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