Skip to content

Commit bdb4a69

Browse files
committed
msw: Implement GET /api/v1/me/crate_owner_invitations request handler
1 parent ac6a466 commit bdb4a69

File tree

3 files changed

+119
-1
lines changed

3 files changed

+119
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import legacyListInvites from './invites/legacy-list.js';
12
import listInvites from './invites/list.js';
23

3-
export default [listInvites];
4+
export default [listInvites, legacyListInvites];
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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 { getSession } from '../../utils/session.js';
7+
8+
export default http.get('/api/v1/me/crate_owner_invitations', () => {
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 invites = db.crateOwnerInvitation.findMany({ where: { invitee: { id: { equals: user.id } } } });
15+
16+
let inviters = invites.map(invite => invite.inviter);
17+
let invitees = invites.map(invite => invite.invitee);
18+
let users = Array.from(new Set([...inviters, ...invitees])).sort((a, b) => a.id - b.id);
19+
20+
return HttpResponse.json({
21+
crate_owner_invitations: invites.map(invite => serializeInvite(invite)),
22+
users: users.map(user => serializeUser(user)),
23+
});
24+
});
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
test('empty case', async function () {
6+
let user = db.user.create();
7+
db.mswSession.create({ user });
8+
9+
let response = await fetch('/api/v1/me/crate_owner_invitations');
10+
assert.strictEqual(response.status, 200);
11+
assert.deepEqual(await response.json(), { crate_owner_invitations: [], users: [] });
12+
});
13+
14+
test('returns the list of invitations for the authenticated user', async function () {
15+
let nanomsg = db.crate.create({ name: 'nanomsg' });
16+
db.version.create({ crate: nanomsg });
17+
18+
let ember = db.crate.create({ name: 'ember-rs' });
19+
db.version.create({ crate: ember });
20+
21+
let user = db.user.create();
22+
db.mswSession.create({ user });
23+
24+
let inviter = db.user.create({ name: 'janed' });
25+
db.crateOwnerInvitation.create({
26+
crate: nanomsg,
27+
createdAt: '2016-12-24T12:34:56Z',
28+
invitee: user,
29+
inviter,
30+
});
31+
32+
let inviter2 = db.user.create({ name: 'wycats' });
33+
db.crateOwnerInvitation.create({
34+
crate: ember,
35+
createdAt: '2020-12-31T12:34:56Z',
36+
invitee: user,
37+
inviter: inviter2,
38+
});
39+
40+
let response = await fetch('/api/v1/me/crate_owner_invitations');
41+
assert.strictEqual(response.status, 200);
42+
assert.deepEqual(await response.json(), {
43+
crate_owner_invitations: [
44+
{
45+
crate_id: Number(nanomsg.id),
46+
crate_name: 'nanomsg',
47+
created_at: '2016-12-24T12:34:56Z',
48+
expires_at: '2017-01-24T12:34:56Z',
49+
invitee_id: Number(user.id),
50+
inviter_id: Number(inviter.id),
51+
},
52+
{
53+
crate_id: Number(ember.id),
54+
crate_name: 'ember-rs',
55+
created_at: '2020-12-31T12:34:56Z',
56+
expires_at: '2017-01-24T12:34:56Z',
57+
invitee_id: Number(user.id),
58+
inviter_id: Number(inviter2.id),
59+
},
60+
],
61+
users: [
62+
{
63+
avatar: user.avatar,
64+
id: Number(user.id),
65+
login: user.login,
66+
name: user.name,
67+
url: user.url,
68+
},
69+
{
70+
avatar: 'https://avatars1.githubusercontent.com/u/14631425?v=4',
71+
id: Number(inviter.id),
72+
login: 'janed',
73+
name: 'janed',
74+
url: 'https://github.com/janed',
75+
},
76+
{
77+
avatar: 'https://avatars1.githubusercontent.com/u/14631425?v=4',
78+
id: Number(inviter2.id),
79+
login: 'wycats',
80+
name: 'wycats',
81+
url: 'https://github.com/wycats',
82+
},
83+
],
84+
});
85+
});
86+
87+
test('returns an error if unauthenticated', async function () {
88+
let response = await fetch('/api/v1/me/crate_owner_invitations');
89+
assert.strictEqual(response.status, 403);
90+
assert.deepEqual(await response.json(), {
91+
errors: [{ detail: 'must be logged in to perform that action' }],
92+
});
93+
});

0 commit comments

Comments
 (0)