Skip to content

Commit f4ac8fc

Browse files
authored
Merge pull request #9791 from Turbo87/mirage-patch-version
mirage: Implement `PATCH /crates/:name/:version` route handler
2 parents eacae21 + 22e1e75 commit f4ac8fc

File tree

3 files changed

+150
-2
lines changed

3 files changed

+150
-2
lines changed

mirage/route-handlers/crates.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,32 @@ export function register(server) {
264264
return { ok: true, msg: 'owners successfully removed' };
265265
});
266266

267+
server.patch('/api/v1/crates/:name/:version', function (schema, request) {
268+
let { user } = getSession(schema);
269+
if (!user) {
270+
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
271+
}
272+
273+
const { name, version: versionNum } = request.params;
274+
const crate = schema.crates.findBy({ name });
275+
if (!crate) {
276+
return notFound();
277+
}
278+
279+
const version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
280+
if (!version) {
281+
return notFound();
282+
}
283+
284+
const body = JSON.parse(request.requestBody);
285+
version.update({
286+
yanked: body.version.yanked,
287+
yank_message: body.version.yanked ? body.version.yank_message || null : null,
288+
});
289+
290+
return this.serialize(version);
291+
});
292+
267293
server.delete('/api/v1/crates/:name/:version/yank', (schema, request) => {
268294
let { user } = getSession(schema);
269295
if (!user) {
@@ -303,7 +329,7 @@ export function register(server) {
303329
return notFound();
304330
}
305331

306-
version.update({ yanked: false });
332+
version.update({ yanked: false, yank_message: null });
307333

308334
return { ok: true };
309335
});
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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+
const YANK_BODY = JSON.stringify({
9+
version: {
10+
yanked: true,
11+
yank_message: 'some reason',
12+
},
13+
});
14+
15+
const UNYANK_BODY = JSON.stringify({
16+
version: {
17+
yanked: false,
18+
},
19+
});
20+
21+
module('Mirage | PATCH /api/v1/crates/:crate/:version', function (hooks) {
22+
setupTest(hooks);
23+
setupMirage(hooks);
24+
25+
test('returns 403 if unauthenticated', async function (assert) {
26+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
27+
assert.strictEqual(response.status, 403);
28+
assert.deepEqual(await response.json(), {
29+
errors: [{ detail: 'must be logged in to perform that action' }],
30+
});
31+
});
32+
33+
test('returns 404 for unknown crates', async function (assert) {
34+
let user = this.server.create('user');
35+
this.authenticateAs(user);
36+
37+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
38+
assert.strictEqual(response.status, 404);
39+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
40+
});
41+
42+
test('returns 404 for unknown versions', async function (assert) {
43+
this.server.create('crate', { name: 'foo' });
44+
45+
let user = this.server.create('user');
46+
this.authenticateAs(user);
47+
48+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
49+
assert.strictEqual(response.status, 404);
50+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
51+
});
52+
53+
test('yanks the version', async function (assert) {
54+
let crate = this.server.create('crate', { name: 'foo' });
55+
let version = this.server.create('version', { crate, num: '1.0.0', yanked: false });
56+
assert.false(version.yanked);
57+
assert.strictEqual(version.yank_message, null);
58+
59+
let user = this.server.create('user');
60+
this.authenticateAs(user);
61+
62+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
63+
assert.strictEqual(response.status, 200);
64+
assert.deepEqual(await response.json(), {
65+
version: {
66+
crate: 'foo',
67+
crate_size: 0,
68+
created_at: '2010-06-16T21:30:45Z',
69+
dl_path: '/api/v1/crates/foo/1.0.0/download',
70+
downloads: 0,
71+
id: '1',
72+
license: 'MIT/Apache-2.0',
73+
links: {
74+
dependencies: '/api/v1/crates/foo/1.0.0/dependencies',
75+
version_downloads: '/api/v1/crates/foo/1.0.0/downloads',
76+
},
77+
num: '1.0.0',
78+
published_by: null,
79+
readme_path: '/api/v1/crates/foo/1.0.0/readme',
80+
rust_version: null,
81+
updated_at: '2017-02-24T12:34:56Z',
82+
yank_message: 'some reason',
83+
yanked: true,
84+
},
85+
});
86+
87+
user.reload();
88+
assert.true(version.yanked);
89+
assert.strictEqual(version.yank_message, 'some reason');
90+
91+
response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: UNYANK_BODY });
92+
assert.strictEqual(response.status, 200);
93+
assert.deepEqual(await response.json(), {
94+
version: {
95+
crate: 'foo',
96+
crate_size: 0,
97+
created_at: '2010-06-16T21:30:45Z',
98+
dl_path: '/api/v1/crates/foo/1.0.0/download',
99+
downloads: 0,
100+
id: '1',
101+
license: 'MIT/Apache-2.0',
102+
links: {
103+
dependencies: '/api/v1/crates/foo/1.0.0/dependencies',
104+
version_downloads: '/api/v1/crates/foo/1.0.0/downloads',
105+
},
106+
num: '1.0.0',
107+
published_by: null,
108+
readme_path: '/api/v1/crates/foo/1.0.0/readme',
109+
rust_version: null,
110+
updated_at: '2017-02-24T12:34:56Z',
111+
yank_message: null,
112+
yanked: false,
113+
},
114+
});
115+
116+
user.reload();
117+
assert.false(version.yanked);
118+
assert.strictEqual(version.yank_message, null);
119+
});
120+
});

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ module('Mirage | PUT /api/v1/crates/:crateId/unyank', function (hooks) {
3939

4040
test('unyanks the version', async function (assert) {
4141
let crate = this.server.create('crate', { name: 'foo' });
42-
let version = this.server.create('version', { crate, num: '1.0.0', yanked: true });
42+
let version = this.server.create('version', { crate, num: '1.0.0', yanked: true, yank_message: 'some reason' });
4343
assert.true(version.yanked);
44+
assert.strictEqual(version.yank_message, 'some reason');
4445

4546
let user = this.server.create('user');
4647
this.authenticateAs(user);
@@ -51,5 +52,6 @@ module('Mirage | PUT /api/v1/crates/:crateId/unyank', function (hooks) {
5152

5253
user.reload();
5354
assert.false(version.yanked);
55+
assert.strictEqual(version.yank_message, null);
5456
});
5557
});

0 commit comments

Comments
 (0)