Skip to content

Commit 6fe0a7c

Browse files
committed
add super basic unit tests for membership checking
1 parent f4a9460 commit 6fe0a7c

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

tests/unit/membership.test.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { afterAll, expect, test, vi } from "vitest";
2+
import init from "../../src/api/index.js";
3+
import { EventGetResponse } from "../../src/api/routes/events.js";
4+
import { describe } from "node:test";
5+
import { setPaidMembershipInTable } from "../../src/api/functions/membership.js";
6+
7+
const app = await init();
8+
vi.mock("../../src/api/functions/entraId.js", () => {
9+
return {
10+
...vi.importActual("../../src/api/functions/entraId.js"),
11+
getEntraIdToken: vi.fn().mockImplementation(async () => ""),
12+
modifyGroup: vi.fn().mockImplementation(async () => ""),
13+
resolveEmailToOid: vi.fn().mockImplementation(async () => ""),
14+
listGroupMembers: vi.fn().mockImplementation(async () => ""),
15+
};
16+
});
17+
18+
const spySetPaidMembership = vi.spyOn(
19+
await import("../../src/api/functions/membership.js"),
20+
"setPaidMembershipInTable",
21+
);
22+
23+
describe("Test membership routes", async () => {
24+
test("Test getting member", async () => {
25+
const response = await app.inject({
26+
method: "GET",
27+
url: "/api/v1/membership/valid",
28+
});
29+
expect(response.statusCode).toBe(200);
30+
const responseDataJson = (await response.json()) as EventGetResponse;
31+
expect(response.headers).toHaveProperty("x-acm-data-source");
32+
expect(response.headers["x-acm-data-source"]).toEqual("dynamo");
33+
expect(responseDataJson).toEqual({ netId: "valid", isPaidMember: true });
34+
});
35+
36+
test("Test getting non-member", async () => {
37+
const response = await app.inject({
38+
method: "GET",
39+
url: "/api/v1/membership/invalid",
40+
});
41+
expect(response.statusCode).toBe(200);
42+
const responseDataJson = (await response.json()) as EventGetResponse;
43+
expect(response.headers).toHaveProperty("x-acm-data-source");
44+
expect(response.headers["x-acm-data-source"]).toEqual("aad");
45+
expect(responseDataJson).toEqual({ netId: "invalid", isPaidMember: false });
46+
});
47+
48+
test("Entra-only members are added to Dynamo", async () => {
49+
const response = await app.inject({
50+
method: "GET",
51+
url: "/api/v1/membership/eadon2",
52+
});
53+
54+
expect(response.statusCode).toBe(200);
55+
const responseDataJson = (await response.json()) as EventGetResponse;
56+
expect(response.headers).toHaveProperty("x-acm-data-source");
57+
expect(response.headers["x-acm-data-source"]).toEqual("aad");
58+
expect(responseDataJson).toEqual({ netId: "eadon2", isPaidMember: true });
59+
expect(spySetPaidMembership).toHaveBeenCalledWith(
60+
"eadon2",
61+
expect.any(Object),
62+
);
63+
});
64+
65+
afterAll(async () => {
66+
await app.close();
67+
});
68+
});

tests/unit/vitest.setup.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ vi.mock(
5959
return false;
6060
}
6161
}),
62+
checkPaidMembershipFromEntra: vi.fn(
63+
async (netId, _entraToken, _paidMemberGroup) => {
64+
switch (netId) {
65+
case "valid":
66+
return true;
67+
case "eadon2":
68+
return true;
69+
default:
70+
return false;
71+
}
72+
},
73+
),
6274
};
6375
},
6476
);

0 commit comments

Comments
 (0)