# 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)*