import React from 'react'; import userEvent from '@testing-library/user-event'; import { render, screen } from '../../../../test-utils/testing-library'; import ItemOptions from '../ItemOptions'; jest.mock('@box/blueprint-web', () => ({ ...jest.requireActual('@box/blueprint-web'), Cell: () =>
, })); describe('elements/common/item/ItemOptions', () => { const renderComponent = (props = {}) => { const defaultProps = { canDelete: true, canDownload: true, canPreview: true, canRename: true, canShare: true, item: { type: 'file', id: '005', name: 'Box file', extension: 'pdf', permissions: { can_delete: true, can_download: true, can_preview: true, can_rename: true, can_share: true, }, }, viewMode: 'grid', }; return render(); }; test('renders component correctly', async () => { renderComponent(); await userEvent.click(screen.getByRole('button', { name: 'More options' })); expect(screen.getByRole('menuitem', { name: 'Preview' })).toBeInTheDocument(); expect(screen.getByRole('menuitem', { name: 'Delete' })).toBeInTheDocument(); expect(screen.getByRole('menuitem', { name: 'Download' })).toBeInTheDocument(); expect(screen.getByRole('menuitem', { name: 'Rename' })).toBeInTheDocument(); expect(screen.getByRole('menuitem', { name: 'Share' })).toBeInTheDocument(); }); test('renders an empty component if there are no permissions on the item', () => { const { container } = renderComponent({ item: { type: 'file', id: '005', name: 'Box file', permissions: undefined, }, }); expect(container).toBeEmptyDOMElement(); }); test('renders a cell component if there are no permissions on the item in list view', () => { renderComponent({ item: { type: 'file', id: '005', name: 'Box file', permissions: undefined, }, viewMode: 'list', }); expect(screen.getByTestId('be-ItemOptions-cell')).toBeInTheDocument(); }); test('renders an empty component if there are no options enabled for the item', () => { const { container } = renderComponent({ canDelete: false, canDownload: false, canPreview: false, canRename: false, canShare: false, }); expect(container).toBeEmptyDOMElement(); }); test('renders component with custom actions', async () => { const onAction = jest.fn(); renderComponent({ itemActions: [ { label: 'Archive', type: 'folder' }, // Should be filtered since there are no folder items { label: 'Email', type: 'file' }, { filter: ({ extension }) => extension === 'pdf', label: 'Export' }, { label: 'Favorite', onAction, type: 'file' }, ], }); await userEvent.click(screen.getByRole('button', { name: 'More options' })); expect(screen.queryByRole('menuitem', { name: 'Archive' })).not.toBeInTheDocument(); expect(screen.getByRole('menuitem', { name: 'Email' })).toBeInTheDocument(); expect(screen.getByRole('menuitem', { name: 'Favorite' })).toBeInTheDocument(); expect(onAction).not.toHaveBeenCalled(); await userEvent.click(screen.getByRole('menuitem', { name: 'Favorite' })); expect(onAction).toHaveBeenCalled(); }); test('renders an empty component if there are no applicable custom actions for the item', () => { const { container } = renderComponent({ canDelete: false, canDownload: false, canPreview: false, canRename: false, canShare: false, itemActions: [ { label: 'Archive', type: 'folder' }, { filter: ({ extension }) => extension === 'csv', label: 'Import' }, ], }); expect(container).toBeEmptyDOMElement(); }); test('renders a cell component if there are no applicable custom actions for the item in list view', () => { renderComponent({ canDelete: false, canDownload: false, canPreview: false, canRename: false, canShare: false, itemActions: [ { label: 'Archive', type: 'folder' }, { filter: ({ extension }) => extension === 'csv', label: 'Import' }, ], viewMode: 'list', }); expect(screen.getByTestId('be-ItemOptions-cell')).toBeInTheDocument(); }); });