import { describe, it, expect, beforeEach, vi } from 'vitest'; import { mount } from '@vue/test-utils'; import { createVuetify } from 'vuetify'; import WelcomeTour from '../../resources/js/components/layout/WelcomeTour.vue'; const vuetify = createVuetify(); const SEEN_KEY = 'liderra.welcomeTourSeen'; const factory = () => mount(WelcomeTour, { global: { plugins: [vuetify] } }); describe('WelcomeTour.vue (Фаза 3)', () => { beforeEach(() => { localStorage.clear(); vi.stubGlobal('requestAnimationFrame', (cb: FrameRequestCallback) => { cb(0); return 0; }); }); it('показывается новому пользователю (флага нет) с первого шага', () => { const w = factory(); const vm = w.vm as unknown as { active: boolean; stepIndex: number; steps: unknown[] }; expect(vm.active).toBe(true); expect(vm.stepIndex).toBe(0); expect(w.find('[data-testid="welcome-tour"]').exists()).toBe(true); expect(w.text()).toContain('Добро пожаловать'); }); it('НЕ показывается, если тур уже видели (флаг в localStorage)', () => { localStorage.setItem(SEEN_KEY, '1'); const w = factory(); const vm = w.vm as unknown as { active: boolean }; expect(vm.active).toBe(false); expect(w.find('[data-testid="welcome-tour"]').exists()).toBe(false); }); it('«Далее» проходит все шаги, «Готово» закрывает и ставит флаг', async () => { const w = factory(); const vm = w.vm as unknown as { active: boolean; stepIndex: number; steps: unknown[]; next: () => void }; const total = vm.steps.length; for (let i = 0; i < total - 1; i++) { vm.next(); } expect(vm.stepIndex).toBe(total - 1); expect(vm.active).toBe(true); vm.next(); // последний шаг → finish expect(vm.active).toBe(false); expect(localStorage.getItem(SEEN_KEY)).toBe('1'); }); it('«Пропустить» закрывает тур и ставит флаг', async () => { const w = factory(); await w.find('[data-testid="tour-skip"]').trigger('click'); const vm = w.vm as unknown as { active: boolean }; expect(vm.active).toBe(false); expect(localStorage.getItem(SEEN_KEY)).toBe('1'); }); });