225 lines
6.4 KiB
JavaScript
225 lines
6.4 KiB
JavaScript
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
import { useAttachments } from '../useAttachments';
|
|
import { useStore } from 'vuex';
|
|
import { computed } from 'vue';
|
|
|
|
// Mock Vue's useStore
|
|
vi.mock('vuex', () => ({
|
|
useStore: vi.fn(),
|
|
}));
|
|
|
|
// Mock Vue's computed
|
|
vi.mock('vue', () => ({
|
|
computed: vi.fn(fn => ({ value: fn() })),
|
|
}));
|
|
|
|
describe('useAttachments', () => {
|
|
let mockStore;
|
|
let mockGetters;
|
|
|
|
beforeEach(() => {
|
|
// Reset window.chatwootWebChannel
|
|
delete window.chatwootWebChannel;
|
|
|
|
// Create mock store
|
|
mockGetters = {};
|
|
mockStore = {
|
|
getters: mockGetters,
|
|
};
|
|
vi.mocked(useStore).mockReturnValue(mockStore);
|
|
|
|
// Mock computed to return a reactive-like object
|
|
vi.mocked(computed).mockImplementation(fn => ({ value: fn() }));
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('shouldShowFilePicker', () => {
|
|
it('returns value from store getter', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = true;
|
|
|
|
const { shouldShowFilePicker } = useAttachments();
|
|
|
|
expect(shouldShowFilePicker.value).toBe(true);
|
|
});
|
|
|
|
it('returns undefined when not set in store', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = undefined;
|
|
|
|
const { shouldShowFilePicker } = useAttachments();
|
|
|
|
expect(shouldShowFilePicker.value).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
describe('hasAttachmentsEnabled', () => {
|
|
it('returns true when attachments are enabled in channel config', () => {
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['attachments', 'emoji'],
|
|
};
|
|
|
|
const { hasAttachmentsEnabled } = useAttachments();
|
|
|
|
expect(hasAttachmentsEnabled.value).toBe(true);
|
|
});
|
|
|
|
it('returns false when attachments are not enabled in channel config', () => {
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['emoji'],
|
|
};
|
|
|
|
const { hasAttachmentsEnabled } = useAttachments();
|
|
|
|
expect(hasAttachmentsEnabled.value).toBe(false);
|
|
});
|
|
|
|
it('returns false when channel config has no enabled features', () => {
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: [],
|
|
};
|
|
|
|
const { hasAttachmentsEnabled } = useAttachments();
|
|
|
|
expect(hasAttachmentsEnabled.value).toBe(false);
|
|
});
|
|
|
|
it('returns false when channel config is missing', () => {
|
|
window.chatwootWebChannel = undefined;
|
|
|
|
const { hasAttachmentsEnabled } = useAttachments();
|
|
|
|
expect(hasAttachmentsEnabled.value).toBe(false);
|
|
});
|
|
|
|
it('returns false when enabledFeatures is missing', () => {
|
|
window.chatwootWebChannel = {};
|
|
|
|
const { hasAttachmentsEnabled } = useAttachments();
|
|
|
|
expect(hasAttachmentsEnabled.value).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('canHandleAttachments', () => {
|
|
beforeEach(() => {
|
|
// Set up a default channel config
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['attachments'],
|
|
};
|
|
});
|
|
|
|
it('prioritizes SDK flag when explicitly set to true', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = true;
|
|
|
|
const { canHandleAttachments } = useAttachments();
|
|
|
|
expect(canHandleAttachments.value).toBe(true);
|
|
});
|
|
|
|
it('prioritizes SDK flag when explicitly set to false', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = false;
|
|
|
|
const { canHandleAttachments } = useAttachments();
|
|
|
|
expect(canHandleAttachments.value).toBe(false);
|
|
});
|
|
|
|
it('falls back to inbox settings when SDK flag is undefined', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = undefined;
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['attachments'],
|
|
};
|
|
|
|
const { canHandleAttachments } = useAttachments();
|
|
|
|
expect(canHandleAttachments.value).toBe(true);
|
|
});
|
|
|
|
it('falls back to inbox settings when SDK flag is undefined and attachments disabled', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = undefined;
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['emoji'],
|
|
};
|
|
|
|
const { canHandleAttachments } = useAttachments();
|
|
|
|
expect(canHandleAttachments.value).toBe(false);
|
|
});
|
|
|
|
it('prioritizes SDK false over inbox settings true', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = false;
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['attachments'],
|
|
};
|
|
|
|
const { canHandleAttachments } = useAttachments();
|
|
|
|
expect(canHandleAttachments.value).toBe(false);
|
|
});
|
|
|
|
it('prioritizes SDK true over inbox settings false', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = true;
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['emoji'], // no attachments
|
|
};
|
|
|
|
const { canHandleAttachments } = useAttachments();
|
|
|
|
expect(canHandleAttachments.value).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('hasEmojiPickerEnabled', () => {
|
|
it('returns true when emoji picker is enabled in channel config', () => {
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['emoji_picker', 'attachments'],
|
|
};
|
|
|
|
const { hasEmojiPickerEnabled } = useAttachments();
|
|
|
|
expect(hasEmojiPickerEnabled.value).toBe(true);
|
|
});
|
|
|
|
it('returns false when emoji picker is not enabled in channel config', () => {
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['attachments'],
|
|
};
|
|
|
|
const { hasEmojiPickerEnabled } = useAttachments();
|
|
|
|
expect(hasEmojiPickerEnabled.value).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('shouldShowEmojiPicker', () => {
|
|
it('returns value from store getter', () => {
|
|
mockGetters['appConfig/getShouldShowEmojiPicker'] = true;
|
|
|
|
const { shouldShowEmojiPicker } = useAttachments();
|
|
|
|
expect(shouldShowEmojiPicker.value).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('integration test', () => {
|
|
it('returns all expected properties', () => {
|
|
mockGetters['appConfig/getShouldShowFilePicker'] = undefined;
|
|
mockGetters['appConfig/getShouldShowEmojiPicker'] = true;
|
|
window.chatwootWebChannel = {
|
|
enabledFeatures: ['attachments', 'emoji_picker'],
|
|
};
|
|
|
|
const result = useAttachments();
|
|
|
|
expect(result).toHaveProperty('shouldShowFilePicker');
|
|
expect(result).toHaveProperty('shouldShowEmojiPicker');
|
|
expect(result).toHaveProperty('hasAttachmentsEnabled');
|
|
expect(result).toHaveProperty('hasEmojiPickerEnabled');
|
|
expect(result).toHaveProperty('canHandleAttachments');
|
|
expect(Object.keys(result)).toHaveLength(5);
|
|
});
|
|
});
|
|
});
|