test: limit + audit_log sections (38/38 pass)

This commit is contained in:
2026-05-30 17:09:50 +03:00
parent e97c36f19f
commit 8ab7eed629
+83
View File
@@ -433,6 +433,89 @@ async function cleanup() {
log(res.status === 200, 'admin: GET /export → 200 (все компании)'); log(res.status === 200, 'admin: GET /export → 200 (все компании)');
} }
// ─────────────────────────────────────────────────────────────────────────────
// 14. Лимит — добавить сверх лимита → ошибка
// ─────────────────────────────────────────────────────────────────────────────
console.log('\n── 14. Лимит ──');
{
// client_id пользователя 'test' — WZ01325 (из MOCK_USERS)
const { MOCK_USERS } = require('../src/config');
const testUser = MOCK_USERS.find(u => u.id === 'test');
const userClientId = testUser?.clientId;
const uRes = await pool.query(
`SELECT id FROM companies WHERE client_id = $1 LIMIT 1`,
[userClientId]
);
const userCompanyId = uRes.rows[0]?.id;
if (userCompanyId) {
// Считаем активные записи компании
const cntRes = await pool.query(
`SELECT COUNT(*)::int AS c FROM whitelist_entries WHERE company_id = $1 AND deleted_at IS NULL`,
[userCompanyId]
);
const currentCount = cntRes.rows[0].c;
// Ставим лимит = текущее количество записей → следующее добавление упадёт
const csrf = await getCsrfFromIndex(adminAgent);
const limitRes = await adminAgent.post(`/admin/limit/${userCompanyId}`).type('form')
.send({ limit: String(currentCount), _csrf: csrf });
log(limitRes.status === 302, 'admin: выставил лимит=currentCount для user', `status=${limitRes.status} count=${currentCount}`);
// Добавляем запись — должна упасть с "Лимит исчерпан"
const csrf3 = await getCsrfFromIndex(userAgent);
const r2 = await userAgent.post('/add').type('form')
.send({ value: '8.8.4.100', comment: 'лимит тест', _csrf: csrf3 });
const err2 = getRedirectParam(r2, 'error');
log(err2?.includes('Лимит'), 'user: лимит исчерпан → ошибка', `err=${err2}`);
// Возвращаем лимит обратно (пустая строка = дефолт)
const csrf4 = await getCsrfFromIndex(adminAgent);
await adminAgent.post(`/admin/limit/${userCompanyId}`).type('form')
.send({ limit: '', _csrf: csrf4 });
// Чистим тестовые записи лимит-теста
await pool.query(
`UPDATE whitelist_entries SET deleted_at = NOW(), deleted_by = 'test-cleanup'
WHERE value_cidr IN ('8.8.8.8/32', '8.8.4.100/32') AND deleted_at IS NULL`
);
} else {
log(false, 'admin: не нашли компанию user для теста лимита');
log(false, 'user: лимит исчерпан → ошибка');
}
}
// ─────────────────────────────────────────────────────────────────────────────
// 15. Audit log — операции пишутся в БД
// ─────────────────────────────────────────────────────────────────────────────
console.log('\n── 15. Audit log ──');
{
const { MOCK_USERS } = require('../src/config');
const testUser = MOCK_USERS.find(u => u.id === 'test');
const uRes = await pool.query(
`SELECT id FROM companies WHERE client_id = $1 LIMIT 1`,
[testUser?.clientId]
);
const userCompanyId = uRes.rows[0]?.id;
if (userCompanyId) {
const r = await pool.query(
`SELECT action FROM audit_log WHERE company_id = $1 ORDER BY created_at DESC LIMIT 20`,
[userCompanyId]
);
const actions = r.rows.map(row => row.action);
log(actions.some(a => /add|create/i.test(a)),
'audit: операция add записана в audit_log', `actions=${JSON.stringify(actions.slice(0,5))}`);
log(actions.some(a => /delete/i.test(a)),
'audit: операция delete записана в audit_log', `actions=${JSON.stringify(actions.slice(0,5))}`);
} else {
log(false, 'audit: не нашли компанию user');
log(false, 'audit: не нашли компанию user (delete)');
}
}
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
// Cleanup // Cleanup
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────