From b91b78ab0459cb2e31e2b0cded4964a9a3cdf4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Tue, 2 Jun 2026 11:36:53 +0300 Subject: [PATCH] =?UTF-8?q?v0.5.8:=20distinct=20MOCK=5FUSERS=20(WZ88888=3D?= =?UTF-8?q?=D0=90=D0=9B=D0=AC=D0=A4=D0=90,=20WZ77777=3D=D0=91=D0=95=D0=A2?= =?UTF-8?q?=D0=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/test-api.sh | 61 ++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- src/config.js | 34 ++++++++++++----------- tests/api.js | 8 +++--- tests/tz-compliance.js | 2 +- 5 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 docs/test-api.sh diff --git a/docs/test-api.sh b/docs/test-api.sh new file mode 100644 index 0000000..51847df --- /dev/null +++ b/docs/test-api.sh @@ -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 "=========================================" diff --git a/package.json b/package.json index 4bd15e0..51ab835 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/src/config.js b/src/config.js index 73d1336..558a5df 100644 --- a/src/config.js +++ b/src/config.js @@ -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', }, ]; diff --git a/tests/api.js b/tests/api.js index 0ed8a30..63abb38 100644 --- a/tests/api.js +++ b/tests/api.js @@ -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)); } } diff --git a/tests/tz-compliance.js b/tests/tz-compliance.js index e611e08..4b09ac9 100644 --- a/tests/tz-compliance.js +++ b/tests/tz-compliance.js @@ -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 });