/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
import React from "react";
import { ColumnDataType, ColumnMetadata, CurrencyDataType, NumberDataType } from "../../models";
import { render, screen } from "@testing-library/react";
import DataTable from "../DataTable";
import userEvent from "@testing-library/user-event";
const columns = ["year", "sales", "revenue"];
const rows = [
{
year: 2015,
sales: 10000,
revenue: 34,
},
{
year: 2016,
sales: 45000,
revenue: 74,
},
{
year: 2017,
sales: 56000,
revenue: 23,
},
];
const columnsMetadata: ColumnMetadata[] = [
{
columnName: "year",
dataType: ColumnDataType.Text,
hidden: false,
},
{
columnName: "sales",
dataType: ColumnDataType.Number,
numberType: NumberDataType.Currency,
currencyType: CurrencyDataType["Dollar $"],
hidden: false,
},
{
columnName: "revenue",
dataType: ColumnDataType.Number,
numberType: NumberDataType.Percentage,
hidden: false,
},
];
test("table should be hidden by default", async () => {
render(
,
);
expect(screen.queryByRole("table")).not.toBeInTheDocument();
});
test("shows and hides table when button is clicked", async () => {
render(
,
);
const showTableBtn = screen.getByText("Show data table");
userEvent.click(showTableBtn);
expect(screen.getByRole("table")).toBeInTheDocument();
const hideTableBtn = screen.getByText("Hide data table");
userEvent.click(hideTableBtn);
expect(screen.queryByRole("table")).not.toBeInTheDocument();
});
test("displays a table with values properly formatted", async () => {
render(
,
);
const showTableBtn = screen.getByText("Show data table");
userEvent.click(showTableBtn);
// Years should be formatted as text as per ColumnMetadata, without comma separators
expect(screen.getByText("2015")).toBeInTheDocument();
expect(screen.getByText("2016")).toBeInTheDocument();
expect(screen.getByText("2017")).toBeInTheDocument();
// Sales column should be formatted as currency
expect(screen.getByText("$10,000")).toBeInTheDocument();
expect(screen.getByText("$45,000")).toBeInTheDocument();
expect(screen.getByText("$56,000")).toBeInTheDocument();
// Revenue column should be formatted as percentage
expect(screen.getByText("34%")).toBeInTheDocument();
expect(screen.getByText("74%")).toBeInTheDocument();
expect(screen.getByText("23%")).toBeInTheDocument();
});
test("renders a Data Table element with hidden table", async () => {
const wrapper = render(
,
);
expect(wrapper.container).toMatchSnapshot();
});
test("renders a Data Table element with hidden table on mobile", async () => {
const wrapper = render(
,
);
expect(wrapper.container).toMatchSnapshot();
});
test("renders a Data Table element", async () => {
const wrapper = render(
,
);
const showTableBtn = wrapper.getByText("Show data table");
userEvent.click(showTableBtn);
expect(wrapper.container).toMatchSnapshot();
});
test("renders a Data Table element on mobile", async () => {
const wrapper = render(
,
);
const showTableBtn = wrapper.getByText("Show data table");
userEvent.click(showTableBtn);
expect(wrapper.container).toMatchSnapshot();
});