v0.5.9: fix tests IDs, revert dotenv abs paths, deploy-vm doc

This commit is contained in:
2026-06-02 14:20:16 +03:00
parent b91b78ab04
commit 66a52d9363
3 changed files with 34 additions and 36 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "ipwhitelist",
"version": "0.5.8",
"version": "0.5.9",
"description": "IP WhiteList microservice for cloud provider",
"main": "server.js",
"scripts": {
-2
View File
@@ -55,8 +55,6 @@ const MOCK_USERS = [
companyName: 'БЕТА',
email: 'beta@example.com',
},
email: 'user2@example.com',
},
];
// ── backUrl — строит URL для редиректа после мутирующего действия ──────────────
+33 -33
View File
@@ -893,92 +893,92 @@ async function cleanup() {
if (!tokenMulti) {
log(false, 'O0: не найден multi-пользователь в MOCK_USERS');
} else {
log(!!tokenMulti, 'O0: выпущен токен multi (WZ01325, WZ02001)');
log(!!tokenMulti, 'O0: выпущен токен multi (WZ88888, WZ77777)');
// O1: GET /entries без ?client_id= → видит записи первой компании (WZ01325)
// O1: GET /entries без ?client_id= → видит записи первой компании (WZ88888)
// Сначала добавим запись в обе компании для проверки
let multiEntry1, multiEntry2;
// O1a: создаём запись в первой компании (WZ01325) через multi-токен
// O1a: создаём запись в первой компании (WZ88888) через multi-токен
{
const r = await req.post('/api/v1/entries').set(bearer(tokenMulti))
.send({ value: '4.4.4.1', comment: 'multi-company-1' });
log(r.status === 201, 'O1a: multi POST → 201 (первая компания WZ01325)', `status=${r.status}`);
log(r.status === 201, 'O1a: multi POST → 201 (первая компания WZ88888)', `status=${r.status}`);
multiEntry1 = json(r).entry?.id;
}
// O1b: создаём запись во ВТОРОЙ компании (WZ02001) через ?client_id=
// O1b: создаём запись во ВТОРОЙ компании (WZ77777) через ?client_id=
{
const r = await req.post('/api/v1/entries?client_id=WZ02001').set(bearer(tokenMulti))
const r = await req.post('/api/v1/entries?client_id=WZ77777').set(bearer(tokenMulti))
.send({ value: '4.4.4.2', comment: 'multi-company-2' });
log(r.status === 201, 'O1b: multi POST ?client_id=WZ02001 → 201', `status=${r.status}`);
log(r.status === 201, 'O1b: multi POST ?client_id=WZ77777 → 201', `status=${r.status}`);
multiEntry2 = json(r).entry?.id;
}
// O2: GET без ?client_id= → только записи WZ01325 (не видит WZ02001)
// O2: GET без ?client_id= → только записи WZ88888 (не видит WZ77777)
{
const rDefault = await req.get('/api/v1/entries').set(bearer(tokenMulti));
const entries = json(rDefault).entries || [];
const hasE1 = entries.some(e => e.id === multiEntry1);
const hasE2 = entries.some(e => e.id === multiEntry2);
log(hasE1, 'O2a: GET default содержит запись WZ01325');
log(!hasE2, 'O2b: GET default НЕ содержит запись WZ02001');
log(hasE1, 'O2a: GET default содержит запись WZ88888');
log(!hasE2, 'O2b: GET default НЕ содержит запись WZ77777');
}
// O3: GET ?client_id=WZ02001 → только записи WZ02001
// O3: GET ?client_id=WZ77777 → только записи WZ77777
{
const rSwitched = await req.get('/api/v1/entries?client_id=WZ02001').set(bearer(tokenMulti));
const rSwitched = await req.get('/api/v1/entries?client_id=WZ77777').set(bearer(tokenMulti));
const entries = json(rSwitched).entries || [];
const hasE1 = entries.some(e => e.id === multiEntry1);
const hasE2 = entries.some(e => e.id === multiEntry2);
log(!hasE1, 'O3a: GET ?client_id=WZ02001 НЕ содержит запись WZ01325');
log(hasE2, 'O3b: GET ?client_id=WZ02001 содержит запись WZ02001');
log(!hasE1, 'O3a: GET ?client_id=WZ77777 НЕ содержит запись WZ88888');
log(hasE2, 'O3b: GET ?client_id=WZ77777 содержит запись WZ77777');
}
// O4: PATCH через ?client_id= работает изолированно
{
const r = await req.patch('/api/v1/entries/' + multiEntry2 + '?client_id=WZ02001')
const r = await req.patch('/api/v1/entries/' + multiEntry2 + '?client_id=WZ77777')
.set(bearer(tokenMulti))
.send({ value: '4.4.4.3', comment: 'patched-in-WZ02001' });
log(r.status === 200, 'O4: multi PATCH ?client_id=WZ02001 → 200', `status=${r.status}`);
.send({ value: '4.4.4.3', comment: 'patched-in-WZ77777' });
log(r.status === 200, 'O4: multi PATCH ?client_id=WZ77777 → 200', `status=${r.status}`);
}
// O5: DELETE через ?client_id=
{
const r = await req.delete('/api/v1/entries/' + multiEntry2 + '?client_id=WZ02001')
const r = await req.delete('/api/v1/entries/' + multiEntry2 + '?client_id=WZ77777')
.set(bearer(tokenMulti));
log([200, 204].includes(r.status), 'O5: multi DELETE ?client_id=WZ02001 → 200/204', `status=${r.status}`);
log([200, 204].includes(r.status), 'O5: multi DELETE ?client_id=WZ77777 → 200/204', `status=${r.status}`);
}
// O6: экспорт с ?client_id=WZ02001 не содержит запись WZ01325
// O6: экспорт с ?client_id=WZ77777 не содержит запись WZ88888
{
// Создаём запись в WZ02001 для проверки экспорта
const cr = await req.post('/api/v1/entries?client_id=WZ02001').set(bearer(tokenMulti))
// Создаём запись в WZ77777 для проверки экспорта
const cr = await req.post('/api/v1/entries?client_id=WZ77777').set(bearer(tokenMulti))
.send({ value: '4.4.5.1', comment: 'export-multi' });
const exportEntryId = json(cr).entry?.id;
const rWZ02 = await req.get('/api/v1/entries/export?client_id=WZ02001').set(bearer(tokenMulti));
log(rWZ02.status === 200, 'O6a: export ?client_id=WZ02001 → 200', `status=${rWZ02.status}`);
log(rWZ02.text.includes('4.4.5.1'), 'O6b: export содержит CIDR WZ02001');
log(!rWZ02.text.includes('4.4.4.1'), 'O6c: export НЕ содержит CIDR WZ01325');
const rWZ02 = await req.get('/api/v1/entries/export?client_id=WZ77777').set(bearer(tokenMulti));
log(rWZ02.status === 200, 'O6a: export ?client_id=WZ77777 → 200', `status=${rWZ02.status}`);
log(rWZ02.text.includes('4.4.5.1'), 'O6b: export содержит CIDR WZ77777');
log(!rWZ02.text.includes('4.4.4.1'), 'O6c: export НЕ содержит CIDR WZ88888');
// O6d: экспорт без ?client_id= → только WZ01325
// O6d: экспорт без ?client_id= → только WZ88888
const rDefault = await req.get('/api/v1/entries/export').set(bearer(tokenMulti));
log(rDefault.text.includes('4.4.4.1'), 'O6d: export default содержит WZ01325');
log(!rDefault.text.includes('4.4.5.1'), 'O6e: export default НЕ содержит WZ02001');
log(rDefault.text.includes('4.4.4.1'), 'O6d: export default содержит WZ88888');
log(!rDefault.text.includes('4.4.5.1'), 'O6e: export default НЕ содержит WZ77777');
// Чистка
if (exportEntryId) {
await req.delete('/api/v1/entries/' + exportEntryId + '?client_id=WZ02001').set(bearer(tokenMulti));
await req.delete('/api/v1/entries/' + exportEntryId + '?client_id=WZ77777').set(bearer(tokenMulti));
}
}
// O7: несуществующий ?client_id= → игнорируется, фоллбек на WZ01325 (безопасность)
// O7: несуществующий ?client_id= → игнорируется, фоллбек на WZ88888 (безопасность)
{
const r = await req.get('/api/v1/entries?client_id=NONEXISTENT').set(bearer(tokenMulti));
log(r.status === 200, 'O7: GET ?client_id=NONEXISTENT → 200 (игнор, фоллбек)', `status=${r.status}`);
// NONEXISTENT не в allClientIds → фоллбек на WZ01325 → записи ЕСТЬ
log(json(r).entries?.length > 0, 'O7b: фоллбек на WZ01325 — записи есть');
// NONEXISTENT не в allClientIds → фоллбек на WZ88888 → записи ЕСТЬ
log(json(r).entries?.length > 0, 'O7b: фоллбек на WZ88888 — записи есть');
}
// O8: admin передаёт ?client_id= → использует свою компанию (игнор)