63 lines
2.7 KiB
TypeScript
63 lines
2.7 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
const requireCommissionUser = vi.fn();
|
|
const limitRequest = vi.fn();
|
|
const insert = vi.fn();
|
|
const values = vi.fn();
|
|
const onConflictDoUpdate = vi.fn();
|
|
|
|
vi.mock("@/lib/commission/server", () => ({ requireCommissionUser }));
|
|
vi.mock("@/lib/security/rate-limit", () => ({ limitRequest }));
|
|
vi.mock("@/db", () => ({ getDb: () => ({ insert }) }));
|
|
vi.mock("@/lib/commission/push", () => ({
|
|
pushPublicKey: () => "public-key",
|
|
validPushEndpoint: (value: string) => value.startsWith("https://fcm.googleapis.com/"),
|
|
}));
|
|
|
|
const { GET, POST } = await import("./route");
|
|
const subscription = { endpoint: "https://fcm.googleapis.com/fcm/send/token",
|
|
keys: { p256dh: "a".repeat(87), auth: "b".repeat(22) } };
|
|
|
|
function request(scope: "customer" | "admin", endpoint = subscription.endpoint) {
|
|
return new Request("https://guide.sudloh.com/api/commission/push-subscription", {
|
|
method: "POST", headers: { Origin: "https://guide.sudloh.com", "Content-Type": "application/json" },
|
|
body: JSON.stringify({ ...subscription, endpoint, scope }),
|
|
});
|
|
}
|
|
|
|
describe("commission push subscriptions", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
process.env.BETTER_AUTH_URL = "https://guide.sudloh.com";
|
|
requireCommissionUser.mockResolvedValue({ id: "customer-1", role: "user", emailVerified: true });
|
|
insert.mockReturnValue({ values });
|
|
values.mockReturnValue({ onConflictDoUpdate });
|
|
onConflictDoUpdate.mockResolvedValue(undefined);
|
|
});
|
|
|
|
it("rejects customer registration for admin notifications", async () => {
|
|
expect((await POST(request("admin"))).status).toBe(403);
|
|
expect(insert).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("only offers admin push scope to verified admins", async () => {
|
|
expect(await (await GET()).json()).toEqual({ publicKey: "public-key", canAdmin: false });
|
|
requireCommissionUser.mockResolvedValue({ id: "admin-1", role: "admin", emailVerified: false });
|
|
expect(await (await GET()).json()).toEqual({ publicKey: "public-key", canAdmin: false });
|
|
requireCommissionUser.mockResolvedValue({ id: "admin-1", role: "admin", emailVerified: true });
|
|
expect(await (await GET()).json()).toEqual({ publicKey: "public-key", canAdmin: true });
|
|
});
|
|
|
|
it("rejects a push endpoint outside browser push services", async () => {
|
|
expect((await POST(request("customer", "https://internal.example/push"))).status).toBe(400);
|
|
expect(insert).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("stores a subscription for the authenticated customer", async () => {
|
|
expect((await POST(request("customer"))).status).toBe(204);
|
|
expect(values).toHaveBeenCalledWith(expect.objectContaining({
|
|
endpoint: subscription.endpoint, userId: "customer-1", scope: "customer",
|
|
}));
|
|
});
|
|
});
|