Skip to content

Commit 1f9d61a

Browse files
committed
msw: Implement GET /api/v1/me/tokens request handler
1 parent 247095d commit 1f9d61a

File tree

3 files changed

+110
-1
lines changed

3 files changed

+110
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import createToken from './api-tokens/create.js';
2+
import listTokens from './api-tokens/list.js';
23

3-
export default [createToken];
4+
export default [createToken, listTokens];
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 { serializeApiToken } from '../../serializers/api-token.js';
5+
import { getSession } from '../../utils/session.js';
6+
7+
export default http.get('/api/v1/me/tokens', async ({ request }) => {
8+
let url = new URL(request.url);
9+
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 expiredAfter = new Date();
16+
if (url.searchParams.has('expired_days')) {
17+
expiredAfter.setUTCDate(expiredAfter.getUTCDate() - url.searchParams.get('expired_days'));
18+
}
19+
20+
let apiTokens = db.apiToken
21+
.findMany({
22+
where: { user: { id: { equals: user.id } } },
23+
orderBy: { id: 'desc' },
24+
})
25+
.filter(token => !token.expiredAt || new Date(token.expiredAt) > expiredAfter);
26+
27+
return HttpResponse.json({
28+
api_tokens: apiTokens.map(token => serializeApiToken(token)),
29+
});
30+
});
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { afterEach, assert, beforeEach, test, vi } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
beforeEach(() => {
6+
vi.useFakeTimers();
7+
vi.setSystemTime(new Date('2017-11-20T12:00:00'));
8+
});
9+
10+
afterEach(() => {
11+
vi.restoreAllMocks();
12+
});
13+
14+
test('returns the list of API token for the authenticated `user`', async function () {
15+
let user = db.user.create();
16+
db.mswSession.create({ user });
17+
18+
db.apiToken.create({
19+
user,
20+
createdAt: '2017-11-19T12:59:22Z',
21+
crateScopes: ['serde', 'serde-*'],
22+
endpointScopes: ['publish-update'],
23+
});
24+
db.apiToken.create({ user, createdAt: '2017-11-19T13:59:22Z', expiredAt: '2023-11-20T10:59:22Z' });
25+
db.apiToken.create({ user, createdAt: '2017-11-19T14:59:22Z' });
26+
db.apiToken.create({ user, createdAt: '2017-11-19T15:59:22Z', expiredAt: '2017-11-20T10:59:22Z' });
27+
28+
let response = await fetch('/api/v1/me/tokens');
29+
assert.strictEqual(response.status, 200);
30+
assert.deepEqual(await response.json(), {
31+
api_tokens: [
32+
{
33+
id: 3,
34+
crate_scopes: null,
35+
created_at: '2017-11-19T14:59:22.000Z',
36+
endpoint_scopes: null,
37+
expired_at: null,
38+
last_used_at: null,
39+
name: 'API Token 3',
40+
},
41+
{
42+
id: 2,
43+
crate_scopes: null,
44+
created_at: '2017-11-19T13:59:22.000Z',
45+
endpoint_scopes: null,
46+
expired_at: '2023-11-20T10:59:22.000Z',
47+
last_used_at: null,
48+
name: 'API Token 2',
49+
},
50+
{
51+
id: 1,
52+
crate_scopes: ['serde', 'serde-*'],
53+
created_at: '2017-11-19T12:59:22.000Z',
54+
endpoint_scopes: ['publish-update'],
55+
expired_at: null,
56+
last_used_at: null,
57+
name: 'API Token 1',
58+
},
59+
],
60+
});
61+
});
62+
63+
test('empty list case', async function () {
64+
let user = db.user.create();
65+
db.mswSession.create({ user });
66+
67+
let response = await fetch('/api/v1/me/tokens');
68+
assert.strictEqual(response.status, 200);
69+
assert.deepEqual(await response.json(), { api_tokens: [] });
70+
});
71+
72+
test('returns an error if unauthenticated', async function () {
73+
let response = await fetch('/api/v1/me/tokens');
74+
assert.strictEqual(response.status, 403);
75+
assert.deepEqual(await response.json(), {
76+
errors: [{ detail: 'must be logged in to perform that action' }],
77+
});
78+
});

0 commit comments

Comments
 (0)