Skip to content

Commit 2312b50

Browse files
committed
msw: Implement DELETE /api/v1/crates/:name request handler
1 parent e5311c3 commit 2312b50

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1+
import deleteCrate from './crates/delete.js';
12
import getCrate from './crates/get.js';
23
import listCrates from './crates/list.js';
34

4-
export default [listCrates, getCrate];
5+
export default [listCrates, getCrate, deleteCrate];
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { getSession } from '../../utils/session.js';
5+
6+
export default http.delete('/api/v1/crates/:name', async ({ params }) => {
7+
let { user } = getSession();
8+
if (!user) {
9+
return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 });
10+
}
11+
12+
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
13+
if (!crate) {
14+
return HttpResponse.json({ errors: [{ detail: `crate \`${params.name}\` does not exist` }] }, { status: 404 });
15+
}
16+
17+
db.crate.delete({ where: { id: crate.id } });
18+
19+
return new HttpResponse(null, { status: 204 });
20+
});
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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', { method: 'DELETE' });
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', { method: 'DELETE' });
18+
assert.strictEqual(response.status, 404);
19+
assert.deepEqual(await response.json(), { errors: [{ detail: 'crate `foo` does not exist' }] });
20+
});
21+
22+
test('deletes crates', async function () {
23+
let user = db.user.create();
24+
db.mswSession.create({ user });
25+
26+
let crate = db.crate.create({ name: 'foo' });
27+
db.crateOwnership.create({ crate, user });
28+
29+
let response = await fetch('/api/v1/crates/foo', { method: 'DELETE' });
30+
assert.strictEqual(response.status, 204);
31+
assert.deepEqual(await response.text(), '');
32+
33+
assert.strictEqual(db.crate.findFirst({ where: { name: { equals: 'foo' } } }), null);
34+
});

0 commit comments

Comments
 (0)