Skip to content

Commit e3a2ebc

Browse files
committed
msw: Implement GET /api/v1/crates/:name/downloads request handler
1 parent ab989bd commit e3a2ebc

File tree

3 files changed

+87
-1
lines changed

3 files changed

+87
-1
lines changed
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import deleteCrate from './crates/delete.js';
2+
import downloads from './crates/downloads.js';
23
import followCrate from './crates/follow.js';
34
import following from './crates/following.js';
45
import getCrate from './crates/get.js';
@@ -7,4 +8,14 @@ import teamOwners from './crates/team-owners.js';
78
import unfollowCrate from './crates/unfollow.js';
89
import userOwners from './crates/user-owners.js';
910

10-
export default [listCrates, getCrate, deleteCrate, following, followCrate, unfollowCrate, userOwners, teamOwners];
11+
export default [
12+
listCrates,
13+
getCrate,
14+
deleteCrate,
15+
following,
16+
followCrate,
17+
unfollowCrate,
18+
userOwners,
19+
teamOwners,
20+
downloads,
21+
];
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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/downloads', async ({ params }) => {
7+
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
8+
if (!crate) return notFound();
9+
10+
let downloads = db.versionDownload.findMany({ where: { version: { crate: { id: { equals: crate.id } } } } });
11+
12+
return HttpResponse.json({
13+
version_downloads: downloads.map(download => ({
14+
date: download.date,
15+
downloads: download.downloads,
16+
version: download.version.id,
17+
})),
18+
meta: { extra_downloads: crate._extra_downloads },
19+
});
20+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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/downloads');
7+
assert.strictEqual(response.status, 404);
8+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
9+
});
10+
11+
test('empty case', async function () {
12+
db.crate.create({ name: 'rand' });
13+
14+
let response = await fetch('/api/v1/crates/rand/downloads');
15+
assert.strictEqual(response.status, 200);
16+
assert.deepEqual(await response.json(), {
17+
version_downloads: [],
18+
meta: {
19+
extra_downloads: [],
20+
},
21+
});
22+
});
23+
24+
test('returns a list of version downloads belonging to the specified crate version', async function () {
25+
let crate = db.crate.create({ name: 'rand' });
26+
let versions = Array.from({ length: 2 }, () => db.version.create({ crate }));
27+
db.versionDownload.create({ version: versions[0], date: '2020-01-13' });
28+
db.versionDownload.create({ version: versions[1], date: '2020-01-14' });
29+
db.versionDownload.create({ version: versions[1], date: '2020-01-15' });
30+
31+
let response = await fetch('/api/v1/crates/rand/downloads');
32+
assert.strictEqual(response.status, 200);
33+
assert.deepEqual(await response.json(), {
34+
version_downloads: [
35+
{
36+
date: '2020-01-13',
37+
downloads: 7035,
38+
version: 1,
39+
},
40+
{
41+
date: '2020-01-14',
42+
downloads: 14_070,
43+
version: 2,
44+
},
45+
{
46+
date: '2020-01-15',
47+
downloads: 21_105,
48+
version: 2,
49+
},
50+
],
51+
meta: {
52+
extra_downloads: [],
53+
},
54+
});
55+
});

0 commit comments

Comments
 (0)