diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index fcbe824e23f..eea1d76b856 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -264,6 +264,32 @@ export function register(server) { return { ok: true, msg: 'owners successfully removed' }; }); + server.patch('/api/v1/crates/:name/:version', function (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) { + return notFound(); + } + + const version = schema.versions.findBy({ crateId: crate.id, num: versionNum }); + if (!version) { + return notFound(); + } + + const body = JSON.parse(request.requestBody); + version.update({ + yanked: body.version.yanked, + yank_message: body.version.yanked ? body.version.yank_message || null : null, + }); + + return this.serialize(version); + }); + server.delete('/api/v1/crates/:name/:version/yank', (schema, request) => { let { user } = getSession(schema); if (!user) { @@ -303,7 +329,7 @@ export function register(server) { return notFound(); } - version.update({ yanked: false }); + version.update({ yanked: false, yank_message: null }); return { ok: true }; }); diff --git a/tests/mirage/crates/versions/patch-test.js b/tests/mirage/crates/versions/patch-test.js new file mode 100644 index 00000000000..e55db8ba625 --- /dev/null +++ b/tests/mirage/crates/versions/patch-test.js @@ -0,0 +1,120 @@ +import { module, test } from 'qunit'; + +import fetch from 'fetch'; + +import { setupTest } from '../../../helpers'; +import setupMirage from '../../../helpers/setup-mirage'; + +const YANK_BODY = JSON.stringify({ + version: { + yanked: true, + yank_message: 'some reason', + }, +}); + +const UNYANK_BODY = JSON.stringify({ + version: { + yanked: false, + }, +}); + +module('Mirage | PATCH /api/v1/crates/:crate/:version', 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', { method: 'PATCH', body: YANK_BODY }); + 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', { method: 'PATCH', body: YANK_BODY }); + 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', { method: 'PATCH', body: YANK_BODY }); + 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); + assert.strictEqual(version.yank_message, null); + + let user = this.server.create('user'); + this.authenticateAs(user); + + let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY }); + assert.strictEqual(response.status, 200); + assert.deepEqual(await response.json(), { + version: { + crate: 'foo', + crate_size: 0, + created_at: '2010-06-16T21:30:45Z', + dl_path: '/api/v1/crates/foo/1.0.0/download', + downloads: 0, + id: '1', + license: 'MIT/Apache-2.0', + links: { + dependencies: '/api/v1/crates/foo/1.0.0/dependencies', + version_downloads: '/api/v1/crates/foo/1.0.0/downloads', + }, + num: '1.0.0', + published_by: null, + readme_path: '/api/v1/crates/foo/1.0.0/readme', + rust_version: null, + updated_at: '2017-02-24T12:34:56Z', + yank_message: 'some reason', + yanked: true, + }, + }); + + user.reload(); + assert.true(version.yanked); + assert.strictEqual(version.yank_message, 'some reason'); + + response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: UNYANK_BODY }); + assert.strictEqual(response.status, 200); + assert.deepEqual(await response.json(), { + version: { + crate: 'foo', + crate_size: 0, + created_at: '2010-06-16T21:30:45Z', + dl_path: '/api/v1/crates/foo/1.0.0/download', + downloads: 0, + id: '1', + license: 'MIT/Apache-2.0', + links: { + dependencies: '/api/v1/crates/foo/1.0.0/dependencies', + version_downloads: '/api/v1/crates/foo/1.0.0/downloads', + }, + num: '1.0.0', + published_by: null, + readme_path: '/api/v1/crates/foo/1.0.0/readme', + rust_version: null, + updated_at: '2017-02-24T12:34:56Z', + yank_message: null, + yanked: false, + }, + }); + + user.reload(); + assert.false(version.yanked); + assert.strictEqual(version.yank_message, null); + }); +}); diff --git a/tests/mirage/crates/versions/yank/unyank-test.js b/tests/mirage/crates/versions/yank/unyank-test.js index bf5607e9191..5db7a5f504b 100644 --- a/tests/mirage/crates/versions/yank/unyank-test.js +++ b/tests/mirage/crates/versions/yank/unyank-test.js @@ -39,8 +39,9 @@ module('Mirage | PUT /api/v1/crates/:crateId/unyank', function (hooks) { 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 }); + let version = this.server.create('version', { crate, num: '1.0.0', yanked: true, yank_message: 'some reason' }); assert.true(version.yanked); + assert.strictEqual(version.yank_message, 'some reason'); let user = this.server.create('user'); this.authenticateAs(user); @@ -51,5 +52,6 @@ module('Mirage | PUT /api/v1/crates/:crateId/unyank', function (hooks) { user.reload(); assert.false(version.yanked); + assert.strictEqual(version.yank_message, null); }); });