// Tests/frontend_tests.mjs
// Тесты доступности страниц frontend — запускаются через: node Tests/frontend_tests.mjs
// Требует: запущенный Vite dev server (npm run dev в frontend/)
const BASE = 'http://localhost:3000';
let passed = 0;
let failed = 0;
async function test(name, fn) {
try {
await fn();
console.log(` ✅ PASS: ${name}`);
passed++;
} catch (err) {
console.log(` ❌ FAIL: ${name}`);
console.log(` ${err.message}`);
failed++;
}
}
function assert(condition, message) {
if (!condition) throw new Error(message || 'Assertion failed');
}
// ─── Группа 1: Доступность страниц ─────────────────────────────────────────
console.log('\n🔍 Группа 1: Доступность страниц (HTTP 200)');
const pages = [
{ url: '/', name: 'Главная страница' },
{ url: '/login', name: 'Страница входа' },
{ url: '/about', name: 'О компании' },
{ url: '/delivery', name: 'Доставка' },
{ url: '/nonexistent-page', name: '404 страница (возвращает HTML)' },
];
for (const page of pages) {
await test(`GET ${page.url} — ${page.name}`, async () => {
const res = await fetch(`${BASE}${page.url}`);
assert(res.status === 200, `Ожидался 200, получен ${res.status}`);
const text = await res.text();
assert(text.includes('
'), 'HTML не содержит корневой элемент React');
});
}
// ─── Группа 2: Контент страниц ──────────────────────────────────────────────
console.log('\n🔍 Группа 2: Корректность HTML');
await test('Главная страница содержит тег title', async () => {
const res = await fetch(`${BASE}/`);
const text = await res.text();
assert(text.includes('
'), 'Нет тега ');
assert(text.includes('Nutshell'), 'Title не содержит "Nutshell"');
});
await test('Страница загружает шрифт Inter из Google Fonts', async () => {
const res = await fetch(`${BASE}/`);
const text = await res.text();
assert(text.includes('fonts.googleapis.com'), 'Нет ссылки на Google Fonts');
assert(text.includes('Inter'), 'Шрифт Inter не подключён');
});
await test('Логотип PNG доступен', async () => {
const res = await fetch(`${BASE}/logo-white.png`);
assert(res.status === 200, `Ожидался 200 для logo-white.png, получен ${res.status}`);
const ct = res.headers.get('content-type') || '';
assert(ct.includes('image/png') || ct.includes('image/'), `Неверный content-type: ${ct}`);
});
await test('Чёрный логотип PNG доступен', async () => {
const res = await fetch(`${BASE}/logo-black.png`);
assert(res.status === 200, `Ожидался 200 для logo-black.png, получен ${res.status}`);
});
// ─── Группа 3: Proxy к API ──────────────────────────────────────────────────
console.log('\n🔍 Группа 3: Proxy /api → backend :3001');
await test('Vite proxy /api/health работает', async () => {
const res = await fetch(`${BASE}/api/health`);
assert(res.status === 200, `Ожидался 200 через proxy, получен ${res.status}`);
const data = await res.json();
assert(data.success === true, 'success !== true через proxy');
assert(data.data.status === 'ok', `status !== 'ok' через proxy`);
});
// ─── Итог ──────────────────────────────────────────────────────────────────
console.log(`\n${'─'.repeat(50)}`);
console.log(`Итог: ${passed} прошло, ${failed} провалено`);
if (failed > 0) {
console.log('⚠️ Есть проваленные тесты');
process.exit(1);
} else {
console.log('✅ Все тесты прошли успешно');
}