/*
* Copyright 2021-2024 Avaiga Private Limited
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
import React from "react";
import { render } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import "@testing-library/jest-dom";
import { LocalizationProvider } from "@mui/x-date-pickers";
import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFnsV3";
import DateSelector from "./DateSelector";
import { TaipyContext } from "../../context/taipyContext";
import { TaipyState, INITIAL_STATE } from "../../context/taipyReducers";
import { getClientServerTimeZoneOffset } from "../../utils";
jest.mock("../../utils", () => {
const originalModule = jest.requireActual("../../utils");
//Mock getClientServerTimeZoneOffset
return {
__esModule: true,
...originalModule,
getClientServerTimeZoneOffset: () => 0,
};
});
beforeEach(() => {
// add window.matchMedia
// this is necessary for the date picker to be rendered in desktop mode.
// if this is not provided, the mobile mode is rendered, which might lead to unexpected behavior
Object.defineProperty(window, "matchMedia", {
writable: true,
value: (query: string): MediaQueryList => ({
media: query,
// this is the media query that @material-ui/pickers uses to determine if a device is a desktop device
matches: query === "(pointer: fine)",
onchange: () => {},
addEventListener: () => {},
removeEventListener: () => {},
addListener: () => {},
removeListener: () => {},
dispatchEvent: () => false,
}),
});
});
afterEach(() => {
// @ts-ignore
delete window.matchMedia;
});
const curDate = new Date();
curDate.setHours(1, 1, 1, 1);
const curDateStr = curDate.toISOString();
const cleanText = (val: string) => val.replace(/\u200e|\u2066|\u2067|\u2068|\u2069/g, "");
describe("DateSelector Component", () => {
it("renders", async () => {
const { getByTestId } = render(
);
const elt = getByTestId("CalendarIcon");
expect(elt.parentElement?.tagName).toBe("BUTTON");
});
it("displays the right info for string", async () => {
const { getByTestId } = render(
);
const elt = getByTestId("CalendarIcon");
expect(elt.parentElement?.parentElement?.parentElement?.parentElement).toHaveClass("taipy-date-picker");
expect(elt.parentElement?.parentElement?.parentElement?.parentElement?.parentElement).toHaveClass("taipy-date");
});
it("displays the default value", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(cleanText(input?.value || "")).toEqual("01/01/2001");
});
it("displays the default value with format", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(cleanText(input?.value || "")).toEqual("11-01-01");
});
it("shows label", async () => {
const { getByLabelText } = render(
);
const input = getByLabelText("a label") as HTMLInputElement;
expect(input.value).toBe("01/01/2001");
});
it("displays with width=70%", async () => {
render(
);
const elt = document.querySelector(".MuiFormControl-root");
expect(elt).toHaveStyle("max-width: 70%");
});
it("displays with width=500", async () => {
render(
);
const elt = document.querySelector(".MuiFormControl-root");
expect(elt).toHaveStyle("max-width: 500px");
});
it("is disabled", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(input).toBeDisabled();
});
it("is enabled by default", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(input).not.toBeDisabled();
});
it("is enabled by active", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(input).not.toBeDisabled();
});
it("dispatch a well formed message", async () => {
const dispatch = jest.fn();
const state: TaipyState = INITIAL_STATE;
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
if (input) {
// await userEvent.clear(input);
await userEvent.type(input, "{ArrowLeft}{ArrowLeft}{ArrowLeft}01012001", { delay: 1 });
expect(dispatch).toHaveBeenLastCalledWith({
name: "",
payload: { value: "Mon Jan 01 2001" },
propagate: true,
type: "SEND_UPDATE_ACTION",
});
}
});
});
describe("DateSelector with time Component", () => {
it("renders", async () => {
const { getByTestId } = render(
);
const elt = getByTestId("CalendarIcon");
expect(elt.parentElement?.tagName).toBe("BUTTON");
});
it("displays the right info for string", async () => {
const { getByTestId } = render(
);
const elt = getByTestId("CalendarIcon");
expect(elt.parentElement?.parentElement?.parentElement?.parentElement).toHaveClass("taipy-time-picker");
expect(elt.parentElement?.parentElement?.parentElement?.parentElement?.parentElement).toHaveClass("taipy-time");
});
it("displays the default value", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(cleanText(input?.value || "").toLocaleLowerCase()).toEqual("01/01/2001 01:01 am");
});
it("displays the default value with format", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(cleanText(input?.value || "")).toEqual("11-01-01 10");
});
it("is disabled", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(input).toBeDisabled();
});
it("is enabled by default", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(input).not.toBeDisabled();
});
it("is enabled by active", async () => {
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
expect(input).not.toBeDisabled();
});
it("dispatch a well formed message", async () => {
const dispatch = jest.fn();
const state: TaipyState = INITIAL_STATE;
render(
);
const input = document.querySelector("input");
expect(input).toBeInTheDocument();
if (input) {
// await userEvent.clear(input);
await userEvent.type(
input,
"{ArrowLeft}{ArrowLeft}{ArrowLeft}{ArrowLeft}{ArrowLeft}{ArrowLeft}010120010101am",
{ delay: 1 }
);
expect(dispatch).toHaveBeenLastCalledWith({
name: "varname",
payload: { value: "2001-01-01T01:01:00.000Z" },
propagate: true,
type: "SEND_UPDATE_ACTION",
});
}
});
});