diff --git a/tests/integration.js b/tests/integration.js index b58b684..9d58601 100644 --- a/tests/integration.js +++ b/tests/integration.js @@ -433,6 +433,89 @@ async function cleanup() { 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 // ─────────────────────────────────────────────────────────────────────────────