import React from 'react'; import { StyleSheet } from 'react-native'; import validator from 'html-validator'; import { HTMLTable } from '../HTMLTable'; import { act, render } from '@testing-library/react-native'; import Ersatz from '@formidable-webview/ersatz'; import { waitForErsatz } from '@formidable-webview/ersatz-testing'; import { HTMLTableStats } from '../types'; import './setup'; import { TableConfig, TableContentHeightState } from '@native-html/table-plugin'; const defaultTestConfig = { WebView: Ersatz, animationType: 'none' as TableConfig['animationType'], debug: false }; const simpleHTML = `
Entry Header 1 Entry Header 2 Entry Header 3
`; const dummyStats: HTMLTableStats = { numOfChars: 200, numOfColumns: 1, numOfRows: 2 }; function waitForRender(timeMs: number = 1000) { // eslint-disable-next-line compat/compat return act(() => new Promise((res) => setTimeout(res, timeMs))); } // We have to exclude those tests until an upstream bug in jest // regarding forwarded ref components is fixed. // See https://github.com/callstack/react-native-testing-library/issues/539 describe('HTMLTable component', () => { it('should produce w3-compliant HTML code', async () => { const webview = await waitForErsatz( render() ); const validated = await validator({ data: webview.props.source.html, format: 'json' }); expect(validated).toBeValidHTML(); await waitForRender(); }); describe('computeContainerHeight prop', () => { it('should be called three times when there is DOM mounting', async () => { const computeContainerHeight = jest.fn((s: TableContentHeightState) => { return s.contentHeight; }); await waitForErsatz( render( ) ); expect(computeContainerHeight).toHaveBeenCalledTimes(3); expect(computeContainerHeight).toHaveBeenNthCalledWith( 1, expect.objectContaining({ type: 'heuristic', contentHeight: expect.any(Number) }) ); expect(computeContainerHeight).toHaveBeenNthCalledWith( 3, expect.objectContaining({ type: 'accurate', contentHeight: expect.any(Number) }) ); }); it("should be used to set container's height", async () => { const { getByTestId, findByTestId } = render( 40} {...dummyStats} {...defaultTestConfig} /> ); await findByTestId('backend-loaded-0'); const container = getByTestId('html-table-container'); expect(container).toBeTruthy(); expect(StyleSheet.flatten(container.props.style)).toMatchObject({ height: 40 }); await waitForRender(); }); }); describe('computeHeuristicHeight prop', () => { it("should be used on two initial rendering cycles to determine container's height", async () => { const computeHeuristicContentHeight = jest.fn(() => 2); const { getByTestId, findByTestId } = render( ); expect(computeHeuristicContentHeight).toHaveBeenCalledTimes(2); const container = getByTestId('html-table-container'); expect(container).toBeTruthy(); expect(StyleSheet.flatten(container.props.style)).toMatchObject({ height: 2 }); await findByTestId('backend-loaded-0'); await waitForRender(); }); }); });