import { describe, it, expect } from 'vitest'; import { mount } from '@vue/test-utils'; import { createPinia, setActivePinia } from 'pinia'; import { createVuetify } from 'vuetify'; import DashboardPageHead from '../../resources/js/components/dashboard/DashboardPageHead.vue'; import { useAuthStore } from '../../resources/js/stores/auth'; import type { AuthUser } from '../../resources/js/api/auth'; const mockUser: AuthUser = { id: 1, email: 'petr.sidorov@example.ru', first_name: 'Пётр', last_name: 'Сидоров', tenant_id: 1, totp_enabled: false, last_login_at: null, }; const mountHead = (user: AuthUser | null = mockUser) => { setActivePinia(createPinia()); useAuthStore().user = user; return mount(DashboardPageHead, { props: { modelValue: 'today' }, global: { plugins: [createVuetify()] }, }); }; describe('DashboardPageHead.vue', () => { it('приветствие использует имя залогиненного пользователя, не захардкоженное «Иван»', () => { const wrapper = mountHead(); const greet = wrapper.find('.page-greet').text(); expect(greet).toContain('Пётр'); expect(greet).not.toContain('Иван'); }); it('без имени приветствие нейтральное, без «коллега» (U2)', () => { const wrapper = mountHead(null); const greet = wrapper.find('.page-greet').text(); expect(greet.length).toBeGreaterThan(0); expect(greet).not.toContain('коллега'); expect(greet).toContain('!'); // «Доброе утро!» — без обращения к чужому }); // F5: meta-строка раньше была захардкоженной «рыбой» (+3 / 11 / 38 / 2 248 ₽). // Теперь числа приходят пропами из реальных данных дашборда. const mountMeta = (props: Record) => { setActivePinia(createPinia()); useAuthStore().user = mockUser; return mount(DashboardPageHead, { props: { modelValue: 'today', ...props }, global: { plugins: [createVuetify()] }, }); }; it('сегодня/вчера — настоящие из пропов, не захардкоженные 11/38', () => { const meta = mountMeta({ leadsToday: 7, leadsYesterday: 12, avgLeadCostRub: 500 }) .find('.page-meta') .text(); expect(meta).toContain('сегодня 7'); expect(meta).toContain('вчера 12'); expect(meta).not.toContain('сегодня 11'); expect(meta).not.toContain('вчера 38'); }); it('средняя стоимость — настоящая из пропа, не захардкоженные 2 248', () => { const meta = mountMeta({ leadsToday: 7, leadsYesterday: 12, avgLeadCostRub: 500 }) .find('.page-meta') .text(); expect(meta).toContain('средняя стоимость'); expect(meta).toContain('500'); expect(meta).not.toContain('2 248'); }); it('средняя стоимость = «—» когда avgLeadCostRub null', () => { const meta = mountMeta({ leadsToday: 0, leadsYesterday: 0, avgLeadCostRub: null }) .find('.page-meta') .text(); expect(meta).toContain('средняя стоимость'); expect(meta).toContain('—'); expect(meta).not.toContain('2 248'); }); it('строка больше не содержит выдуманное «+3 … с утра»', () => { const meta = mountMeta({ leadsToday: 7, leadsYesterday: 12, avgLeadCostRub: 500 }) .find('.page-meta') .text(); expect(meta).not.toContain('с утра'); expect(meta).not.toContain('+3'); }); });