@askverdict/sdk 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/client.test.d.ts +2 -0
- package/dist/__tests__/client.test.d.ts.map +1 -0
- package/dist/__tests__/client.test.js +472 -0
- package/dist/__tests__/client.test.js.map +1 -0
- package/dist/client.d.ts +167 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +503 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +227 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { AskVerdictClient } from "../client.js";
|
|
3
|
+
import { AskVerdictError } from "../types.js";
|
|
4
|
+
// ── Fetch mock setup ───────────────────────────────────────────────────────────
|
|
5
|
+
const mockFetch = vi.fn();
|
|
6
|
+
global.fetch = mockFetch;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
vi.clearAllMocks();
|
|
9
|
+
mockFetch.mockReset();
|
|
10
|
+
});
|
|
11
|
+
function mockResponse(body, status = 200) {
|
|
12
|
+
mockFetch.mockResolvedValueOnce(new Response(JSON.stringify(body), {
|
|
13
|
+
status,
|
|
14
|
+
headers: { "Content-Type": "application/json" },
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
function mockNetworkError(message = "Failed to fetch") {
|
|
18
|
+
mockFetch.mockRejectedValueOnce(new Error(message));
|
|
19
|
+
}
|
|
20
|
+
// ── Constructor ────────────────────────────────────────────────────────────────
|
|
21
|
+
describe("AskVerdictClient — constructor", () => {
|
|
22
|
+
it("uses default base URL when none provided", async () => {
|
|
23
|
+
const client = new AskVerdictClient();
|
|
24
|
+
mockResponse({ status: "ok", service: "askverdict", timestamp: "", version: "1.0.0" });
|
|
25
|
+
await client.health();
|
|
26
|
+
const [url] = mockFetch.mock.calls[0];
|
|
27
|
+
expect(url).toBe("https://api.askverdict.ai/v1/health");
|
|
28
|
+
});
|
|
29
|
+
it("uses provided baseUrl and strips trailing slash", async () => {
|
|
30
|
+
const client = new AskVerdictClient({ baseUrl: "https://api.example.com/" });
|
|
31
|
+
mockResponse({ status: "ok", service: "askverdict", timestamp: "", version: "1.0.0" });
|
|
32
|
+
await client.health();
|
|
33
|
+
const [url] = mockFetch.mock.calls[0];
|
|
34
|
+
expect(url).toBe("https://api.example.com/v1/health");
|
|
35
|
+
});
|
|
36
|
+
it("sets X-Api-Key header when apiKey is provided", async () => {
|
|
37
|
+
const client = new AskVerdictClient({ apiKey: "my-api-key" });
|
|
38
|
+
mockResponse({ status: "ok", service: "askverdict", timestamp: "", version: "1.0.0" });
|
|
39
|
+
await client.health();
|
|
40
|
+
const [, init] = mockFetch.mock.calls[0];
|
|
41
|
+
expect(init.headers["X-Api-Key"]).toBe("my-api-key");
|
|
42
|
+
});
|
|
43
|
+
it("sets Authorization Bearer header when authToken is provided", async () => {
|
|
44
|
+
const client = new AskVerdictClient({ authToken: "tok_abc123" });
|
|
45
|
+
mockResponse({ status: "ok", service: "askverdict", timestamp: "", version: "1.0.0" });
|
|
46
|
+
await client.health();
|
|
47
|
+
const [, init] = mockFetch.mock.calls[0];
|
|
48
|
+
expect(init.headers["Authorization"]).toBe("Bearer tok_abc123");
|
|
49
|
+
});
|
|
50
|
+
it("sets no auth headers when neither apiKey nor authToken provided", async () => {
|
|
51
|
+
const client = new AskVerdictClient();
|
|
52
|
+
mockResponse({ status: "ok", service: "askverdict", timestamp: "", version: "1.0.0" });
|
|
53
|
+
await client.health();
|
|
54
|
+
const [, init] = mockFetch.mock.calls[0];
|
|
55
|
+
const headers = init.headers;
|
|
56
|
+
expect(headers["X-Api-Key"]).toBeUndefined();
|
|
57
|
+
expect(headers["Authorization"]).toBeUndefined();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
// ── health() ──────────────────────────────────────────────────────────────────
|
|
61
|
+
describe("AskVerdictClient.health()", () => {
|
|
62
|
+
it("returns a health response on 200", async () => {
|
|
63
|
+
const client = new AskVerdictClient();
|
|
64
|
+
const body = {
|
|
65
|
+
status: "ok",
|
|
66
|
+
service: "askverdict-api",
|
|
67
|
+
timestamp: "2026-02-18T00:00:00Z",
|
|
68
|
+
version: "1.2.3",
|
|
69
|
+
};
|
|
70
|
+
mockResponse(body);
|
|
71
|
+
const result = await client.health();
|
|
72
|
+
expect(result).toEqual(body);
|
|
73
|
+
});
|
|
74
|
+
it("sends GET to /health", async () => {
|
|
75
|
+
const client = new AskVerdictClient();
|
|
76
|
+
mockResponse({ status: "ok", service: "s", timestamp: "", version: "1" });
|
|
77
|
+
await client.health();
|
|
78
|
+
const [, init] = mockFetch.mock.calls[0];
|
|
79
|
+
expect(init.method).toBe("GET");
|
|
80
|
+
});
|
|
81
|
+
it("throws AskVerdictError on non-200 response", async () => {
|
|
82
|
+
const client = new AskVerdictClient();
|
|
83
|
+
mockResponse({ error: { code: "INTERNAL_ERROR", message: "Something broke" } }, 500);
|
|
84
|
+
await expect(client.health()).rejects.toThrow(AskVerdictError);
|
|
85
|
+
});
|
|
86
|
+
it("carries status code on AskVerdictError for non-200 responses", async () => {
|
|
87
|
+
const client = new AskVerdictClient();
|
|
88
|
+
mockResponse({ error: { code: "INTERNAL_ERROR", message: "Something broke" } }, 500);
|
|
89
|
+
let caught;
|
|
90
|
+
try {
|
|
91
|
+
await client.health();
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
if (e instanceof AskVerdictError)
|
|
95
|
+
caught = e;
|
|
96
|
+
}
|
|
97
|
+
expect(caught?.status).toBe(500);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ── createDebate() ────────────────────────────────────────────────────────────
|
|
101
|
+
describe("AskVerdictClient.createDebate()", () => {
|
|
102
|
+
it("sends POST to /v1/verdicts with correct body", async () => {
|
|
103
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
104
|
+
const returnBody = { id: "d1", status: "pending", streamUrl: "/v1/verdicts/d1/stream" };
|
|
105
|
+
mockResponse(returnBody, 201);
|
|
106
|
+
await client.createDebate({ question: "Is TypeScript worth it?" });
|
|
107
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
108
|
+
expect(url).toContain("/v1/verdicts");
|
|
109
|
+
expect(init.method).toBe("POST");
|
|
110
|
+
const sentBody = JSON.parse(init.body);
|
|
111
|
+
expect(sentBody["question"]).toBe("Is TypeScript worth it?");
|
|
112
|
+
});
|
|
113
|
+
it("sends all optional params in the body", async () => {
|
|
114
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
115
|
+
mockResponse({ id: "d2", status: "pending", streamUrl: "/v1/verdicts/d2/stream" }, 201);
|
|
116
|
+
await client.createDebate({
|
|
117
|
+
question: "Tabs or spaces?",
|
|
118
|
+
mode: "thorough",
|
|
119
|
+
agentCount: 4,
|
|
120
|
+
maxRounds: 3,
|
|
121
|
+
enableSearch: true,
|
|
122
|
+
context: "Engineering context",
|
|
123
|
+
});
|
|
124
|
+
const [, init] = mockFetch.mock.calls[0];
|
|
125
|
+
const sentBody = JSON.parse(init.body);
|
|
126
|
+
expect(sentBody["mode"]).toBe("thorough");
|
|
127
|
+
expect(sentBody["agentCount"]).toBe(4);
|
|
128
|
+
expect(sentBody["maxRounds"]).toBe(3);
|
|
129
|
+
expect(sentBody["enableSearch"]).toBe(true);
|
|
130
|
+
expect(sentBody["context"]).toBe("Engineering context");
|
|
131
|
+
});
|
|
132
|
+
it("returns CreateDebateResult with id, debateId alias, and streamUrl", async () => {
|
|
133
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
134
|
+
const returnBody = { id: "d3", status: "pending", streamUrl: "/v1/verdicts/d3/stream" };
|
|
135
|
+
mockResponse(returnBody, 201);
|
|
136
|
+
const result = await client.createDebate({ question: "Test?" });
|
|
137
|
+
expect(result.id).toBe("d3");
|
|
138
|
+
expect(result.debateId).toBe("d3");
|
|
139
|
+
expect(result.streamUrl).toBe("/v1/verdicts/d3/stream");
|
|
140
|
+
});
|
|
141
|
+
it("throws AskVerdictError on 422 validation error", async () => {
|
|
142
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
143
|
+
mockResponse({ error: { code: "VALIDATION_ERROR", message: "question is required" } }, 422);
|
|
144
|
+
await expect(client.createDebate({ question: "" })).rejects.toThrow(AskVerdictError);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// ── getDebate() ───────────────────────────────────────────────────────────────
|
|
148
|
+
describe("AskVerdictClient.getDebate()", () => {
|
|
149
|
+
it("sends GET to the correct verdict path", async () => {
|
|
150
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
151
|
+
mockResponse({ verdict: { id: "abc-123", question: "?", status: "completed" } });
|
|
152
|
+
await client.getDebate("abc-123");
|
|
153
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
154
|
+
expect(url).toContain("/v1/verdicts/abc-123");
|
|
155
|
+
expect(init.method).toBe("GET");
|
|
156
|
+
});
|
|
157
|
+
it("URL-encodes the debate ID", async () => {
|
|
158
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
159
|
+
mockResponse({ verdict: { id: "id with spaces", question: "?", status: "pending" } });
|
|
160
|
+
await client.getDebate("id with spaces");
|
|
161
|
+
const [url] = mockFetch.mock.calls[0];
|
|
162
|
+
expect(url).toContain("id%20with%20spaces");
|
|
163
|
+
});
|
|
164
|
+
it("throws AskVerdictError with status 404 when debate not found", async () => {
|
|
165
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
166
|
+
mockResponse({ error: { code: "NOT_FOUND", message: "Debate not found" } }, 404);
|
|
167
|
+
let caught;
|
|
168
|
+
try {
|
|
169
|
+
await client.getDebate("nonexistent");
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
if (e instanceof AskVerdictError)
|
|
173
|
+
caught = e;
|
|
174
|
+
}
|
|
175
|
+
expect(caught).toBeInstanceOf(AskVerdictError);
|
|
176
|
+
expect(caught?.status).toBe(404);
|
|
177
|
+
expect(caught?.code).toBe("NOT_FOUND");
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
// ── listDebates() ─────────────────────────────────────────────────────────────
|
|
181
|
+
describe("AskVerdictClient.listDebates()", () => {
|
|
182
|
+
it("sends GET to /v1/verdicts with no query string when called with no params", async () => {
|
|
183
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
184
|
+
mockResponse({ verdicts: [], total: 0, page: 1, pageSize: 20, hasMore: false });
|
|
185
|
+
await client.listDebates();
|
|
186
|
+
const [url] = mockFetch.mock.calls[0];
|
|
187
|
+
expect(url).toBe("https://api.askverdict.ai/v1/verdicts");
|
|
188
|
+
});
|
|
189
|
+
it("sends limit in query string", async () => {
|
|
190
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
191
|
+
mockResponse({ verdicts: [], total: 0, page: 1, pageSize: 10, hasMore: false });
|
|
192
|
+
await client.listDebates({ limit: 10 });
|
|
193
|
+
const [url] = mockFetch.mock.calls[0];
|
|
194
|
+
expect(url).toContain("limit=10");
|
|
195
|
+
});
|
|
196
|
+
it("sends status filter in query string", async () => {
|
|
197
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
198
|
+
mockResponse({ verdicts: [], total: 0, page: 1, pageSize: 20, hasMore: false });
|
|
199
|
+
await client.listDebates({ status: "completed" });
|
|
200
|
+
const [url] = mockFetch.mock.calls[0];
|
|
201
|
+
expect(url).toContain("status=completed");
|
|
202
|
+
});
|
|
203
|
+
it("normalizes verdicts key to debates in response", async () => {
|
|
204
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
205
|
+
const returnBody = {
|
|
206
|
+
verdicts: [{ id: "d1", question: "Q?", status: "completed" }],
|
|
207
|
+
total: 1,
|
|
208
|
+
page: 1,
|
|
209
|
+
pageSize: 20,
|
|
210
|
+
hasMore: false,
|
|
211
|
+
};
|
|
212
|
+
mockResponse(returnBody);
|
|
213
|
+
const result = await client.listDebates();
|
|
214
|
+
expect(result.total).toBe(1);
|
|
215
|
+
expect(result.debates).toHaveLength(1);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
// ── deleteDebate() ────────────────────────────────────────────────────────────
|
|
219
|
+
describe("AskVerdictClient.deleteDebate()", () => {
|
|
220
|
+
it("sends DELETE to the correct verdict path", async () => {
|
|
221
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
222
|
+
mockResponse({ deleted: true });
|
|
223
|
+
await client.deleteDebate("debate-99");
|
|
224
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
225
|
+
expect(url).toContain("/v1/verdicts/debate-99");
|
|
226
|
+
expect(init.method).toBe("DELETE");
|
|
227
|
+
});
|
|
228
|
+
it("resolves without a return value on success", async () => {
|
|
229
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
230
|
+
mockResponse({ deleted: true });
|
|
231
|
+
const result = await client.deleteDebate("d1");
|
|
232
|
+
expect(result).toBeUndefined();
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
// ── castVote() ────────────────────────────────────────────────────────────────
|
|
236
|
+
describe("AskVerdictClient.castVote()", () => {
|
|
237
|
+
it("sends POST to the votes endpoint with claimId and vote", async () => {
|
|
238
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
239
|
+
mockResponse({ success: true });
|
|
240
|
+
await client.castVote("debate-1", "claim-A", "agree");
|
|
241
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
242
|
+
expect(url).toContain("/api/debates/debate-1/votes");
|
|
243
|
+
expect(init.method).toBe("POST");
|
|
244
|
+
const body = JSON.parse(init.body);
|
|
245
|
+
expect(body["claimId"]).toBe("claim-A");
|
|
246
|
+
expect(body["vote"]).toBe("agree");
|
|
247
|
+
});
|
|
248
|
+
it("sends neutral vote to remove existing vote", async () => {
|
|
249
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
250
|
+
mockResponse({ success: true });
|
|
251
|
+
await client.castVote("debate-1", "claim-B", "neutral");
|
|
252
|
+
const [, init] = mockFetch.mock.calls[0];
|
|
253
|
+
const body = JSON.parse(init.body);
|
|
254
|
+
expect(body["vote"]).toBe("neutral");
|
|
255
|
+
});
|
|
256
|
+
it("sends disagree vote correctly", async () => {
|
|
257
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
258
|
+
mockResponse({ success: true });
|
|
259
|
+
await client.castVote("debate-2", "claim-C", "disagree");
|
|
260
|
+
const [, init] = mockFetch.mock.calls[0];
|
|
261
|
+
const body = JSON.parse(init.body);
|
|
262
|
+
expect(body["vote"]).toBe("disagree");
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
// ── removeVote() ──────────────────────────────────────────────────────────────
|
|
266
|
+
describe("AskVerdictClient.removeVote()", () => {
|
|
267
|
+
it("sends DELETE to the correct votes path", async () => {
|
|
268
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
269
|
+
mockResponse({ success: true });
|
|
270
|
+
await client.removeVote("debate-1", "claim-A");
|
|
271
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
272
|
+
expect(url).toContain("/api/debates/debate-1/votes/claim-A");
|
|
273
|
+
expect(init.method).toBe("DELETE");
|
|
274
|
+
});
|
|
275
|
+
it("URL-encodes both debateId and claimId", async () => {
|
|
276
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
277
|
+
mockResponse({ success: true });
|
|
278
|
+
await client.removeVote("debate/1", "claim/A");
|
|
279
|
+
const [url] = mockFetch.mock.calls[0];
|
|
280
|
+
expect(url).toContain("debate%2F1");
|
|
281
|
+
expect(url).toContain("claim%2FA");
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
// ── getVotes() ────────────────────────────────────────────────────────────────
|
|
285
|
+
describe("AskVerdictClient.getVotes()", () => {
|
|
286
|
+
it("sends GET to the votes endpoint and returns the votes map", async () => {
|
|
287
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
288
|
+
const votesPayload = {
|
|
289
|
+
votes: {
|
|
290
|
+
"claim-1": { agree: 5, disagree: 2, userVote: "agree" },
|
|
291
|
+
"claim-2": { agree: 0, disagree: 3 },
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
mockResponse(votesPayload);
|
|
295
|
+
const result = await client.getVotes("debate-1");
|
|
296
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
297
|
+
expect(url).toContain("/api/debates/debate-1/votes");
|
|
298
|
+
expect(init.method).toBe("GET");
|
|
299
|
+
expect(result["claim-1"]?.agree).toBe(5);
|
|
300
|
+
expect(result["claim-2"]?.disagree).toBe(3);
|
|
301
|
+
});
|
|
302
|
+
it("unwraps the votes property from the API response", async () => {
|
|
303
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
304
|
+
mockResponse({ votes: { "c1": { agree: 1, disagree: 0 } } });
|
|
305
|
+
const result = await client.getVotes("debate-1");
|
|
306
|
+
expect(result).not.toHaveProperty("votes");
|
|
307
|
+
expect(result).toHaveProperty("c1");
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
// ── getPolls() ────────────────────────────────────────────────────────────────
|
|
311
|
+
describe("AskVerdictClient.getPolls()", () => {
|
|
312
|
+
it("sends GET to the polls endpoint and returns polls array", async () => {
|
|
313
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
314
|
+
const poll = {
|
|
315
|
+
id: "poll-1",
|
|
316
|
+
debateId: "debate-1",
|
|
317
|
+
question: "Do you agree?",
|
|
318
|
+
options: [{ id: "opt-1", label: "Yes" }, { id: "opt-2", label: "No" }],
|
|
319
|
+
status: "open",
|
|
320
|
+
createdAt: "2026-01-01T00:00:00Z",
|
|
321
|
+
closedAt: null,
|
|
322
|
+
tallies: {},
|
|
323
|
+
totalVotes: 0,
|
|
324
|
+
userVote: null,
|
|
325
|
+
};
|
|
326
|
+
mockResponse({ polls: [poll] });
|
|
327
|
+
const result = await client.getPolls("debate-1");
|
|
328
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
329
|
+
expect(url).toContain("/api/debates/debate-1/polls");
|
|
330
|
+
expect(init.method).toBe("GET");
|
|
331
|
+
expect(result).toHaveLength(1);
|
|
332
|
+
expect(result[0]?.id).toBe("poll-1");
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
// ── createPoll() ──────────────────────────────────────────────────────────────
|
|
336
|
+
describe("AskVerdictClient.createPoll()", () => {
|
|
337
|
+
it("sends POST with question and options, returns Poll", async () => {
|
|
338
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
339
|
+
const createdPoll = {
|
|
340
|
+
id: "poll-new",
|
|
341
|
+
debateId: "debate-1",
|
|
342
|
+
question: "Which is better?",
|
|
343
|
+
options: [{ id: "o1", label: "A" }, { id: "o2", label: "B" }],
|
|
344
|
+
status: "open",
|
|
345
|
+
createdAt: "2026-02-18T00:00:00Z",
|
|
346
|
+
closedAt: null,
|
|
347
|
+
tallies: {},
|
|
348
|
+
totalVotes: 0,
|
|
349
|
+
userVote: null,
|
|
350
|
+
};
|
|
351
|
+
mockResponse({ poll: createdPoll });
|
|
352
|
+
const result = await client.createPoll("debate-1", "Which is better?", ["A", "B"]);
|
|
353
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
354
|
+
expect(url).toContain("/api/debates/debate-1/polls");
|
|
355
|
+
expect(init.method).toBe("POST");
|
|
356
|
+
const body = JSON.parse(init.body);
|
|
357
|
+
expect(body["question"]).toBe("Which is better?");
|
|
358
|
+
expect(body["options"]).toEqual(["A", "B"]);
|
|
359
|
+
expect(result.id).toBe("poll-new");
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
// ── votePoll() ────────────────────────────────────────────────────────────────
|
|
363
|
+
describe("AskVerdictClient.votePoll()", () => {
|
|
364
|
+
it("sends POST to the correct vote URL with optionId in body", async () => {
|
|
365
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
366
|
+
mockResponse({ success: true });
|
|
367
|
+
await client.votePoll("debate-1", "poll-1", "opt-1");
|
|
368
|
+
const [url, init] = mockFetch.mock.calls[0];
|
|
369
|
+
expect(url).toContain("/api/debates/debate-1/polls/poll-1/vote");
|
|
370
|
+
expect(init.method).toBe("POST");
|
|
371
|
+
const body = JSON.parse(init.body);
|
|
372
|
+
expect(body["optionId"]).toBe("opt-1");
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
// ── Error handling ────────────────────────────────────────────────────────────
|
|
376
|
+
describe("AskVerdictClient — error handling", () => {
|
|
377
|
+
it("throws AskVerdictError with code VALIDATION_ERROR on 400", async () => {
|
|
378
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
379
|
+
mockResponse({ error: { code: "VALIDATION_ERROR", message: "Invalid request body" } }, 400);
|
|
380
|
+
let caught;
|
|
381
|
+
try {
|
|
382
|
+
await client.createDebate({ question: "" });
|
|
383
|
+
}
|
|
384
|
+
catch (e) {
|
|
385
|
+
if (e instanceof AskVerdictError)
|
|
386
|
+
caught = e;
|
|
387
|
+
}
|
|
388
|
+
expect(caught).toBeInstanceOf(AskVerdictError);
|
|
389
|
+
expect(caught?.code).toBe("VALIDATION_ERROR");
|
|
390
|
+
expect(caught?.status).toBe(400);
|
|
391
|
+
});
|
|
392
|
+
it("throws AskVerdictError with code UNAUTHORIZED on 401", async () => {
|
|
393
|
+
const client = new AskVerdictClient();
|
|
394
|
+
mockResponse({ error: { code: "UNAUTHORIZED", message: "Authentication required" } }, 401);
|
|
395
|
+
let caught;
|
|
396
|
+
try {
|
|
397
|
+
await client.listDebates();
|
|
398
|
+
}
|
|
399
|
+
catch (e) {
|
|
400
|
+
if (e instanceof AskVerdictError)
|
|
401
|
+
caught = e;
|
|
402
|
+
}
|
|
403
|
+
expect(caught?.code).toBe("UNAUTHORIZED");
|
|
404
|
+
expect(caught?.status).toBe(401);
|
|
405
|
+
});
|
|
406
|
+
it("throws AskVerdictError with code HTTP_ERROR on 500 with non-JSON body", async () => {
|
|
407
|
+
const client = new AskVerdictClient();
|
|
408
|
+
mockFetch.mockResolvedValueOnce(new Response("Internal Server Error", {
|
|
409
|
+
status: 500,
|
|
410
|
+
headers: { "Content-Type": "text/plain" },
|
|
411
|
+
}));
|
|
412
|
+
let caught;
|
|
413
|
+
try {
|
|
414
|
+
await client.health();
|
|
415
|
+
}
|
|
416
|
+
catch (e) {
|
|
417
|
+
if (e instanceof AskVerdictError)
|
|
418
|
+
caught = e;
|
|
419
|
+
}
|
|
420
|
+
expect(caught).toBeInstanceOf(AskVerdictError);
|
|
421
|
+
expect(caught?.code).toBe("HTTP_ERROR");
|
|
422
|
+
expect(caught?.status).toBe(500);
|
|
423
|
+
});
|
|
424
|
+
it("throws AskVerdictError with code NETWORK_ERROR on fetch rejection", async () => {
|
|
425
|
+
const client = new AskVerdictClient();
|
|
426
|
+
mockNetworkError("ECONNREFUSED");
|
|
427
|
+
let caught;
|
|
428
|
+
try {
|
|
429
|
+
await client.health();
|
|
430
|
+
}
|
|
431
|
+
catch (e) {
|
|
432
|
+
if (e instanceof AskVerdictError)
|
|
433
|
+
caught = e;
|
|
434
|
+
}
|
|
435
|
+
expect(caught).toBeInstanceOf(AskVerdictError);
|
|
436
|
+
expect(caught?.code).toBe("NETWORK_ERROR");
|
|
437
|
+
expect(caught?.message).toContain("ECONNREFUSED");
|
|
438
|
+
});
|
|
439
|
+
it("throws AskVerdictError with details field when API provides them", async () => {
|
|
440
|
+
const client = new AskVerdictClient({ authToken: "tok" });
|
|
441
|
+
mockResponse({
|
|
442
|
+
error: {
|
|
443
|
+
code: "VALIDATION_ERROR",
|
|
444
|
+
message: "Invalid fields",
|
|
445
|
+
details: { field: "question", reason: "too_short" },
|
|
446
|
+
},
|
|
447
|
+
}, 422);
|
|
448
|
+
let caught;
|
|
449
|
+
try {
|
|
450
|
+
await client.createDebate({ question: "?" });
|
|
451
|
+
}
|
|
452
|
+
catch (e) {
|
|
453
|
+
if (e instanceof AskVerdictError)
|
|
454
|
+
caught = e;
|
|
455
|
+
}
|
|
456
|
+
expect(caught?.details).toEqual({ field: "question", reason: "too_short" });
|
|
457
|
+
});
|
|
458
|
+
it("falls back to API_ERROR code when error body has no code field", async () => {
|
|
459
|
+
const client = new AskVerdictClient();
|
|
460
|
+
mockResponse({ error: { message: "Something went wrong" } }, 500);
|
|
461
|
+
let caught;
|
|
462
|
+
try {
|
|
463
|
+
await client.health();
|
|
464
|
+
}
|
|
465
|
+
catch (e) {
|
|
466
|
+
if (e instanceof AskVerdictError)
|
|
467
|
+
caught = e;
|
|
468
|
+
}
|
|
469
|
+
expect(caught?.code).toBe("API_ERROR");
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
//# sourceMappingURL=client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":"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"}
|