import { render, waitFor } from "@testing-library/react"; import { ptBR } from "date-fns/locale/pt-BR"; import React from "react"; import { registerLocale } from "../date_utils"; import TimeComponent from "../time"; describe("TimeComponent", () => { registerLocale("pt-BR", ptBR); beforeEach(() => { // sandbox = sinon.createSandbox(); // // mock global time to June 14, 1990 13:28:12, so test results will be constant // sandbox.useFakeTimers({ // now: new Date("1990-06-14 13:28").valueOf(), // toFake: ["Date"], // }); jest.useFakeTimers().setSystemTime(new Date("1990-06-14 13:28")); }); afterEach(() => { jest.restoreAllMocks(); }); describe("Format", () => { let spy: jest.SpyInstance; beforeEach(() => { spy = jest.spyOn(TimeComponent, "calcCenterPosition"); }); it("should forward the time format provided in timeFormat props", () => { const { container } = render(); const timeListItem = container.querySelector( ".react-datepicker__time-list-item", ); expect(timeListItem?.textContent).toBe("00:00"); }); it("should format the time based on the default locale (en-US)", async () => { render(); await waitFor(() => { expect(spy.mock.calls[0][1].innerHTML).toBe("1:00 PM"); }); }); it("should format the time based on the pt-BR locale", async () => { render(); await waitFor(() => { expect(spy.mock.calls[0][1].innerHTML).toBe("13:00"); }); }); }); describe("Initial position", () => { let spy: jest.SpyInstance; beforeEach(() => { spy = jest.spyOn(TimeComponent, "calcCenterPosition"); }); it("should call calcCenterPosition once", async () => { render(); await waitFor(() => { expect(spy).toHaveBeenCalled(); }); }); it("should call calcCenterPosition with centerLi ref, closest to the current time", async () => { render(); await waitFor(() => { expect(spy.mock.calls[0][1].innerHTML).toBe("13:00"); }); }); it("with five minute time interval, should call calcCenterPosition with centerLi ref, closest to the current time", async () => { render(); await waitFor(() => { expect(spy.mock.calls[0][1].innerHTML).toBe("13:25"); }); }); it("should call calcCenterPosition with centerLi ref, closest to the selected time", async () => { render( , ); await waitFor(() => { expect(spy.mock.calls[0][1].innerHTML).toBe("08:00"); }); }); it("should call calcCenterPosition with centerLi ref, which is selected", async () => { render( , ); await waitFor(() => { expect( spy.mock.calls[0][1].classList.contains( "react-datepicker__time-list-item--selected", ), ).toBe(true); }); }); it("should add the aria-selected property to the selected item", () => { const { container } = render( , ); const timeListItem = container.querySelector( ".react-datepicker__time-list-item--selected", ); expect(timeListItem?.getAttribute("aria-selected")).toBe("true"); }); it("should enable keyboard focus on the selected item", () => { const { container } = render( , ); const timeListItem = container.querySelector( ".react-datepicker__time-list-item--selected", ); expect(timeListItem?.tabIndex).toBe(0); }); it("should not add the aria-selected property to a regular item", () => { const { container } = render( , ); const timeListItem = container.querySelector( ".react-datepicker__time-list-item", ); expect(timeListItem?.getAttribute("aria-selected")).toBeNull(); }); it("should disable keyboard focus on a regular item", () => { const { container } = render( , ); const timeListItem = container.querySelector( ".react-datepicker__time-list-item", ); expect(timeListItem?.tabIndex).toBe(-1); }); it("when no selected time, should focus the time closest to the opened time", () => { const { container } = render( , ); const timeListItem = container.querySelectorAll( ".react-datepicker__time-list-item", ); expect( Array.from(timeListItem ?? []).find( (node) => node.tagName && node.textContent === "09:00", )?.tabIndex, ).toBe(0); }); it("when no selected time, should call calcCenterPosition with centerLi ref, closest to the opened time", async () => { render( , ); await waitFor(() => { expect(spy.mock.calls[0][1].innerHTML).toBe("09:00"); }); }); it("when no selected time, should call calcCenterPosition with centerLi ref, and no time should be selected", async () => { render( , ); await waitFor(() => { expect( spy.mock.calls[0][1].classList.contains( "react-datepicker__time-list-item--selected", ), ).toBe(false); }); }); it("should calculate scroll for the first item of 4 (even) items list", () => { expect( TimeComponent.calcCenterPosition(200, { offsetTop: 0, clientHeight: 50, } as HTMLLIElement), ).toBe(-75); }); it("should calculate scroll for the last item of 4 (even) items list", () => { expect( TimeComponent.calcCenterPosition(200, { offsetTop: 150, clientHeight: 50, } as HTMLLIElement), ).toBe(75); }); it("should calculate scroll for the first item of 3 (odd) items list", () => { expect( TimeComponent.calcCenterPosition(90, { offsetTop: 0, clientHeight: 30, } as HTMLLIElement), ).toBe(-30); }); it("should calculate scroll for the last item of 3 (odd) items list", () => { expect( TimeComponent.calcCenterPosition(90, { offsetTop: 60, clientHeight: 30, } as HTMLLIElement), ).toBe(30); }); }); });