Skip to content

Commit 732313b

Browse files
committed
msw: Implement GET /api/v1/crates/:name/:version/downloads request handler
1 parent 21c31bd commit 732313b

File tree

3 files changed

+90
-1
lines changed

3 files changed

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

5-
export default [listVersions, getVersion, dependencies];
6+
export default [listVersions, getVersion, dependencies, downloads];
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { notFound } from '../../utils/handlers.js';
5+
6+
export default http.get('/api/v1/crates/:name/:version/downloads', async ({ params }) => {
7+
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
8+
if (!crate) return notFound();
9+
10+
let version = db.version.findFirst({
11+
where: {
12+
crate: { id: { equals: crate.id } },
13+
num: { equals: params.version },
14+
},
15+
});
16+
if (!version) {
17+
let errorMessage = `crate \`${crate.name}\` does not have a version \`${params.version}\``;
18+
return HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 404 });
19+
}
20+
21+
let downloads = db.versionDownload.findMany({ where: { version: { id: { equals: version.id } } } });
22+
23+
return HttpResponse.json({
24+
version_downloads: downloads.map(download => ({
25+
date: download.date,
26+
downloads: download.downloads,
27+
version: download.version.id,
28+
})),
29+
});
30+
});
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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/downloads');
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/downloads');
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/downloads');
24+
assert.strictEqual(response.status, 200);
25+
assert.deepEqual(await response.json(), {
26+
version_downloads: [],
27+
});
28+
});
29+
30+
test('returns a list of version downloads 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+
db.versionDownload.create({ version, date: '2020-01-13' });
34+
db.versionDownload.create({ version, date: '2020-01-14' });
35+
db.versionDownload.create({ version, date: '2020-01-15' });
36+
37+
let response = await fetch('/api/v1/crates/rand/1.0.0/downloads');
38+
assert.strictEqual(response.status, 200);
39+
assert.deepEqual(await response.json(), {
40+
version_downloads: [
41+
{
42+
date: '2020-01-13',
43+
downloads: 7035,
44+
version: 1,
45+
},
46+
{
47+
date: '2020-01-14',
48+
downloads: 14_070,
49+
version: 1,
50+
},
51+
{
52+
date: '2020-01-15',
53+
downloads: 21_105,
54+
version: 1,
55+
},
56+
],
57+
});
58+
});

0 commit comments

Comments
 (0)