v0.5.8: distinct MOCK_USERS (WZ88888=АЛЬФА, WZ77777=БЕТА)

This commit is contained in:
2026-06-02 11:36:53 +03:00
parent f1416e6566
commit b91b78ab04
5 changed files with 85 additions and 22 deletions
+61
View File
@@ -0,0 +1,61 @@
#!/bin/bash
# API-тесты: все комбинации (без UI)
# Запуск: bash docs/test-api.sh
BASE="https://white.nodejsk8s.dev.nubes.ru"
PASS=0
FAIL=0
green() { echo -e "\033[32m$1\033[0m"; }
red() { echo -e "\033[31m$1\033[0m"; }
check() { # check "описание" expected actual
if [ "$2" = "$3" ]; then
green "$1"
PASS=$((PASS+1))
else
red "$1 (ожидалось: $2, получено: $3)"
FAIL=$((FAIL+1))
fi
}
# ── Получить mock JWT для заданного clientId ───────────────────
get_token() {
local CLIENT_ID="$1"
# POST /dev-login для получения токена через API
# Возвращает access_token из ответа
local RESP=$(curl -s -c /tmp/jar-test.txt "$BASE/login" > /dev/null && \
curl -s -b /tmp/jar-test.txt -c /tmp/jar-test.txt \
-X POST "$BASE/login" \
-d "clientId=$CLIENT_ID" \
-D - 2>&1)
# Извлечь токен из редиректа (он в сессии, получаем через API)
# Используем /dev-login для прямого получения токена
local CSRF=$(curl -s -b /tmp/jar-test.txt "$BASE/dev-login" | grep -oP 'name="_csrf" value="\K[^"]+')
curl -s -b /tmp/jar-test.txt -c /tmp/jar-test.txt \
-X POST "$BASE/dev-login" \
-d "clientId=$CLIENT_ID&_csrf=$CSRF&email=test@test.local&companyName=TestCo" \
> /dev/null
# Получить api-токен через сессию
# Пробуем получить через /login page (там токен генерится в сессию)
# Возвращаем токен из cookie
echo "TODO"
}
echo "========================================="
echo " API Tests v0.5.4"
echo "========================================="
echo ""
# ── 1. Без токена → 401 ────────────────────────────────────────
echo "--- 1. No token → 401 ---"
CODE=$(curl -s -o /dev/null -w '%{http_code}' "$BASE/api/v1/entries")
check "GET /entries без токена" "401" "$CODE"
CODE=$(curl -s -o /dev/null -w '%{http_code}' -X POST "$BASE/api/v1/entries" -H 'Content-Type: application/json' -d '{"value":"1.1.1.1/32"}')
check "POST /entries без токена" "401" "$CODE"
echo ""
echo "========================================="
echo " Результат: $PASS/$((PASS+FAIL))"
echo "========================================="
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "ipwhitelist",
"version": "0.5.7",
"version": "0.5.8",
"description": "IP WhiteList microservice for cloud provider",
"main": "server.js",
"scripts": {
+18 -16
View File
@@ -17,7 +17,7 @@
const MOCK_USERS = [
{
id: 'admin',
label: 'Администратор (WZ01112)',
label: 'АДМИН (WZ01112)',
role: 'admin',
isAdmin: true,
clientId: 'WZ01112',
@@ -26,33 +26,35 @@ const MOCK_USERS = [
email: 'admin@nubes.ru',
},
{
id: 'test',
label: 'Тест (WZ01325)',
id: 'alfa',
label: 'АЛЬФА (WZ88888)',
role: 'user',
isAdmin: false,
clientId: 'WZ01325',
companyId: '3e64aac6-dcfc-4082-88dc-da19c86555a5',
companyName: 'Компания Тест',
email: 'tazet@narod.ru',
clientId: 'WZ88888',
companyId: '11111111-aaaa-aaaa-aaaa-111111111111',
companyName: 'АЛЬФА',
email: 'alfa@example.com',
},
{
id: 'multi',
label: 'Мульти (WZ01325 + WZ02001)',
label: 'АЛЬФА+БЕТА (WZ88888, WZ77777)',
role: 'user',
isAdmin: false,
clientId: 'WZ01325, WZ02001',
companyId: '3e64aac6-dcfc-4082-88dc-da19c86555a5',
companyName: 'Мульти-компания',
clientId: 'WZ88888, WZ77777',
companyId: '11111111-aaaa-aaaa-aaaa-111111111111',
companyName: 'АЛЬФА+БЕТА',
email: 'multi@example.com',
},
{
id: 'client2',
label: 'Вторая (WZ02001)',
id: 'beta',
label: 'БЕТА (WZ77777)',
role: 'user',
isAdmin: false,
clientId: 'WZ02001',
companyId: '11111111-2222-3333-4444-555555555555',
companyName: 'Вторая компания',
clientId: 'WZ77777',
companyId: '22222222-bbbb-bbbb-bbbb-222222222222',
companyName: 'БЕТА',
email: 'beta@example.com',
},
email: 'user2@example.com',
},
];
+4 -4
View File
@@ -146,8 +146,8 @@ async function cleanup() {
// ── Токены для трёх пользователей ───────────────────────────────────────────
const { MOCK_USERS } = require('../src/config');
const uAdmin = MOCK_USERS.find(u => u.id === 'admin');
const uUser = MOCK_USERS.find(u => u.id === 'test');
const uUser2 = MOCK_USERS.find(u => u.id === 'client2');
const uUser = MOCK_USERS.find(u => u.id === 'alfa');
const uUser2 = MOCK_USERS.find(u => u.id === 'beta');
const tokenAdmin = auth.issueMockToken({ clientId: uAdmin.clientId, companyId: uAdmin.companyId, companyName: uAdmin.companyName, email: uAdmin.email });
const tokenUser = auth.issueMockToken({ clientId: uUser.clientId, companyId: uUser.companyId, companyName: uUser.companyName, email: uUser.email });
@@ -983,7 +983,7 @@ async function cleanup() {
// O8: admin передаёт ?client_id= → использует свою компанию (игнор)
{
const r = await req.get('/api/v1/entries?client_id=WZ02001').set(bearer(tokenAdmin));
const r = await req.get('/api/v1/entries?client_id=WZ77777').set(bearer(tokenAdmin));
log(r.status === 200, 'O8: admin GET ?client_id= → 200 (игнорирует)', `status=${r.status}`);
}
@@ -992,7 +992,7 @@ async function cleanup() {
await req.delete('/api/v1/entries/' + multiEntry1).set(bearer(tokenMulti));
}
if (multiEntry2) {
await req.delete('/api/v1/entries/' + multiEntry2 + '?client_id=WZ02001').set(bearer(tokenMulti));
await req.delete('/api/v1/entries/' + multiEntry2 + '?client_id=WZ77777').set(bearer(tokenMulti));
}
}
+1 -1
View File
@@ -59,7 +59,7 @@ function cidr(ip) { return ip.includes('/') ? ip : ip + '/32'; }
const { MOCK_USERS } = require('../src/config');
const admin = MOCK_USERS.find(u => u.id === 'admin');
const user = MOCK_USERS.find(u => u.id === 'test');
const user = MOCK_USERS.find(u => u.id === 'alfa');
const tokAdmin = auth.issueMockToken({ clientId: admin.clientId, companyId: admin.companyId, companyName: admin.companyName, email: admin.email });
const tokUser = auth.issueMockToken({ clientId: user.clientId, companyId: user.companyId, companyName: user.companyName, email: user.email });