import React from "react";
import { render, screen } from "@testing-library/react";
import { noop } from "lodash";
// ignore TS error for now until these are rewritten in ts.
// @ts-ignore
import DataTable from "./DataTable";

const DEFAULT_PAGE_SIZE = 100;

describe("DataTable - component", () => {
  it("renders a data table based on the columns and data passed in", () => {
    const columns = [
      {
        title: "Name",
        Header: "Name",
        accessor: "name",
        disableHidden: false,
      },
    ];

    const data = [{ name: "Test User", id: 1 }];

    render(
      <DataTable
        columns={columns}
        data={data}
        sortHeader={"name"}
        sortDirection={"desc"}
        isLoading={false}
        onSort={noop}
        showMarkAllPages={false}
        isAllPagesSelected={false}
        resultsTitle="users"
        defaultPageSize={DEFAULT_PAGE_SIZE}
        disableMultiRowSelect={false}
        onPrimarySelectActionClick={noop}
      />
    );

    const nameHeader = screen.getByText("Name");
    const nameDataCell = screen.getByText("Test User");
    expect(nameHeader).toBeInTheDocument();
    expect(nameDataCell).toBeInTheDocument();
  });

  it("renders correctly given a sort header", () => {
    const columns = [
      {
        title: "Name",
        Header: "Name",
        accessor: "name",
        disableHidden: false,
      },
      {
        title: "Address",
        Header: "Address",
        accessor: "address",
        disableHidden: false,
      },
    ];

    // 'name' attribute is how we want to sort the data
    const { rerender } = render(
      <DataTable
        columns={columns}
        data={[
          { name: "foo user", address: "biz address" },
          { name: "bar user", address: "daz address" },
        ]}
        sortHeader={"name"}
        sortDirection={"desc"}
        isLoading={false}
        onSort={noop}
        showMarkAllPages={false}
        isAllPagesSelected={false}
        resultsTitle="users"
        defaultPageSize={DEFAULT_PAGE_SIZE}
        disableMultiRowSelect={false}
        onPrimarySelectActionClick={noop}
      />
    );

    let dataCells = screen.getAllByRole("cell");
    let firstNameInTableCell = dataCells[0];
    let secondNameInTableCell = dataCells[2];
    expect(firstNameInTableCell).toHaveTextContent("foo user");
    expect(secondNameInTableCell).toHaveTextContent("bar user");

    // now want to sort on 'address' attribute
    rerender(
      <DataTable
        columns={columns}
        data={[
          { name: "foo user", address: "biz address" },
          { name: "bar user", address: "daz address" },
        ]}
        sortHeader={"address"}
        sortDirection={"desc"}
        isLoading={false}
        onSort={noop}
        showMarkAllPages={false}
        isAllPagesSelected={false}
        resultsTitle="users"
        defaultPageSize={DEFAULT_PAGE_SIZE}
        disableMultiRowSelect={false}
        onPrimarySelectActionClick={noop}
      />
    );

    dataCells = screen.getAllByRole("cell");
    firstNameInTableCell = dataCells[1];
    secondNameInTableCell = dataCells[3];
    expect(firstNameInTableCell).toHaveTextContent("daz address");
    expect(secondNameInTableCell).toHaveTextContent("biz address");
  });

  it("renders correctly given a sortDirection", () => {
    const columns = [
      {
        title: "Name",
        Header: "Name",
        accessor: "name",
        disableHidden: false,
      },
    ];

    // testing 'desc' data
    const { rerender } = render(
      <DataTable
        columns={columns}
        data={[{ name: "foo user" }, { name: "bar user" }]}
        sortHeader={"name"}
        sortDirection={"desc"}
        isLoading={false}
        onSort={noop}
        showMarkAllPages={false}
        isAllPagesSelected={false}
        resultsTitle="users"
        defaultPageSize={DEFAULT_PAGE_SIZE}
        disableMultiRowSelect={false}
        onPrimarySelectActionClick={noop}
      />
    );

    let dataCells = screen.getAllByRole("cell");
    let firstNameInTableCell = dataCells[0];
    let secondNameInTableCell = dataCells[1];
    expect(firstNameInTableCell).toHaveTextContent("foo user");
    expect(secondNameInTableCell).toHaveTextContent("bar user");

    // testing 'asc' data
    rerender(
      <DataTable
        columns={columns}
        data={[{ name: "foo user" }, { name: "bar user" }]}
        sortHeader={"name"}
        sortDirection={"asc"}
        isLoading={false}
        onSort={noop}
        showMarkAllPages={false}
        isAllPagesSelected={false}
        resultsTitle="users"
        defaultPageSize={DEFAULT_PAGE_SIZE}
        disableMultiRowSelect={false}
        onPrimarySelectActionClick={noop}
      />
    );

    dataCells = screen.getAllByRole("cell");
    firstNameInTableCell = dataCells[0];
    secondNameInTableCell = dataCells[1];
    expect(firstNameInTableCell).toHaveTextContent("bar user");
    expect(secondNameInTableCell).toHaveTextContent("foo user");
  });
});
