| 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(''); |
| }); |
| }); |
|
|