From ff47af27399110c956f1d97d2a35f78ba754246b Mon Sep 17 00:00:00 2001 From: Nicolas Bonamy Date: Sat, 11 May 2024 16:38:42 -0500 Subject: [PATCH] store tests --- src/services/store.ts | 21 ++++--- src/types/index.d.ts | 1 + tests/unit/commands.test.ts | 2 +- tests/unit/store.test.ts | 116 ++++++++++++++++++++++++++++++++++++ vitest.config.mjs | 7 +++ 5 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 tests/unit/store.test.ts diff --git a/src/services/store.ts b/src/services/store.ts index a8cfcee..c368199 100644 --- a/src/services/store.ts +++ b/src/services/store.ts @@ -27,8 +27,16 @@ store.load = async () => { loadHistory() loadPrompts() - // load models - // and select valid engine + // subscribe to file changes + window.api.on('file-modified', (signal) => { + if (signal === 'settings') { + loadSettings() + } else if (signal === 'history') { + mergeHistory(window.api.history.load()) + } + }) + + // load models and select valid engine await loadAllModels() if (!isEngineReady(store.config.llm.engine)) { for (const engine of availableEngines) { @@ -40,15 +48,6 @@ store.load = async () => { } } - // subscribe to file changes - window.api.on('file-modified', (signal) => { - if (signal === 'settings') { - loadSettings() - } else if (signal === 'history') { - mergeHistory(window.api.history.load()) - } - }) - } store.dump = () => { diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 1578592..78842c9 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -75,6 +75,7 @@ interface Store { saveSettings?(): void load?(): Promise loadCommands?(): Promise + mergeHistory?(chats: any[]): void dump?(): void } diff --git a/tests/unit/commands.test.ts b/tests/unit/commands.test.ts index 3ea373f..449493e 100644 --- a/tests/unit/commands.test.ts +++ b/tests/unit/commands.test.ts @@ -1,7 +1,7 @@ import { vi, beforeAll, expect, test } from 'vitest' -import * as commands from '../../src/services/commands' import { store } from '../../src/services/store' +import * as commands from '../../src/services/commands' beforeAll(() => { diff --git a/tests/unit/store.test.ts b/tests/unit/store.test.ts new file mode 100644 index 0000000..b723794 --- /dev/null +++ b/tests/unit/store.test.ts @@ -0,0 +1,116 @@ + +import { vi, expect, test, beforeEach } from 'vitest' +import { store } from '../../src/services/store' +import Chat from '../../src/models/chat' +import Message from '../../src/models/message' +import defaultSettings from '../../defaults/settings.json' +import defaultCommands from '../../defaults/commands.json' +import defaultPrompts from '../../defaults/prompts.json' + +const listeners: ((signal: string) => void)[] = [] + +const chats = [ + new Chat(), + new Chat({ + uuid: '123', + engine: 'engine', + model: 'model', + messages: [ + { uuid: 1, role: 'system', content: 'Hi' }, + { uuid: 2, role: 'user', content: 'Hello' } + ] + }) +] + +window.api = { + config: { + load: vi.fn(() => defaultSettings), + save: vi.fn(), + }, + commands: { + load: vi.fn(() => defaultCommands), + }, + prompts: { + load: vi.fn(() => defaultPrompts), + }, + history: { + load: vi.fn(() => chats), + save: vi.fn(), + }, + on: (signal: string, listener: any) => { + listeners.push(listener) + } +} + +beforeEach(() => { + vi.clearAllMocks() + listeners.length = 0 +}) + +test('Check atributtes', async () => { + expect(store.config).toBe(null) + expect(store.commands).toEqual([]) + expect(store.prompts).toEqual([]) + expect(store.chats).toEqual([]) + expect(store.chatFilter).toBe(null) + expect(store.pendingAttachment).toBe(null) +}) + +test('Load', async () => { + store.load() + expect(window.api.config.load).toHaveBeenCalled() + expect(window.api.prompts.load).toHaveBeenCalled() + expect(window.api.commands.load).toHaveBeenCalled() + expect(window.api.history.load).toHaveBeenCalled() + expect(store.config).toStrictEqual(defaultSettings) + expect(store.config.getActiveModel).toBeDefined() + expect(store.commands).toStrictEqual(defaultCommands) + expect(store.prompts).toStrictEqual(defaultPrompts) +}) + +test('Save settings', async () => { + store.load() + store.saveSettings() + expect(window.api.config.save).toHaveBeenCalled() +}) + +test('Reload settings', async () => { + store.load() + vi.clearAllMocks() + expect(window.api.config.load).not.toHaveBeenCalled() + listeners[0]('settings') + expect(window.api.config.load).toHaveBeenCalled() +}) + +test('Load history', async () => { + store.load() + expect(store.chats).toHaveLength(2) + expect(store.chats[0].messages).toHaveLength(0) + expect(store.chats[1].messages).toHaveLength(2) +}) + +test('Save history', async () => { + store.saveHistory() + expect(window.api.history.save).toHaveBeenCalledWith([ { + uuid: '123', + engine: 'engine', + model: 'model', + messages: [ + { uuid: 1, role: 'system', content: 'Hi', toolCall: null, transient: false }, + { uuid: 2, role: 'user', content: 'Hello', toolCall: null, transient: false } + ] + }]) +}) + +test('Merge history', async () => { + store.load() + chats.push(new Chat()) + chats[1].messages.push(new Message('user', '')) + listeners[0]('history') + expect(store.chats).toHaveLength(3) + expect(store.chats[1].messages).toHaveLength(3) + chats[2].deleted = true + listeners[0]('history') + expect(store.chats).toHaveLength(2) + expect(store.chats[1].messages).toHaveLength(3) +}) diff --git a/vitest.config.mjs b/vitest.config.mjs index fd3043b..5c1cc8e 100644 --- a/vitest.config.mjs +++ b/vitest.config.mjs @@ -6,6 +6,7 @@ // import { defineConfig } from 'vite' +import { coverageConfigDefaults } from 'vitest/dist/config' import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ @@ -20,5 +21,11 @@ export default defineConfig({ test: { globals: true, environment: 'jsdom', + coverage: { + exclude: [ + ...coverageConfigDefaults.exclude, + 'src/vendor/**/*', + ] + }, }, })