Skip to content

Commit 052db07

Browse files
committed
msw: Implement GET /api/v1/me/tokens/:tokenId request handler
1 parent 6adbf6f commit 052db07

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import createToken from './api-tokens/create.js';
22
import deleteToken from './api-tokens/delete.js';
3+
import getToken from './api-tokens/get.js';
34
import listTokens from './api-tokens/list.js';
45

5-
export default [createToken, listTokens, deleteToken];
6+
export default [createToken, listTokens, getToken, deleteToken];
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeApiToken } from '../../serializers/api-token.js';
5+
import { notFound } from '../../utils/handlers.js';
6+
import { getSession } from '../../utils/session.js';
7+
8+
export default http.get('/api/v1/me/tokens/:tokenId', async ({ params }) => {
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 { tokenId } = params;
15+
let token = db.apiToken.findFirst({
16+
where: {
17+
id: { equals: parseInt(tokenId) },
18+
user: { id: { equals: user.id } },
19+
},
20+
});
21+
if (!token) return notFound();
22+
23+
return HttpResponse.json({
24+
api_token: serializeApiToken(token),
25+
});
26+
});
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
test('returns the requested token', async function () {
6+
let user = db.user.create();
7+
db.mswSession.create({ user });
8+
9+
let token = db.apiToken.create({
10+
user,
11+
crateScopes: ['serde', 'serde-*'],
12+
endpointScopes: ['publish-update'],
13+
});
14+
15+
let response = await fetch(`/api/v1/me/tokens/${token.id}`);
16+
assert.strictEqual(response.status, 200);
17+
assert.deepEqual(await response.json(), {
18+
api_token: {
19+
id: 1,
20+
crate_scopes: ['serde', 'serde-*'],
21+
created_at: '2017-11-19T16:59:22.000Z',
22+
endpoint_scopes: ['publish-update'],
23+
expired_at: null,
24+
last_used_at: null,
25+
name: 'API Token 1',
26+
},
27+
});
28+
});
29+
30+
test('returns 404 if token not found', async function () {
31+
let user = db.user.create();
32+
db.mswSession.create({ user });
33+
34+
let response = await fetch('/api/v1/me/tokens/42');
35+
assert.strictEqual(response.status, 404);
36+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
37+
});
38+
39+
test('returns an error if unauthenticated', async function () {
40+
let response = await fetch('/api/v1/me/tokens/42');
41+
assert.strictEqual(response.status, 403);
42+
assert.deepEqual(await response.json(), {
43+
errors: [{ detail: 'must be logged in to perform that action' }],
44+
});
45+
});

0 commit comments

Comments
 (0)