Skip to content

Commit 809e372

Browse files
authored
Merge pull request #9788 from Turbo87/fix-mirage-yank
mirage: Fix yank/unyank route handlers
2 parents f2ee2be + fa7a14d commit 809e372

File tree

3 files changed

+126
-2
lines changed

3 files changed

+126
-2
lines changed

mirage/route-handlers/crates.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ export function register(server) {
265265
});
266266

267267
server.delete('/api/v1/crates/:name/:version/yank', (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+
268273
const { name, version: versionNum } = request.params;
269274
const crate = schema.crates.findBy({ name });
270275
if (!crate) {
@@ -276,10 +281,17 @@ export function register(server) {
276281
return notFound();
277282
}
278283

279-
return {};
284+
version.update({ yanked: true });
285+
286+
return { ok: true };
280287
});
281288

282289
server.put('/api/v1/crates/:name/:version/unyank', (schema, request) => {
290+
let { user } = getSession(schema);
291+
if (!user) {
292+
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
293+
}
294+
283295
const { name, version: versionNum } = request.params;
284296
const crate = schema.crates.findBy({ name });
285297
if (!crate) {
@@ -291,7 +303,9 @@ export function register(server) {
291303
return notFound();
292304
}
293305

294-
return {};
306+
version.update({ yanked: false });
307+
308+
return { ok: true };
295309
});
296310

297311
server.get('/api/v1/crates/:name/:version/readme', (schema, request) => {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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 | PUT /api/v1/crates/:crateId/unyank', function (hooks) {
9+
setupTest(hooks);
10+
setupMirage(hooks);
11+
12+
test('returns 403 if unauthenticated', async function (assert) {
13+
let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' });
14+
assert.strictEqual(response.status, 403);
15+
assert.deepEqual(await response.json(), {
16+
errors: [{ detail: 'must be logged in to perform that action' }],
17+
});
18+
});
19+
20+
test('returns 404 for unknown crates', async function (assert) {
21+
let user = this.server.create('user');
22+
this.authenticateAs(user);
23+
24+
let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' });
25+
assert.strictEqual(response.status, 404);
26+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
27+
});
28+
29+
test('returns 404 for unknown versions', async function (assert) {
30+
this.server.create('crate', { name: 'foo' });
31+
32+
let user = this.server.create('user');
33+
this.authenticateAs(user);
34+
35+
let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' });
36+
assert.strictEqual(response.status, 404);
37+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
38+
});
39+
40+
test('unyanks the version', async function (assert) {
41+
let crate = this.server.create('crate', { name: 'foo' });
42+
let version = this.server.create('version', { crate, num: '1.0.0', yanked: true });
43+
assert.true(version.yanked);
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/unyank', { method: 'PUT' });
49+
assert.strictEqual(response.status, 200);
50+
assert.deepEqual(await response.json(), { ok: true });
51+
52+
user.reload();
53+
assert.false(version.yanked);
54+
});
55+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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 | DELETE /api/v1/crates/:crateId/yank', function (hooks) {
9+
setupTest(hooks);
10+
setupMirage(hooks);
11+
12+
test('returns 403 if unauthenticated', async function (assert) {
13+
let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' });
14+
assert.strictEqual(response.status, 403);
15+
assert.deepEqual(await response.json(), {
16+
errors: [{ detail: 'must be logged in to perform that action' }],
17+
});
18+
});
19+
20+
test('returns 404 for unknown crates', async function (assert) {
21+
let user = this.server.create('user');
22+
this.authenticateAs(user);
23+
24+
let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' });
25+
assert.strictEqual(response.status, 404);
26+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
27+
});
28+
29+
test('returns 404 for unknown versions', async function (assert) {
30+
this.server.create('crate', { name: 'foo' });
31+
32+
let user = this.server.create('user');
33+
this.authenticateAs(user);
34+
35+
let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' });
36+
assert.strictEqual(response.status, 404);
37+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
38+
});
39+
40+
test('yanks the version', async function (assert) {
41+
let crate = this.server.create('crate', { name: 'foo' });
42+
let version = this.server.create('version', { crate, num: '1.0.0', yanked: false });
43+
assert.false(version.yanked);
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/yank', { method: 'DELETE' });
49+
assert.strictEqual(response.status, 200);
50+
assert.deepEqual(await response.json(), { ok: true });
51+
52+
user.reload();
53+
assert.true(version.yanked);
54+
});
55+
});

0 commit comments

Comments
 (0)