Skip to content

Commit 99f564d

Browse files
committed
msw: Implement PUT /api/v1/crates/:name/:version/unyank request handler
1 parent 198505b commit 99f564d

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

packages/crates-io-msw/handlers/versions.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import dependencies from './versions/dependencies.js';
22
import downloads from './versions/downloads.js';
33
import getVersion from './versions/get.js';
44
import listVersions from './versions/list.js';
5+
import unyankVersion from './versions/unyank.js';
56
import yankVersion from './versions/yank.js';
67

7-
export default [listVersions, getVersion, yankVersion, dependencies, downloads];
8+
export default [listVersions, getVersion, yankVersion, unyankVersion, dependencies, downloads];
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { notFound } from '../../utils/handlers.js';
5+
import { getSession } from '../../utils/session.js';
6+
7+
export default http.put('/api/v1/crates/:name/:version/unyank', async ({ params }) => {
8+
let { user } = getSession();
9+
if (!user) {
10+
return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 });
11+
}
12+
13+
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
14+
if (!crate) return notFound();
15+
16+
let version = db.version.findFirst({
17+
where: {
18+
crate: { id: { equals: crate.id } },
19+
num: { equals: params.version },
20+
},
21+
});
22+
if (!version) return notFound();
23+
24+
db.version.update({ where: { id: { equals: version.id } }, data: { yanked: false, yank_message: null } });
25+
26+
return HttpResponse.json({ ok: true });
27+
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
test('returns 403 if unauthenticated', async function () {
6+
let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' });
7+
assert.strictEqual(response.status, 403);
8+
assert.deepEqual(await response.json(), {
9+
errors: [{ detail: 'must be logged in to perform that action' }],
10+
});
11+
});
12+
13+
test('returns 404 for unknown crates', async function () {
14+
let user = db.user.create();
15+
db.mswSession.create({ user });
16+
17+
let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' });
18+
assert.strictEqual(response.status, 404);
19+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
20+
});
21+
22+
test('returns 404 for unknown versions', async function () {
23+
db.crate.create({ name: 'foo' });
24+
25+
let user = db.user.create();
26+
db.mswSession.create({ user });
27+
28+
let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' });
29+
assert.strictEqual(response.status, 404);
30+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
31+
});
32+
33+
test('unyanks the version', async function () {
34+
let crate = db.crate.create({ name: 'foo' });
35+
let version = db.version.create({ crate, num: '1.0.0', yanked: true, yank_message: 'some reason' });
36+
assert.strictEqual(version.yanked, true);
37+
assert.strictEqual(version.yank_message, 'some reason');
38+
39+
let user = db.user.create();
40+
db.mswSession.create({ user });
41+
42+
let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' });
43+
assert.strictEqual(response.status, 200);
44+
assert.deepEqual(await response.json(), { ok: true });
45+
46+
version = db.version.findFirst({ where: { id: version.id } });
47+
assert.strictEqual(version.yanked, false);
48+
assert.strictEqual(version.yank_message, null);
49+
});

0 commit comments

Comments
 (0)