Skip to content

Commit 9127efd

Browse files
authored
mirage: Add include=default_version support for GET /api/v1/crates/:id (#10301)
1 parent 50b1bc2 commit 9127efd

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

mirage/route-handlers/crates.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ export function register(server) {
5959
let crate = schema.crates.findBy({ name });
6060
if (!crate) return notFound();
6161
let serialized = this.serialize(crate);
62+
let includes = request.queryParams?.include ?? '';
63+
let includeDefaultVersion = includes.includes('default_version') && !includes.includes('versions');
6264
return {
6365
categories: null,
6466
keywords: null,
@@ -67,6 +69,12 @@ export function register(server) {
6769
...(serialized.crate.categories && this.serialize(crate.categories)),
6870
...(serialized.crate.keywords && this.serialize(crate.keywords)),
6971
...(serialized.crate.versions && this.serialize(crate.versions.sort((a, b) => Number(b.id) - Number(a.id)))),
72+
// `default_version` share the same key `versions`
73+
...(includeDefaultVersion && {
74+
versions: [serialized.crate.default_version].map(
75+
num => this.serialize(schema.versions.findBy({ num })).version,
76+
),
77+
}),
7078
};
7179
});
7280

mirage/serializers/crate.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ import semverSort from 'semver/functions/rsort';
66
import { compareIsoDates } from '../route-handlers/-utils';
77
import BaseSerializer from './application';
88

9-
const VALID_INCLUDE_MODEL = new Set(['versions', 'keywords', 'categories' /*, 'badges', 'downloads' */]);
9+
const VALID_INCLUDE_MODEL = new Set([
10+
'versions',
11+
'default_version',
12+
'keywords',
13+
'categories',
14+
/*, 'badges', 'downloads' */
15+
]);
1016

1117
export default BaseSerializer.extend({
1218
include(request) {

tests/mirage/crates/get-by-id-test.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,47 @@ module('Mirage | GET /api/v1/crates/:id', function (hooks) {
223223
versions: null,
224224
});
225225
});
226+
test('includes default_version', async function (assert) {
227+
let crate = this.server.create('crate', { name: 'rand' });
228+
this.server.create('version', { crate, num: '1.0.0' });
229+
this.server.create('version', { crate, num: '1.1.0' });
230+
this.server.create('version', { crate, num: '1.2.0' });
231+
232+
let req = await fetch('/api/v1/crates/rand');
233+
let expected = await req.json();
234+
235+
let response = await fetch('/api/v1/crates/rand?include=default_version');
236+
assert.strictEqual(response.status, 200);
237+
238+
let responsePayload = await response.json();
239+
let default_version = expected.versions.find(it => it.num === responsePayload.crate.default_version);
240+
assert.deepEqual(responsePayload, {
241+
...expected,
242+
crate: {
243+
...expected.crate,
244+
categories: null,
245+
keywords: null,
246+
max_version: '0.0.0',
247+
newest_version: '0.0.0',
248+
max_stable_version: null,
249+
versions: null,
250+
},
251+
categories: null,
252+
keywords: null,
253+
versions: [default_version],
254+
});
255+
256+
let resp_both = await fetch('/api/v1/crates/rand?include=versions,default_version');
257+
assert.strictEqual(response.status, 200);
258+
assert.deepEqual(await resp_both.json(), {
259+
...expected,
260+
crate: {
261+
...expected.crate,
262+
categories: null,
263+
keywords: null,
264+
},
265+
categories: null,
266+
keywords: null,
267+
});
268+
});
226269
});

0 commit comments

Comments
 (0)