Home Reference Source Test

src/MultiTable.test.js

import React from 'react';
import {render, fireEvent} from '@testing-library/react';
import * as reactDeviceDetect from 'react-device-detect';
import MultiTable from './MultiTable';
import dataReducer from './modules/data';

it('can change tables browser', () => {
  const mockEvent = jest.fn();

  // Fake a reducer call to get the initial state
  const data = dataReducer(undefined, {}).sourceData;

  const {container} = render(
    <MultiTable ReactGA={{event: mockEvent}} tables={data} />
  );

  const browserSelect = container.querySelector('.browserSelect');

  // Change the table
  fireEvent.change(browserSelect, {target: {value: 'Patient'}});

  expect(mockEvent.mock.calls.length).toBe(1);
  expect(mockEvent.mock.calls[0][0].category).toBe('User Selecting A Table');
  expect(mockEvent.mock.calls[0][0].action).toBe('Patient');

  // Check that the correct table data is displayed
  expect(container).toHaveTextContent('Patient');

  // The browserTable should be rendered (it's always rendered in browser view)
  const browserTable = container.querySelector('.ReactTable');
  expect(browserTable).toBeInTheDocument();

  // Check that Patient data is displayed
  data.Patient.columns.forEach((column) => {
    expect(container).toHaveTextContent(column);
  });
});

it('can change tables mobile', () => {
  const mockEvent = jest.fn();
  // Fake a reducer call to get the initial state
  const data = dataReducer(undefined, {}).sourceData;

  // Mock the isMobileOnly to true for this test
  const originalIsMobileOnly = reactDeviceDetect.isMobileOnly;
  reactDeviceDetect.isMobileOnly = true;

  const {container} = render(
    <MultiTable ReactGA={{event: mockEvent}} tables={data} />
  );

  const mobileSelect = container.querySelector('.mobileSelect');

  if (mobileSelect) {
    fireEvent.change(mobileSelect, {target: {value: 'Patient'}});

    expect(mockEvent.mock.calls.length).toBe(1);
    expect(mockEvent.mock.calls[0][0].category).toBe('User Selecting A Table');
    expect(mockEvent.mock.calls[0][0].action).toBe('Patient');

    const mobileButton = container.querySelector('.mobileButton');
    if (mobileButton) {
      fireEvent.click(mobileButton);
      // Check that mobile table is now displayed
      expect(container.querySelector('.mobileTable')).toBeInTheDocument();

      // Check that Patient data is displayed in mobile table
      data.Patient.columns.forEach((column) => {
        expect(container).toHaveTextContent(column);
      });
    }
  }

  // Restore original value
  reactDeviceDetect.isMobileOnly = originalIsMobileOnly;
});