Skip to content

Commit d3b80ef

Browse files
committed
msw: Implement GET /api/v1/keywords/:keyword_id request handler
1 parent 96a2ea4 commit d3b80ef

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import getKeyword from './keywords/get.js';
12
import listKeywords from './keywords/list.js';
23

3-
export default [listKeywords];
4+
export default [listKeywords, getKeyword];
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeKeyword } from '../../serializers/keyword.js';
5+
import { notFound } from '../../utils/handlers.js';
6+
7+
export default http.get('/api/v1/keywords/:keyword_id', ({ params }) => {
8+
let keywordId = params.keyword_id;
9+
let keyword = db.keyword.findFirst({ where: { id: { equals: keywordId } } });
10+
if (!keyword) {
11+
return notFound();
12+
}
13+
14+
return HttpResponse.json({ keyword: serializeKeyword(keyword) });
15+
});
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
test('returns 404 for unknown keywords', async function () {
6+
let response = await fetch('/api/v1/keywords/foo');
7+
assert.strictEqual(response.status, 404);
8+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
9+
});
10+
11+
test('returns a keyword object for known keywords', async function () {
12+
db.keyword.create({ keyword: 'cli' });
13+
14+
let response = await fetch('/api/v1/keywords/cli');
15+
assert.strictEqual(response.status, 200);
16+
assert.deepEqual(await response.json(), {
17+
keyword: {
18+
id: 'cli',
19+
crates_cnt: 0,
20+
keyword: 'cli',
21+
},
22+
});
23+
});
24+
25+
test('calculates `crates_cnt` correctly', async function () {
26+
let cli = db.keyword.create({ keyword: 'cli' });
27+
Array.from({ length: 7 }, () => db.crate.create({ keywords: [cli] }));
28+
let notCli = db.keyword.create({ keyword: 'not-cli' });
29+
Array.from({ length: 3 }, () => db.crate.create({ keywords: [notCli] }));
30+
31+
let response = await fetch('/api/v1/keywords/cli');
32+
assert.strictEqual(response.status, 200);
33+
assert.deepEqual(await response.json(), {
34+
keyword: {
35+
id: 'cli',
36+
crates_cnt: 7,
37+
keyword: 'cli',
38+
},
39+
});
40+
});

0 commit comments

Comments
 (0)