Files
gutscheintracker/tests/access.test.ts
T

54 lines
2.9 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { canAccess, contactUsableIn, resolveTarget, scopeWhere, type Viewer } from "../lib/access";
const adminOhneHaushalt: Viewer = { id: 1, name: "Admin", email: null, role: "admin", isServerAdmin: true, householdId: null, householdName: null, householdRole: null };
const julia: Viewer = { id: 2, name: "Julia", email: "j@x.de", role: "member", isServerAdmin: false, householdId: 7, householdName: "Familie", householdRole: "admin" };
const gast: Viewer = { id: 3, name: "Gast", email: "g@x.de", role: "member", isServerAdmin: false, householdId: null, householdName: null, householdRole: null };
describe("scopeWhere", () => {
it("Haushaltsmitglied sieht Haushalt plus eigene private Einträge", () => {
expect(scopeWhere(julia)).toEqual({ OR: [{ householdId: 7 }, { householdId: null, ownerId: 2 }] });
});
it("Server-Admin ohne Mitgliedschaft sieht nur eigene private Einträge", () => {
expect(scopeWhere(adminOhneHaushalt)).toEqual({ householdId: null, ownerId: 1 });
});
it("Unzugeordnete sehen nur eigene private Einträge", () => {
expect(scopeWhere(gast)).toEqual({ householdId: null, ownerId: 3 });
});
});
describe("canAccess", () => {
it("Haushaltseinträge nur für Mitglieder desselben Haushalts", () => {
expect(canAccess(julia, { householdId: 7, ownerId: 2 })).toBe(true);
expect(canAccess(julia, { householdId: 8, ownerId: 2 })).toBe(false);
expect(canAccess(adminOhneHaushalt, { householdId: 7, ownerId: 2 })).toBe(false);
});
it("private Einträge nur für den Besitzer", () => {
expect(canAccess(julia, { householdId: null, ownerId: 2 })).toBe(true);
expect(canAccess(julia, { householdId: null, ownerId: 3 })).toBe(false);
expect(canAccess(gast, { householdId: null, ownerId: 3 })).toBe(true);
});
});
describe("contactUsableIn", () => {
it("Haushaltsgutschein braucht Kontakt desselben Haushalts", () => {
expect(contactUsableIn(julia, 7, { householdId: 7, ownerId: 2 })).toBe(true);
expect(contactUsableIn(julia, 7, { householdId: 8, ownerId: 2 })).toBe(false);
expect(contactUsableIn(julia, 7, { householdId: null, ownerId: 2 })).toBe(false);
});
it("privater Gutschein braucht eigenen privaten Kontakt", () => {
expect(contactUsableIn(julia, null, { householdId: null, ownerId: 2 })).toBe(true);
expect(contactUsableIn(julia, null, { householdId: 7, ownerId: 2 })).toBe(false);
expect(contactUsableIn(julia, null, { householdId: null, ownerId: 3 })).toBe(false);
});
});
describe("resolveTarget", () => {
it("explizite Ablage, Haushalt erforderlich für gemeinsam", () => {
expect(resolveTarget(julia, "household")).toEqual({ ok: true, householdId: 7 });
expect(resolveTarget(gast, "household")).toEqual({ ok: false, error: expect.any(String) });
expect(resolveTarget(julia, "private")).toEqual({ ok: true, householdId: null });
expect(resolveTarget(julia, "falsch")).toEqual({ ok: false, error: expect.any(String) });
});
});