diff --git a/frontend/src/features/chat/ChatView.spec.ts b/frontend/src/features/chat/ChatView.spec.ts index 46c73d2..fe1d731 100644 --- a/frontend/src/features/chat/ChatView.spec.ts +++ b/frontend/src/features/chat/ChatView.spec.ts @@ -64,3 +64,26 @@ it('preserves the selection when provider discovery fails', async () => { expect(wrapper.get('.error-banner').text()).toBe('offline') wrapper.unmount() }) + +it.each(['providers', 'skills'])('ignores initialization after unmount while %s are loading', async source => { + const chat = useChatStore() + let finish!: () => void + const pending = new Promise(resolve => { finish = resolve }) + if (source === 'providers') vi.mocked(useProviderStore().loadProviders).mockReturnValueOnce(pending) + else vi.mocked(useSkillStore().loadSkills).mockReturnValueOnce(pending) + const first = mount(ChatView) + first.unmount() + finish() + await flushPromises() + expect(chat.selectedProviderId).toBe('') + expect(chat.selectedModel).toBe('') + expect(useProviderStore().loadModels).not.toHaveBeenCalled() + + const returned = mount(ChatView) + await flushPromises() + expect(chat.selectedProviderId).toBe('a') + expect(chat.selectedModel).toBe('a-default') + await returned.get('textarea').setValue('hello') + expect(returned.get('button.button-primary').attributes('disabled')).toBeUndefined() + returned.unmount() +}) diff --git a/frontend/src/features/chat/ChatView.vue b/frontend/src/features/chat/ChatView.vue index 51ad5d0..7cd0525 100644 --- a/frontend/src/features/chat/ChatView.vue +++ b/frontend/src/features/chat/ChatView.vue @@ -1,5 +1,5 @@