This repository was archived by the owner on May 15, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Expand file tree
/
Copy pathbase-openai-compatible-provider-timeout.spec.ts
More file actions
128 lines (103 loc) · 3.3 KB
/
Copy pathbase-openai-compatible-provider-timeout.spec.ts
File metadata and controls
128 lines (103 loc) · 3.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// npx vitest run api/providers/__tests__/base-openai-compatible-provider-timeout.spec.ts
import type { ModelInfo } from "@roo-code/types"
import { BaseOpenAiCompatibleProvider } from "../base-openai-compatible-provider"
// Mock the timeout config utility
vitest.mock("../utils/timeout-config", () => ({
getApiRequestTimeout: vitest.fn(),
}))
// Mock the undici-fetch utility
const mockFetchFn = vitest.fn()
vitest.mock("../utils/undici-fetch", () => ({
createFetchWithUndiciTimeout: vitest.fn(() => mockFetchFn),
}))
import { getApiRequestTimeout } from "../utils/timeout-config"
import { createFetchWithUndiciTimeout } from "../utils/undici-fetch"
// Mock OpenAI and capture constructor calls
const mockOpenAIConstructor = vitest.fn()
vitest.mock("openai", () => {
return {
__esModule: true,
default: vitest.fn().mockImplementation((config) => {
mockOpenAIConstructor(config)
return {
chat: {
completions: {
create: vitest.fn(),
},
},
}
}),
}
})
// Create a concrete test implementation of the abstract base class
class TestOpenAiCompatibleProvider extends BaseOpenAiCompatibleProvider<"test-model"> {
constructor(apiKey: string) {
const testModels: Record<"test-model", ModelInfo> = {
"test-model": {
maxTokens: 4096,
contextWindow: 128000,
supportsImages: false,
supportsPromptCache: false,
inputPrice: 0.5,
outputPrice: 1.5,
},
}
super({
providerName: "TestProvider",
baseURL: "https://test.example.com/v1",
defaultProviderModelId: "test-model",
providerModels: testModels,
apiKey,
})
}
}
describe("BaseOpenAiCompatibleProvider Timeout Configuration", () => {
beforeEach(() => {
vitest.clearAllMocks()
})
it("should call getApiRequestTimeout when creating the provider", () => {
;(getApiRequestTimeout as any).mockReturnValue(600000)
new TestOpenAiCompatibleProvider("test-api-key")
expect(getApiRequestTimeout).toHaveBeenCalled()
expect(createFetchWithUndiciTimeout).toHaveBeenCalled()
})
it("should pass the default timeout to the OpenAI client constructor", () => {
;(getApiRequestTimeout as any).mockReturnValue(600000) // 600 seconds in ms
new TestOpenAiCompatibleProvider("test-api-key")
expect(mockOpenAIConstructor).toHaveBeenCalledWith(
expect.objectContaining({
baseURL: "https://test.example.com/v1",
apiKey: "test-api-key",
timeout: 600000,
fetch: mockFetchFn,
}),
)
})
it("should use custom timeout value from getApiRequestTimeout", () => {
;(getApiRequestTimeout as any).mockReturnValue(1800000) // 30 minutes in ms
new TestOpenAiCompatibleProvider("test-api-key")
expect(mockOpenAIConstructor).toHaveBeenCalledWith(
expect.objectContaining({
timeout: 1800000,
}),
)
})
it("should handle zero timeout (no timeout)", () => {
;(getApiRequestTimeout as any).mockReturnValue(0)
new TestOpenAiCompatibleProvider("test-api-key")
expect(mockOpenAIConstructor).toHaveBeenCalledWith(
expect.objectContaining({
timeout: 0,
}),
)
})
it("should pass DEFAULT_HEADERS to the OpenAI client constructor", () => {
;(getApiRequestTimeout as any).mockReturnValue(600000)
new TestOpenAiCompatibleProvider("test-api-key")
expect(mockOpenAIConstructor).toHaveBeenCalledWith(
expect.objectContaining({
defaultHeaders: expect.any(Object),
}),
)
})
})