Files
api/web/__test__/store/activationCodeModal.test.ts
Michael Datelle eb080e5d22 test: create tests for components batch 4 (#1384)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **Tests**
- Added comprehensive unit tests for the activation code data store,
covering loading states, activation code retrieval, fresh install
detection, and partner info resolution under various scenarios.
- Introduced new tests for the activation code modal store, validating
state management, visibility logic, and Konami code sequence handling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: mdatelle <mike@datelle.net>
2025-05-20 10:15:06 -04:00

140 lines
4.0 KiB
TypeScript

import { ref } from 'vue';
import { createPinia, setActivePinia } from 'pinia';
import { useSessionStorage } from '@vueuse/core';
import { ACTIVATION_CODE_MODAL_HIDDEN_STORAGE_KEY } from '~/consts';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { useActivationCodeDataStore } from '~/components/Activation/store/activationCodeData';
import { useActivationCodeModalStore } from '~/components/Activation/store/activationCodeModal';
import { useCallbackActionsStore } from '~/store/callbackActions';
vi.mock('@vueuse/core', () => ({
useSessionStorage: vi.fn(),
}));
vi.mock('~/components/Activation/store/activationCodeData', () => ({
useActivationCodeDataStore: vi.fn(),
}));
vi.mock('~/store/callbackActions', () => ({
useCallbackActionsStore: vi.fn(),
}));
describe('ActivationCodeModal Store', () => {
let store: ReturnType<typeof useActivationCodeModalStore>;
let mockIsHidden: ReturnType<typeof ref>;
let mockIsFreshInstall: ReturnType<typeof ref>;
let mockCallbackData: ReturnType<typeof ref>;
beforeEach(() => {
vi.clearAllMocks();
// Mock window.location to prevent navigation errors
Object.defineProperty(window, 'location', {
value: { href: '' },
writable: true,
});
mockIsHidden = ref(null);
mockIsFreshInstall = ref(false);
mockCallbackData = ref(null);
vi.mocked(useSessionStorage).mockReturnValue(mockIsHidden);
vi.mocked(useActivationCodeDataStore).mockReturnValue({
isFreshInstall: mockIsFreshInstall,
} as unknown as ReturnType<typeof useActivationCodeDataStore>);
vi.mocked(useCallbackActionsStore).mockReturnValue({
callbackData: mockCallbackData,
} as unknown as ReturnType<typeof useCallbackActionsStore>);
setActivePinia(createPinia());
store = useActivationCodeModalStore();
});
afterEach(() => {
vi.resetAllMocks();
mockIsHidden.value = null;
mockIsFreshInstall.value = false;
mockCallbackData.value = null;
});
describe('State Management', () => {
it('should initialize with correct storage key', () => {
expect(useSessionStorage).toHaveBeenCalledWith(ACTIVATION_CODE_MODAL_HIDDEN_STORAGE_KEY, null);
});
it('should set isHidden value correctly', () => {
store.setIsHidden(true);
expect(mockIsHidden.value).toBe(true);
store.setIsHidden(false);
expect(mockIsHidden.value).toBe(false);
store.setIsHidden(null);
expect(mockIsHidden.value).toBe(null);
});
});
describe('Computed Properties', () => {
it('should be visible when explicitly set to show', () => {
mockIsHidden.value = false;
expect(store.isVisible).toBe(true);
});
it('should be visible when fresh install and not explicitly hidden', () => {
mockIsHidden.value = null;
mockIsFreshInstall.value = true;
mockCallbackData.value = null;
expect(store.isVisible).toBe(true);
});
it('should not be visible when explicitly hidden', () => {
mockIsHidden.value = true;
expect(store.isVisible).toBe(false);
});
it('should not be visible when not fresh install', () => {
mockIsHidden.value = null;
mockIsFreshInstall.value = false;
expect(store.isVisible).toBe(false);
});
it('should not be visible when callback data exists', () => {
mockIsHidden.value = null;
mockIsFreshInstall.value = true;
mockCallbackData.value = { someData: 'test' };
expect(store.isVisible).toBe(false);
});
});
describe('Konami Code Handling', () => {
const keySequence = [
'ArrowUp',
'ArrowUp',
'ArrowDown',
'ArrowDown',
'ArrowLeft',
'ArrowRight',
'ArrowLeft',
'ArrowRight',
'b',
'a',
];
it('should not trigger on partial sequence', () => {
keySequence.slice(0, 3).forEach((key) => {
window.dispatchEvent(new KeyboardEvent('keydown', { key }));
});
expect(mockIsHidden.value).toBe(null);
expect(window.location.href).toBe('');
});
});
});