Skip to content

Commit b343a07

Browse files
committed
msw: Implement GET /api/v1/crates/:name/owner_user request handler
1 parent 732313b commit b343a07

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

packages/crates-io-msw/handlers/crates.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ import following from './crates/following.js';
44
import getCrate from './crates/get.js';
55
import listCrates from './crates/list.js';
66
import unfollowCrate from './crates/unfollow.js';
7+
import userOwners from './crates/user-owners.js';
78

8-
export default [listCrates, getCrate, deleteCrate, following, followCrate, unfollowCrate];
9+
export default [listCrates, getCrate, deleteCrate, following, followCrate, unfollowCrate, userOwners];
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { http, HttpResponse } from 'msw';
2+
3+
import { db } from '../../index.js';
4+
import { serializeUser } from '../../serializers/user.js';
5+
import { notFound } from '../../utils/handlers.js';
6+
7+
export default http.get('/api/v1/crates/:name/owner_user', async ({ params }) => {
8+
let crate = db.crate.findFirst({ where: { name: { equals: params.name } } });
9+
if (!crate) {
10+
return notFound();
11+
}
12+
13+
let ownerships = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } });
14+
15+
return HttpResponse.json({
16+
users: ownerships.filter(o => o.user).map(o => ({ ...serializeUser(o.user), kind: 'user' })),
17+
});
18+
});
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { assert, test } from 'vitest';
2+
3+
import { db } from '../../index.js';
4+
5+
test('returns 404 for unknown crates', async function () {
6+
let response = await fetch('/api/v1/crates/foo/owner_user');
7+
assert.strictEqual(response.status, 404);
8+
assert.deepEqual(await response.json(), { errors: [{ detail: 'Not Found' }] });
9+
});
10+
11+
test('empty case', async function () {
12+
db.crate.create({ name: 'rand' });
13+
14+
let response = await fetch('/api/v1/crates/rand/owner_user');
15+
assert.strictEqual(response.status, 200);
16+
assert.deepEqual(await response.json(), {
17+
users: [],
18+
});
19+
});
20+
21+
test('returns the list of users that own the specified crate', async function () {
22+
let user = db.user.create({ name: 'John Doe' });
23+
let crate = db.crate.create({ name: 'rand' });
24+
db.crateOwnership.create({ crate, user });
25+
26+
let response = await fetch('/api/v1/crates/rand/owner_user');
27+
assert.strictEqual(response.status, 200);
28+
assert.deepEqual(await response.json(), {
29+
users: [
30+
{
31+
id: 1,
32+
avatar: 'https://avatars1.githubusercontent.com/u/14631425?v=4',
33+
kind: 'user',
34+
login: 'john-doe',
35+
name: 'John Doe',
36+
url: 'https://github.com/john-doe',
37+
},
38+
],
39+
});
40+
});

0 commit comments

Comments
 (0)