import React from "react";
import { render, userEvent } from "@testing-library/react-native";
import { Banner } from ".";
import { Text } from "../Text";
import { TextList } from "../TextList";
const user = userEvent.setup();
describe("Banner", () => {
describe("Type", () => {
it("renders an error Banner", () => {
const { getByText, getByTestId } = render(
,
);
const icon = getByTestId("ATL-Banner-Icon");
expect(getByText("An error happened")).toBeDefined();
expect(icon.props.children.props.name).toBe("alert");
});
it("renders a warning Banner", () => {
const { getByText, getByTestId } = render(
,
);
const icon = getByTestId("ATL-Banner-Icon");
expect(getByText("Here is a warning")).toBeDefined();
expect(icon.props.children.props.name).toBe("warning");
});
it("renders a notice Banner", () => {
const { getByText, getByTestId } = render(
,
);
const icon = getByTestId("ATL-Banner-Icon");
expect(getByText("Notice me")).toBeDefined();
expect(icon.props.children.props.name).toBe("info");
});
it("renders a success Banner", () => {
const { getByText, getByTestId } = render(
Your import is complete
,
);
const icon = getByTestId("ATL-Banner-Icon");
expect(getByText("Your import is complete")).toBeDefined();
expect(icon.props.children.props.name).toBe("checkmark");
});
});
describe("Children", () => {
describe("should flow", () => {
it("renders using RNText when there is a text prop", () => {
const { getByText, queryByTestId } = render(
,
);
expect(getByText("Notice me")).toBeDefined();
expect(queryByTestId("ATL-Banner-RNText")).toBeDefined();
});
it("renders using RNText when there is a Text element", () => {
const { getByText, queryByTestId } = render(
Notice me
,
);
expect(getByText("Notice me")).toBeDefined();
expect(queryByTestId("ATL-Banner-RNText")).toBeDefined();
});
});
describe("should stack", () => {
it("renders using View when there is a details prop", () => {
const { getByText, queryByTestId } = render(
,
);
expect(getByText("details")).toBeDefined();
expect(queryByTestId("ATL-View-Container")).toBeDefined();
});
it("renders using View when there is more than one child", () => {
const { getByText, queryByTestId } = render(
Notice me
,
);
expect(getByText("Notice me")).toBeDefined();
expect(getByText("Detail Three")).toBeDefined();
expect(queryByTestId("ATL-View-Container")).toBeDefined();
});
it("renders using View when there is a details prop and a text prop", () => {
const { getByText, queryByTestId } = render(
,
);
expect(getByText("Notice me")).toBeDefined();
expect(getByText("details")).toBeDefined();
expect(queryByTestId("ATL-View-Container")).toBeDefined();
});
it("renders using View when there are text and details props, as well as a child", () => {
const { getByText, queryByTestId } = render(
I am a text child!
,
);
expect(getByText("Notice me")).toBeDefined();
expect(getByText("I am a text child!")).toBeDefined();
expect(queryByTestId("ATL-View-Container")).toBeDefined();
});
});
it("should render multiple details when using the details prop", () => {
const tree = render(
,
);
expect(tree.getByText("details")).toBeDefined();
expect(tree.getByText("etc")).toBeDefined();
});
it("should render multiple details when using the TextList component", () => {
const tree = render(
,
);
expect(tree.getByText("details")).toBeDefined();
expect(tree.getByText("etc")).toBeDefined();
});
it("should render a Typography bar when there is an action prop but no details", () => {
const { getByText } = render(
,
);
expect(getByText("Reconnect")).toBeDefined();
expect(getByText("|")).toBeDefined();
});
it("should not render a Typography bar when there are action and details props", () => {
const { getByText, queryByText } = render(
,
);
expect(getByText("Reconnect")).toBeDefined();
expect(queryByText("|")).toBeNull();
});
});
describe("Dismissal", () => {
it("does not render a dismiss button by default", () => {
const { queryByTestId } = render(
Notice me,
);
expect(queryByTestId("ATL-Banner-DismissButton")).toBeNull();
});
it("renders a dismiss button when dismissible", () => {
const { getByTestId } = render(
Notice me
,
);
expect(getByTestId("ATL-Banner-DismissButton")).toBeDefined();
});
it("keeps a non-action banner accessible as an alert", () => {
const { getByTestId } = render(
Notice me
,
);
expect(getByTestId("ATL-Banner-Content").props.accessible).toBe(true);
expect(getByTestId("ATL-Banner-Content").props.accessibilityRole).toBe(
"alert",
);
});
it("dismisses the banner and calls onDismiss when the dismiss button is pressed", async () => {
const onDismiss = jest.fn();
const { getByTestId, queryByText } = render(
Notice me
,
);
await user.press(getByTestId("ATL-Banner-DismissButton"));
expect(onDismiss).toHaveBeenCalledTimes(1);
expect(queryByText("Notice me")).toBeNull();
});
it("does not call the banner action when the dismiss button is pressed", async () => {
const onDismiss = jest.fn();
const onPress = jest.fn();
const { getByTestId } = render(
Notice me
,
);
await user.press(getByTestId("ATL-Banner-DismissButton"));
expect(onDismiss).toHaveBeenCalledTimes(1);
expect(onPress).not.toHaveBeenCalled();
});
it("calls the banner action when the main banner content is pressed", async () => {
const onPress = jest.fn();
const { getByTestId } = render(
Notice me
,
);
await user.press(getByTestId("ATL-Banner-Pressable"));
expect(onPress).toHaveBeenCalledTimes(1);
});
});
});