Files
gunshiz 96c27f8fc3
CI / Verify (push) Successful in 1m36s
CI / Build immutable images and deploy (push) Successful in 2m17s
fix(commission) : replace repeated notification buttons with entry prompt
2026-10-02 12:07:41 +07:00

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",
}));
});
});