UNPKG

box-ui-elements-mlh

Version:
240 lines (216 loc) 11.4 kB
import * as React from 'react'; import { FormattedMessage } from 'react-intl'; import { shallow } from 'enzyme/build'; import messages from '../messages'; import selectors from '../../../common/selectors/version'; import VersionsItem from '../VersionsItem'; import VersionsItemActions from '../VersionsItemActions'; import VersionsItemButton from '../VersionsItemButton'; import VersionsItemRetention from '../VersionsItemRetention'; import { ReadableTime } from '../../../../components/time'; import { FILE_REQUEST_NAME, PLACEHOLDER_USER, VERSION_UPLOAD_ACTION } from '../../../../constants'; jest.mock('../../../../utils/dom', () => ({ ...jest.requireActual('../../../../utils/dom'), scrollIntoView: jest.fn(), })); describe('elements/content-sidebar/versions/VersionsItem', () => { const defaultDate = new Date('2019-03-01T00:00:00'); const defaultUser = { name: 'Test User', id: 10 }; const restoreDate = new Date('2019-05-01T00:00:00'); const restoreUser = { name: 'Restore User', id: 12 }; const trashedDate = new Date('2019-04-01T00:00:00'); const trashedUser = { name: 'Delete User', id: 11 }; const unknownUser = <FormattedMessage {...messages.versionUserUnknown} />; const defaults = { created_at: defaultDate, extension: 'docx', id: '12345', is_download_available: true, modified_at: defaultDate, modified_by: defaultUser, permissions: { can_delete: true, can_preview: true, }, size: 10240, version_number: '1', }; const getVersion = (overrides = {}) => ({ ...defaults, ...overrides, }); const getWrapper = (props = {}) => shallow(<VersionsItem fileId="123" version={defaults} {...props} />); beforeEach(() => { selectors.getVersionAction = jest.fn().mockReturnValue(VERSION_UPLOAD_ACTION); selectors.getVersionUser = jest.fn().mockReturnValue(defaultUser); }); describe('render', () => { test.each` action | showDelete | showDownload | showPreview | showPromote | showRestore ${'delete'} | ${false} | ${false} | ${false} | ${false} | ${true} ${'restore'} | ${true} | ${true} | ${true} | ${true} | ${false} ${'upload'} | ${true} | ${true} | ${true} | ${true} | ${false} `( "should show actions correctly when the version's action is $action", ({ action, showDelete, showDownload, showPreview, showPromote, showRestore }) => { selectors.getVersionAction.mockReturnValueOnce(action); const wrapper = getWrapper({ version: getVersion({ permissions: { can_delete: true, can_download: true, can_preview: true, can_upload: true, }, }), }); const actions = wrapper.find(VersionsItemActions); const button = wrapper.find(VersionsItemButton); expect(button.prop('isDisabled')).toBe(!showPreview); expect(actions.prop('showDelete')).toBe(showDelete); expect(actions.prop('showDownload')).toBe(showDownload); expect(actions.prop('showPromote')).toBe(showPromote); expect(actions.prop('showPreview')).toBe(showPreview); expect(actions.prop('showRestore')).toBe(showRestore); expect(wrapper.find(ReadableTime)).toBeTruthy(); expect(wrapper).toMatchSnapshot(); }, ); test.each` permissions ${{ can_delete: true, can_download: true, can_preview: true, can_upload: true }} ${{ can_delete: true, can_download: true, can_preview: true, can_upload: false }} ${{ can_delete: true, can_download: true, can_preview: false, can_upload: false }} ${{ can_delete: true, can_download: false, can_preview: false, can_upload: false }} ${{ can_delete: false, can_download: true, can_preview: false, can_upload: false }} ${{ can_delete: false, can_download: false, can_preview: true, can_upload: false }} ${{ can_delete: false, can_download: false, can_preview: false, can_upload: true }} `('should show the correct menu items based on permissions', ({ permissions }) => { const wrapper = getWrapper({ version: getVersion({ permissions }) }); const actions = wrapper.find(VersionsItemActions); const button = wrapper.find(VersionsItemButton); expect(button.prop('isDisabled')).toBe(!permissions.can_preview); expect(actions.prop('showDelete')).toBe(permissions.can_delete); expect(actions.prop('showDownload')).toBe(permissions.can_download); expect(actions.prop('showPromote')).toBe(permissions.can_upload); expect(actions.prop('showPreview')).toBe(permissions.can_preview); expect(wrapper.find(ReadableTime)).toBeTruthy(); }); test('should render a selected version correctly', () => { const wrapper = getWrapper({ isSelected: true }); const actions = wrapper.find(VersionsItemActions); const button = wrapper.find(VersionsItemButton); expect(actions.prop('showPreview')).toBe(false); expect(button.prop('isSelected')).toBe(true); }); test.each` versionUser | expected ${defaultUser} | ${defaultUser.name} ${restoreUser} | ${restoreUser.name} ${trashedUser} | ${trashedUser.name} ${PLACEHOLDER_USER} | ${unknownUser} `('should render the correct user name', ({ expected, versionUser }) => { selectors.getVersionUser.mockReturnValue(versionUser); const wrapper = getWrapper(); const result = wrapper.find('[data-testid="bcs-VersionsItem-log"]').find('FormattedMessage'); expect(result.prop('values')).toEqual({ name: expected }); }); test.each` versionUser | expected ${defaultUser} | ${defaultUser.name} ${restoreUser} | ${restoreUser.name} ${trashedUser} | ${trashedUser.name} ${{ ...PLACEHOLDER_USER, name: FILE_REQUEST_NAME }} | ${(<FormattedMessage {...messages.fileRequestDisplayName} />)} `('should render the correct user name if uploader_user_name present', ({ expected, versionUser }) => { selectors.getVersionUser.mockReturnValueOnce(versionUser); const wrapper = getWrapper({ version: { ...defaults, uploader_display_name: FILE_REQUEST_NAME } }); const result = wrapper.find('[data-testid="bcs-VersionsItem-log"]').find('FormattedMessage'); expect(result.prop('values')).toEqual({ name: expected }); }); test.each` created_at | restored_at | trashed_at | expected ${defaultDate} | ${null} | ${null} | ${defaultDate} ${defaultDate} | ${restoreDate} | ${null} | ${restoreDate} ${defaultDate} | ${restoreDate} | ${trashedDate} | ${restoreDate} ${defaultDate} | ${null} | ${trashedDate} | ${trashedDate} `('should render the correct date and time', ({ expected, created_at, restored_at, trashed_at }) => { const wrapper = getWrapper({ version: getVersion({ created_at, restored_at, trashed_at, }), }); expect(wrapper.find(ReadableTime).prop('timestamp')).toEqual(expected.getTime()); }); test.each` versionLimit | versionNumber | isLimited ${1} | ${1} | ${true} ${1} | ${5} | ${true} ${5} | ${3} | ${true} ${5} | ${7} | ${false} ${10} | ${1} | ${false} ${100} | ${3} | ${false} ${Infinity} | ${3} | ${false} ${Infinity} | ${3000} | ${false} `( 'should show version number $versionNumber with a limit of $versionLimit correctly', ({ isLimited, versionLimit, versionNumber }) => { const wrapper = getWrapper({ version: getVersion({ action: 'upload', version_number: versionNumber }), versionCount: 10, versionLimit, }); const button = wrapper.find(VersionsItemButton); expect(button.prop('isDisabled')).toBe(isLimited); expect(wrapper.find(VersionsItemActions).length).toBe(isLimited ? 0 : 1); }, ); test.each` extension | isCurrent | showPreview ${'docx'} | ${true} | ${true} ${'xlsb'} | ${true} | ${true} ${'xlsm'} | ${true} | ${true} ${'xlsx'} | ${true} | ${true} ${'docx'} | ${false} | ${true} ${'xlsb'} | ${false} | ${false} ${'xlsm'} | ${false} | ${false} ${'xlsx'} | ${false} | ${false} `( 'should restrict preview for non-current versions with extensions that could use the office viewer', ({ extension, isCurrent, showPreview }) => { const wrapper = getWrapper({ isCurrent, version: getVersion({ extension }), }); expect(wrapper.find(VersionsItemActions).prop('showPreview')).toBe(showPreview); expect(wrapper.find(VersionsItemButton).prop('isDisabled')).toBe(!showPreview); }, ); test('should disable preview if the file is watermarked', () => { const wrapper = getWrapper({ isWatermarked: true, }); const actions = wrapper.find(VersionsItemActions); const button = wrapper.find(VersionsItemButton); expect(actions.prop('showPreview')).toBe(false); expect(button.prop('isDisabled')).toBe(true); }); test('should disable actions as needed and render retention info if retention is provided', () => { const dispositionAt = new Date(new Date().getTime() + 365 * 24 * 60 * 60 * 1000); // Future time const wrapper = getWrapper({ version: getVersion({ retention: { applied_at: defaultDate, disposition_at: dispositionAt, winning_retention_policy: { disposition_action: 'permanently_delete', }, }, }), }); expect(wrapper.exists(VersionsItemRetention)).toBe(true); expect(wrapper.find(VersionsItemActions).prop('isRetained')).toBe(true); }); }); });