diff --git a/app/javascript/dashboard/routes/dashboard/commands/spec/useBulkActionsHotKeys.spec.js b/app/javascript/dashboard/routes/dashboard/commands/spec/useBulkActionsHotKeys.spec.js new file mode 100644 index 000000000..3e80014f6 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/commands/spec/useBulkActionsHotKeys.spec.js @@ -0,0 +1,110 @@ +import { useBulkActionsHotKeys } from '../useBulkActionsHotKeys'; +import { useStore, useMapGetter } from 'dashboard/composables/store'; +import { useI18n } from 'dashboard/composables/useI18n'; +import wootConstants from 'dashboard/constants/globals'; +import { emitter } from 'shared/helpers/mitt'; + +vi.mock('dashboard/composables/store'); +vi.mock('dashboard/composables/useI18n'); +vi.mock('shared/helpers/mitt'); + +describe('useBulkActionsHotKeys', () => { + let store; + + beforeEach(() => { + store = { + getters: { + 'bulkActions/getSelectedConversationIds': [], + }, + }; + + useStore.mockReturnValue(store); + useMapGetter.mockImplementation(key => ({ + value: store.getters[key], + })); + + useI18n.mockReturnValue({ t: vi.fn(key => key) }); + emitter.emit = vi.fn(); + }); + + it('should return the correct computed properties', () => { + const { selectedConversations, bulkActionsHotKeys } = + useBulkActionsHotKeys(); + + expect(selectedConversations.value).toEqual([]); + expect(bulkActionsHotKeys.value).toEqual([]); + }); + + it('should return bulk actions when conversations are selected', () => { + store.getters['bulkActions/getSelectedConversationIds'] = [1, 2, 3]; + const { bulkActionsHotKeys } = useBulkActionsHotKeys(); + + expect(bulkActionsHotKeys.value.length).toBeGreaterThan(0); + expect(bulkActionsHotKeys.value).toContainEqual( + expect.objectContaining({ + id: 'bulk_action_snooze_conversation', + title: 'COMMAND_BAR.COMMANDS.SNOOZE_CONVERSATION', + section: 'COMMAND_BAR.SECTIONS.BULK_ACTIONS', + }) + ); + expect(bulkActionsHotKeys.value).toContainEqual( + expect.objectContaining({ + id: 'bulk_action_reopen_conversation', + title: 'COMMAND_BAR.COMMANDS.REOPEN_CONVERSATION', + section: 'COMMAND_BAR.SECTIONS.BULK_ACTIONS', + }) + ); + expect(bulkActionsHotKeys.value).toContainEqual( + expect.objectContaining({ + id: 'bulk_action_resolve_conversation', + title: 'COMMAND_BAR.COMMANDS.RESOLVE_CONVERSATION', + section: 'COMMAND_BAR.SECTIONS.BULK_ACTIONS', + }) + ); + }); + + it('should include snooze options in bulk actions', () => { + store.getters['bulkActions/getSelectedConversationIds'] = [1, 2, 3]; + const { bulkActionsHotKeys } = useBulkActionsHotKeys(); + + const snoozeAction = bulkActionsHotKeys.value.find( + action => action.id === 'bulk_action_snooze_conversation' + ); + expect(snoozeAction).toBeDefined(); + expect(snoozeAction.children).toEqual( + Object.values(wootConstants.SNOOZE_OPTIONS) + ); + }); + + it('should create handlers for reopen and resolve actions', () => { + store.getters['bulkActions/getSelectedConversationIds'] = [1, 2, 3]; + const { bulkActionsHotKeys } = useBulkActionsHotKeys(); + + const reopenAction = bulkActionsHotKeys.value.find( + action => action.id === 'bulk_action_reopen_conversation' + ); + const resolveAction = bulkActionsHotKeys.value.find( + action => action.id === 'bulk_action_resolve_conversation' + ); + + expect(reopenAction.handler).toBeDefined(); + expect(resolveAction.handler).toBeDefined(); + + reopenAction.handler(); + expect(emitter.emit).toHaveBeenCalledWith( + 'CMD_BULK_ACTION_REOPEN_CONVERSATION' + ); + + resolveAction.handler(); + expect(emitter.emit).toHaveBeenCalledWith( + 'CMD_BULK_ACTION_RESOLVE_CONVERSATION' + ); + }); + + it('should return an empty array when no conversations are selected', () => { + store.getters['bulkActions/getSelectedConversationIds'] = []; + const { bulkActionsHotKeys } = useBulkActionsHotKeys(); + + expect(bulkActionsHotKeys.value).toEqual([]); + }); +});