Files
compras/tests/frontend/public-navigation.test.tsx
T
2026-10-30 20:52:10 +02:00

52 lines
2.1 KiB
TypeScript

import { readFileSync } from 'node:fs';
import { App } from '@inertiajs/react';
import type { Page } from '@inertiajs/core';
import type { ComponentType } from 'react';
import { renderToString } from 'react-dom/server';
import { expect, test } from 'vitest';
import AppLayout from '@/layouts/app-layout';
import { procurementNavigation } from '@/lib/procurement-navigation';
const fixtures = JSON.parse(
readFileSync(
new URL('../Fixtures/public-navigation.json', import.meta.url),
'utf8',
),
) as Record<string, Page>;
const modules = import.meta.glob<{
default: ComponentType<Record<string, unknown>>;
}>('../../resources/js/pages/**/*.tsx', { eager: true });
test.each(Object.entries(fixtures))(
'real public page %s renders with the actual application shell and no authenticated user',
(name, initialPage) => {
const Screen = modules[`../../resources/js/pages/${name}.tsx`]?.default;
expect(Screen).toBeDefined();
const Component = (props: Record<string, unknown>) => (
<AppLayout>
<Screen {...props} />
</AppLayout>
);
const html = renderToString(
<App initialPage={initialPage} initialComponent={Component} />,
);
expect(html).toContain('Consulta pública de desenvolvimento');
expect(html).not.toContain('/consulta?');
expect(html).toContain('/dashboard');
},
);
test('public menu links only to the explicit public screens and never grants a staff role', () => {
const paths = (
fixtures.dashboard.props.publicNavigation as { paths: string[] }
).paths;
const groups = procurementNavigation('', false, paths);
expect(groups.length).toBeGreaterThan(3);
for (const entry of groups.flatMap((group) => group.entries))
expect(paths).toContain(new URL(entry.path, 'http://local').pathname);
expect(
groups
.flatMap((group) => group.entries)
.some((entry) => entry.path.startsWith('/administracao')),
).toBe(false);
expect(fixtures.dashboard.props.auth).toEqual({ user: null });
});