// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import {Screens} from '@constants'; import {PostPriorityType} from '@constants/post'; import {renderWithIntlAndTheme} from '@test/intl-test-helper'; import QuickActions from './quick_actions'; jest.mock('@components/post_draft/quick_actions/bor_quick_action', () => ({ __esModule: true, default: jest.fn(), })); describe('Quick Actions', () => { const baseProps: Parameters[0] = { isBoREnabled: false, updatePostBoRStatus: jest.fn(), testID: 'test-quick-actions', canUploadFiles: true, fileCount: 0, isAgentsEnabled: true, isPostPriorityEnabled: true, canShowPostPriority: true, canShowSlashCommands: true, maxFileCount: 10, value: '', updateValue: jest.fn(), addFiles: jest.fn(), postPriority: { priority: PostPriorityType.STANDARD, }, updatePostPriority: jest.fn(), focus: jest.fn(), location: Screens.CHANNEL, }; describe('slash commands', () => { it('should render slash command if canShowSlashCommands is true', () => { const props = { ...baseProps, canShowSlashCommands: true, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.slash_input_action')).toBeDefined(); }); it('should not render slash command if canShowSlashCommands is false', () => { const props = { ...baseProps, canShowSlashCommands: false, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.slash_input_action')).toBeNull(); }); it('should render slash command by default when canShowSlashCommands is not provided', () => { const props = { ...baseProps, }; delete (props as {canShowSlashCommands?: boolean}).canShowSlashCommands; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.slash_input_action')).toBeDefined(); }); }); describe('post priority', () => { it('should render post priority action when both isPostPriorityEnabled and canShowPostPriority are true', () => { const props = { ...baseProps, isPostPriorityEnabled: true, canShowPostPriority: true, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.post_priority_action')).toBeDefined(); }); it('should not render post priority action when isPostPriorityEnabled is false', () => { const props = { ...baseProps, isPostPriorityEnabled: false, canShowPostPriority: true, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.post_priority_action')).toBeNull(); }); it('should not render post priority action when canShowPostPriority is false', () => { const props = { ...baseProps, isPostPriorityEnabled: true, canShowPostPriority: false, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.post_priority_action')).toBeNull(); }); it('should not render post priority action when canShowPostPriority is undefined', () => { const props = { ...baseProps, isPostPriorityEnabled: true, }; delete (props as {canShowPostPriority?: boolean}).canShowPostPriority; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.post_priority_action')).toBeNull(); }); }); describe('input action disabled states', () => { it('should disable at input action when value ends with @', () => { const props = { ...baseProps, value: 'test @', }; const {getByTestId} = renderWithIntlAndTheme(); const atAction = getByTestId('test-quick-actions.at_input_action.disabled'); expect(atAction).toBeDisabled(); }); it('should enable at input action when value does not end with @', () => { const props = { ...baseProps, value: 'test message', }; const {getByTestId} = renderWithIntlAndTheme(); const atAction = getByTestId('test-quick-actions.at_input_action'); expect(atAction).not.toBeDisabled(); }); it('should enable at input action when value is empty', () => { const props = { ...baseProps, value: '', }; const {getByTestId} = renderWithIntlAndTheme(); const atAction = getByTestId('test-quick-actions.at_input_action'); expect(atAction).not.toBeDisabled(); }); it('should disable slash input action when value is not empty', () => { const props = { ...baseProps, value: 'test message', }; const {getByTestId} = renderWithIntlAndTheme(); const slashAction = getByTestId('test-quick-actions.slash_input_action.disabled'); expect(slashAction).toBeDisabled(); }); it('should enable slash input action when value is empty', () => { const props = { ...baseProps, value: '', }; const {getByTestId} = renderWithIntlAndTheme(); const slashAction = getByTestId('test-quick-actions.slash_input_action'); expect(slashAction).not.toBeDisabled(); }); }); describe('attachment action props', () => { it('should pass disabled=true when canUploadFiles is false', () => { const props = { ...baseProps, canUploadFiles: false, }; const {getByTestId} = renderWithIntlAndTheme(); const attachmentAction = getByTestId('test-quick-actions.attachment_action.disabled'); expect(attachmentAction).toBeDisabled(); }); it('should pass disabled=false when canUploadFiles is true', () => { const props = { ...baseProps, canUploadFiles: true, }; const {getByTestId} = renderWithIntlAndTheme(); const attachmentAction = getByTestId('test-quick-actions.attachment_action'); expect(attachmentAction).not.toBeDisabled(); }); }); describe('BoR quick action', () => { it('should render BoR action when isBoREnabled is true', () => { const props = { ...baseProps, isBoREnabled: true, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.bor_action')).toBeDefined(); }); it('should not render BoR action when isBoREnabled is false', () => { const props = { ...baseProps, isBoREnabled: false, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.bor_action')).toBeNull(); }); it('should not render BoR action in threads', () => { const props = { ...baseProps, isBoREnabled: true, location: Screens.THREAD, }; const {queryByTestId} = renderWithIntlAndTheme(); expect(queryByTestId('test-quick-actions.bor_action')).toBeNull(); }); }); });