diff --git a/__test__/components/CalendarSelection.test.tsx b/__test__/components/CalendarSelection.test.tsx index 4326fde..56c6e25 100644 --- a/__test__/components/CalendarSelection.test.tsx +++ b/__test__/components/CalendarSelection.test.tsx @@ -1,193 +1,158 @@ -import { CalendarApi } from "@fullcalendar/core"; -import { jest } from "@jest/globals"; -import { ThunkDispatch } from "@reduxjs/toolkit"; +import { screen, fireEvent } from "@testing-library/react"; import "@testing-library/jest-dom"; -import { screen } from "@testing-library/react"; -import * as appHooks from "../../src/app/hooks"; -import CalendarApp from "../../src/components/Calendar/Calendar"; -import { renderWithProviders } from "../utils/Renderwithproviders"; import CalendarSelection from "../../src/components/Calendar/CalendarSelection"; +import { renderWithProviders } from "../utils/Renderwithproviders"; describe("CalendarSelection", () => { - const today = new Date(); - const start = new Date(today); - start.setHours(10, 0, 0, 0); - const end = new Date(today); - end.setHours(11, 0, 0, 0); + const baseUser = { + userData: { + sub: "test", + email: "test@test.com", + sid: "mockSid", + openpaasId: "user1", + }, + tokens: { accessToken: "token" }, + }; + + const calendarsMock = { + "user1/cal1": { + name: "Calendar personnal", + id: "user1/cal1", + color: "#FF0000", + ownerEmails: ["alice@example.com"], + }, + "user2/cal1": { + name: "Calendar delegated", + delegated: true, + id: "user2/cal1", + color: "#00FF00", + ownerEmails: ["bob@example.com"], + }, + "user3/cal1": { + name: "Calendar shared", + id: "user3/cal1", + color: "#0000FF", + ownerEmails: ["charlie@example.com"], + }, + }; + + it("renders personal, delegated and shared calendars", () => { + renderWithProviders( + , + { + user: baseUser, + calendars: { list: calendarsMock, pending: false }, + } + ); - it("renders the all the calendars in list", async () => { - const preloadedState = { - user: { - userData: { - sub: "test", - email: "test@test.com", - sid: "mockSid", - openpaasId: "user1", - }, - tokens: { accessToken: "token" }, // required to avoid redirect - }, - calendars: { - list: { - "user1/cal1": { - name: "Calendar personnal", - id: "user1/cal1", - color: "#FF0000", - ownerEmails: ["alice@example.com"], - events: { - event1: { - id: "event1", - calId: "user1/cal1", - uid: "event1", - title: "Test Event", - start: start.toISOString(), - end: end.toISOString(), - partstat: "ACCEPTED", - organizer: { - cn: "Alice", - cal_address: "alice@example.com", - }, - attendee: [ - { - cn: "Alice", - partstat: "ACCEPTED", - rsvp: "TRUE", - role: "REQ-PARTICIPANT", - cutype: "INDIVIDUAL", - cal_address: "alice@example.com", - }, - ], - }, - }, - }, - "user2/cal1": { - name: "Calendar delegated", - delegated: true, - id: "user2/cal1", - color: "#FF0000", - ownerEmails: ["alice@example.com"], - events: { - event1: { - id: "event1", - calId: "user2/cal1", - uid: "event1", - title: "Test Event", - start: start.toISOString(), - end: end.toISOString(), - partstat: "ACCEPTED", - organizer: { - cn: "Alice", - cal_address: "alice@example.com", - }, - attendee: [ - { - cn: "Alice", - partstat: "ACCEPTED", - rsvp: "TRUE", - role: "REQ-PARTICIPANT", - cutype: "INDIVIDUAL", - cal_address: "alice@example.com", - }, - ], - }, - }, - }, - "user3/cal1": { - name: "Calendar shared", - id: "user3/cal1", - color: "#FF0000", - ownerEmails: ["alice@example.com"], - events: { - event1: { - id: "event1", - calId: "user3/cal1", - uid: "event1", - title: "Test Event", - start: start.toISOString(), - end: end.toISOString(), - partstat: "ACCEPTED", - organizer: { - cn: "Alice", - cal_address: "alice@example.com", - }, - attendee: [ - { - cn: "Alice", - partstat: "ACCEPTED", - rsvp: "TRUE", - role: "REQ-PARTICIPANT", - cutype: "INDIVIDUAL", - cal_address: "alice@example.com", - }, - ], - }, - }, - }, - }, - pending: false, - }, - }; - renderWithProviders(, preloadedState); expect(screen.getByText("Personnal Calendars")).toBeInTheDocument(); expect(screen.getByText("Delegated Calendars")).toBeInTheDocument(); expect(screen.getByText("Shared Calendars")).toBeInTheDocument(); - expect(screen.getByLabelText("Calendar personnal")).toBeInTheDocument(); - expect(screen.getByLabelText("Calendar delegated")).toBeInTheDocument(); - expect(screen.getByLabelText("Calendar shared")).toBeInTheDocument(); + expect(screen.getByLabelText("Calendar personnal")).toBeChecked(); + expect(screen.getByLabelText("Calendar delegated")).not.toBeChecked(); + expect(screen.getByLabelText("Calendar shared")).not.toBeChecked(); }); - it("renders only personnal calendars in list", async () => { - const preloadedState = { - user: { - userData: { - sub: "test", - email: "test@test.com", - sid: "mockSid", - openpaasId: "user1", - }, - tokens: { accessToken: "token" }, // required to avoid redirect - }, - calendars: { - list: { - "user1/cal1": { - name: "Calendar personnal", - id: "user1/cal1", - color: "#FF0000", - ownerEmails: ["alice@example.com"], - events: { - event1: { - id: "event1", - calId: "user1/cal1", - uid: "event1", - title: "Test Event", - start: start.toISOString(), - end: end.toISOString(), - partstat: "ACCEPTED", - organizer: { - cn: "Alice", - cal_address: "alice@example.com", - }, - attendee: [ - { - cn: "Alice", - partstat: "ACCEPTED", - rsvp: "TRUE", - role: "REQ-PARTICIPANT", - cutype: "INDIVIDUAL", - cal_address: "alice@example.com", - }, - ], - }, - }, + + it("toggles a calendar selection on click", () => { + const setSelectedCalendars = jest.fn(); + + renderWithProviders( + , + { + user: baseUser, + calendars: { list: calendarsMock, pending: false }, + } + ); + + const checkbox = screen.getByLabelText("Calendar personnal"); + fireEvent.click(checkbox); + + expect(setSelectedCalendars).toHaveBeenCalledWith(expect.any(Function)); + + const updater = setSelectedCalendars.mock.calls[0][0]; + expect(updater([])).toEqual(["user1/cal1"]); + }); + + it("removes calendar from selection if already selected", () => { + const setSelectedCalendars = jest.fn(); + + renderWithProviders( + , + { + user: baseUser, + calendars: { list: calendarsMock, pending: false }, + } + ); + + const checkbox = screen.getByLabelText("Calendar personnal"); + fireEvent.click(checkbox); + + const updater = setSelectedCalendars.mock.calls[0][0]; + expect(updater(["user1/cal1"])).toEqual([]); + }); + + it("opens CalendarPopover when Add button is clicked", () => { + renderWithProviders( + , + { + user: baseUser, + calendars: { list: calendarsMock, pending: false }, + } + ); + + const addButton = screen.getByRole("button"); + fireEvent.click(addButton); + + expect(screen.getByRole("presentation")).toBeInTheDocument(); + }); + + it("renders only personal calendars if no delegated/shared exist", () => { + renderWithProviders( + , + { + user: baseUser, + calendars: { + list: { + "user1/cal1": calendarsMock["user1/cal1"], }, + pending: false, }, - pending: false, - }, - }; - renderWithProviders(, preloadedState); + } + ); + expect(screen.getByText("Personnal Calendars")).toBeInTheDocument(); expect(screen.queryByText("Delegated Calendars")).not.toBeInTheDocument(); expect(screen.queryByText("Shared Calendars")).not.toBeInTheDocument(); + }); - expect(screen.getByLabelText("Calendar personnal")).toBeInTheDocument(); + it("renders nothing when no calendars are present", () => { + renderWithProviders( + , + { + user: baseUser, + calendars: { list: {}, pending: false }, + } + ); + + expect(screen.queryByLabelText(/Calendar/)).not.toBeInTheDocument(); }); });