import React from 'react'
import * as tlr from '@testing-library/react'
import { constant, E, pipe } from '@monorail/sharedHelpers/fp-ts-imports'
import { isNotNil } from '@monorail/sharedHelpers/typeGuards'
import { generateA11yStoryTests } from '@monorail/testHelpers/a11y'
import { renderWithTheme } from '@monorail/testHelpers/render'
import * as stories from '@monorail/v2/components/TreeGrid/__stories__/TreeGrid.stories'
import { TreeGrid } from '@monorail/v2/components/TreeGrid/TreeGrid'
import '@testing-library/jest-dom/extend-expect'
import {
EMPTY_VIEW_TEXT_CONTENT,
mockTreeGridProps,
} from '../__mocks__/TreeGridProps.mock'
describe('TreeGrid', () => {
/**
* Note from https://www.w3.org/TR/wai-aria-practices-1.1/examples/treegrid/treegrid-1.html
* "Due to an error in the ARIA 1.1 specification, the aria-posinset and
* aria-setsize properties are not supported on row elements. This is being
* corrected in ARIA 1.2. Consequently, when validating the HTML in this
* example, errors are generated.""
*/
// generateA11yStoryTests(stories)
it('virtualizes rendering of rows', () => {
renderWithTheme(
,
)
const rows = tlr.screen.getAllByRole('row')
expect(rows.length).toBeGreaterThan(
1, // because the header row is always there
)
expect(rows.length).toBeLessThan(
pipe(
mockTreeGridProps.content,
E.fold(constant(0), xs => xs.length),
),
)
})
it('expands and collapses parent rows on button click', () => {
const _rendered = renderWithTheme(
,
)
const allVisibleRowsAreLevel1 = tlr.screen
.getAllByRole('row')
.map(row => row.getAttribute('aria-level'))
.filter(isNotNil)
.every(rowLevel => rowLevel === '1')
expect(allVisibleRowsAreLevel1).toBe(true)
const expandBtns = tlr.screen.getAllByRole('button', {
name: 'Expand',
})
expandBtns.forEach(btn => {
tlr.fireEvent.click(btn)
})
const someVisibleRowsAreLevel2 = tlr.screen
.getAllByRole('row')
.map(row => row.getAttribute('aria-level'))
.filter(isNotNil)
.some(rowLevel => rowLevel === '2')
expect(someVisibleRowsAreLevel2).toBe(true)
expandBtns.forEach(btn => {
tlr.fireEvent.click(btn)
})
const allVisibleRowsAreLevel1Again = tlr.screen
.getAllByRole('row')
.map(row => row.getAttribute('aria-level'))
.filter(isNotNil)
.every(rowLevel => rowLevel === '1')
expect(allVisibleRowsAreLevel1Again).toBe(true)
})
it('renders arbitrary jsx when props.content is Left', () => {
const rendered = renderWithTheme(
{EMPTY_VIEW_TEXT_CONTENT}>)}
/>
,
)
expect(rendered.container).toHaveTextContent(EMPTY_VIEW_TEXT_CONTENT)
})
})