Skip to content

Commit 7f4e033

Browse files
committed
msw: Add ?include=versions support for GET /api/v1/crates/:name/downloads
1 parent bb11f79 commit 7f4e033

File tree

2 files changed

+90
-4
lines changed

2 files changed

+90
-4
lines changed
Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
11
import { http, HttpResponse } from 'msw';
22

33
import { db } from '../../index.js';
4+
import { serializeVersion } from '../../serializers/version.js';
45
import { notFound } from '../../utils/handlers.js';
56

6-
export default http.get('/api/v1/crates/:name/downloads', async ({ params }) => {
7+
export default http.get('/api/v1/crates/:name/downloads', async ({ request, params }) => {
78
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
89
if (!crate) return notFound();
910

1011
let downloads = db.versionDownload.findMany({ where: { version: { crate: { id: { equals: crate.id } } } } });
11-
12-
return HttpResponse.json({
12+
let resp = {
1313
version_downloads: downloads.map(download => ({
1414
date: download.date,
1515
downloads: download.downloads,
1616
version: download.version.id,
1717
})),
1818
meta: { extra_downloads: crate._extra_downloads },
19-
});
19+
};
20+
21+
let url = new URL(request.url);
22+
let include = url.searchParams.get('include') ?? '';
23+
let includes = include ? include.split(',') : [];
24+
if (includes.includes('versions')) {
25+
let versions = [...new Set(downloads.map(it => it.version))];
26+
resp.versions = versions.map(it => serializeVersion(it));
27+
}
28+
return HttpResponse.json(resp);
2029
});

packages/crates-io-msw/handlers/crates/downloads.test.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,80 @@ test('returns a list of version downloads belonging to the specified crate versi
5353
},
5454
});
5555
});
56+
57+
test('includes related versions', async function () {
58+
let crate = db.crate.create({ name: 'rand' });
59+
let versions = Array.from({ length: 2 }, () => db.version.create({ crate }));
60+
db.versionDownload.create({ version: versions[0], date: '2020-01-13' });
61+
db.versionDownload.create({ version: versions[1], date: '2020-01-14' });
62+
db.versionDownload.create({ version: versions[1], date: '2020-01-15' });
63+
64+
let response = await fetch('/api/v1/crates/rand/downloads?include=versions');
65+
assert.strictEqual(response.status, 200);
66+
assert.deepEqual(await response.json(), {
67+
version_downloads: [
68+
{
69+
date: '2020-01-13',
70+
downloads: 7035,
71+
version: 1,
72+
},
73+
{
74+
date: '2020-01-14',
75+
downloads: 14_070,
76+
version: 2,
77+
},
78+
{
79+
date: '2020-01-15',
80+
downloads: 21_105,
81+
version: 2,
82+
},
83+
],
84+
versions: [
85+
{
86+
crate: 'rand',
87+
crate_size: 162_963,
88+
created_at: '2010-06-16T21:30:45Z',
89+
dl_path: '/api/v1/crates/rand/1.0.0/download',
90+
downloads: 3702,
91+
features: {},
92+
id: 1,
93+
license: 'MIT',
94+
links: {
95+
dependencies: '/api/v1/crates/rand/1.0.0/dependencies',
96+
version_downloads: '/api/v1/crates/rand/1.0.0/downloads',
97+
},
98+
num: '1.0.0',
99+
published_by: null,
100+
readme_path: '/api/v1/crates/rand/1.0.0/readme',
101+
rust_version: null,
102+
updated_at: '2017-02-24T12:34:56Z',
103+
yank_message: null,
104+
yanked: false,
105+
},
106+
{
107+
crate: 'rand',
108+
crate_size: 325_926,
109+
created_at: '2010-06-16T21:30:45Z',
110+
dl_path: '/api/v1/crates/rand/1.0.1/download',
111+
downloads: 7404,
112+
features: {},
113+
id: 2,
114+
license: 'Apache-2.0',
115+
links: {
116+
dependencies: '/api/v1/crates/rand/1.0.1/dependencies',
117+
version_downloads: '/api/v1/crates/rand/1.0.1/downloads',
118+
},
119+
num: '1.0.1',
120+
published_by: null,
121+
readme_path: '/api/v1/crates/rand/1.0.1/readme',
122+
rust_version: null,
123+
updated_at: '2017-02-24T12:34:56Z',
124+
yank_message: null,
125+
yanked: false,
126+
},
127+
],
128+
meta: {
129+
extra_downloads: [],
130+
},
131+
});
132+
});

0 commit comments

Comments
 (0)