-
Notifications
You must be signed in to change notification settings - Fork 3k
Expand file tree
/
Copy pathqwen-code-complete-prompt.spec.ts
More file actions
146 lines (126 loc) · 3.57 KB
/
qwen-code-complete-prompt.spec.ts
File metadata and controls
146 lines (126 loc) · 3.57 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// npx vitest run api/providers/__tests__/qwen-code-complete-prompt.spec.ts
// Mock filesystem - must come before other imports
vi.mock("node:fs", () => ({
promises: {
readFile: vi.fn(),
writeFile: vi.fn(),
},
}))
const mockCreate = vi.fn()
vi.mock("openai", () => {
return {
__esModule: true,
default: vi.fn().mockImplementation(() => ({
apiKey: "test-key",
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
chat: {
completions: {
create: mockCreate,
},
},
})),
}
})
import { promises as fs } from "node:fs"
import { QwenCodeHandler } from "../qwen-code"
import type { ApiHandlerOptions } from "../../../shared/api"
describe("QwenCodeHandler completePrompt", () => {
let handler: QwenCodeHandler
let mockOptions: ApiHandlerOptions & { qwenCodeOauthPath?: string }
const validCredentials = {
access_token: "test-access-token",
refresh_token: "test-refresh-token",
token_type: "Bearer",
expiry_date: Date.now() + 3600000,
resource_url: "https://dashscope.aliyuncs.com/compatible-mode/v1",
}
beforeEach(() => {
vi.clearAllMocks()
mockOptions = {
apiModelId: "qwen3-coder-plus",
qwenCodeOauthPath: "/tmp/test-creds.json",
}
handler = new QwenCodeHandler(mockOptions)
;(fs.readFile as ReturnType<typeof vi.fn>).mockResolvedValue(JSON.stringify(validCredentials))
})
it("should return plain text content as-is", async () => {
mockCreate.mockResolvedValueOnce({
choices: [
{
message: {
content: "Here is your enhanced prompt with more details.",
},
},
],
})
const result = await handler.completePrompt("Enhance this prompt")
expect(result).toBe("Here is your enhanced prompt with more details.")
})
it("should strip <think> blocks from response content", async () => {
mockCreate.mockResolvedValueOnce({
choices: [
{
message: {
content:
"<think>Let me analyze this prompt and think about how to enhance it...</think>Here is your enhanced prompt with more details.",
},
},
],
})
const result = await handler.completePrompt("Enhance this prompt")
expect(result).toBe("Here is your enhanced prompt with more details.")
})
it("should strip multiple <think> blocks from response content", async () => {
mockCreate.mockResolvedValueOnce({
choices: [
{
message: {
content: "<think>First thought...</think>Part one. <think>Second thought...</think>Part two.",
},
},
],
})
const result = await handler.completePrompt("Enhance this prompt")
expect(result).toBe("Part one. Part two.")
})
it("should handle multiline <think> blocks", async () => {
mockCreate.mockResolvedValueOnce({
choices: [
{
message: {
content:
"<think>\nLet me think about this.\nI need to consider multiple things.\n</think>\nThe enhanced prompt.",
},
},
],
})
const result = await handler.completePrompt("Enhance this prompt")
expect(result).toBe("The enhanced prompt.")
})
it("should return empty string when content is only a think block", async () => {
mockCreate.mockResolvedValueOnce({
choices: [
{
message: {
content: "<think>Only thinking, no actual content.</think>",
},
},
],
})
const result = await handler.completePrompt("Enhance this prompt")
expect(result).toBe("")
})
it("should return empty string when message content is null", async () => {
mockCreate.mockResolvedValueOnce({
choices: [
{
message: {
content: null,
},
},
],
})
const result = await handler.completePrompt("Enhance this prompt")
expect(result).toBe("")
})
})