From c94e845989a0d31de6946ddbb4ffd789418941ba Mon Sep 17 00:00:00 2001 From: Rustin170506 <29879298+Rustin170506@users.noreply.github.com> Date: Mon, 28 Oct 2024 23:33:47 +0800 Subject: [PATCH 1/5] Correct the mock APIs Signed-off-by: Rustin170506 <29879298+Rustin170506@users.noreply.github.com> --- mirage/route-handlers/crates.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index f189568ddad..47c00b003a9 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -275,6 +275,8 @@ export function register(server) { if (!version) { return notFound(); } + version.yanked = true; + version.save(); return {}; }); @@ -290,6 +292,8 @@ export function register(server) { if (!version) { return notFound(); } + version.yanked = false; + version.save(); return {}; }); From dd0631290d647bd7a98ee832fd9bed942a4d15e3 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 29 Oct 2024 10:21:16 +0100 Subject: [PATCH 2/5] mirage: Add authentication checks to yank/unyank route handlers --- mirage/route-handlers/crates.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index 47c00b003a9..4980899e6d9 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) { @@ -282,6 +287,11 @@ export function register(server) { }); 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) { From 77d46e7587c7130b0da793ca5c93aa40b39d17c8 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 29 Oct 2024 10:21:35 +0100 Subject: [PATCH 3/5] mirage: Fix response payload for yank/unyank route handlers --- mirage/route-handlers/crates.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index 4980899e6d9..c9872e800b7 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -283,7 +283,7 @@ export function register(server) { version.yanked = true; version.save(); - return {}; + return { ok: true }; }); server.put('/api/v1/crates/:name/:version/unyank', (schema, request) => { @@ -305,7 +305,7 @@ export function register(server) { version.yanked = false; version.save(); - return {}; + return { ok: true }; }); server.get('/api/v1/crates/:name/:version/readme', (schema, request) => { From eb2e4496d013396fd41c332e4508687dd110ee87 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 29 Oct 2024 10:21:45 +0100 Subject: [PATCH 4/5] mirage: Add tests for yank/unyank route handlers --- .../crates/versions/yank/unyank-test.js | 55 +++++++++++++++++++ .../mirage/crates/versions/yank/yank-test.js | 55 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 tests/mirage/crates/versions/yank/unyank-test.js create mode 100644 tests/mirage/crates/versions/yank/yank-test.js 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); + }); +}); From fa7a14db68df81e41d91d7e464f6292d8585fe78 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 29 Oct 2024 10:22:46 +0100 Subject: [PATCH 5/5] mirage: Use `version.update()` to simplify yank/unyank route handlers --- mirage/route-handlers/crates.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index c9872e800b7..fcbe824e23f 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -280,8 +280,8 @@ export function register(server) { if (!version) { return notFound(); } - version.yanked = true; - version.save(); + + version.update({ yanked: true }); return { ok: true }; }); @@ -302,8 +302,8 @@ export function register(server) { if (!version) { return notFound(); } - version.yanked = false; - version.save(); + + version.update({ yanked: false }); return { ok: true }; });