import { describe, it, expect } from 'vitest'; import { mount } from '@vue/test-utils'; import { createVuetify } from 'vuetify'; import DashboardView from '../../resources/js/views/DashboardView.vue'; describe('DashboardView.vue', () => { const factory = () => mount(DashboardView, { global: { plugins: [createVuetify()] }, }); it('монтируется и содержит приветствие', () => { const wrapper = factory(); expect(wrapper.text()).toContain('Доброе утро'); }); it('содержит range-toggle с 4 опциями', () => { const wrapper = factory(); const text = wrapper.text(); expect(text).toContain('Сегодня'); expect(text).toContain('7 дней'); expect(text).toContain('30 дней'); expect(text).toContain('Период'); }); it('содержит 3 KPI-cards (получено лидов / конверсия / активные проекты)', () => { const wrapper = factory(); const text = wrapper.text(); expect(text).toContain('Получено лидов'); expect(text).toContain('Конверсия в оплату'); expect(text).toContain('Активные проекты'); }); it('содержит balance-card с suммой и runway', () => { const wrapper = factory(); const text = wrapper.text(); expect(text).toContain('Баланс'); expect(text).toContain('14 250'); expect(text).toContain('LIVE'); expect(text).toContain('хватит на'); }); it('runway-bar содержит 7 сегментов (по числу runwayMax)', () => { const wrapper = factory(); expect(wrapper.findAll('.runway-fill')).toHaveLength(7); }); });