Ten dokument opisuje kompletne scenariusze testowania systemu OPA Zero Poll, od tworzenia tenantów przez zarządzanie użytkownikami do autoryzacji OPA. Każdy scenariusz zawiera komendy CURL, oczekiwane logi i procedury diagnostyczne.
Upewnij się, że wszystkie usługi są uruchomione:
docker-compose up -d
docker-compose ps # Sprawdź czy wszystkie usługi są zdroweWywołanie API:
curl -X POST http://localhost:8010/api/tenants \
-H "Content-Type: application/json" \
-d '{
"name": "FirmaTestowa",
"admin_user": {
"username": "admin.firma@testowa.pl",
"email": "admin.firma@testowa.pl",
"full_name": "Admin Firmowy"
}
}'Oczekiwana odpowiedź:
{
"message": "Tenant created successfully",
"tenant_id": "tenant_1750173XXX",
"admin_user_id": "admin_tenant_1750173XXX"
}Monitorowanie logów:
# Logi Provisioning API
docker logs provisioning-api-new -f
# Oczekiwane wpisy:
# [INFO] Creating tenant: FirmaTestowa
# [INFO] Creating admin user for tenant: tenant_1750173XXX
# [INFO] User created with ID: admin_tenant_1750173XXX
# [INFO] Tenant created successfully: tenant_1750173XXXWywołanie API:
curl -X GET "http://localhost:8010/api/tenants" | jqOczekiwana odpowiedź:
{
"tenants": [
{
"id": "tenant_1750173XXX",
"name": "FirmaTestowa",
"created_at": "2025-01-17T...",
"status": "active"
}
]
}Wywołanie API:
curl -X POST "http://localhost:8010/api/tenants/tenant_1750173XXX/provision" \
-H "Content-Type: application/json"Oczekiwana odpowiedź:
{
"message": "Provisioning initiated for tenant tenant_1750173XXX",
"status": "in_progress"
}Monitorowanie logów:
# Logi Provisioning API
docker logs provisioning-api-new -f
# Oczekiwane wpisy:
# [INFO] Starting provisioning for tenant: tenant_1750173XXX
# [INFO] Fetching ACL data for tenant: tenant_1750173XXX
# [INFO] Sending OPAL notification for tenant: tenant_1750173XXX
# [SUCCESS] Provisioning completed for tenant: tenant_1750173XXXMonitorowanie logów:
# Logi OPAL Server
docker logs opal-server -f
# Oczekiwane wpisy:
# [DEBUG] Received data update notification
# [INFO] Processing tenant data: tenant_1750173XXX
# [DEBUG] Broadcasting update to clientsMonitorowanie logów:
# Logi OPAL Client
docker logs opal-client -f
# Oczekiwane wpisy:
# [DEBUG] Received data update from server
# [INFO] Updating OPA with new tenant data: tenant_1750173XXX
# [SUCCESS] Data sync completed for tenant: tenant_1750173XXXWywołanie API:
curl -s "http://localhost:8181/v1/data/acl/tenant_1750173XXX" | jqOczekiwana odpowiedź:
{
"result": {
"access": {
"admin_tenant_1750173XXX": {
"tenant_1750173XXX": ["Administrator"]
}
},
"roles": {
"admin_tenant_1750173XXX": {}
}
}
}Wywołanie API:
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "admin_tenant_1750173XXX",
"tenant": "tenant_1750173XXX",
"action": "view_invoices_purchase"
}
}' | jqOczekiwana odpowiedź:
{
"result": true
}Wywołanie API:
curl -X POST http://localhost:8110/api/users \
-H "Content-Type: application/json" \
-d '{
"username": "jan.kowalski@testowa.pl",
"email": "jan.kowalski@testowa.pl",
"full_name": "Jan Kowalski",
"tenant_id": "tenant_1750173XXX"
}'Oczekiwana odpowiedź:
{
"message": "User created successfully",
"user": {
"id": "user_1750174XXX",
"username": "jan.kowalski@testowa.pl",
"email": "jan.kowalski@testowa.pl",
"full_name": "Jan Kowalski",
"tenant_id": "tenant_1750173XXX",
"status": "active"
}
}Monitorowanie logów:
# Logi Data Provider API
docker logs data-provider-api -f
# Oczekiwane wpisy:
# [INFO] Creating user: jan.kowalski@testowa.pl
# [DEBUG] User created successfully with ID: user_1750174XXX
# [INFO] Publishing user_create event for user: user_1750174XXX
# [INFO] Publishing translated_permission_event for user: user_1750174XXX
# [DEBUG] Notification sent to OPAL ServerWywołanie API:
curl -X POST "http://localhost:8110/api/users/user_1750174XXX/roles" \
-H "Content-Type: application/json" \
-d '{
"role_name": "Handlowiec",
"tenant_id": "tenant_1750173XXX"
}'Oczekiwana odpowiedź:
{
"message": "Role assigned successfully",
"user_id": "user_1750174XXX",
"role_name": "Handlowiec",
"tenant_id": "tenant_1750173XXX"
}Monitorowanie logów:
# Logi Data Provider API
docker logs data-provider-api -f
# Oczekiwane wpisy:
# [INFO] Assigning role Handlowiec to user user_1750174XXX in tenant tenant_1750173XXX
# [DEBUG] Role assignment successful
# [INFO] Publishing role_assign event
# [INFO] Publishing translated_permission_event for role assignment
# [DEBUG] Notification sent to OPAL ServerMonitorowanie logów:
# Logi OPAL Server
docker logs opal-server -f
# Oczekiwane wpisy:
# [DEBUG] Received permission event: user_create
# [DEBUG] Received permission event: translated_permission_event
# [INFO] Broadcasting data updates to clients
# Logi OPAL Client
docker logs opal-client -f
# Oczekiwane wpisy:
# [DEBUG] Processing data update for tenant: tenant_1750173XXX
# [INFO] Updating OPA data store
# [SUCCESS] Data synchronization completedWywołanie API:
curl -s "http://localhost:8181/v1/data/acl/tenant_1750173XXX" | jqOczekiwana odpowiedź:
{
"result": {
"access": {
"admin_tenant_1750173XXX": {
"tenant_1750173XXX": ["Administrator"]
},
"user_1750174XXX": {
"tenant_1750173XXX": ["Handlowiec"]
}
},
"roles": {
"admin_tenant_1750173XXX": {},
"user_1750174XXX": {}
}
}
}Wywołanie API:
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "user_1750174XXX",
"tenant": "tenant_1750173XXX",
"action": "create_invoices_sale"
}
}' | jqOczekiwana odpowiedź:
{
"result": true
}Wywołanie API:
curl -X DELETE "http://localhost:8110/api/users/user_1750174XXX/roles" \
-H "Content-Type: application/json" \
-d '{
"role_name": "Handlowiec",
"tenant_id": "tenant_1750173XXX"
}'Oczekiwana odpowiedź:
{
"message": "Role removed successfully",
"user_id": "user_1750174XXX",
"role_name": "Handlowiec",
"tenant_id": "tenant_1750173XXX"
}Wywołanie API:
curl -X POST "http://localhost:8110/api/users/user_1750174XXX/roles" \
-H "Content-Type: application/json" \
-d '{
"role_name": "Ksiegowa",
"tenant_id": "tenant_1750173XXX"
}'Oczekiwana odpowiedź:
{
"message": "Role assigned successfully",
"user_id": "user_1750174XXX",
"role_name": "Ksiegowa",
"tenant_id": "tenant_1750173XXX"
}Monitorowanie logów:
# Logi Data Provider API
docker logs data-provider-api -f
# Oczekiwane wpisy:
# [INFO] Removing role Handlowiec from user user_1750174XXX
# [INFO] Publishing role_remove event
# [INFO] Publishing translated_permission_event for role removal
# [INFO] Assigning role Ksiegowa to user user_1750174XXX
# [INFO] Publishing role_assign event
# [INFO] Publishing translated_permission_event for role assignmentWywołanie API:
curl -s "http://localhost:8181/v1/data/acl/tenant_1750173XXX" | jqOczekiwana odpowiedź:
{
"result": {
"access": {
"admin_tenant_1750173XXX": {
"tenant_1750173XXX": ["Administrator"]
},
"user_1750174XXX": {
"tenant_1750173XXX": ["Ksiegowa"]
}
},
"roles": {
"admin_tenant_1750173XXX": {},
"user_1750174XXX": {}
}
}
}Poprzednie uprawnienie (powinno teraz być odrzucone):
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "user_1750174XXX",
"tenant": "tenant_1750173XXX",
"action": "create_invoices_sale"
}
}' | jqOczekiwana odpowiedź:
{
"result": false
}Nowe uprawnienie (powinno zostać zaakceptowane):
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "user_1750174XXX",
"tenant": "tenant_1750173XXX",
"action": "view_reports_financial"
}
}' | jqOczekiwana odpowiedź:
{
"result": true
}# Status wszystkich usług
docker-compose ps
# Health check poszczególnych usług
curl -f http://localhost:8010/health # Provisioning API
curl -f http://localhost:8110/health # Data Provider API
curl -f http://localhost:8181/health # OPA
curl -f http://localhost:7002/healthcheck # OPAL Server# Logi wszystkich usług
docker-compose logs -f
# Logi konkretnych usług
docker logs provisioning-api-new -f
docker logs data-provider-api -f
docker logs opal-server -f
docker logs opal-client -f
docker logs opa-standalone-new -fcurl -s "http://localhost:7001/healthcheck" | jqOczekiwana odpowiedź:
{
"policy_updater": true,
"data_updater": true,
"policy": true,
"data": true
}# Sprawdź wszystkie dane tenantów w OPA
curl -s "http://localhost:8181/v1/data/acl" | jq
# Sprawdź konkretny tenant
curl -s "http://localhost:8181/v1/data/acl/[TENANT_ID]" | jq
# Sprawdź statystyki OPAL Server
curl -s "http://localhost:7002/stats" | jq# Sprawdź logi OPAL Client
docker logs opal-client -f
# Restartuj OPAL Client
docker restart opal-client
# Zweryfikuj połączenie z Redis
docker exec -it redis-broadcast redis-cli ping# Sprawdź źródła danych OPAL Server
curl -s "http://localhost:7002/data/config" | jq
# Manualne odświeżenie danych
curl -X POST "http://localhost:7002/data/config/update"
# Sprawdź łączność z Data Provider API
curl -s "http://localhost:8110/data/config" | jq# Sprawdź ładowanie polityk
curl -s "http://localhost:8181/v1/policies" | jq
# Testuj ocenę polityk z debugiem
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "[USER_ID]",
"tenant": "[TENANT_ID]",
"action": "[ACTION]"
}
}' | jq
# Sprawdź logi decyzji OPA
docker logs opa-standalone-new | grep -i decision# Zmierz czas odpowiedzi API
time curl -X POST http://localhost:8110/api/users \
-H "Content-Type: application/json" \
-d '{"username":"test","email":"test@test.com","full_name":"Test","tenant_id":"tenant1"}'
# Zmierz czas odpowiedzi autoryzacji
time curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{"input":{"user":"user_id","tenant":"tenant_id","action":"view_invoices"}}'# Prosty test obciążenia dla tworzenia użytkowników
for i in {1..10}; do
curl -X POST http://localhost:8110/api/users \
-H "Content-Type: application/json" \
-d "{\"username\":\"user$i@test.com\",\"email\":\"user$i@test.com\",\"full_name\":\"User $i\",\"tenant_id\":\"tenant1\"}" &
done
wait- Tworzenie Tenanta: 1-2 sekundy
- Tworzenie Użytkownika: 0.5-1 sekunda
- Przypisanie Roli: 0.5-1 sekunda
- Propagacja OPAL: 2-5 sekund
- Synchronizacja Danych OPA: 1-3 sekundy
- Zapytanie Autoryzacyjne: <100ms
Cel: Weryfikacja poprawnego wyświetlania kontekstu autoryzacji dla użytkownika z tenant_mikro_dzialal
Kroki:
- Otwórz przeglądarkę i przejdź do
http://localhost:3000 - Kliknij na aplikację "Symfonia KSEF"
- Zaloguj się jako
admin_tenant_mikro_dzialal(Jan Kowalski)
Oczekiwany rezultat:
Kontekst autoryzacji:
Użytkownik: admin_tenant_mikro_dzialal
Tenant: tenant_mikro_dzialal
Wybrana firma: company_tenant_mikro_dzialal (Consulting Services Jan Kowalski)
Uprawnienia: Zakup: true, Sprzedaż: true
Weryfikacja Backend (curl):
# Test autoryzacji faktury sprzedaży
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "admin_tenant_mikro_dzialal",
"tenant": "tenant_mikro_dzialal",
"action": "view_invoices_sales",
"company_id": "company_tenant_mikro_dzialal"
}
}' | jqOczekiwana odpowiedź OPA:
{
"result": true
}Monitorowanie logów Frontend:
# Sprawdź logi Next.js (console w przeglądarce)
# Oczekiwane wpisy:
# [KSEF] Używam tenant z danych użytkownika: tenant_mikro_dzialal
# [KSEF] Sprawdzanie uprawnień dla użytkownika: admin_tenant_mikro_dzialal
# [KSEF] Dostęp do faktur zakupu: true
# [KSEF] Dostęp do faktur sprzedaży: trueCel: Weryfikacja że zakładki faktury działają z poprawną autoryzacją po naprawie hardkodowanego tenanta
Kroki:
- W aplikacji KSEF kliknij na "Faktury sprzedaży"
- Sprawdź czy zawartość się ładuje (bez komunikatu "Brak dostępu")
- Kliknij na "Faktury zakupu"
- Sprawdź czy zawartość się ładuje (bez komunikatu "Brak dostępu")
Oczekiwany rezultat - Faktury sprzedaży:
🎯 Faktury sprzedażowe
Faktury sprzedażowe z integracją OPA
Użytkownik: admin_tenant_mikro_dzialal | Tenant: tenant_mikro_dzialal | Firma: company_tenant_mikro_dzialal
Oczekiwany rezultat - Faktury zakupu:
🛒 Faktury zakupowe
Faktury zakupowe z integracją OPA
Użytkownik: admin_tenant_mikro_dzialal | Tenant: tenant_mikro_dzialal | Firma: company_tenant_mikro_dzialal
Weryfikacja Backend przez Frontend API:
# Sprawdź logi API calls w konsoli przeglądarki
# Oczekiwane zapytania:
# POST /api/opa - view_invoices_sales → result: true
# POST /api/opa - view_invoices_purchase → result: trueMonitorowanie logów komponentów:
# Sprawdź logi w konsoli przeglądarki (F12)
# Oczekiwane wpisy:
# [SalesInvoicesTab] Sprawdzanie uprawnień dla userId: admin_tenant_mikro_dzialal, tenantId: tenant_mikro_dzialal, companyId: company_tenant_mikro_dzialal
# [SalesInvoicesTab] Dostęp do faktur sprzedaży: true
# [PurchaseInvoicesTab] Sprawdzanie uprawnień dla userId: admin_tenant_mikro_dzialal, tenantId: tenant_mikro_dzialal, companyId: company_tenant_mikro_dzialal
# [PurchaseInvoicesTab] Dostęp do faktur zakupu: trueCel: Weryfikacja autoryzacji przez zespół (user700 - Joanna Wiśniewska z zespołu "KSEF Północ")
Przygotowanie danych:
# Sprawdź synchronizację danych team_roles w OPA
curl -s "http://localhost:8181/v1/data/acl/tenant125" | jq '.result.team_roles'Weryfikacja Backend:
# Test autoryzacji ReBAC przez zespół
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "user700",
"tenant": "tenant125",
"action": "view_invoices_sales",
"company_id": "company1"
}
}' | jq
# Test uprawnień zakupu przez zespół
curl -X POST http://localhost:8181/v1/data/ksef/allow \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "user700",
"tenant": "tenant125",
"action": "view_invoices_purchase",
"company_id": "company1"
}
}' | jqOczekiwane odpowiedzi:
{
"result": true
}Diagnostyka zespołów:
# Sprawdź role zespołów w OPA
curl -X POST http://localhost:8181/v1/data/ksef/user_team_ksef_roles \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "user700",
"tenant": "tenant125"
}
}' | jqOczekiwana odpowiedź diagnostyczna:
{
"result": [
"Administrator",
"Księgowa"
]
}Cel: Weryfikacja że Data Provider API poprawnie eksportuje tabele team_roles
Sprawdzenie eksportu team_roles:
curl -s "http://localhost:8110/tenants/tenant125/acl" | jq '.team_roles'Oczekiwana odpowiedź:
[
{
"team_id": "3da9df20-e348-42cb-a8e7-203a62317459",
"role_id": "7561c884-5e29-4d07-914f-2f855775bd8a",
"team_name": "KSEF Północ",
"role_name": "Administrator",
"role_description": "Administrator with full access to all KSEF functions"
},
{
"team_id": "3da9df20-e348-42cb-a8e7-203a62317459",
"role_id": "5a89fa9f-614d-43df-9715-03b399fcd075",
"team_name": "KSEF Północ",
"role_name": "Księgowa",
"role_description": "Accountant with access to purchase invoices"
}
]Weryfikacja synchronizacji OPAL:
# Sprawdź że OPAL Client odebrał team_roles
curl -s "http://localhost:8181/v1/data/acl/tenant125/team_roles" | jqMonitorowanie logów synchronizacji:
# Logi OPAL Server
docker logs opal-server | grep "team_roles"
# Logi OPAL Client
docker logs opal-client | grep "team_roles"
# Oczekiwane wpisy:
# [DEBUG] Updating OPA with team_roles data
# [SUCCESS] team_roles data synchronizedTest przed naprawą vs po naprawie:
# Sprawdź czy endpoint /tenants/{tenant_id}/acl zawiera team_roles
curl -s "http://localhost:8110/tenants/tenant125/acl" | jq 'keys | sort'Oczekiwana lista kluczy (po naprawie):
[
"applications",
"companies",
"permissions",
"role_permissions",
"roles",
"team_companies",
"team_memberships",
"team_roles",
"teams",
"user_companies",
"users"
]# Uruchom frontend w trybie development
cd /path/to/project && npm run dev
# Sprawdź logi w terminalu Next.js
# Oczekiwane wpisy:
# ✓ Ready in 2.1s
# ○ Compiling /ksef/page.tsx...
# ✓ Compiled /ksef/page.tsx in XXXms- Otwórz Developer Tools (F12)
- Przejdź do zakładki Console
- Odśwież stronę KSEF
- Sprawdź logi autoryzacji:
// Oczekiwane logi w konsoli:
[KSEF] useEffect uruchomiony - sprawdzanie uprawnień...
[KSEF] Sprawdzanie uprawnień dla użytkownika: admin_tenant_mikro_dzialal
[KSEF] Tenant: tenant_mikro_dzialal
[KSEF] Kontekst firmy: company_tenant_mikro_dzialal
[KSEF] Dostęp do faktur zakupu: true
[KSEF] Dostęp do faktur sprzedaży: true// W konsoli przeglądarki:
console.log('currentUser:', localStorage.getItem('currentUser'));
console.log('currentUserId:', localStorage.getItem('currentUserId'));
console.log('selectedCompany:', localStorage.getItem('selectedCompany'));
// Oczekiwane wartości:
// currentUser: {"id":"admin_tenant_mikro_dzialal","tenant_id":"tenant_mikro_dzialal",...}
// currentUserId: "admin_tenant_mikro_dzialal"
// selectedCompany: {"company_id":"company_tenant_mikro_dzialal",...}# Test przez frontend API proxy
curl -X POST http://localhost:3000/api/opa \
-H "Content-Type: application/json" \
-d '{
"input": {
"user": "admin_tenant_mikro_dzialal",
"tenant": "tenant_mikro_dzialal",
"action": "view_invoices_sales",
"company_id": "company_tenant_mikro_dzialal"
}
}' | jqOczekiwana odpowiedź:
{
"result": true
}// Sprawdź w kodzie czy nie ma hardkodowanych wartości:
// ❌ Źle: const tenantId = 'tenant125'
// ✅ Dobrze: const tenantId = authContext.tenant || 'defaultTenant'// Sprawdź czy komponenty otrzymują props:
// ✅ Dobrze: <SalesInvoicesTab userId={userId} tenantId={tenantId} companyId={companyId} />
// ❌ Źle: <SalesInvoicesTab /># Sprawdź czy OPA ma najnowsze polityki
curl -s "http://localhost:8181/v1/policies" | jq 'keys'
# Sprawdź czy OPAL Client działa
curl -s "http://localhost:7001/healthcheck" | jq
# Wymuś synchronizację polityk
docker restart opal-clientTa dokumentacja zapewnia kompletne scenariusze testowania end-to-end z możliwościami diagnostycznymi dla systemu OPA Zero Poll. Każdy scenariusz może być wykonany niezależnie i zawiera kompleksowe procedury logowania oraz rozwiązywania problemów.