Skip to content

Commit e5311c3

Browse files
committed
msw: Implement GET /api/v1/crates/:name/:version request handler
1 parent 1689a30 commit e5311c3

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import getVersion from './versions/get.js';
12
import listVersions from './versions/list.js';
23

3-
export default [listVersions];
4+
export default [listVersions, getVersion];
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeVersion } from '../../serializers/version.js';
5+
import { notFound } from '../../utils/handlers.js';
6+
7+
export default http.get('/api/v1/crates/:name/:version', async ({ params }) => {
8+
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
9+
if (!crate) return notFound();
10+
11+
let version = db.version.findFirst({
12+
where: {
13+
crate: { id: { equals: crate.id } },
14+
num: { equals: params.version },
15+
},
16+
});
17+
if (!version) {
18+
let errorMessage = `crate \`${crate.name}\` does not have a version \`${params.version}\``;
19+
return HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 404 });
20+
}
21+
22+
return HttpResponse.json({
23+
version: serializeVersion(version),
24+
});
25+
});
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
test('returns 404 for unknown crates', async function () {
6+
let response = await fetch('/api/v1/crates/foo/1.0.0-beta.1');
7+
assert.strictEqual(response.status, 404);
8+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
9+
});
10+
11+
test('returns 404 for unknown versions', async function () {
12+
let crate = db.crate.create({ name: 'rand' });
13+
db.version.create({ crate, num: '1.0.0-alpha.1' });
14+
let response = await fetch('/api/v1/crates/rand/1.0.0-beta.1');
15+
assert.strictEqual(response.status, 404);
16+
assert.deepEqual(await response.json(), {
17+
errors: [{ detail: 'crate `rand` does not have a version `1.0.0-beta.1`' }],
18+
});
19+
});
20+
21+
test('returns a version object for known version', async function () {
22+
let crate = db.crate.create({ name: 'rand' });
23+
db.version.create({ crate, num: '1.0.0-beta.1' });
24+
25+
let response = await fetch('/api/v1/crates/rand/1.0.0-beta.1');
26+
assert.strictEqual(response.status, 200);
27+
assert.deepEqual(await response.json(), {
28+
version: {
29+
crate: 'rand',
30+
crate_size: 162_963,
31+
created_at: '2010-06-16T21:30:45Z',
32+
dl_path: '/api/v1/crates/rand/1.0.0-beta.1/download',
33+
downloads: 3702,
34+
features: {},
35+
id: 1,
36+
license: 'MIT',
37+
links: {
38+
dependencies: '/api/v1/crates/rand/1.0.0-beta.1/dependencies',
39+
version_downloads: '/api/v1/crates/rand/1.0.0-beta.1/downloads',
40+
},
41+
num: '1.0.0-beta.1',
42+
published_by: null,
43+
readme_path: '/api/v1/crates/rand/1.0.0-beta.1/readme',
44+
rust_version: null,
45+
updated_at: '2017-02-24T12:34:56Z',
46+
yank_message: null,
47+
yanked: false,
48+
},
49+
});
50+
});

0 commit comments

Comments
 (0)