import { createEventContext } from "@/features/Events/createEventContext"; import { Calendar } from "@/features/Calendars/CalendarTypes"; import { CalendarEvent } from "@/features/Events/EventsTypes"; import { userData } from "@/features/User/userDataTypes"; import { userAttendee } from "@/features/User/models/attendee"; const makeUser = (email: string): userData => ({ email, given_name: "Alice", family_name: "User", name: "Alice User", sid: "user1", sub: "user1", }); const makeEvent = (overrides: Partial = {}): CalendarEvent => ({ uid: "event-1", calId: "user1/cal1", title: "Test Event", start: "2024-01-15T10:00:00", end: "2024-01-15T11:00:00", organizer: { cal_address: "alice@example.com" }, attendee: [ { cal_address: "alice@example.com", partstat: "ACCEPTED" }, { cal_address: "owner@example.com", partstat: "ACCEPTED" }, { cal_address: "other@example.com", partstat: "NEEDS-ACTION" }, ], ...overrides, }) as CalendarEvent; const makeCalendar = (overrides: Partial = {}): Calendar => ({ id: "user1/cal1", name: "Test Calendar", delegated: false, owner: { emails: ["alice@example.com"], firstname: "Alice" }, events: {}, ...overrides, }) as Calendar; describe("createEventContext", () => { describe("non-delegated calendar", () => { const calendar = makeCalendar({ delegated: false }); const user = makeUser("alice@example.com"); it("finds currentUserAttendee by logged-in user email", () => { const event = makeEvent(); const ctx = createEventContext(event, calendar, user); expect(ctx.currentUserAttendee?.cal_address).toBe("alice@example.com"); }); it("returns null currentUserAttendee when user is not an attendee", () => { const event = makeEvent({ attendee: [] }); const ctx = createEventContext(event, calendar, user); expect(ctx.currentUserAttendee).toBeUndefined(); }); it("isOwn is true when user email is in owner emails", () => { const ctx = createEventContext(makeEvent(), calendar, user); expect(ctx.isOwn).toBe(true); }); it("isOwn is false when user email is not in owner emails", () => { const other = makeUser("other@example.com"); const ctx = createEventContext(makeEvent(), calendar, other); expect(ctx.isOwn).toBe(false); }); }); describe("delegated calendar", () => { const calendar = makeCalendar({ id: "user2/cal1", delegated: true, owner: { emails: ["owner@example.com"], firstname: "Owner" }, }); const user = makeUser("alice@example.com"); // logged-in user, not the owner it("finds currentUserAttendee by owner email, not logged-in user email", () => { const event = makeEvent({ calId: "user2/cal1" }); const ctx = createEventContext(event, calendar, user); expect(ctx.currentUserAttendee?.cal_address).toBe("owner@example.com"); }); it("does not find logged-in user as attendee for delegated calendar", () => { const event = makeEvent({ calId: "user2/cal1", attendee: [ { cal_address: "owner@example.com", partstat: "ACCEPTED", } as userAttendee, ], }); const ctx = createEventContext(event, calendar, user); // currentUserAttendee should be owner's, not alice's expect(ctx.currentUserAttendee?.cal_address).toBe("owner@example.com"); }); it("returns undefined currentUserAttendee when owner is not an attendee", () => { const event = makeEvent({ calId: "user2/cal1", attendee: [ { cal_address: "alice@example.com", partstat: "ACCEPTED", } as userAttendee, ], }); const ctx = createEventContext(event, calendar, user); expect(ctx.currentUserAttendee).toBeUndefined(); }); it("passes event through unchanged", () => { const event = makeEvent({ calId: "user2/cal1" }); const ctx = createEventContext(event, calendar, user); expect(ctx.event).toBe(event); }); }); });