- Kompletna Go implementacija licencnog servera (19 Go fajlova) - Klijentski API: activate, deactivate, validate - Admin API: CRUD licence, stats, audit log - Admin dashboard: htmx + Go templates - RSA-2048 potpisivanje licencnih podataka - Rate limiting i API key autentifikacija - MySQL migracije i seed podaci (ESIR, ARV, LIGHT_TICKET) - Unit testovi: keygen, crypto, model, middleware (24 testa) - Dokumentacija: SPEC.md, ARCHITECTURE.md, SETUP.md, API.md, TESTING.md, README.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package service
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestGenerateKey_Format(t *testing.T) {
|
|
prefixes := []string{"ESIR-", "ARV-", "LT-"}
|
|
|
|
for _, prefix := range prefixes {
|
|
key, err := GenerateKey(prefix)
|
|
if err != nil {
|
|
t.Fatalf("GenerateKey(%q) error: %v", prefix, err)
|
|
}
|
|
|
|
if !strings.HasPrefix(key, prefix) {
|
|
t.Errorf("key %q nema prefix %q", key, prefix)
|
|
}
|
|
|
|
// Remove prefix, check 4 groups of 4 chars separated by dashes
|
|
rest := strings.TrimPrefix(key, prefix)
|
|
groups := strings.Split(rest, "-")
|
|
if len(groups) != 4 {
|
|
t.Errorf("key %q: ocekivano 4 grupe, dobijeno %d", key, len(groups))
|
|
}
|
|
for i, g := range groups {
|
|
if len(g) != 4 {
|
|
t.Errorf("key %q: grupa %d ima %d karaktera umesto 4", key, i, len(g))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGenerateKey_ValidChars(t *testing.T) {
|
|
key, err := GenerateKey("TEST-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
rest := strings.TrimPrefix(key, "TEST-")
|
|
rest = strings.ReplaceAll(rest, "-", "")
|
|
|
|
for _, c := range rest {
|
|
if !strings.ContainsRune(keyChars, c) {
|
|
t.Errorf("key sadrzi nedozvoljen karakter: %c", c)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGenerateKey_NoConfusingChars(t *testing.T) {
|
|
// Generate multiple keys and check none contain O, 0, I, 1, L, Z
|
|
confusing := "OIL01Z"
|
|
for i := 0; i < 50; i++ {
|
|
key, err := GenerateKey("T-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
rest := strings.TrimPrefix(key, "T-")
|
|
rest = strings.ReplaceAll(rest, "-", "")
|
|
for _, c := range rest {
|
|
if strings.ContainsRune(confusing, c) {
|
|
t.Errorf("key sadrzi konfuzan karakter %c: %s", c, key)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGenerateKey_Uniqueness(t *testing.T) {
|
|
seen := make(map[string]bool)
|
|
for i := 0; i < 100; i++ {
|
|
key, err := GenerateKey("U-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if seen[key] {
|
|
t.Errorf("duplikat kljuca: %s", key)
|
|
}
|
|
seen[key] = true
|
|
}
|
|
}
|