Files
portal/app/tests/Frontend/WelcomeTour.spec.ts
T
Дмитрий 813b58447e feat/onboarding: приветственный тур при первом входе Фаза 3
Лёгкий тур без сторонних зависимостей: подсвечивает пункты меню по порядку
пополнить→создать проект→где заявки→помощь. Показывается один раз localStorage,
можно пропустить. Якоря data-tour на AppSidebar, монтируется в AppLayout.
Тест WelcomeTour 4/4. NB: пиксельное позиционирование проверить визуально на выкате.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 12:36:15 +03:00

59 lines
2.4 KiB
TypeScript

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