import React from 'react' import type { UseGridReturn } from '../hooks' import { createGrid, useSubNavigation } from '../hooks' import { GridDragOverlay } from './grid-drag-overlay' import { GridContext } from '../context/grid-context' import { render } from '../utils/test-utils' describe('GridDragOverlay', () => { let grid: UseGridReturn beforeEach(() => { grid = createGrid() jest.spyOn(grid.selectors, 'selectDragIsActive').mockReturnValue(true) jest.spyOn(grid.selectors, 'selectDraggingRowIds').mockReturnValue( new Set(['101']) ) jest.spyOn(grid.selectors, 'selectPreviewColumnId').mockReturnValue( 'name' ) jest.spyOn(grid.selectors, 'selectColumn').mockReturnValue({ id: 'name', actualWidth: 300, data: { id: 'name', label: 'Name', cell: { Renderer: jest .fn() .mockReturnValue(
Test Renderer
), }, }, }) jest.spyOn(grid.selectors, 'selectRow').mockReturnValue({ id: '101', name: 'Test Row', }) jest.spyOn(grid.selectors, 'selectRowMeta').mockReturnValue({ type: 'leaf', }) }) function renderComponent() { return render( ) } it('should render the drag overlay', () => { const { getByTestId } = renderComponent() const overlay = getByTestId('pvds-grid-drag-overlay') expect(overlay).toBeInTheDocument() expect(overlay).toHaveTextContent('Test Renderer') }) it('should render using the value (if label and Renderer are not present)', () => { const valueCb = jest.fn().mockReturnValue('Test Value') jest.spyOn(grid.selectors, 'selectColumn').mockReturnValue({ id: 'name', actualWidth: 300, data: { id: 'name', label: 'Name', cell: { value: valueCb, }, }, }) const { getByTestId } = renderComponent() expect(getByTestId('pvds-grid-drag-overlay')).toHaveTextContent( 'Test Value' ) expect(valueCb).toHaveBeenCalledWith({ columnId: 'name', row: { id: '101', name: 'Test Row' }, rowMeta: { type: 'leaf' }, }) }) it('should render using the label (if Renderer is not present)', () => { const labelCb = jest.fn().mockReturnValue('Test Label') jest.spyOn(grid.selectors, 'selectColumn').mockReturnValue({ id: 'name', actualWidth: 300, data: { id: 'name', label: 'Name', cell: { value() { return 'Test Value' }, label: labelCb, }, }, }) const { getByTestId } = renderComponent() expect(getByTestId('pvds-grid-drag-overlay')).toHaveTextContent( 'Test Label' ) expect(labelCb).toHaveBeenCalledWith({ columnId: 'name', row: { id: '101', name: 'Test Row' }, rowMeta: { type: 'leaf' }, value: 'Test Value', }) }) it('should render using the Renderer', () => { const rendererCb = jest.fn().mockReturnValue(
Test Renderer
) jest.spyOn(grid.selectors, 'selectColumn').mockReturnValue({ id: 'name', actualWidth: 300, data: { id: 'name', label: 'Name', cell: { value() { return 'Test Value' }, label() { return 'Test Label' }, Renderer: rendererCb, }, }, }) const { getByTestId } = renderComponent() expect(getByTestId('pvds-grid-drag-overlay')).toHaveTextContent( 'Test Renderer' ) expect(rendererCb).toHaveBeenCalledWith( { rowId: '101', columnId: 'name', tabIndex: -1, value: 'Test Value', label: 'Test Label', }, undefined ) }) it('should render the error message if present', () => { jest.spyOn(grid.selectors, 'selectDragMessage').mockReturnValue( 'You cannot drop here' ) const { getByTestId } = renderComponent() const overlay = getByTestId('pvds-grid-drag-overlay') expect(overlay).toBeInTheDocument() expect(overlay).toHaveTextContent('Test RendererYou cannot drop here') }) it('should render the drag overlay if Renderer uses sub-navigation', () => { jest.spyOn(grid.selectors, 'selectColumn').mockReturnValue({ id: 'name', actualWidth: 300, data: { id: 'name', label: 'Name', cell: { Renderer() { useSubNavigation({ indexes: 3, inlineFocusStylingEnabled: true, }) return
Test Renderer with Sub Navigation
}, }, }, }) const { getByTestId } = renderComponent() const overlay = getByTestId('pvds-grid-drag-overlay') expect(overlay).toHaveTextContent('Test Renderer with Sub Navigation') }) })