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();
});
});