Position the datepicker on top of the input when the input is at the bottom of the screen and whenthere is enough space to display the datepicker on the top.
122 lines
3.1 KiB
TypeScript
122 lines
3.1 KiB
TypeScript
import React, { useRef } from "react";
|
|
import { render, screen, waitFor } from "@testing-library/react";
|
|
import userEvent from "@testing-library/user-event";
|
|
import { Popover } from ".";
|
|
|
|
interface TestComponentProps {
|
|
borderless?: boolean;
|
|
onClickOutside?: () => void;
|
|
}
|
|
const TestComponent = ({
|
|
borderless,
|
|
onClickOutside = () => {},
|
|
}: TestComponentProps) => {
|
|
const parentRef = useRef<HTMLDivElement>(null);
|
|
|
|
return (
|
|
<div>
|
|
<div>Other container</div>
|
|
<div ref={parentRef}>Parent container</div>
|
|
<Popover
|
|
parentRef={parentRef}
|
|
onClickOutside={onClickOutside}
|
|
borderless={borderless}
|
|
>
|
|
Hello Popover
|
|
</Popover>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
describe("<Popover />", () => {
|
|
it("checks the render", async () => {
|
|
render(<TestComponent />);
|
|
|
|
expect(screen.getByText("Parent container")).toBeInTheDocument();
|
|
expect(screen.getByText("Hello Popover")).toBeInTheDocument();
|
|
expect(screen.queryByRole("dialog")).not.toHaveClass(
|
|
"c__popover--borderless",
|
|
);
|
|
});
|
|
|
|
it("checks the borderless prop", async () => {
|
|
render(<TestComponent borderless />);
|
|
expect(screen.getByRole("dialog")).toHaveClass("c__popover--borderless");
|
|
});
|
|
|
|
it("checks onClickOutside prop", async () => {
|
|
const mockOnClickOutside = vi.fn();
|
|
render(<TestComponent onClickOutside={mockOnClickOutside} />);
|
|
|
|
await userEvent.click(screen.getByText("Parent container"));
|
|
expect(mockOnClickOutside).not.toHaveBeenCalled();
|
|
|
|
await userEvent.click(screen.getByText("Other container"));
|
|
expect(mockOnClickOutside).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it("checks popover position top with parent not as origin", async () => {
|
|
// by default window.innerHeight === 768
|
|
const ref = React.createRef<HTMLDivElement>() as any;
|
|
ref.current = {
|
|
offsetTop: 400,
|
|
clientHeight: 100,
|
|
getBoundingClientRect: () => ({
|
|
top: 700,
|
|
}),
|
|
};
|
|
|
|
render(<Popover onClickOutside={() => {}} parentRef={ref} />);
|
|
|
|
waitFor(
|
|
() => {
|
|
expect(screen.getByRole("dialog")).toHaveStyle({
|
|
top: "400px",
|
|
});
|
|
},
|
|
{ timeout: 1000 },
|
|
);
|
|
});
|
|
|
|
it("checks popover position top with parent as origin", async () => {
|
|
// by default window.innerHeight === 768
|
|
const ref = React.createRef<HTMLDivElement>() as any;
|
|
ref.current = {
|
|
offsetTop: 400,
|
|
clientHeight: 0,
|
|
getBoundingClientRect: () => ({
|
|
top: 800,
|
|
}),
|
|
};
|
|
|
|
render(<Popover onClickOutside={() => {}} parentRef={ref} />);
|
|
|
|
waitFor(
|
|
() => {
|
|
expect(screen.getByRole("dialog")).toHaveStyle({
|
|
top: "0px",
|
|
});
|
|
},
|
|
{ timeout: 1000 },
|
|
);
|
|
});
|
|
|
|
it("checks popover position bottom", async () => {
|
|
// by default window.innerHeight === 768
|
|
const ref = React.createRef<HTMLDivElement>() as any;
|
|
ref.current = {
|
|
offsetTop: 500,
|
|
clientHeight: 100,
|
|
getBoundingClientRect: () => ({
|
|
top: 200,
|
|
}),
|
|
};
|
|
|
|
render(<Popover onClickOutside={() => {}} parentRef={ref} />);
|
|
|
|
expect(await screen.findByRole("dialog")).toHaveStyle({
|
|
top: undefined,
|
|
});
|
|
});
|
|
});
|