Files
portal/app/tests/Frontend/AppShell.spec.ts
T

54 lines
2.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, it, expect } from 'vitest';
import { mount } from '@vue/test-utils';
import { createPinia } from 'pinia';
import { createVuetify } from 'vuetify';
import { createRouter, createMemoryHistory } from 'vue-router';
import AppShell from '../../resources/js/components/AppShell.vue';
// AppShell — layout-mapper по route.meta.layout: 'app' (default) → AppLayout, 'auth' → AuthLayout.
const mountWithRouter = async (path: string) => {
const router = createRouter({
history: createMemoryHistory(),
routes: [
{ path: '/', redirect: '/dashboard' },
{ path: '/dashboard', component: { template: '<div>dashboard</div>' }, meta: { layout: 'app' } },
{ path: '/login', component: { template: '<div>login stub</div>' }, meta: { layout: 'auth' } },
// Stub'ы для всех nav-targets AppLayout, чтобы избежать router-warn'ов.
{ path: '/deals', component: { template: '<div />' } },
{ path: '/kanban', component: { template: '<div />' } },
{ path: '/billing', component: { template: '<div />' } },
{ path: '/reports', component: { template: '<div />' } },
{ path: '/managers', component: { template: '<div />' } },
{ path: '/settings', component: { template: '<div />' } },
],
});
await router.push(path);
await router.isReady();
return mount(AppShell, {
global: { plugins: [createPinia(), createVuetify(), router] },
});
};
describe('AppShell.vue', () => {
it('монтируется без ошибок', async () => {
const wrapper = await mountWithRouter('/dashboard');
expect(wrapper.exists()).toBe(true);
});
it('рендерит AppLayout на default-layout (sidebar с brand + nav)', async () => {
const wrapper = await mountWithRouter('/dashboard');
expect(wrapper.text()).toContain('Лидерра');
// Sidebar nav-группы и пункты — признак AppLayout.
expect(wrapper.text()).toContain('Дашборд');
expect(wrapper.text()).toContain('Сделки');
});
it('переключается на AuthLayout при meta.layout = auth', async () => {
const wrapper = await mountWithRouter('/login');
// На auth-layout sidebar не рендерится — нет nav-пунктов «Сделки»/«Дашборд».
expect(wrapper.text()).not.toContain('Сделки');
expect(wrapper.text()).not.toContain('Дашборд');
});
});