diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index f189568ddad..fcbe824e23f 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -265,6 +265,11 @@ export function register(server) { }); server.delete('/api/v1/crates/:name/:version/yank', (schema, request) => { + let { user } = getSession(schema); + if (!user) { + return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] }); + } + const { name, version: versionNum } = request.params; const crate = schema.crates.findBy({ name }); if (!crate) { @@ -276,10 +281,17 @@ export function register(server) { return notFound(); } - return {}; + version.update({ yanked: true }); + + return { ok: true }; }); server.put('/api/v1/crates/:name/:version/unyank', (schema, request) => { + let { user } = getSession(schema); + if (!user) { + return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] }); + } + const { name, version: versionNum } = request.params; const crate = schema.crates.findBy({ name }); if (!crate) { @@ -291,7 +303,9 @@ export function register(server) { return notFound(); } - return {}; + version.update({ yanked: false }); + + return { ok: true }; }); server.get('/api/v1/crates/:name/:version/readme', (schema, request) => { diff --git a/tests/mirage/crates/versions/yank/unyank-test.js b/tests/mirage/crates/versions/yank/unyank-test.js new file mode 100644 index 00000000000..bf5607e9191 --- /dev/null +++ b/tests/mirage/crates/versions/yank/unyank-test.js @@ -0,0 +1,55 @@ +import { module, test } from 'qunit'; + +import fetch from 'fetch'; + +import { setupTest } from '../../../../helpers'; +import setupMirage from '../../../../helpers/setup-mirage'; + +module('Mirage | PUT /api/v1/crates/:crateId/unyank', function (hooks) { + setupTest(hooks); + setupMirage(hooks); + + test('returns 403 if unauthenticated', async function (assert) { + let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' }); + assert.strictEqual(response.status, 403); + assert.deepEqual(await response.json(), { + errors: [{ detail: 'must be logged in to perform that action' }], + }); + }); + + test('returns 404 for unknown crates', async function (assert) { + let user = this.server.create('user'); + this.authenticateAs(user); + + let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' }); + assert.strictEqual(response.status, 404); + assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] }); + }); + + test('returns 404 for unknown versions', async function (assert) { + this.server.create('crate', { name: 'foo' }); + + let user = this.server.create('user'); + this.authenticateAs(user); + + let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' }); + assert.strictEqual(response.status, 404); + assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] }); + }); + + test('unyanks the version', async function (assert) { + let crate = this.server.create('crate', { name: 'foo' }); + let version = this.server.create('version', { crate, num: '1.0.0', yanked: true }); + assert.true(version.yanked); + + let user = this.server.create('user'); + this.authenticateAs(user); + + let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' }); + assert.strictEqual(response.status, 200); + assert.deepEqual(await response.json(), { ok: true }); + + user.reload(); + assert.false(version.yanked); + }); +}); diff --git a/tests/mirage/crates/versions/yank/yank-test.js b/tests/mirage/crates/versions/yank/yank-test.js new file mode 100644 index 00000000000..8dc79b03691 --- /dev/null +++ b/tests/mirage/crates/versions/yank/yank-test.js @@ -0,0 +1,55 @@ +import { module, test } from 'qunit'; + +import fetch from 'fetch'; + +import { setupTest } from '../../../../helpers'; +import setupMirage from '../../../../helpers/setup-mirage'; + +module('Mirage | DELETE /api/v1/crates/:crateId/yank', function (hooks) { + setupTest(hooks); + setupMirage(hooks); + + test('returns 403 if unauthenticated', async function (assert) { + let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' }); + assert.strictEqual(response.status, 403); + assert.deepEqual(await response.json(), { + errors: [{ detail: 'must be logged in to perform that action' }], + }); + }); + + test('returns 404 for unknown crates', async function (assert) { + let user = this.server.create('user'); + this.authenticateAs(user); + + let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' }); + assert.strictEqual(response.status, 404); + assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] }); + }); + + test('returns 404 for unknown versions', async function (assert) { + this.server.create('crate', { name: 'foo' }); + + let user = this.server.create('user'); + this.authenticateAs(user); + + let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' }); + assert.strictEqual(response.status, 404); + assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] }); + }); + + test('yanks the version', async function (assert) { + let crate = this.server.create('crate', { name: 'foo' }); + let version = this.server.create('version', { crate, num: '1.0.0', yanked: false }); + assert.false(version.yanked); + + let user = this.server.create('user'); + this.authenticateAs(user); + + let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' }); + assert.strictEqual(response.status, 200); + assert.deepEqual(await response.json(), { ok: true }); + + user.reload(); + assert.true(version.yanked); + }); +});