|
import { vi, type Mock } from "vitest"; |
|
import { Client } from "../client"; |
|
import { readable_stream } from "../utils/stream"; |
|
import { initialise_server } from "./server"; |
|
import { direct_space_url } from "./handlers.ts"; |
|
|
|
import { |
|
describe, |
|
it, |
|
expect, |
|
afterEach, |
|
beforeAll, |
|
afterAll, |
|
beforeEach |
|
} from "vitest"; |
|
|
|
const server = initialise_server(); |
|
|
|
beforeAll(() => server.listen()); |
|
afterEach(() => server.resetHandlers()); |
|
afterAll(() => server.close()); |
|
|
|
describe("open_stream", () => { |
|
let app: Client; |
|
|
|
beforeEach(async () => { |
|
app = await Client.connect("hmb/hello_world"); |
|
app.stream = vi.fn().mockImplementation(() => { |
|
app.stream_instance = readable_stream( |
|
new URL(`${direct_space_url}/queue/data`) |
|
); |
|
return app.stream_instance; |
|
}); |
|
}); |
|
|
|
afterEach(() => { |
|
vi.clearAllMocks(); |
|
}); |
|
|
|
it("should throw an error if config is not defined", () => { |
|
app.config = undefined; |
|
|
|
expect(async () => { |
|
await app.open_stream(); |
|
}).rejects.toThrow("Could not resolve app config"); |
|
}); |
|
|
|
it("should connect to the SSE endpoint and handle messages", async () => { |
|
await app.open_stream(); |
|
|
|
const eventsource_mock_call = (app.stream as Mock).mock.calls[0][0]; |
|
|
|
expect(eventsource_mock_call.href).toMatch( |
|
/https:\/\/hmb-hello-world\.hf\.space\/queue\/data\?session_hash/ |
|
); |
|
|
|
expect(app.stream).toHaveBeenCalledWith(eventsource_mock_call); |
|
|
|
if (!app.stream_instance?.onmessage || !app.stream_instance?.onerror) { |
|
throw new Error("stream instance is not defined"); |
|
} |
|
|
|
const onMessageCallback = app.stream_instance.onmessage.bind(app); |
|
const onErrorCallback = app.stream_instance.onerror.bind(app); |
|
|
|
const message = { msg: "hello jerry" }; |
|
|
|
onMessageCallback({ data: JSON.stringify(message) }); |
|
expect(app.stream_status.open).toBe(true); |
|
|
|
expect(app.event_callbacks).toEqual({}); |
|
expect(app.pending_stream_messages).toEqual({}); |
|
|
|
const close_stream_message = { msg: "close_stream" }; |
|
onMessageCallback({ data: JSON.stringify(close_stream_message) }); |
|
expect(app.stream_status.open).toBe(false); |
|
|
|
onErrorCallback({ data: JSON.stringify("404") }); |
|
expect(app.stream_status.open).toBe(false); |
|
}); |
|
}); |
|
|