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>
259 lines
8.1 KiB
Markdown
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)*
|