Skip to content
File

Blob: tests/worker/routes/workspaces-members-guest.workers.test.ts

typescript59 lines
1import { beforeEach, describe, expect, it } from "vitest";
2 
3import { resetD1Tables } from "@tests/worker/helpers/db";
4import { apiRequest } from "@tests/worker/helpers/request";
5import { seedMembership, seedUser, seedWorkspace } from "@tests/worker/helpers/seeds";
6 
7describe("GET /workspaces/:id/members", () => {
8 beforeEach(async () => {
9 await resetD1Tables();
10 });
11 
12 it("returns the full roster for owner/admin/member callers", async () => {
13 const owner = await seedUser();
14 const member = await seedUser();
15 const guest = await seedUser();
16 const workspace = await seedWorkspace({ owner_id: owner.id });
17 await seedMembership({ user_id: member.id, workspace_id: workspace.id, role: "member" });
18 await seedMembership({ user_id: guest.id, workspace_id: workspace.id, role: "guest" });
19 
20 const res = await apiRequest(`/api/v1/workspaces/${workspace.id}/members`, {
21 userId: member.id,
22 });
23 
24 expect(res.status).toBe(200);
25 const body = (await res.json()) as { members: Array<{ user_id: string; role: string }> };
26 expect(body.members.map((m) => m.user_id).sort()).toEqual([guest.id, member.id, owner.id].sort());
27 });
28 
29 it("returns a self-only projection for guest callers", async () => {
30 const owner = await seedUser();
31 const member = await seedUser();
32 const guest = await seedUser();
33 const workspace = await seedWorkspace({ owner_id: owner.id });
34 await seedMembership({ user_id: member.id, workspace_id: workspace.id, role: "member" });
35 await seedMembership({ user_id: guest.id, workspace_id: workspace.id, role: "guest" });
36 
37 const res = await apiRequest(`/api/v1/workspaces/${workspace.id}/members`, {
38 userId: guest.id,
39 });
40 
41 expect(res.status).toBe(200);
42 const body = (await res.json()) as { members: Array<{ user_id: string; role: string }> };
43 expect(body.members).toHaveLength(1);
44 expect(body.members[0]).toMatchObject({ user_id: guest.id, role: "guest" });
45 });
46 
47 it("rejects non-members with 403", async () => {
48 const owner = await seedUser();
49 const outsider = await seedUser();
50 const workspace = await seedWorkspace({ owner_id: owner.id });
51 
52 const res = await apiRequest(`/api/v1/workspaces/${workspace.id}/members`, {
53 userId: outsider.id,
54 });
55 
56 expect(res.status).toBe(403);
57 });
58});