55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
// @vitest-environment node
|
|
import { afterEach, assert, expect, it, vi } from "vitest";
|
|
import { activityEvents } from "./http-events.server";
|
|
|
|
afterEach(() => vi.useRealTimers());
|
|
|
|
it("invalidates on connection and publication, and unsubscribes on disconnect", async () => {
|
|
let notify = () => {};
|
|
const unsubscribe = vi.fn<() => void>();
|
|
const abort = new AbortController();
|
|
const response = activityEvents(
|
|
new Request("http://workspace.invalid/api/activities/events", { signal: abort.signal }),
|
|
(listener) => {
|
|
notify = listener;
|
|
return unsubscribe;
|
|
},
|
|
() => true,
|
|
);
|
|
assert.isNotNull(response.body);
|
|
const reader = response.body.getReader();
|
|
const initial = await reader.read();
|
|
expect(new TextDecoder().decode(initial.value)).toBe("event: change\ndata: {}\n\n");
|
|
notify();
|
|
expect(new TextDecoder().decode((await reader.read()).value)).toBe("event: change\ndata: {}\n\n");
|
|
abort.abort();
|
|
expect((await reader.read()).done).toBe(true);
|
|
expect(unsubscribe).toHaveBeenCalledOnce();
|
|
});
|
|
|
|
it("refuses an unauthorized subscriber", () => {
|
|
const subscribe = vi.fn<(listener: () => void) => () => void>();
|
|
expect(
|
|
activityEvents(new Request("http://workspace.invalid/events"), subscribe, () => false).status,
|
|
).toBe(401);
|
|
expect(subscribe).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("closes an expired browser session during keepalive", async () => {
|
|
vi.useFakeTimers();
|
|
let authorized = true;
|
|
const unsubscribe = vi.fn<() => void>();
|
|
const response = activityEvents(
|
|
new Request("http://workspace.invalid/events"),
|
|
() => unsubscribe,
|
|
() => authorized,
|
|
);
|
|
assert.isNotNull(response.body);
|
|
const reader = response.body.getReader();
|
|
await reader.read();
|
|
authorized = false;
|
|
await vi.advanceTimersByTimeAsync(15_000);
|
|
expect((await reader.read()).done).toBe(true);
|
|
expect(unsubscribe).toHaveBeenCalledOnce();
|
|
});
|