rescribet/link-redux

View on GitHub
src/hooks/__tests__/useField.spec.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import * as schema from "@ontologies/schema";
import { fireEvent, render } from "@testing-library/react";
import React from "react";
import ReactDOM from "react-dom";
import { act } from "react-dom/test-utils";

import * as ctx from "../../__tests__/helpers/fixtures";
import example from "../../ontology/example";
import { useFields } from "../useParsedField";

describe("useFields", () => {
  let container: HTMLElement | undefined;

  beforeEach(() => {
    container = document.createElement("div");
    document.body.appendChild(container);
  });

  afterEach(() => {
    document.body.removeChild(container!);
    container = undefined;
  });

  it("retrieves a property", () => {
    const opts = ctx.fullCW();

    const UpdateComp = () => {
      const [test] = useFields(schema.name);

      return <div id="test">{test?.value}</div>;
    };

    act(() => {
      // @ts-ignore
      ReactDOM.render(opts.wrapComponent(<UpdateComp />), container);
    });

    expect(container!.querySelector("#test")!.textContent).toBe("title");
  });

  it("memoized between renders", () => {
    const opts = ctx.fullCW();
    const values: any[] = [];

    const UpdateComp = () => {
      const tags = useFields(example.ns("tags"));
      values.push(tags);

      const [s, setS] = React.useState(0);
      const handleClick = () => setS(s + 1);

      return (
        <div
          data-testid="id"
          onClick={handleClick}
        >
          {s}
        </div>
      );
    };

    const { getByTestId } = render(opts.wrapComponent(<UpdateComp />));

    fireEvent.click(getByTestId("id"));

    expect(values).toHaveLength(2);
    expect(values[0] === values[1]).toBeTruthy();
  });

  /**
   * This makes it a lot easier to use the hook chained with others like useFields.
   */
  it("allows undefined property", () => {
    const opts = ctx.fullCW();

    const UpdateComp = () => {
      const [test] = useFields(undefined);

      return <div id="test">{test}</div>;
    };

    act(() => {
      // @ts-ignore
      ReactDOM.render(opts.wrapComponent(<UpdateComp />), container);
    });

    expect(container!.querySelector("#test")!.textContent).toBe("");
  });
});