Skip to content

Commit 281a1eb

Browse files
authored
Merge pull request #10332 from eth3lbert/mirage-crate-version
mirage: Maintains crate version-related handling
2 parents fc78f3d + e20b903 commit 281a1eb

File tree

10 files changed

+121
-38
lines changed

10 files changed

+121
-38
lines changed

mirage/route-handlers/crates.js

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -167,38 +167,53 @@ export function register(server) {
167167
return resp;
168168
});
169169

170-
server.get('/api/v1/crates/:name/:version_num/authors', (schema, request) => {
170+
server.get('/api/v1/crates/:name/:version/authors', (schema, request) => {
171171
let { name } = request.params;
172172
let crate = schema.crates.findBy({ name });
173173
if (!crate) return notFound();
174174

175-
let num = request.params.version_num;
175+
let num = request.params.version;
176176
let version = schema.versions.findBy({ crateId: crate.id, num });
177-
if (!version) return { errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] };
177+
if (!version)
178+
return new Response(
179+
404,
180+
{},
181+
{ errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] },
182+
);
178183

179184
return { meta: { names: [] }, users: [] };
180185
});
181186

182-
server.get('/api/v1/crates/:name/:version_num/dependencies', (schema, request) => {
187+
server.get('/api/v1/crates/:name/:version/dependencies', (schema, request) => {
183188
let { name } = request.params;
184189
let crate = schema.crates.findBy({ name });
185190
if (!crate) return notFound();
186191

187-
let num = request.params.version_num;
192+
let num = request.params.version;
188193
let version = schema.versions.findBy({ crateId: crate.id, num });
189-
if (!version) return { errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] };
194+
if (!version)
195+
return new Response(
196+
404,
197+
{},
198+
{ errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] },
199+
);
190200

191201
return schema.dependencies.where({ versionId: version.id });
192202
});
193203

194-
server.get('/api/v1/crates/:name/:version_num/downloads', function (schema, request) {
204+
server.get('/api/v1/crates/:name/:version/downloads', function (schema, request) {
195205
let { name } = request.params;
196206
let crate = schema.crates.findBy({ name });
197207
if (!crate) return notFound();
198208

199-
let versionNum = request.params.version_num;
200-
let version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
201-
if (!version) return { errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${versionNum}\`` }] };
209+
let num = request.params.version;
210+
let version = schema.versions.findBy({ crateId: crate.id, num });
211+
if (!version)
212+
return new Response(
213+
404,
214+
{},
215+
{ errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] },
216+
);
202217

203218
return schema.versionDownloads.where({ versionId: version.id });
204219
});
@@ -339,19 +354,36 @@ export function register(server) {
339354
return { ok: true, msg: 'owners successfully removed' };
340355
});
341356

