Squash and merge of version-0.1 Co-authored-by: James Wampler <james@wamp.dev> Co-committed-by: James Wampler <james@wamp.dev>
189 lines
6.0 KiB
TypeScript
Executable File
189 lines
6.0 KiB
TypeScript
Executable File
import { describe, it, expect, beforeEach } from '@jest/globals';
|
|
import { setActivePinia, createPinia } from 'pinia';
|
|
import { useContextStore } from '@/stores/context';
|
|
import type { OrganizationResponse, ProjectResponse, EnvironmentResponse } from '@/types/api';
|
|
|
|
const mockOrg: OrganizationResponse = { id: 1, name: 'Acme', createdAt: '2026-01-01T00:00:00Z', isPrimary: false };
|
|
const mockProject: ProjectResponse = {
|
|
id: 10,
|
|
name: 'Website',
|
|
organizationId: 1,
|
|
hideDisabledFlags: false,
|
|
createdAt: '2026-01-01T00:00:00Z',
|
|
};
|
|
const mockEnv: EnvironmentResponse = {
|
|
id: 100,
|
|
name: 'Production',
|
|
apiKey: 'env-key-abc',
|
|
projectId: 10,
|
|
createdAt: '2026-01-01T00:00:00Z',
|
|
};
|
|
|
|
describe('useContextStore', () => {
|
|
beforeEach(() => {
|
|
setActivePinia(createPinia());
|
|
localStorage.clear();
|
|
});
|
|
|
|
describe('WhenOrganizationIsSelected', () => {
|
|
it('ThenCurrentOrganizationIsUpdated', () => {
|
|
const store = useContextStore();
|
|
store.setOrganization(mockOrg);
|
|
|
|
expect(store.currentOrganization).toEqual(mockOrg);
|
|
});
|
|
|
|
it('ThenOrganizationIsPersistedToLocalStorage', () => {
|
|
const store = useContextStore();
|
|
store.setOrganization(mockOrg);
|
|
|
|
const stored = JSON.parse(localStorage.getItem('mic_ctx_organization')!);
|
|
expect(stored).toEqual(mockOrg);
|
|
});
|
|
|
|
it('ThenProjectAndEnvironmentAreReset', () => {
|
|
const store = useContextStore();
|
|
store.setOrganization(mockOrg);
|
|
store.setProject(mockProject);
|
|
store.setEnvironment(mockEnv);
|
|
|
|
store.setOrganization({ ...mockOrg, id: 2 });
|
|
|
|
expect(store.currentProject).toBeNull();
|
|
expect(store.currentEnvironment).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('WhenProjectIsSelected', () => {
|
|
it('ThenCurrentProjectIsUpdated', () => {
|
|
const store = useContextStore();
|
|
store.setOrganization(mockOrg);
|
|
store.setProject(mockProject);
|
|
|
|
expect(store.currentProject).toEqual(mockProject);
|
|
});
|
|
|
|
it('ThenEnvironmentIsReset', () => {
|
|
const store = useContextStore();
|
|
store.setOrganization(mockOrg);
|
|
store.setProject(mockProject);
|
|
store.setEnvironment(mockEnv);
|
|
|
|
store.setProject({ ...mockProject, id: 11 });
|
|
|
|
expect(store.currentEnvironment).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('WhenEnvironmentIsSelected', () => {
|
|
it('ThenCurrentEnvironmentIsUpdated', () => {
|
|
const store = useContextStore();
|
|
store.setEnvironment(mockEnv);
|
|
|
|
expect(store.currentEnvironment).toEqual(mockEnv);
|
|
});
|
|
|
|
it('ThenEnvironmentIsPersistedToLocalStorage', () => {
|
|
const store = useContextStore();
|
|
store.setEnvironment(mockEnv);
|
|
|
|
const stored = JSON.parse(localStorage.getItem('mic_ctx_environment')!);
|
|
expect(stored).toEqual(mockEnv);
|
|
});
|
|
});
|
|
|
|
describe('WhenLoadFromStorageIsCalledWithSavedContext', () => {
|
|
it('ThenContextIsRestoredFromLocalStorage', () => {
|
|
localStorage.setItem('mic_ctx_organization', JSON.stringify(mockOrg));
|
|
localStorage.setItem('mic_ctx_project', JSON.stringify(mockProject));
|
|
localStorage.setItem('mic_ctx_environment', JSON.stringify(mockEnv));
|
|
|
|
const store = useContextStore();
|
|
store.loadFromStorage();
|
|
|
|
expect(store.currentOrganization).toEqual(mockOrg);
|
|
expect(store.currentProject).toEqual(mockProject);
|
|
expect(store.currentEnvironment).toEqual(mockEnv);
|
|
});
|
|
});
|
|
|
|
describe('WhenLoadFromStorageEncountersCorruptData', () => {
|
|
it('ThenContextRemainsNullAndStorageIsCleared', () => {
|
|
localStorage.setItem('mic_ctx_organization', 'not-valid-json{{');
|
|
|
|
const store = useContextStore();
|
|
store.loadFromStorage();
|
|
|
|
expect(store.currentOrganization).toBeNull();
|
|
expect(localStorage.getItem('mic_ctx_organization')).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('WhenRefreshOrganizationIsCalled', () => {
|
|
it('ThenOrgIsUpdatedWithoutClearingProjectOrEnvironment', () => {
|
|
const store = useContextStore();
|
|
store.setOrganization(mockOrg);
|
|
store.setProject(mockProject);
|
|
store.setEnvironment(mockEnv);
|
|
|
|
const updatedOrg = { ...mockOrg, name: 'Acme Updated' };
|
|
store.refreshOrganization(updatedOrg);
|
|
|
|
expect(store.currentOrganization).toEqual(updatedOrg);
|
|
expect(store.currentProject).toEqual(mockProject);
|
|
expect(store.currentEnvironment).toEqual(mockEnv);
|
|
});
|
|
|
|
it('ThenOrgIsPersistedToLocalStorage', () => {
|
|
const store = useContextStore();
|
|
const updatedOrg = { ...mockOrg, name: 'Acme Updated' };
|
|
store.refreshOrganization(updatedOrg);
|
|
|
|
const stored = JSON.parse(localStorage.getItem('mic_ctx_organization')!);
|
|
expect(stored).toEqual(updatedOrg);
|
|
});
|
|
});
|
|
|
|
describe('WhenRefreshProjectIsCalled', () => {
|
|
it('ThenProjectIsUpdatedWithoutClearingEnvironment', () => {
|
|
const store = useContextStore();
|
|
store.setProject(mockProject);
|
|
store.setEnvironment(mockEnv);
|
|
|
|
const updatedProject = { ...mockProject, name: 'Website Updated' };
|
|
store.refreshProject(updatedProject);
|
|
|
|
expect(store.currentProject).toEqual(updatedProject);
|
|
expect(store.currentEnvironment).toEqual(mockEnv);
|
|
});
|
|
});
|
|
|
|
describe('WhenRefreshEnvironmentIsCalled', () => {
|
|
it('ThenEnvironmentIsUpdatedAndPersisted', () => {
|
|
const store = useContextStore();
|
|
const updatedEnv = { ...mockEnv, name: 'Production Updated' };
|
|
store.refreshEnvironment(updatedEnv);
|
|
|
|
expect(store.currentEnvironment).toEqual(updatedEnv);
|
|
const stored = JSON.parse(localStorage.getItem('mic_ctx_environment')!);
|
|
expect(stored).toEqual(updatedEnv);
|
|
});
|
|
});
|
|
|
|
describe('WhenClearContextIsCalled', () => {
|
|
it('ThenAllContextIsRemovedFromStateAndStorage', () => {
|
|
const store = useContextStore();
|
|
store.setOrganization(mockOrg);
|
|
store.setProject(mockProject);
|
|
store.setEnvironment(mockEnv);
|
|
|
|
store.clearContext();
|
|
|
|
expect(store.currentOrganization).toBeNull();
|
|
expect(store.currentProject).toBeNull();
|
|
expect(store.currentEnvironment).toBeNull();
|
|
expect(localStorage.getItem('mic_ctx_organization')).toBeNull();
|
|
});
|
|
});
|
|
});
|