dal-license-server/TESTING.md
djuka 1b8db5e4a7 Obimni testovi: 179 ukupno (46 Go + 133 Playwright)
Novi Go testovi:
- config_test.go: 9 testova (defaults, override, DSN, .env loading)
- helpers_test.go: 13 testova (writeJSON, writeError, clientIP)

Prosireni E2E testovi za svaku stranicu:
- login: 15 testova (forma, auth, redirect, sesije)
- dashboard: 18 testova (statistike, navbar, navigacija, odjava)
- licenses: 20 testova (tabela, filteri, pretraga, kombinacije)
- license-crud: 22 testa (forma, validacija, svi proizvodi/tipovi)
- license-detail: 26 testova (info, aktivacije, audit, revoke, release)
- audit: 14 testova (tabela, API zapisi, formati)
- api-client: 18 testova (activate flow, auth, revoke flow)

Azuriran TESTING.md sa kompletnom checklistom

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 07:58:24 +00:00

259 lines
8.1 KiB
Markdown

# DAL License Server — Test Checklista
## Ukupno testova: 179
- Go unit testovi: 46
- Playwright E2E testovi: 133
## Pokretanje testova
```bash
# Go unit testovi
go test ./internal/... -v -count=1
# Playwright E2E testovi (server mora biti pokrenut na :8090)
npx playwright test
# Sve zajedno
go test ./internal/... -v -count=1 && npx playwright test
```
---
## Go Unit Testovi (46)
### Config (9 testova)
- [x] Podrazumevane vrednosti (port, env, db, rsa, rate limit)
- [x] Override iz env varijabli
- [x] DSN format (parseTime, charset, multiStatements)
- [x] DSN sa specijalnim karakterima
- [x] Ucitavanje .env fajla
- [x] Postojece env varijable se ne prepisuju iz .env
- [x] Komentari u .env se preskacu
- [x] Prazne linije u .env se preskacu
- [x] Nepostojeci .env fajl ne izaziva gresku
### Keygen (4 testa)
- [x] Format kljuca: {PREFIX}-XXXX-XXXX-XXXX-XXXX
- [x] Samo dozvoljeni karakteri (A-H, J-N, P-Y, 2-9)
- [x] Nema konfuznih karaktera (O, 0, I, 1, L, Z)
- [x] Jedinstvenost 100 generisanih kljuceva
### Crypto Service (7 testova)
- [x] Kreiranje servisa sa validnim kljucem
- [x] Greska za nepostojeci fajl
- [x] Greska za nevalidan PEM
- [x] Potpis format (RSA-SHA256:base64...)
- [x] Verifikacija potpisa sa public key-em
- [x] Tampered data ne prolazi verifikaciju
- [x] Generisanje public key PEM-a
### Model — License (13 testova)
- [x] IsExpired: PERPETUAL (nikad ne istice)
- [x] IsExpired: aktivna licenca
- [x] IsExpired: istekla licenca
- [x] IsInGrace: nije istekla → false
- [x] IsInGrace: istekla pre 5 dana, grace 30 → true
- [x] IsInGrace: istekla pre 35 dana, grace 30 → false
- [x] IsInGrace: PERPETUAL → false
- [x] IsGraceExpired: istekao grace
- [x] IsGraceExpired: PERPETUAL → false
- [x] MaskedKey: LT, ESIR, ARV prefiksi
- [x] StatusText: revoked, inactive, active, trial, grace, expired
- [x] StatusClass: status-active, status-revoked
- [x] ExpiresAtFormatted: datum format i Neograniceno
### Handler Helpers (13 testova)
- [x] writeJSON: status 200, Content-Type, body
- [x] writeJSON: status 201
- [x] writeJSON: nil data
- [x] writeJSON: prazan slice []
- [x] writeError: 400 sa kodom i porukom
- [x] writeError: 401 Unauthorized
- [x] writeError: 500 Internal Server Error
- [x] writeLicenseError: LicenseError → 400
- [x] writeLicenseError: genericka greska → 500
- [x] clientIP: RemoteAddr
- [x] clientIP: X-Forwarded-For
- [x] clientIP: X-Real-IP
- [x] clientIP: X-Forwarded-For prioritet
### Middleware Auth (3 testa)
- [x] Validan API kljuc → 200
- [x] Bez kljuca → 401
- [x] Pogresan kljuc → 401
### Middleware Rate Limit (4 testa)
- [x] Dozvoljeni zahtevi prolaze (do limita)
- [x] Zahtev preko limita → blokiran
- [x] Razliciti IP-ovi imaju odvojene limite
- [x] X-Forwarded-For se koristi za identifikaciju
---
## Playwright E2E Testovi (133)
### Login stranica (15 testova)
- [x] Prikazuje login formu sa svim elementima
- [x] Password polje ima autofocus
- [x] Forma ima ispravnu action i method
- [x] Prijava sa ispravnom lozinkom preusmerava na dashboard
- [x] Prijava sa pogresnom lozinkom prikazuje gresku
- [x] Prijava sa praznom lozinkom (browser validacija)
- [x] Razlicite pogresne lozinke (7 pokusaja)
- [x] Pristup /dashboard bez logina → redirect
- [x] Pristup /licenses bez logina → redirect
- [x] Pristup /licenses/new bez logina → redirect
- [x] Pristup /audit bez logina → redirect
- [x] Pristup /licenses/1 bez logina → redirect
- [x] CSS je ucitan
- [x] Ispravan page title
- [x] Visestruki logini kreiraju razlicite sesije
### Dashboard stranica (18 testova)
- [x] Prikazuje naslov Dashboard
- [x] 3 statisticke kartice (ESIR, ARV, LIGHT_TICKET)
- [x] Svaka kartica prikazuje ime proizvoda
- [x] Svaka kartica prikazuje sve metrike (5 redova)
- [x] Sekcija poslednje aktivnosti
- [x] Tabela aktivnosti ima ispravne kolone
- [x] Navbar prikazuje brend
- [x] Navbar dashboard link je aktivan
- [x] Navbar ima link na licence
- [x] Navbar ima link na audit log
- [x] Navbar ima dugme za odjavu
- [x] Odjava preusmerava na login
- [x] Posle odjave ne moze na dashboard
- [x] Root (/) preusmerava na dashboard
- [x] Navigacija na licence
- [x] Navigacija na audit
- [x] Ispravan page title
- [x] htmx je ucitan
### Lista licenci — stranica (20 testova)
- [x] Prikazuje naslov Licence
- [x] Ispravan page title
- [x] Tabela sa 7 ispravnih kolona
- [x] Dugme za novu licencu (btn-primary)
- [x] Dugme vodi na formu
- [x] Filter dropdown za proizvod (4 opcije)
- [x] Filter dropdown za status (5 opcija)
- [x] Pretraga polje sa placeholder-om
- [x] Filtriraj dugme
- [x] Filter po ESIR proizvodu
- [x] Filter po ARV proizvodu
- [x] Filter po LIGHT_TICKET proizvodu
- [x] Filter po statusu active
- [x] Filter po statusu expired
- [x] Filter po statusu revoked
- [x] Pretraga po firmi
- [x] Kombinacija filtera (proizvod + status)
- [x] Filter cuva selekciju posle submit-a
- [x] Navbar licence link je aktivan
- [x] Poruka kad nema licenci
### Kreiranje licence — forma (14 testova)
- [x] Naslov Nova licenca
- [x] Ispravan page title
- [x] Sva polja forme prikazana
- [x] customer_name je obavezan (required)
- [x] product_id je obavezan (required)
- [x] license_type je obavezan (required)
- [x] Dropdown ima min 3 proizvoda
- [x] Dropdown ima sve tipove licenci
- [x] grace_days default je 30
- [x] limits placeholder
- [x] email polje ima type email
- [x] Otkazi dugme vodi na listu
- [x] Forma ima POST method
- [x] Kreiraj licencu dugme (btn-primary)
### Kreiranje licence — svi proizvodi (8 testova)
- [x] LIGHT_TICKET MONTHLY sa svim poljima + format kljuca
- [x] LIGHT_TICKET PERPETUAL (Neograniceno)
- [x] ARV ANNUAL
- [x] ARV TRIAL
- [x] ESIR PERPETUAL
- [x] ESIR MONTHLY
- [x] Kreirana licenca se pojavljuje u listi
- [x] Kreirana licenca ima status Aktivna
### Detalji licence — informacije (8 testova)
- [x] Licencni kljuc u naslovu
- [x] Status badge
- [x] Sekcija Informacije
- [x] Sva informaciona polja (8 polja)
- [x] Ispravni podaci za LT licencu
- [x] Ispravni podaci za ARV licencu
- [x] PERPETUAL prikazuje Neograniceno
- [x] Ispravan title sa kljucem
### Detalji licence — aktivacije i audit (6 testova)
- [x] Tabela aktivacija
- [x] Nova licenca nema aktivacija
- [x] Tabela aktivacija ima ispravne kolone
- [x] Audit log za licencu
- [x] CREATE audit zapis
- [x] Audit tabela ima ispravne kolone
### Detalji licence — akcije (10 testova)
- [x] Sekcija Akcije
- [x] Dugme za opoziv (btn-danger)
- [x] Dugme za force release (btn-warning)
- [x] Polje za razlog opoziva
- [x] Revoke menja status na Opozvana
- [x] Revoke generise REVOKE audit zapis
- [x] Posle revoke-a dugme za opoziv nestaje
- [x] Posle revoke-a force release ostaje
- [x] Force release funkcionise
- [x] Force release generise FORCE_RELEASE audit zapis
### Detalji licence — navigacija (2 testa)
- [x] Klik iz liste otvara detalje
- [x] Navbar licence link aktivan
### Audit Log stranica (11 testova)
- [x] Naslov Audit Log
- [x] Ispravan page title
- [x] Tabela prikazana
- [x] 5 kolona (Vreme, Akcija, Licenca, IP, Detalji)
- [x] Navbar audit link aktivan
- [x] Navigacija iz navbara
- [x] CREATE zapis posle kreiranja licence
- [x] Licencni kljuc prikazan u auditu
- [x] IP adresa prikazana
- [x] Vreme u DD.MM.YYYY formatu
- [x] Detalji kao JSON
### Audit Log — API zapisi (3 testa)
- [x] ACTIVATE zapis posle aktivacije
- [x] DEACTIVATE zapis posle deaktivacije
- [x] VALIDATE zapis posle validacije
### Klijentski API (8 testova)
- [x] Aktivacija licence (200 + potpis)
- [x] Ponovna aktivacija istim fingerprint-om (refresh)
- [x] Aktivacija sa drugog racunara → ALREADY_ACTIVATED
- [x] Validacija aktivne licence
- [x] Deaktivacija licence
- [x] Re-aktivacija posle deaktivacije
- [x] Nepostojeci kljuc → INVALID_KEY
- [x] Validacija nepostojeceg kljuca → valid: false
### Admin API autentifikacija (7 testova)
- [x] Bez API kljuca → 401
- [x] Pogresan kljuc → 401
- [x] Ispravan kljuc → 200
- [x] Products endpoint
- [x] Stats endpoint
- [x] Audit endpoint
- [x] Health endpoint
### Admin API — Revoke flow (3 testa)
- [x] Revoke licence
- [x] Aktivacija opozvane → KEY_REVOKED
- [x] Validacija opozvane → valid: false, revoked: true
---
*Poslednje azuriranje: 04.03.2026 — 179 testova (46 Go + 133 Playwright)*