Skip to content

Commit 21c31bd

Browse files
committed
msw: Implement GET /api/v1/crates/:name/:version/dependencies request handler
1 parent 8bd19ed commit 21c31bd

File tree

3 files changed

+109
-1
lines changed

3 files changed

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

4-
export default [listVersions, getVersion];
5+
export default [listVersions, getVersion, dependencies];
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeDependency } from '../../serializers/dependency.js';
5+
import { notFound } from '../../utils/handlers.js';
6+
7+
export default http.get('/api/v1/crates/:name/:version/dependencies', 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+
let dependencies = db.dependency.findMany({ where: { version: { id: { equals: version.id } } } });
23+
24+
return HttpResponse.json({
25+
dependencies: dependencies.map(d => serializeDependency(d)),
26+
});
27+
});
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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/dependencies');
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+
db.crate.create({ name: 'rand' });
13+
14+
let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies');
15+
assert.strictEqual(response.status, 404);
16+
assert.deepEqual(await response.json(), { errors: [{ detail: 'crate `rand` does not have a version `1.0.0`' }] });
17+
});
18+
19+
test('empty case', async function () {
20+
let crate = db.crate.create({ name: 'rand' });
21+
db.version.create({ crate, num: '1.0.0' });
22+
23+
let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies');
24+
assert.strictEqual(response.status, 200);
25+
assert.deepEqual(await response.json(), {
26+
dependencies: [],
27+
});
28+
});
29+
30+
test('returns a list of dependencies belonging to the specified crate version', async function () {
31+
let crate = db.crate.create({ name: 'rand' });
32+
let version = db.version.create({ crate, num: '1.0.0' });
33+
34+
let foo = db.crate.create({ name: 'foo' });
35+
db.dependency.create({ crate: foo, version });
36+
let bar = db.crate.create({ name: 'bar' });
37+
db.dependency.create({ crate: bar, version });
38+
let baz = db.crate.create({ name: 'baz' });
39+
db.dependency.create({ crate: baz, version });
40+
41+
let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies');
42+
assert.strictEqual(response.status, 200);
43+
assert.deepEqual(await response.json(), {
44+
dependencies: [
45+
{
46+
id: 1,
47+
crate_id: 'foo',
48+
default_features: false,
49+
features: [],
50+
kind: 'normal',
51+
optional: true,
52+
req: '^2.1.3',
53+
target: null,
54+
version_id: 1,
55+
},
56+
{
57+
id: 2,
58+
crate_id: 'bar',
59+
default_features: false,
60+
features: [],
61+
kind: 'normal',
62+
optional: true,
63+
req: '0.3.7',
64+
target: null,
65+
version_id: 1,
66+
},
67+
{
68+
id: 3,
69+
crate_id: 'baz',
70+
default_features: true,
71+
features: [],
72+
kind: 'dev',
73+
optional: false,
74+
req: '~5.2.12',
75+
target: null,
76+
version_id: 1,
77+
},
78+
],
79+
});
80+
});

0 commit comments

Comments
 (0)