diff --git a/__test__/components/Menubar.test.tsx b/__test__/components/Menubar.test.tsx index 896d43e..55a5d6c 100644 --- a/__test__/components/Menubar.test.tsx +++ b/__test__/components/Menubar.test.tsx @@ -55,6 +55,139 @@ describe("Calendar App Component Display Tests", () => { expect(screen.getByText("t")).toBeInTheDocument(); }); + // Edge cases for avatar display logic + it("handles user with only family_name", () => { + (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; + const preloadedState = { + user: { + userData: { + sub: "test", + email: "test@test.com", + family_name: "Smith", + name: null, + sid: "mockSid", + openpaasId: "667037022b752d0026472254", + }, + }, + }; + renderWithProviders(, preloadedState); + expect(screen.getByText("t")).toBeInTheDocument(); + }); + + it("handles user with only name", () => { + (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; + const preloadedState = { + user: { + userData: { + sub: "test", + email: "test@test.com", + family_name: null, + name: "John", + sid: "mockSid", + openpaasId: "667037022b752d0026472254", + }, + }, + }; + renderWithProviders(, preloadedState); + expect(screen.getByText("t")).toBeInTheDocument(); + }); + + it("handles user with both name and family_name", () => { + (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; + const preloadedState = { + user: { + userData: { + sub: "test", + email: "test@test.com", + family_name: "Doe", + name: "John", + sid: "mockSid", + openpaasId: "667037022b752d0026472254", + }, + }, + }; + renderWithProviders(, preloadedState); + expect(screen.getByText("JD")).toBeInTheDocument(); + }); + + it("handles user with no name and family_name", () => { + (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; + const preloadedState = { + user: { + userData: { + sub: "test", + email: "test@test.com", + family_name: null, + name: null, + sid: "mockSid", + openpaasId: "667037022b752d0026472254", + }, + }, + }; + renderWithProviders(, preloadedState); + expect(screen.getByText("t")).toBeInTheDocument(); + }); + + it("handles user with empty email", () => { + (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; + const preloadedState = { + user: { + userData: { + sub: "test", + email: "", + family_name: null, + name: null, + sid: "mockSid", + openpaasId: "667037022b752d0026472254", + }, + }, + }; + renderWithProviders(, preloadedState); + // Should not crash and show empty string + const avatar = screen.getByRole("img", { hidden: true }); + expect(avatar).toBeInTheDocument(); + }); + + it("handles user with null email", () => { + (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; + const preloadedState = { + user: { + userData: { + sub: "test", + email: null, + family_name: null, + name: null, + sid: "mockSid", + openpaasId: "667037022b752d0026472254", + }, + }, + }; + renderWithProviders(, preloadedState); + // Should not crash and show empty string + const avatar = screen.getByRole("img", { hidden: true }); + expect(avatar).toBeInTheDocument(); + }); + + it("handles user with undefined email", () => { + (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; + const preloadedState = { + user: { + userData: { + sub: "test", + email: undefined, + family_name: null, + name: null, + sid: "mockSid", + openpaasId: "667037022b752d0026472254", + }, + }, + }; + renderWithProviders(, preloadedState); + // Should not crash and show empty string + const avatar = screen.getByRole("img", { hidden: true }); + expect(avatar).toBeInTheDocument(); + }); + it("shows AppsIcon when applist is not empty", () => { (window as any).appList = [{ name: "test", icon: "test", link: "test" }]; renderWithProviders(, preloadedState); diff --git a/__test__/features/Events/eventUtils.test.ts b/__test__/features/Events/eventUtils.test.ts index 4cb01b1..da43b72 100644 --- a/__test__/features/Events/eventUtils.test.ts +++ b/__test__/features/Events/eventUtils.test.ts @@ -465,4 +465,168 @@ describe("calendarEventToJCal", () => { ]) ); }); + + // Edge cases for timezone fallback + it("handles invalid timezone with UTC fallback", () => { + const mockEvent = { + uid: "event-invalid-tz", + title: "Invalid Timezone Event", + start: new Date("2025-07-23T10:00:00"), + end: new Date("2025-07-23T11:00:00"), + timezone: "Invalid/Timezone", + allday: false, + attendee: [], + }; + + const result = calendarEventToJCal(mockEvent as CalendarEvent); + + expect(result[0]).toBe("vcalendar"); + const [vevent, vtimezone] = result[2]; + expect(vevent[0]).toBe("vevent"); + expect(vtimezone[0]).toBe("vtimezone"); + + // Should use UTC timezone as fallback - check for UTC standard timezone + expect(vtimezone[2]).toEqual( + expect.arrayContaining([ + ["standard", [ + ["tzoffsetfrom", {}, "utc-offset", "+00:00"], + ["tzoffsetto", {}, "utc-offset", "+00:00"], + ["tzname", {}, "text", "UTC"], + ["dtstart", {}, "date-time", "1970-01-01T00:00:00"] + ], []] + ]) + ); + }); + + it("handles null timezone with UTC fallback", () => { + const mockEvent = { + uid: "event-null-tz", + title: "Null Timezone Event", + start: new Date("2025-07-23T10:00:00"), + end: new Date("2025-07-23T11:00:00"), + timezone: null, + allday: false, + attendee: [], + }; + + const result = calendarEventToJCal(mockEvent as CalendarEvent); + + expect(result[0]).toBe("vcalendar"); + const [vevent, vtimezone] = result[2]; + expect(vevent[0]).toBe("vevent"); + expect(vtimezone[0]).toBe("vtimezone"); + + // Should use UTC timezone as fallback + expect(vtimezone[2]).toEqual( + expect.arrayContaining([ + ["standard", [ + ["tzoffsetfrom", {}, "utc-offset", "+00:00"], + ["tzoffsetto", {}, "utc-offset", "+00:00"], + ["tzname", {}, "text", "UTC"], + ["dtstart", {}, "date-time", "1970-01-01T00:00:00"] + ], []] + ]) + ); + }); + + it("handles undefined timezone with UTC fallback", () => { + const mockEvent = { + uid: "event-undefined-tz", + title: "Undefined Timezone Event", + start: new Date("2025-07-23T10:00:00"), + end: new Date("2025-07-23T11:00:00"), + timezone: undefined, + allday: false, + attendee: [], + }; + + const result = calendarEventToJCal(mockEvent as CalendarEvent); + + expect(result[0]).toBe("vcalendar"); + const [vevent, vtimezone] = result[2]; + expect(vevent[0]).toBe("vevent"); + expect(vtimezone[0]).toBe("vtimezone"); + + // Should use UTC timezone as fallback + expect(vtimezone[2]).toEqual( + expect.arrayContaining([ + ["standard", [ + ["tzoffsetfrom", {}, "utc-offset", "+00:00"], + ["tzoffsetto", {}, "utc-offset", "+00:00"], + ["tzname", {}, "text", "UTC"], + ["dtstart", {}, "date-time", "1970-01-01T00:00:00"] + ], []] + ]) + ); + }); + + it("handles empty string timezone with UTC fallback", () => { + const mockEvent = { + uid: "event-empty-tz", + title: "Empty Timezone Event", + start: new Date("2025-07-23T10:00:00"), + end: new Date("2025-07-23T11:00:00"), + timezone: "", + allday: false, + attendee: [], + }; + + const result = calendarEventToJCal(mockEvent as CalendarEvent); + + expect(result[0]).toBe("vcalendar"); + const [vevent, vtimezone] = result[2]; + expect(vevent[0]).toBe("vevent"); + expect(vtimezone[0]).toBe("vtimezone"); + + // Should use UTC timezone as fallback + expect(vtimezone[2]).toEqual( + expect.arrayContaining([ + ["standard", [ + ["tzoffsetfrom", {}, "utc-offset", "+00:00"], + ["tzoffsetto", {}, "utc-offset", "+00:00"], + ["tzname", {}, "text", "UTC"], + ["dtstart", {}, "date-time", "1970-01-01T00:00:00"] + ], []] + ]) + ); + }); + + it("handles valid timezone correctly", () => { + const mockEvent = { + uid: "event-valid-tz", + title: "Valid Timezone Event", + start: new Date("2025-07-23T10:00:00"), + end: new Date("2025-07-23T11:00:00"), + timezone: "Europe/Paris", + allday: false, + attendee: [], + }; + + const result = calendarEventToJCal(mockEvent as CalendarEvent); + + expect(result[0]).toBe("vcalendar"); + const [vevent, vtimezone] = result[2]; + expect(vevent[0]).toBe("vevent"); + expect(vtimezone[0]).toBe("vtimezone"); + + // Should use the specified timezone - check for Europe/Paris timezone components + expect(vtimezone[2]).toEqual( + expect.arrayContaining([ + ["daylight", [ + ["tzoffsetfrom", {}, "utc-offset", "+01:00"], + ["tzoffsetto", {}, "utc-offset", "+02:00"], + ["tzname", {}, "text", "CEST"], + ["dtstart", {}, "date-time", "1970-03-29T02:00:00"], + ["rrule", {}, "recur", { byday: "-1SU", bymonth: 3, freq: "YEARLY" }] + ], []], + ["standard", [ + ["tzoffsetfrom", {}, "utc-offset", "+02:00"], + ["tzoffsetto", {}, "utc-offset", "+01:00"], + ["tzname", {}, "text", "CET"], + ["dtstart", {}, "date-time", "1970-10-25T03:00:00"], + ["rrule", {}, "recur", { byday: "-1SU", bymonth: 10, freq: "YEARLY" }] + ], []] + ]) + ); + }); });