Files
GoNtech/internal/db/sqlite/servis_idempotency_test.go
T

66 lines
2.2 KiB
Go

package sqlite
import (
"context"
"testing"
"ntech/internal/model"
)
// TestServisKreiraj_IdempotencyKey: dva poziva Kreiraj sa istim IdempotencyKey
// (simulira dupliran POST — dupli klik, "Nazad" pa ponovni submit, mrežni retry)
// vraćaju ISTI nalogID i ne prave drugi nalog — isti obrazac kao za prodaju
// (v. TestProdajaKreiraj_IdempotencyKey u prodaja_kreiraj_test.go).
func TestServisKreiraj_IdempotencyKey(t *testing.T) {
ctx := context.Background()
baza := testDB(t)
repo := NoviServisRepo(baza)
id1, err := repo.Kreiraj(ctx, &model.ServisniNalog{
Uredjaj: "Laptop", OpisKvara: "ne pali", Status: "Primljeno",
IdempotencyKey: "test-servis-kljuc-123",
})
if err != nil {
t.Fatalf("prvi Kreiraj: %v", err)
}
// drugi poziv sa ISTIM ključem (nov nalog, kao pri ponovljenom POST-u)
id2, err := repo.Kreiraj(ctx, &model.ServisniNalog{
Uredjaj: "Laptop", OpisKvara: "ne pali", Status: "Primljeno",
IdempotencyKey: "test-servis-kljuc-123",
})
if err != nil {
t.Fatalf("drugi Kreiraj (dupliran POST): %v", err)
}
if id1 != id2 {
t.Errorf("drugi poziv sa istim idempotency ključem vratio drugačiji ID: %d != %d — napravljen dupli nalog", id1, id2)
}
var brNaloga int
baza.QueryRowContext(ctx, "SELECT COUNT(*) FROM servisni_nalozi WHERE idempotency_key = ?", "test-servis-kljuc-123").Scan(&brNaloga)
if brNaloga != 1 {
t.Errorf("broj naloga sa ovim idempotency ključem = %d, očekivano 1", brNaloga)
}
}
// TestServisKreiraj_BezIdempotencyKljuca: prazan ključ (pozivalac ga ne koristi) —
// dva odvojena poziva prave DVA odvojena naloga, kao i pre uvođenja zaštite.
func TestServisKreiraj_BezIdempotencyKljuca(t *testing.T) {
ctx := context.Background()
baza := testDB(t)
repo := NoviServisRepo(baza)
id1, err := repo.Kreiraj(ctx, &model.ServisniNalog{Uredjaj: "PC", OpisKvara: "kvar", Status: "Primljeno"})
if err != nil {
t.Fatalf("prvi Kreiraj: %v", err)
}
id2, err := repo.Kreiraj(ctx, &model.ServisniNalog{Uredjaj: "PC", OpisKvara: "kvar", Status: "Primljeno"})
if err != nil {
t.Fatalf("drugi Kreiraj: %v", err)
}
if id1 == id2 {
t.Errorf("bez idempotency ključa očekivana dva različita naloga, dobijen isti ID %d", id1)
}
}