File size: 2,653 Bytes
ca51841 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import { beforeEach, describe, expect, it, vi } from 'vitest';
import { SettingsModal } from '../src/components/settings-modal.js';
import { store } from '../src/store.js';
function mountModal() {
const modal = new SettingsModal();
modal.render();
modal.show();
return modal;
}
beforeEach(() => {
document.body.innerHTML = '';
vi.restoreAllMocks();
});
describe('SettingsModal', () => {
it('shows only fetched models for the current baseUrl', () => {
store.saveSettings({ baseUrl: 'http://a.local' });
store.saveAvailableModels('http://a.local', ['model-a']);
store.saveAvailableModels('http://b.local', ['model-b']);
const modal = mountModal();
const text = modal.el.querySelector('#model-caps-list').textContent;
expect(text).toContain('model-a');
expect(text).not.toContain('model-b');
});
it('saves fetched models under the current baseUrl', async () => {
store.saveSettings({ baseUrl: 'http://a.local', apiKey: '' });
globalThis.fetch = vi.fn().mockResolvedValue({
ok: true,
json: async () => ({ data: [{ id: 'model-a' }] }),
});
const modal = mountModal();
await modal._fetchModels();
expect(store.getAvailableModels('http://a.local')).toEqual(['model-a']);
});
it('does not close when clicking inside the modal panel while editing inputs', () => {
const modal = mountModal();
const panel = modal.el.querySelector('.modal-panel');
const input = modal.el.querySelector('#settings-base-url');
panel.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
input.dispatchEvent(new MouseEvent('click', { bubbles: true }));
expect(document.body.contains(modal.el)).toBe(true);
expect(modal.visible).toBe(true);
});
it('closes only when the backdrop itself is clicked', () => {
const modal = mountModal();
modal.el.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
modal.el.dispatchEvent(new MouseEvent('click', { bubbles: true }));
expect(document.body.contains(modal.el)).toBe(false);
expect(modal.visible).toBe(false);
});
it('clears selected model when switching to a URL without that model', () => {
store.saveAvailableModels('http://a.local', ['model-a']);
store.setCurrentModel('http://a.local', 'model-a');
store.saveSettings({ baseUrl: 'http://a.local' });
const modal = mountModal();
modal.el.querySelector('#settings-base-url').value = 'http://b.local';
modal.el.querySelector('#settings-save').click();
expect(store.getSettings().baseUrl).toBe('http://b.local');
expect(store.getCurrentModel('http://b.local')).toBe('');
});
});
|