diff --git a/web/src/components/WelcomeModal.vue b/web/src/components/WelcomeModal.vue new file mode 100644 index 0000000..dd46f52 --- /dev/null +++ b/web/src/components/WelcomeModal.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/web/src/components/__tests__/WelcomeModal.test.ts b/web/src/components/__tests__/WelcomeModal.test.ts new file mode 100644 index 0000000..b64b7da --- /dev/null +++ b/web/src/components/__tests__/WelcomeModal.test.ts @@ -0,0 +1,35 @@ +import { describe, it, expect, beforeEach } from 'vitest' +import { mount } from '@vue/test-utils' +import WelcomeModal from '../WelcomeModal.vue' + +const LS_KEY = 'peregrine_demo_visited' + +beforeEach(() => { + localStorage.clear() +}) + +describe('WelcomeModal', () => { + it('is visible when localStorage key is absent', () => { + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + expect(w.find('.welcome-modal').exists()).toBe(true) + }) + + it('is hidden when localStorage key is set', () => { + localStorage.setItem(LS_KEY, '1') + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + expect(w.find('.welcome-modal').exists()).toBe(false) + }) + + it('dismisses and sets localStorage on primary CTA click', async () => { + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + await w.find('.welcome-modal__explore').trigger('click') + expect(w.find('.welcome-modal').exists()).toBe(false) + expect(localStorage.getItem(LS_KEY)).toBe('1') + }) + + it('emits dismissed event on close', async () => { + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + await w.find('.welcome-modal__explore').trigger('click') + expect(w.emitted('dismissed')).toBeTruthy() + }) +})