128 lines
3.6 KiB
TypeScript
128 lines
3.6 KiB
TypeScript
/**
|
|
* Zustand Stores Tests
|
|
*/
|
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
import { useSettingsStore } from '@/stores/settings';
|
|
import { useGatewayStore } from '@/stores/gateway';
|
|
|
|
describe('Settings Store', () => {
|
|
beforeEach(() => {
|
|
// Reset store to default state
|
|
useSettingsStore.setState({
|
|
theme: 'system',
|
|
language: 'en',
|
|
sidebarCollapsed: false,
|
|
devModeUnlocked: false,
|
|
gatewayAutoStart: true,
|
|
gatewayPort: 18789,
|
|
autoCheckUpdate: true,
|
|
autoDownloadUpdate: false,
|
|
startMinimized: false,
|
|
launchAtStartup: false,
|
|
updateChannel: 'stable',
|
|
});
|
|
});
|
|
|
|
it('should have default values', () => {
|
|
const state = useSettingsStore.getState();
|
|
expect(state.theme).toBe('system');
|
|
expect(state.sidebarCollapsed).toBe(false);
|
|
expect(state.gatewayAutoStart).toBe(true);
|
|
});
|
|
|
|
it('should update theme', () => {
|
|
const { setTheme } = useSettingsStore.getState();
|
|
setTheme('dark');
|
|
expect(useSettingsStore.getState().theme).toBe('dark');
|
|
});
|
|
|
|
it('should toggle sidebar collapsed state', () => {
|
|
const { setSidebarCollapsed } = useSettingsStore.getState();
|
|
setSidebarCollapsed(true);
|
|
expect(useSettingsStore.getState().sidebarCollapsed).toBe(true);
|
|
});
|
|
|
|
it('should unlock dev mode', () => {
|
|
const invoke = vi.mocked(window.electron.ipcRenderer.invoke);
|
|
invoke.mockResolvedValueOnce({
|
|
ok: true,
|
|
data: {
|
|
status: 200,
|
|
ok: true,
|
|
json: { success: true },
|
|
},
|
|
});
|
|
|
|
const { setDevModeUnlocked } = useSettingsStore.getState();
|
|
setDevModeUnlocked(true);
|
|
|
|
expect(useSettingsStore.getState().devModeUnlocked).toBe(true);
|
|
expect(invoke).toHaveBeenCalledWith(
|
|
'hostapi:fetch',
|
|
expect.objectContaining({
|
|
path: '/api/settings/devModeUnlocked',
|
|
method: 'PUT',
|
|
}),
|
|
);
|
|
});
|
|
|
|
it('should persist launch-at-startup setting through host api', () => {
|
|
const invoke = vi.mocked(window.electron.ipcRenderer.invoke);
|
|
invoke.mockResolvedValueOnce({
|
|
ok: true,
|
|
data: {
|
|
status: 200,
|
|
ok: true,
|
|
json: { success: true },
|
|
},
|
|
});
|
|
|
|
const { setLaunchAtStartup } = useSettingsStore.getState();
|
|
setLaunchAtStartup(true);
|
|
|
|
expect(useSettingsStore.getState().launchAtStartup).toBe(true);
|
|
expect(invoke).toHaveBeenCalledWith(
|
|
'hostapi:fetch',
|
|
expect.objectContaining({
|
|
path: '/api/settings/launchAtStartup',
|
|
method: 'PUT',
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('Gateway Store', () => {
|
|
beforeEach(() => {
|
|
// Reset store
|
|
useGatewayStore.setState({
|
|
status: { state: 'stopped', port: 18789 },
|
|
isInitialized: false,
|
|
});
|
|
});
|
|
|
|
it('should have default status', () => {
|
|
const state = useGatewayStore.getState();
|
|
expect(state.status.state).toBe('stopped');
|
|
expect(state.status.port).toBe(18789);
|
|
});
|
|
|
|
it('should update status', () => {
|
|
const { setStatus } = useGatewayStore.getState();
|
|
setStatus({ state: 'running', port: 18789, pid: 12345 });
|
|
|
|
const state = useGatewayStore.getState();
|
|
expect(state.status.state).toBe('running');
|
|
expect(state.status.pid).toBe(12345);
|
|
});
|
|
|
|
it('should proxy gateway rpc through ipc', async () => {
|
|
const invoke = vi.mocked(window.electron.ipcRenderer.invoke);
|
|
invoke.mockResolvedValueOnce({ success: true, result: { ok: true } });
|
|
|
|
const result = await useGatewayStore.getState().rpc<{ ok: boolean }>('chat.history', { limit: 10 }, 5000);
|
|
|
|
expect(result.ok).toBe(true);
|
|
expect(invoke).toHaveBeenCalledWith('gateway:rpc', 'chat.history', { limit: 10 }, 5000);
|
|
});
|
|
});
|