357+
server.get('/api/v1/crates/:name/:version', function (schema, request) {
358+
let { name } = request.params;
359+
let crate = schema.crates.findBy({ name });
360+
if (!crate) return notFound();
361+
362+
let num = request.params.version;
363+
let version = schema.versions.findBy({ crateId: crate.id, num });
364+
if (!version) {
365+
return new Response(
366+
404,
367+
{},
368+
{ errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] },
369+
);
370+
}
371+
return this.serialize(version);
372+
});
373+
342374
server.patch('/api/v1/crates/:name/:version', function (schema, request) {
343375
let { user } = getSession(schema);
344376
if (!user) {
345377
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
346378
}
347379

348-
const { name, version: versionNum } = request.params;
380+
const { name, version: num } = request.params;
349381
const crate = schema.crates.findBy({ name });
350382
if (!crate) {
351383
return notFound();
352384
}
353385

354-
const version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
386+
const version = schema.versions.findBy({ crateId: crate.id, num });
355387
if (!version) {
356388
return notFound();
357389
}
@@ -371,13 +403,13 @@ export function register(server) {
371403
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
372404
}
373405

374-
const { name, version: versionNum } = request.params;
406+
const { name, version: num } = request.params;
375407
const crate = schema.crates.findBy({ name });
376408
if (!crate) {
377409
return notFound();
378410
}
379411

380-
const version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
412+
const version = schema.versions.findBy({ crateId: crate.id, num });
381413
if (!version) {
382414
return notFound();
383415
}
@@ -393,13 +425,13 @@ export function register(server) {
393425
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
394426
}
395427

396-
const { name, version: versionNum } = request.params;
428+
const { name, version: num } = request.params;
397429
const crate = schema.crates.findBy({ name });
398430
if (!crate) {
399431
return notFound();
400432
}
401433

402-
const version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
434+
const version = schema.versions.findBy({ crateId: crate.id, num });
403435
if (!version) {
404436
return notFound();
405437
}
@@ -410,13 +442,13 @@ export function register(server) {
410442
});
411443

412444
server.get('/api/v1/crates/:name/:version/readme', (schema, request) => {
413-
const { name, version: versionNum } = request.params;
445+
const { name, version: num } = request.params;
414446
const crate = schema.crates.findBy({ name });
415447
if (!crate) {
416448
return new Response(403, { 'Content-Type': 'text/html' }, '');
417449
}
418450

419-
const version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
451+
const version = schema.versions.findBy({ crateId: crate.id, num });
420452
if (!version || !version.readme) {
421453
return new Response(403, { 'Content-Type': 'text/html' }, '');
422454
}

tests/mirage/crates/versions/authors-test.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'fetch';
55
import { setupTest } from '../../../helpers';
66
import setupMirage from '../../../helpers/setup-mirage';
77

8-
module('Mirage | GET /api/v1/crates/:id/:version/authors', function (hooks) {
8+
module('Mirage | GET /api/v1/crates/:name/:version/authors', function (hooks) {
99
setupTest(hooks);
1010
setupMirage(hooks);
1111

@@ -15,13 +15,11 @@ module('Mirage | GET /api/v1/crates/:id/:version/authors', function (hooks) {
1515
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
1616
});
1717

18-
test('returns 200 for unknown versions', async function (assert) {
18+
test('returns 404 for unknown versions', async function (assert) {
1919
this.server.create('crate', { name: 'rand' });
2020

2121
let response = await fetch('/api/v1/crates/rand/1.0.0/authors');
22-
// we should probably return 404 for this, but the production API
23-
// currently doesn't do this either
24-
assert.strictEqual(response.status, 200);
22+
assert.strictEqual(response.status, 404);
2523
assert.deepEqual(await response.json(), { errors: [{ detail: 'crate `rand` does not have a version `1.0.0`' }] });
2624
});
2725

tests/mirage/crates/versions/dependencies-test.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'fetch';
55
import { setupTest } from '../../../helpers';
66
import setupMirage from '../../../helpers/setup-mirage';
77

8-
module('Mirage | GET /api/v1/crates/:id/:version/dependencies', function (hooks) {
8+
module('Mirage | GET /api/v1/crates/:name/:version/dependencies', function (hooks) {
99
setupTest(hooks);
1010
setupMirage(hooks);
1111

@@ -15,13 +15,11 @@ module('Mirage | GET /api/v1/crates/:id/:version/dependencies', function (hooks)
1515
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
1616
});
1717

18-
test('returns 200 for unknown versions', async function (assert) {
18+
test('returns 404 for unknown versions', async function (assert) {
1919
this.server.create('crate', { name: 'rand' });
2020

2121
let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies');
22-
// we should probably return 404 for this, but the production API
23-
// currently doesn't do this either
24-
assert.strictEqual(response.status, 200);
22+
assert.strictEqual(response.status, 404);
2523
assert.deepEqual(await response.json(), { errors: [{ detail: 'crate `rand` does not have a version `1.0.0`' }] });
2624
});
2725

tests/mirage/crates/versions/downloads-test.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'fetch';
55
import { setupTest } from '../../../helpers';
66
import setupMirage from '../../../helpers/setup-mirage';
77

8-
module('Mirage | GET /api/v1/crates/:id/:version/downloads', function (hooks) {
8+
module('Mirage | GET /api/v1/crates/:name/:version/downloads', function (hooks) {
99
setupTest(hooks);
1010
setupMirage(hooks);
1111

@@ -15,13 +15,11 @@ module('Mirage | GET /api/v1/crates/:id/:version/downloads', function (hooks) {
1515
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
1616
});
1717

18-
test('returns 200 for unknown versions', async function (assert) {
18+
test('returns 404 for unknown versions', async function (assert) {
1919
this.server.create('crate', { name: 'rand' });
2020

2121
let response = await fetch('/api/v1/crates/rand/1.0.0/downloads');
22-
// we should probably return 404 for this, but the production API
23-
// currently doesn't do this either
24-
assert.strictEqual(response.status, 200);
22+
assert.strictEqual(response.status, 404);
2523
assert.deepEqual(await response.json(), { errors: [{ detail: 'crate `rand` does not have a version `1.0.0`' }] });
2624
});
2725

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { module, test } from 'qunit';
2+
3+
import fetch from 'fetch';
4+
5+
import { setupTest } from '../../../helpers';
6+
import setupMirage from '../../../helpers/setup-mirage';
7+
8+
module('Mirage | GET /api/v1/crates/:name/:version', function (hooks) {
9+
setupTest(hooks);
10+
setupMirage(hooks);
11+
12+
test('returns 404 for unknown crates', async function (assert) {
13+
let response = await fetch('/api/v1/crates/foo/1.0.0-beta.1');
14+
assert.strictEqual(response.status, 404);
15+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
16+
});
17+
18+
test('returns 404 for unknown versions', async function (assert) {
19+
let crate = this.server.create('crate', { name: 'rand' });
20+
this.server.create('version', { crate, num: '1.0.0-alpha.1' });
21+
let response = await fetch('/api/v1/crates/rand/1.0.0-beta.1');
22+
assert.strictEqual(response.status, 404);
23+
assert.deepEqual(await response.json(), {
24+
errors: [{ detail: 'crate `rand` does not have a version `1.0.0-beta.1`' }],
25+
});
26+
});
27+
28+
test('returns a version object for known version', async function (assert) {
29+
let crate = this.server.create('crate', { name: 'rand' });
30+
this.server.create('version', { crate, num: '1.0.0-beta.1' });
31+
32+
let response = await fetch('/api/v1/crates/rand/1.0.0-beta.1');
33+
assert.strictEqual(response.status, 200);
34+
assert.deepEqual(await response.json(), {
35+
version: {
36+
crate: 'rand',
37+
crate_size: 0,
38+
created_at: '2010-06-16T21:30:45Z',
39+
dl_path: '/api/v1/crates/rand/1.0.0-beta.1/download',
40+
downloads: 0,
41+
id: '1',
42+
license: 'MIT/Apache-2.0',
43+
links: {
44+
dependencies: '/api/v1/crates/rand/1.0.0-beta.1/dependencies',
45+
version_downloads: '/api/v1/crates/rand/1.0.0-beta.1/downloads',
46+
},
47+
num: '1.0.0-beta.1',
48+
published_by: null,
49+
readme_path: '/api/v1/crates/rand/1.0.0-beta.1/readme',
50+
rust_version: null,
51+
updated_at: '2017-02-24T12:34:56Z',
52+
yank_message: null,
53+
yanked: false,
54+
},
55+
});
56+
});
57+
});

tests/mirage/crates/versions/list-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'fetch';
55
import { setupTest } from '../../../helpers';
66
import setupMirage from '../../../helpers/setup-mirage';
77

8-
module('Mirage | GET /api/v1/crates/:id/versions', function (hooks) {
8+
module('Mirage | GET /api/v1/crates/:name/versions', function (hooks) {
99
setupTest(hooks);
1010
setupMirage(hooks);
1111

tests/mirage/crates/versions/patch-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const UNYANK_BODY = JSON.stringify({
1818
},
1919
});
2020

21-
module('Mirage | PATCH /api/v1/crates/:crate/:version', function (hooks) {
21+
module('Mirage | PATCH /api/v1/crates/:name/:version', function (hooks) {
2222
setupTest(hooks);
2323
setupMirage(hooks);
2424

tests/mirage/crates/versions/readme-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'fetch';
55
import { setupTest } from '../../../helpers';
66
import setupMirage from '../../../helpers/setup-mirage';
77

8-
module('Mirage | GET /api/v1/crates/:id/:version/readme', function (hooks) {
8+
module('Mirage | GET /api/v1/crates/:name/:version/readme', function (hooks) {
99
setupTest(hooks);
1010
setupMirage(hooks);
1111

tests/mirage/crates/versions/yank/unyank-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'fetch';
55
import { setupTest } from '../../../../helpers';
66
import setupMirage from '../../../../helpers/setup-mirage';
77

8-
module('Mirage | PUT /api/v1/crates/:crateId/unyank', function (hooks) {
8+
module('Mirage | PUT /api/v1/crates/:name/unyank', function (hooks) {
99
setupTest(hooks);
1010
setupMirage(hooks);
1111

tests/mirage/crates/versions/yank/yank-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'fetch';
55
import { setupTest } from '../../../../helpers';
66
import setupMirage from '../../../../helpers/setup-mirage';
77

8-
module('Mirage | DELETE /api/v1/crates/:crateId/yank', function (hooks) {
8+
module('Mirage | DELETE /api/v1/crates/:name/yank', function (hooks) {
99
setupTest(hooks);
1010
setupMirage(hooks);
1111

0 commit comments

Comments
 (0)