Skip to content

Commit f728333

Browse files
committed
test(openai): add abort signal test coverage for createOpts refactoring
1 parent 3b1302e commit f728333

1 file changed

Lines changed: 127 additions & 1 deletion

File tree

src/api/providers/__tests__/openai.spec.ts

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ vitest.mock("../utils/timeout-config", () => ({
1212
getApiRequestTimeout: vitest.fn().mockReturnValue(300_000),
1313
}))
1414

15-
const MOCK_TIMEOUT_MS = 300_000
15+
const MOCK_TIMEOUT_MS = 600_000
1616

1717
const mockCreate = vitest.fn()
1818

@@ -840,6 +840,51 @@ describe("OpenAiHandler", () => {
840840
const callOptions = mockCreate.mock.calls[0][1]
841841
expect(callOptions?.signal).toBe(controller.signal)
842842
})
843+
844+
it("should pass abort signal through to client in non-streaming createMessage", async () => {
845+
const handler = new OpenAiHandler({
846+
...mockOptions,
847+
openAiStreamingEnabled: false,
848+
})
849+
850+
const controller = new AbortController()
851+
const stream = handler.createMessage(systemPrompt, messages, {
852+
taskId: "test-task",
853+
abortSignal: controller.signal as any,
854+
})
855+
for await (const _ of stream) {
856+
// consume stream
857+
}
858+
859+
expect(mockCreate).toHaveBeenCalledWith(
860+
expect.any(Object),
861+
expect.objectContaining({ signal: controller.signal }),
862+
)
863+
})
864+
865+
it("should pass abort signal with path for Azure AI Inference in non-streaming createMessage", async () => {
866+
const localAzureOptions = {
867+
...mockOptions,
868+
openAiBaseUrl: "https://test.services.ai.azure.com",
869+
openAiModelId: "deepseek-v3",
870+
azureApiVersion: "2024-05-01-preview",
871+
}
872+
const azureHandler = new OpenAiHandler(localAzureOptions)
873+
874+
const controller = new AbortController()
875+
const stream = azureHandler.createMessage(systemPrompt, messages, {
876+
taskId: "test-task",
877+
abortSignal: controller.signal,
878+
})
879+
for await (const _ of stream) {
880+
// consume stream
881+
}
882+
883+
expect(mockCreate).toHaveBeenCalledWith(
884+
expect.objectContaining({ model: localAzureOptions.openAiModelId }),
885+
expect.objectContaining({ path: "/models/chat/completions", signal: controller.signal }),
886+
)
887+
})
843888
})
844889
})
845890

@@ -1538,6 +1583,87 @@ describe("OpenAiHandler", () => {
15381583
{ path: "/models/chat/completions" },
15391584
)
15401585
})
1586+
1587+
it("should pass abort signal through to client in O3 streaming createMessage", async () => {
1588+
const o3Handler = new OpenAiHandler(o3Options)
1589+
const controller = new AbortController()
1590+
const systemPrompt = "You are a helpful assistant."
1591+
const messages: Anthropic.Messages.MessageParam[] = [
1592+
{
1593+
role: "user",
1594+
content: "Hello!",
1595+
},
1596+
]
1597+
1598+
const stream = o3Handler.createMessage(systemPrompt, messages, {
1599+
taskId: "test-task",
1600+
abortSignal: controller.signal as any,
1601+
})
1602+
for await (const _ of stream) {
1603+
// consume stream
1604+
}
1605+
1606+
expect(mockCreate).toHaveBeenCalledWith(
1607+
expect.any(Object),
1608+
expect.objectContaining({ signal: controller.signal }),
1609+
)
1610+
})
1611+
1612+
it("should pass abort signal with path for O3 model with Azure AI Inference", async () => {
1613+
const o3AzureHandler = new OpenAiHandler({
1614+
...o3Options,
1615+
openAiBaseUrl: "https://test.services.ai.azure.com",
1616+
})
1617+
const controller = new AbortController()
1618+
const systemPrompt = "You are a helpful assistant."
1619+
const messages: Anthropic.Messages.MessageParam[] = [
1620+
{
1621+
role: "user",
1622+
content: "Hello!",
1623+
},
1624+
]
1625+
1626+
const stream = o3AzureHandler.createMessage(systemPrompt, messages, {
1627+
taskId: "test-task",
1628+
abortSignal: controller.signal,
1629+
})
1630+
for await (const _ of stream) {
1631+
// consume stream
1632+
}
1633+
1634+
expect(mockCreate).toHaveBeenCalledWith(
1635+
expect.objectContaining({ model: "o3-mini" }),
1636+
expect.objectContaining({ path: "/models/chat/completions", signal: controller.signal }),
1637+
)
1638+
})
1639+
1640+
it("should pass abort signal through to client in O3 non-streaming createMessage", async () => {
1641+
const o3Handler = new OpenAiHandler({
1642+
...o3Options,
1643+
openAiStreamingEnabled: false,
1644+
})
1645+
const controller = new AbortController()
1646+
const systemPrompt = "You are a helpful assistant."
1647+
const messages: Anthropic.Messages.MessageParam[] = [
1648+
{
1649+
role: "user",
1650+
content: "Hello!",
1651+
},
1652+
]
1653+
1654+
const stream = o3Handler.createMessage(systemPrompt, messages, {
1655+
taskId: "test-task",
1656+
abortSignal: controller.signal as any,
1657+
})
1658+
for await (const _ of stream) {
1659+
// consume stream
1660+
}
1661+
1662+
expect(mockCreate).toHaveBeenCalledWith(
1663+
expect.any(Object),
1664+
expect.objectContaining({ signal: controller.signal }),
1665+
)
1666+
})
15411667
})
15421668
})
15431669

0 commit comments

Comments
 (0)