Skip to content

Commit 3955f97

Browse files
committed
msw: Implement GET /api/v1/me request handler
1 parent 462c6ff commit 3955f97

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import getUser from './users/get.js';
2+
import me from './users/me.js';
23
import resend from './users/resend.js';
34
import updateUser from './users/update.js';
45

5-
export default [getUser, updateUser, resend];
6+
export default [getUser, updateUser, resend, me];
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeUser } from '../../serializers/user.js';
5+
import { getSession } from '../../utils/session.js';
6+
7+
export default http.get('/api/v1/me', () => {
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 ownerships = db.crateOwnership.findMany({ where: { user: { id: { equals: user.id } } } });
14+
15+
return HttpResponse.json({
16+
user: serializeUser(user, { removePrivateData: false }),
17+
owned_crates: ownerships.map(ownership => ({
18+
id: ownership.crate.id,
19+
name: ownership.crate.name,
20+
email_notifications: ownership.emailNotifications,
21+
})),
22+
});
23+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
test('returns the `user` resource including the private fields', async function () {
6+
let user = db.user.create();
7+
db.mswSession.create({ user });
8+
9+
let response = await fetch('/api/v1/me');
10+
assert.strictEqual(response.status, 200);
11+
assert.deepEqual(await response.json(), {
12+
user: {
13+
id: 1,
14+
avatar: 'https://avatars1.githubusercontent.com/u/14631425?v=4',
15+
16+
email_verification_sent: true,
17+
email_verified: true,
18+
is_admin: false,
19+
login: 'user-1',
20+
name: 'User 1',
21+
publish_notifications: true,
22+
url: 'https://github.com/user-1',
23+
},
24+
owned_crates: [],
25+
});
26+
});
27+
28+
test('returns a list of `owned_crates`', async function () {
29+
let user = db.user.create();
30+
db.mswSession.create({ user });
31+
32+
let [crate1, , crate3] = Array.from({ length: 3 }, () => db.crate.create());
33+
34+
db.crateOwnership.create({ crate: crate1, user });
35+
db.crateOwnership.create({ crate: crate3, user });
36+
37+
let response = await fetch('/api/v1/me');
38+
assert.strictEqual(response.status, 200);
39+
40+
let responsePayload = await response.json();
41+
assert.deepEqual(responsePayload.owned_crates, [
42+
{ id: crate1.id, name: 'crate-1', email_notifications: true },
43+
{ id: crate3.id, name: 'crate-3', email_notifications: true },
44+
]);
45+
});
46+
47+
test('returns an error if unauthenticated', async function () {
48+
db.user.create();
49+
50+
let response = await fetch('/api/v1/me');
51+
assert.strictEqual(response.status, 403);
52+
assert.deepEqual(await response.json(), {
53+
errors: [{ detail: 'must be logged in to perform that action' }],
54+
});
55+
});

0 commit comments

Comments
 (0)