mirror of
https://github.com/unraid/api.git
synced 2025-12-30 21:19:49 -06:00
<!-- 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>
194 lines
5.4 KiB
TypeScript
194 lines
5.4 KiB
TypeScript
import { ref } from 'vue';
|
|
import { createPinia, setActivePinia } from 'pinia';
|
|
import { useQuery } from '@vue/apollo-composable';
|
|
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
import {
|
|
ACTIVATION_CODE_QUERY,
|
|
PARTNER_INFO_QUERY,
|
|
} from '~/components/Activation/graphql/activationCode.query';
|
|
import { useActivationCodeDataStore } from '~/components/Activation/store/activationCodeData';
|
|
import { RegistrationState } from '~/composables/gql/graphql';
|
|
|
|
// Create a complete mock of UseQueryReturn with all required properties
|
|
const createCompleteQueryMock = <T>(result: T | null = null, loading = false) => ({
|
|
result: ref(result),
|
|
loading: ref(loading),
|
|
error: ref(null),
|
|
networkStatus: ref(7),
|
|
called: ref(true),
|
|
variables: ref({}),
|
|
document: ref(null),
|
|
query: ref(null),
|
|
forceDisabled: ref(false),
|
|
options: { errorPolicy: 'all' as const },
|
|
stop: vi.fn(),
|
|
start: vi.fn(),
|
|
restart: vi.fn(),
|
|
refetch: vi.fn(),
|
|
fetchMore: vi.fn(),
|
|
onResult: vi.fn(),
|
|
onError: vi.fn(),
|
|
subscribeToMore: vi.fn(),
|
|
updateQuery: vi.fn(),
|
|
});
|
|
|
|
vi.mock('@vue/apollo-composable', () => ({
|
|
useQuery: vi.fn(),
|
|
}));
|
|
|
|
describe('ActivationCodeData Store', () => {
|
|
beforeEach(() => {
|
|
setActivePinia(createPinia());
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.resetAllMocks();
|
|
});
|
|
|
|
describe('Computed Properties', () => {
|
|
it('should compute loading state when activationCodeLoading is true', () => {
|
|
vi.mocked(useQuery).mockImplementation((query) => {
|
|
if (query === ACTIVATION_CODE_QUERY) {
|
|
return createCompleteQueryMock(null, true);
|
|
}
|
|
|
|
return createCompleteQueryMock(null, false);
|
|
});
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.loading).toBe(true);
|
|
});
|
|
|
|
it('should compute loading state when partnerInfoLoading is true', () => {
|
|
vi.mocked(useQuery).mockImplementation((query) => {
|
|
if (query === PARTNER_INFO_QUERY) {
|
|
return createCompleteQueryMock(null, true);
|
|
}
|
|
|
|
return createCompleteQueryMock(null, false);
|
|
});
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.loading).toBe(true);
|
|
});
|
|
|
|
it('should compute loading state when both loadings are false', () => {
|
|
vi.mocked(useQuery).mockImplementation(() => createCompleteQueryMock(null, false));
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.loading).toBe(false);
|
|
});
|
|
|
|
it('should compute activationCode correctly', () => {
|
|
const mockActivationCode = 'TEST-CODE-123';
|
|
|
|
vi.mocked(useQuery).mockImplementation((query) => {
|
|
if (query === ACTIVATION_CODE_QUERY) {
|
|
return createCompleteQueryMock(
|
|
{
|
|
customization: { activationCode: mockActivationCode },
|
|
},
|
|
false
|
|
);
|
|
}
|
|
return createCompleteQueryMock(null, false);
|
|
});
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.activationCode).toBe(mockActivationCode);
|
|
});
|
|
|
|
it('should compute isFreshInstall as true when regState is ENOKEYFILE', () => {
|
|
vi.mocked(useQuery).mockImplementation((query) => {
|
|
if (query === ACTIVATION_CODE_QUERY) {
|
|
return createCompleteQueryMock(
|
|
{
|
|
vars: { regState: RegistrationState.ENOKEYFILE },
|
|
},
|
|
false
|
|
);
|
|
}
|
|
|
|
return createCompleteQueryMock(null, false);
|
|
});
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.isFreshInstall).toBe(true);
|
|
});
|
|
|
|
it('should compute isFreshInstall as false when regState is not ENOKEYFILE', () => {
|
|
vi.mocked(useQuery).mockImplementation((query) => {
|
|
if (query === ACTIVATION_CODE_QUERY) {
|
|
return createCompleteQueryMock(
|
|
{
|
|
vars: { regState: 'REGISTERED' as RegistrationState },
|
|
},
|
|
false
|
|
);
|
|
}
|
|
|
|
return createCompleteQueryMock(null, false);
|
|
});
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.isFreshInstall).toBe(false);
|
|
});
|
|
|
|
it('should use publicPartnerInfo when available', () => {
|
|
const mockPublicPartnerInfo = { name: 'Public Partner' };
|
|
vi.mocked(useQuery).mockImplementation((query) => {
|
|
if (query === PARTNER_INFO_QUERY) {
|
|
return createCompleteQueryMock(
|
|
{
|
|
publicPartnerInfo: mockPublicPartnerInfo,
|
|
},
|
|
false
|
|
);
|
|
}
|
|
|
|
return createCompleteQueryMock(null, false);
|
|
});
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.partnerInfo).toEqual(mockPublicPartnerInfo);
|
|
});
|
|
|
|
it('should fallback to activationCode partnerInfo when publicPartnerInfo is null', () => {
|
|
const mockPartnerInfo = { name: 'Activation Partner' };
|
|
vi.mocked(useQuery).mockImplementation((query) => {
|
|
if (query === ACTIVATION_CODE_QUERY) {
|
|
return createCompleteQueryMock(
|
|
{
|
|
customization: { partnerInfo: mockPartnerInfo },
|
|
},
|
|
false
|
|
);
|
|
} else if (query === PARTNER_INFO_QUERY) {
|
|
return createCompleteQueryMock(
|
|
{
|
|
publicPartnerInfo: null,
|
|
},
|
|
false
|
|
);
|
|
}
|
|
|
|
return createCompleteQueryMock(null, false);
|
|
});
|
|
|
|
const store = useActivationCodeDataStore();
|
|
|
|
expect(store.partnerInfo).toEqual(mockPartnerInfo);
|
|
});
|
|
});
|
|
});
|