Skip to content

Commit acb0275

Browse files
committed
msw: Implement PUT /api/v1/me/crate_owner_invitations/:crate_id request handler
1 parent bdb4a69 commit acb0275

File tree

3 files changed

+123
-1
lines changed

3 files changed

+123
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import legacyListInvites from './invites/legacy-list.js';
22
import listInvites from './invites/list.js';
3+
import redeemByCrateId from './invites/redeem-by-crate-id.js';
34

4-
export default [listInvites, legacyListInvites];
5+
export default [listInvites, legacyListInvites, redeemByCrateId];
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeInvite } from '../../serializers/invite.js';
5+
import { serializeUser } from '../../serializers/user.js';
6+
import { notFound } from '../../utils/handlers.js';
7+
import { getSession } from '../../utils/session.js';
8+
9+
export default http.put('/api/v1/me/crate_owner_invitations/:crate_id', async ({ request }) => {
10+
let { user } = getSession();
11+
if (!user) {
12+
return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 });
13+
}
14+
15+
let body = await request.json();
16+
let { accepted, crate_id: crateId } = body.crate_owner_invite;
17+
18+
let invite = db.crateOwnerInvitation.findFirst({
19+
where: {
20+
crate: { id: { equals: parseInt(crateId) } },
21+
invitee: { id: { equals: user.id } },
22+
},
23+
});
24+
if (!invite) return notFound();
25+
26+
if (accepted) {
27+
db.crateOwnership.create({ crate: invite.crate, user });
28+
}
29+
30+
db.crateOwnerInvitation.delete({ where: { id: invite.id } });
31+
32+
return HttpResponse.json({ crate_owner_invitation: { crate_id: crateId, accepted } });
33+
});
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { test as _test, assert } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
let test = _test.extend({
6+
// eslint-disable-next-line no-empty-pattern
7+
serde: async ({}, use) => {
8+
let serde = db.crate.create({ name: 'serde' });
9+
db.version.create({ crate: serde });
10+
await use(serde);
11+
},
12+
});
13+
14+
test('can accept an invitation', async function ({ serde }) {
15+
let inviter = db.user.create();
16+
let invitee = db.user.create();
17+
db.mswSession.create({ user: invitee });
18+
19+
db.crateOwnerInvitation.create({ crate: serde, invitee, inviter });
20+
21+
let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: true } });
22+
let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body });
23+
assert.strictEqual(response.status, 200);
24+
assert.deepEqual(await response.json(), {
25+
crate_owner_invitation: {
26+
accepted: true,
27+
crate_id: serde.id,
28+
},
29+
});
30+
31+
let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: serde.id }, invitee: { id: invitee.id } } });
32+
assert.strictEqual(invites.length, 0);
33+
let owners = db.crateOwnership.findMany({ where: { crate: { id: serde.id }, user: { id: invitee.id } } });
34+
assert.strictEqual(owners.length, 1);
35+
});
36+
37+
test('can decline an invitation', async function ({ serde }) {
38+
let inviter = db.user.create();
39+
let invitee = db.user.create();
40+
db.mswSession.create({ user: invitee });
41+
42+
db.crateOwnerInvitation.create({ crate: serde, invitee, inviter });
43+
44+
let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: false } });
45+
let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body });
46+
assert.strictEqual(response.status, 200);
47+
assert.deepEqual(await response.json(), {
48+
crate_owner_invitation: {
49+
accepted: false,
50+
crate_id: serde.id,
51+
},
52+
});
53+
54+
let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: serde.id }, invitee: { id: invitee.id } } });
55+
assert.strictEqual(invites.length, 0);
56+
let owners = db.crateOwnership.findMany({ where: { crate: { id: serde.id }, user: { id: invitee.id } } });
57+
assert.strictEqual(owners.length, 0);
58+
});
59+
60+
test('returns 404 if invite does not exist', async function ({ serde }) {
61+
let user = db.user.create();
62+
db.mswSession.create({ user });
63+
64+
let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: true } });
65+
let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body });
66+
assert.strictEqual(response.status, 404);
67+
});
68+
69+
test('returns 404 if invite is for another user', async function ({ serde }) {
70+
let inviter = db.user.create();
71+
let invitee = db.user.create();
72+
db.mswSession.create({ user: inviter });
73+
74+
db.crateOwnerInvitation.create({ crate: serde, invitee, inviter });
75+
76+
let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: true } });
77+
let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body });
78+
assert.strictEqual(response.status, 404);
79+
});
80+
81+
test('returns an error if unauthenticated', async function ({ serde }) {
82+
let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: true } });
83+
let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body });
84+
assert.strictEqual(response.status, 403);
85+
assert.deepEqual(await response.json(), {
86+
errors: [{ detail: 'must be logged in to perform that action' }],
87+
});
88+
});

0 commit comments

Comments
 (0)