Skip to content

Commit a7852c0

Browse files
committed
msw: Implement PATCH /api/v1/crates/:name/:version request handler
1 parent ba949ae commit a7852c0

File tree

3 files changed

+155
-1
lines changed

3 files changed

+155
-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,8 +2,9 @@ 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 patchVersion from './versions/patch.js';
56
import readme from './versions/readme.js';
67
import unyankVersion from './versions/unyank.js';
78
import yankVersion from './versions/yank.js';
89

9-
export default [listVersions, getVersion, yankVersion, unyankVersion, dependencies, downloads, readme];
10+
export default [listVersions, getVersion, patchVersion, yankVersion, unyankVersion, dependencies, downloads, readme];
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeVersion } from '../../serializers/version.js';
5+
import { notFound } from '../../utils/handlers.js';
6+
import { getSession } from '../../utils/session.js';
7+
8+
export default http.patch('/api/v1/crates/:name/:version', async ({ request, params }) => {
9+
let { user } = getSession();
10+
if (!user) {
11+
return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 });
12+
}
13+
14+
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
15+
if (!crate) return notFound();
16+
17+
let version = db.version.findFirst({
18+
where: {
19+
crate: { id: { equals: crate.id } },
20+
num: { equals: params.version },
21+
},
22+
});
23+
if (!version) return notFound();
24+
25+
let body = await request.json();
26+
27+
let yanked = body.version.yanked;
28+
let yankMessage = body.version.yank_message;
29+
30+
version = db.version.update({
31+
where: { id: { equals: version.id } },
32+
data: {
33+
yanked: yanked,
34+
yank_message: yanked ? yankMessage || null : null,
35+
},
36+
});
37+
38+
return HttpResponse.json({ version: serializeVersion(version) });
39+
});
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
const YANK_BODY = JSON.stringify({
6+
version: {
7+
yanked: true,
8+
yank_message: 'some reason',
9+
},
10+
});
11+
12+
const UNYANK_BODY = JSON.stringify({
13+
version: {
14+
yanked: false,
15+
},
16+
});
17+
18+
test('returns 403 if unauthenticated', async function () {
19+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
20+
assert.strictEqual(response.status, 403);
21+
assert.deepEqual(await response.json(), {
22+
errors: [{ detail: 'must be logged in to perform that action' }],
23+
});
24+
});
25+
26+
test('returns 404 for unknown crates', async function () {
27+
let user = db.user.create();
28+
db.mswSession.create({ user });
29+
30+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
31+
assert.strictEqual(response.status, 404);
32+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
33+
});
34+
35+
test('returns 404 for unknown versions', async function () {
36+
db.crate.create({ name: 'foo' });
37+
38+
let user = db.user.create();
39+
db.mswSession.create({ user });
40+
41+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
42+
assert.strictEqual(response.status, 404);
43+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
44+
});
45+
46+
test('yanks the version', async function () {
47+
let crate = db.crate.create({ name: 'foo' });
48+
let version = db.version.create({ crate, num: '1.0.0', yanked: false });
49+
assert.strictEqual(version.yanked, false);
50+
assert.strictEqual(version.yank_message, null);
51+
52+
let user = db.user.create();
53+
db.mswSession.create({ user });
54+
55+
let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY });
56+
assert.strictEqual(response.status, 200);
57+
assert.deepEqual(await response.json(), {
58+
version: {
59+
crate: 'foo',
60+
crate_size: 162_963,
61+
created_at: '2010-06-16T21:30:45Z',
62+
dl_path: '/api/v1/crates/foo/1.0.0/download',
63+
downloads: 3702,
64+
features: {},
65+
id: 1,
66+
license: 'MIT',
67+
links: {
68+
dependencies: '/api/v1/crates/foo/1.0.0/dependencies',
69+
version_downloads: '/api/v1/crates/foo/1.0.0/downloads',
70+
},
71+
num: '1.0.0',
72+
published_by: null,
73+
readme_path: '/api/v1/crates/foo/1.0.0/readme',
74+
rust_version: null,
75+
updated_at: '2017-02-24T12:34:56Z',
76+
yank_message: 'some reason',
77+
yanked: true,
78+
},
79+
});
80+
81+
version = db.version.findFirst({ where: { id: { equals: version.id } } });
82+
assert.strictEqual(version.yanked, true);
83+
assert.strictEqual(version.yank_message, 'some reason');
84+
85+
response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: UNYANK_BODY });
86+
assert.strictEqual(response.status, 200);
87+
assert.deepEqual(await response.json(), {
88+
version: {
89+
crate: 'foo',
90+
crate_size: 162_963,
91+
created_at: '2010-06-16T21:30:45Z',
92+
dl_path: '/api/v1/crates/foo/1.0.0/download',
93+
downloads: 3702,
94+
features: {},
95+
id: 1,
96+
license: 'MIT',
97+
links: {
98+
dependencies: '/api/v1/crates/foo/1.0.0/dependencies',
99+
version_downloads: '/api/v1/crates/foo/1.0.0/downloads',
100+
},
101+
num: '1.0.0',
102+
published_by: null,
103+
readme_path: '/api/v1/crates/foo/1.0.0/readme',
104+
rust_version: null,
105+
updated_at: '2017-02-24T12:34:56Z',
106+
yank_message: null,
107+
yanked: false,
108+
},
109+
});
110+
111+
version = db.version.findFirst({ where: { id: { equals: version.id } } });
112+
assert.strictEqual(version.yanked, false);
113+
assert.strictEqual(version.yank_message, null);
114+
});

0 commit comments

Comments
 (0)