import React from 'react'; import { renderAsyncTest } from '@lg-tools/test-harnesses'; import { fireEvent, render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import Checkbox from '../Checkbox'; import { getTestUtils } from './getTestUtils'; const defaultProps = { label: 'Test Input Label', description: 'This is the description', placeholder: 'This is some placeholder text', }; const renderCheckboxAsync = () => renderAsyncTest(, render); function renderCheckbox(props = {}) { const renderUtils = render( , ); return { ...renderUtils }; } function renderMultipleInputs() { render( <> , ); } describe('packages/checkbox', () => { describe('getTestUtils', () => { test('throws error if LG Checkbox is not found', () => { render(); try { const _utils = getTestUtils(); } catch (error) { expect(error).toBeInstanceOf(Error); expect(error).toHaveProperty( 'message', expect.stringMatching( /Unable to find an element by: \[data-lgid="lg-checkbox"\]/, ), ); } }); describe('single input', () => { describe('getInput', () => { test('is in the document', () => { renderCheckbox(); const { getInput } = getTestUtils(); expect(getInput()).toBeInTheDocument(); }); }); describe('getLabel', () => { test('is in the document', () => { renderCheckbox(); const { getLabel } = getTestUtils(); expect(getLabel()).toBeInTheDocument(); }); }); describe('getDescription', () => { test('is in the document', () => { renderCheckbox(); const { getDescription } = getTestUtils(); expect(getDescription()).toBeInTheDocument(); }); test('is not in the document', () => { renderCheckbox({ description: '' }); const { getDescription } = getTestUtils(); expect(getDescription()).not.toBeInTheDocument(); }); }); describe('getInputValue', () => { test('returns false by default', () => { renderCheckbox(); const { getInputValue } = getTestUtils(); expect(getInputValue()).toBe(false); }); test('returns value when uncontrolled', () => { renderCheckbox(); const { getInput, getInputValue } = getTestUtils(); fireEvent.click(getInput()); expect(getInputValue()).toBe(true); }); test('returns value when controlled', () => { renderCheckbox({ value: true }); const { getInput, getInputValue } = getTestUtils(); fireEvent.click(getInput()); expect(getInputValue()).toBe(true); }); }); describe('isDisabled', () => { test('is true', () => { renderCheckbox({ disabled: true }); const { isDisabled } = getTestUtils(); expect(isDisabled()).toBe(true); }); test('is false', () => { renderCheckbox(); const { isDisabled } = getTestUtils(); expect(isDisabled()).toBe(false); }); }); describe('isIndeterminate', () => { test('is true', () => { renderCheckbox({ indeterminate: true }); const { isIndeterminate } = getTestUtils(); expect(isIndeterminate()).toBe(true); }); test('is false', () => { renderCheckbox(); const { isIndeterminate } = getTestUtils(); expect(isIndeterminate()).toBe(false); }); }); }); describe('multiple inputs', () => { test('getInput', () => { renderMultipleInputs(); const utilsOne = getTestUtils('lg-checkbox-1'); const utilsTwo = getTestUtils('lg-checkbox-2'); expect(utilsOne.getInput()).toBeInTheDocument(); expect(utilsTwo.getInput()).toBeInTheDocument(); }); test('getInputValue', () => { renderMultipleInputs(); const utilsOne = getTestUtils('lg-checkbox-1'); const utilsTwo = getTestUtils('lg-checkbox-2'); expect(utilsOne.getInputValue()).toBe(true); expect(utilsTwo.getInputValue()).toBe(false); }); }); describe('Async component', () => { test('find LG Checkbox after awaiting an async component', async () => { const { openButton, findByTestId, asyncTestComponentId } = renderCheckboxAsync(); userEvent.click(openButton); const asyncComponent = await findByTestId(asyncTestComponentId); expect(asyncComponent).toBeInTheDocument(); // After awaiting asyncComponent, look for checkbox const { getInput } = getTestUtils(); expect(getInput()).toBeInTheDocument(); }); test('find LG Checkbox awaiting getLGCheckboxTestUtils', async () => { const { openButton } = renderCheckboxAsync(); userEvent.click(openButton); // awaiting getTestUtils await waitFor(() => { const { getInput } = getTestUtils(); expect(getInput()).toBeInTheDocument(); }); }); test('Updates the value inside an async component', async () => { const { openButton, findByTestId, asyncTestComponentId } = renderCheckboxAsync(); userEvent.click(openButton); const asyncComponent = await findByTestId(asyncTestComponentId); expect(asyncComponent).toBeInTheDocument(); // After awaiting asyncComponent, look for checkbox const { getInput, getInputValue } = getTestUtils(); const input = getInput(); fireEvent.click(input); expect(getInputValue()).toBe(true); }); }); }); });