From e2e3e9be724b490b1b7393ddc13178b278807370 Mon Sep 17 00:00:00 2001 From: eth3lbert Date: Wed, 1 Jan 2025 13:20:10 +0800 Subject: [PATCH] mirage: Add `include=default_version` support for `GET /api/v1/crates/:id` --- mirage/route-handlers/crates.js | 8 +++++ mirage/serializers/crate.js | 8 ++++- tests/mirage/crates/get-by-id-test.js | 43 +++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index 8633ae7f93f..f014a47607f 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -59,6 +59,8 @@ export function register(server) { let crate = schema.crates.findBy({ name }); if (!crate) return notFound(); let serialized = this.serialize(crate); + let includes = request.queryParams?.include ?? ''; + let includeDefaultVersion = includes.includes('default_version') && !includes.includes('versions'); return { categories: null, keywords: null, @@ -67,6 +69,12 @@ export function register(server) { ...(serialized.crate.categories && this.serialize(crate.categories)), ...(serialized.crate.keywords && this.serialize(crate.keywords)), ...(serialized.crate.versions && this.serialize(crate.versions.sort((a, b) => Number(b.id) - Number(a.id)))), + // `default_version` share the same key `versions` + ...(includeDefaultVersion && { + versions: [serialized.crate.default_version].map( + num => this.serialize(schema.versions.findBy({ num })).version, + ), + }), }; }); diff --git a/mirage/serializers/crate.js b/mirage/serializers/crate.js index bb9ee87f125..15f81136390 100644 --- a/mirage/serializers/crate.js +++ b/mirage/serializers/crate.js @@ -6,7 +6,13 @@ import semverSort from 'semver/functions/rsort'; import { compareIsoDates } from '../route-handlers/-utils'; import BaseSerializer from './application'; -const VALID_INCLUDE_MODEL = new Set(['versions', 'keywords', 'categories' /*, 'badges', 'downloads' */]); +const VALID_INCLUDE_MODEL = new Set([ + 'versions', + 'default_version', + 'keywords', + 'categories', + /*, 'badges', 'downloads' */ +]); export default BaseSerializer.extend({ include(request) { diff --git a/tests/mirage/crates/get-by-id-test.js b/tests/mirage/crates/get-by-id-test.js index 461078b9e4d..712ea30b89a 100644 --- a/tests/mirage/crates/get-by-id-test.js +++ b/tests/mirage/crates/get-by-id-test.js @@ -223,4 +223,47 @@ module('Mirage | GET /api/v1/crates/:id', function (hooks) { versions: null, }); }); + test('includes default_version', async function (assert) { + let crate = this.server.create('crate', { name: 'rand' }); + this.server.create('version', { crate, num: '1.0.0' }); + this.server.create('version', { crate, num: '1.1.0' }); + this.server.create('version', { crate, num: '1.2.0' }); + + let req = await fetch('/api/v1/crates/rand'); + let expected = await req.json(); + + let response = await fetch('/api/v1/crates/rand?include=default_version'); + assert.strictEqual(response.status, 200); + + let responsePayload = await response.json(); + let default_version = expected.versions.find(it => it.num === responsePayload.crate.default_version); + assert.deepEqual(responsePayload, { + ...expected, + crate: { + ...expected.crate, + categories: null, + keywords: null, + max_version: '0.0.0', + newest_version: '0.0.0', + max_stable_version: null, + versions: null, + }, + categories: null, + keywords: null, + versions: [default_version], + }); + + let resp_both = await fetch('/api/v1/crates/rand?include=versions,default_version'); + assert.strictEqual(response.status, 200); + assert.deepEqual(await resp_both.json(), { + ...expected, + crate: { + ...expected.crate, + categories: null, + keywords: null, + }, + categories: null, + keywords: null, + }); + }); });