test(httpapi): simplify event stream regression coverage (#27427)
This commit is contained in:
@@ -51,6 +51,20 @@ async function readEvent(reader: ReadableStreamDefaultReader<Uint8Array>) {
|
|||||||
return Schema.decodeUnknownSync(EventData)(JSON.parse(new TextDecoder().decode(result.value).replace(/^data: /, "")))
|
return Schema.decodeUnknownSync(EventData)(JSON.parse(new TextDecoder().decode(result.value).replace(/^data: /, "")))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function readStatusWithin(reader: ReadableStreamDefaultReader<Uint8Array>, delay: number) {
|
||||||
|
let timeout: ReturnType<typeof setTimeout> | undefined
|
||||||
|
try {
|
||||||
|
return await Promise.race([
|
||||||
|
reader.read().then((result) => (result.done ? "closed" : "event")),
|
||||||
|
new Promise<"open">((resolve) => {
|
||||||
|
timeout = setTimeout(() => resolve("open"), delay)
|
||||||
|
}),
|
||||||
|
])
|
||||||
|
} finally {
|
||||||
|
if (timeout) clearTimeout(timeout)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
await disposeAllInstances()
|
await disposeAllInstances()
|
||||||
await resetDatabase()
|
await resetDatabase()
|
||||||
@@ -69,14 +83,6 @@ describe("event HttpApi", () => {
|
|||||||
expect(await readFirstEvent(response)).toMatchObject({ type: "server.connected", properties: {} })
|
expect(await readFirstEvent(response)).toMatchObject({ type: "server.connected", properties: {} })
|
||||||
})
|
})
|
||||||
|
|
||||||
test("serves the initial server connected event", async () => {
|
|
||||||
await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } })
|
|
||||||
const headers = { "x-opencode-directory": tmp.path }
|
|
||||||
const response = await app().request(EventPaths.event, { headers })
|
|
||||||
|
|
||||||
expect(await readFirstEvent(response)).toMatchObject({ type: "server.connected", properties: {} })
|
|
||||||
})
|
|
||||||
|
|
||||||
test("keeps the event stream open after the initial event", async () => {
|
test("keeps the event stream open after the initial event", async () => {
|
||||||
await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } })
|
await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } })
|
||||||
const response = await app().request(EventPaths.event, { headers: { "x-opencode-directory": tmp.path } })
|
const response = await app().request(EventPaths.event, { headers: { "x-opencode-directory": tmp.path } })
|
||||||
@@ -85,12 +91,7 @@ describe("event HttpApi", () => {
|
|||||||
const reader = response.body.getReader()
|
const reader = response.body.getReader()
|
||||||
try {
|
try {
|
||||||
expect(await readEvent(reader)).toMatchObject({ type: "server.connected", properties: {} })
|
expect(await readEvent(reader)).toMatchObject({ type: "server.connected", properties: {} })
|
||||||
const next = await Promise.race([
|
expect(await readStatusWithin(reader, 250)).toBe("open")
|
||||||
reader.read().then((result) => (result.done ? "closed" : "event")),
|
|
||||||
new Promise<"open">((resolve) => setTimeout(() => resolve("open"), 250)),
|
|
||||||
])
|
|
||||||
|
|
||||||
expect(next).toBe("open")
|
|
||||||
} finally {
|
} finally {
|
||||||
await reader.cancel()
|
await reader.cancel()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user