Skip to content

Commit 331246c

Browse files
committed
msw/crate: Add PATCH /api/v1/crates/:name request handler
1 parent 238317a commit 331246c

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import followCrate from './crates/follow.js';
55
import following from './crates/following.js';
66
import getCrate from './crates/get.js';
77
import listCrates from './crates/list.js';
8+
import patchCrate from './crates/patch.js';
89
import removeOwners from './crates/remove-owners.js';
910
import reverseDependencies from './crates/reverse-dependencies.js';
1011
import teamOwners from './crates/team-owners.js';
@@ -14,6 +15,7 @@ import userOwners from './crates/user-owners.js';
1415
export default [
1516
listCrates,
1617
getCrate,
18+
patchCrate,
1719
deleteCrate,
1820
following,
1921
followCrate,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeCrate } from '../../serializers/crate.js';
5+
import { getSession } from '../../utils/session.js';
6+
7+
export default http.patch('/api/v1/crates/:name', async ({ request, 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) {
15+
return HttpResponse.json({ errors: [{ detail: `crate \`${params.name}\` does not exist` }] }, { status: 404 });
16+
}
17+
18+
let body = await request.json();
19+
20+
if (body.crate?.trustpub_only != null) {
21+
crate = db.crate.update({
22+
where: { id: { equals: crate.id } },
23+
data: {
24+
trustpubOnly: body.crate.trustpub_only,
25+
},
26+
});
27+
}
28+
29+
return HttpResponse.json({ crate: serializeCrate(crate) });
30+
});
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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', {
7+
method: 'PATCH',
8+
headers: { 'Content-Type': 'application/json' },
9+
body: JSON.stringify({ crate: { trustpub_only: true } }),
10+
});
11+
assert.strictEqual(response.status, 403);
12+
assert.deepEqual(await response.json(), {
13+
errors: [{ detail: 'must be logged in to perform that action' }],
14+
});
15+
});
16+
17+
test('returns 404 for unknown crates', async function () {
18+
let user = db.user.create();
19+
db.mswSession.create({ user });
20+
21+
let response = await fetch('/api/v1/crates/foo', {
22+
method: 'PATCH',
23+
headers: { 'Content-Type': 'application/json' },
24+
body: JSON.stringify({ crate: { trustpub_only: true } }),
25+
});
26+
assert.strictEqual(response.status, 404);
27+
assert.deepEqual(await response.json(), { errors: [{ detail: 'crate `foo` does not exist' }] });
28+
});
29+
30+
test('updates trustpub_only flag', async function () {
31+
let user = db.user.create();
32+
db.mswSession.create({ user });
33+
34+
let crate = db.crate.create({ name: 'foo', trustpubOnly: false });
35+
assert.strictEqual(crate.trustpubOnly, false);
36+
37+
db.version.create({ crate, num: '1.0.0' });
38+
db.crateOwnership.create({ crate, user });
39+
40+
let response = await fetch('/api/v1/crates/foo', {
41+
method: 'PATCH',
42+
headers: { 'Content-Type': 'application/json' },
43+
body: JSON.stringify({ crate: { trustpub_only: true } }),
44+
});
45+
assert.strictEqual(response.status, 200);
46+
47+
let json = await response.json();
48+
assert.strictEqual(json.crate.trustpub_only, true);
49+
50+
let updatedCrate = db.crate.findFirst({ where: { name: { equals: 'foo' } } });
51+
assert.strictEqual(updatedCrate.trustpubOnly, true);
52+
});

0 commit comments

Comments
 (0)