Merge grane feature/testovi-parseformu: testovi validatora forme

This commit is contained in:
2026-06-12 23:12:56 +02:00
+167
View File
@@ -0,0 +1,167 @@
package handler
import (
"net/http"
"net/http/httptest"
"net/url"
"strings"
"testing"
"ntech/internal/model"
)
// formZahtev gradi POST zahtev sa form vrednostima i parsira ga
func formZahtev(v url.Values) *http.Request {
r := httptest.NewRequest("POST", "/", strings.NewReader(v.Encode()))
r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
_ = r.ParseForm()
return r
}
func TestParseFormuArtikla(t *testing.T) {
t.Run("validan", func(t *testing.T) {
a, greska := parseFormuArtikla(formZahtev(url.Values{
"naziv": {"Pumpa"}, "kolicina": {"10"}, "prodajna_cena": {"1500.50"},
}))
if greska != "" {
t.Fatalf("neočekivana greška: %q", greska)
}
if a.Naziv != "Pumpa" || a.Kolicina != 10 || a.ProdajnaCena != 1500.50 {
t.Fatalf("pogrešno parsiran artikal: %+v", a)
}
})
t.Run("naziv obavezan", func(t *testing.T) {
if _, greska := parseFormuArtikla(formZahtev(url.Values{"naziv": {""}})); greska == "" {
t.Fatal("prazan naziv mora dati grešku")
}
})
t.Run("negativna količina", func(t *testing.T) {
_, greska := parseFormuArtikla(formZahtev(url.Values{"naziv": {"X"}, "kolicina": {"-5"}}))
if greska == "" {
t.Fatal("negativna količina mora dati grešku")
}
})
t.Run("neispravna cena", func(t *testing.T) {
_, greska := parseFormuArtikla(formZahtev(url.Values{"naziv": {"X"}, "prodajna_cena": {"abc"}}))
if greska == "" {
t.Fatal("neispravna cena mora dati grešku")
}
})
}
func TestParseFormuKlijenta(t *testing.T) {
t.Run("fizičko bez imena", func(t *testing.T) {
_, greska := parseFormuKlijenta(formZahtev(url.Values{"tip": {"fizicko"}}))
if greska == "" {
t.Fatal("fizičko lice bez imena mora dati grešku")
}
})
t.Run("pravno bez naziva firme", func(t *testing.T) {
_, greska := parseFormuKlijenta(formZahtev(url.Values{"tip": {"pravno"}}))
if greska == "" {
t.Fatal("pravno lice bez naziva firme mora dati grešku")
}
})
t.Run("neispravan email", func(t *testing.T) {
_, greska := parseFormuKlijenta(formZahtev(url.Values{
"tip": {"fizicko"}, "ime": {"Pera"}, "email": {"nije-email"},
}))
if greska == "" {
t.Fatal("email bez @ mora dati grešku")
}
})
t.Run("validno fizičko", func(t *testing.T) {
k, greska := parseFormuKlijenta(formZahtev(url.Values{
"tip": {"fizicko"}, "ime": {"Pera"}, "prezime": {"Perić"},
}))
if greska != "" {
t.Fatalf("neočekivana greška: %q", greska)
}
if k.Tip != "fizicko" || k.Ime != "Pera" {
t.Fatalf("pogrešno parsiran klijent: %+v", k)
}
})
t.Run("nepoznat tip → fizičko", func(t *testing.T) {
k, _ := parseFormuKlijenta(formZahtev(url.Values{"tip": {"vanzemaljac"}, "ime": {"Pera"}}))
if k.Tip != "fizicko" {
t.Fatalf("nepoznat tip treba da padne na fizičko, dobijeno %q", k.Tip)
}
})
}
func TestParseFormuProdaje(t *testing.T) {
t.Run("bez stavki", func(t *testing.T) {
_, _, greska := parseFormuProdaje(formZahtev(url.Values{}))
if greska == "" {
t.Fatal("prodaja bez stavki mora dati grešku")
}
})
t.Run("količina nula", func(t *testing.T) {
_, _, greska := parseFormuProdaje(formZahtev(url.Values{
"artikal_id[]": {"1"}, "kolicina[]": {"0"}, "cena_po_komadu[]": {"100"},
}))
if greska == "" {
t.Fatal("količina 0 mora dati grešku")
}
})
t.Run("neispravan artikal", func(t *testing.T) {
_, _, greska := parseFormuProdaje(formZahtev(url.Values{
"artikal_id[]": {"0"}, "kolicina[]": {"1"}, "cena_po_komadu[]": {"100"},
}))
if greska == "" {
t.Fatal("artikal_id 0 mora dati grešku")
}
})
t.Run("validna stavka", func(t *testing.T) {
nalog, stavke, greska := parseFormuProdaje(formZahtev(url.Values{
"artikal_id[]": {"3"}, "kolicina[]": {"2"}, "cena_po_komadu[]": {"250"}, "pdv_stopa[]": {"20"},
}))
if greska != "" {
t.Fatalf("neočekivana greška: %q", greska)
}
if len(stavke) != 1 {
t.Fatalf("očekivana 1 stavka, dobijeno %d", len(stavke))
}
s := stavke[0]
if s.ArtikalID != 3 || s.Kolicina != 2 || s.CenaPoKomadu != 250 || s.PdvStopa != 20 {
t.Fatalf("pogrešno parsirana stavka: %+v", s)
}
if nalog.NacinPlacanja != "gotovina" {
t.Fatalf("podrazumevani način plaćanja treba da bude gotovina, dobijeno %q", nalog.NacinPlacanja)
}
})
t.Run("nesklad broja stavki", func(t *testing.T) {
_, _, greska := parseFormuProdaje(formZahtev(url.Values{
"artikal_id[]": {"1", "2"}, "kolicina[]": {"1"}, "cena_po_komadu[]": {"100"},
}))
if greska == "" {
t.Fatal("nesklad broja stavki mora dati grešku")
}
})
}
func TestParseFormuNaloga(t *testing.T) {
t.Run("uređaj obavezan", func(t *testing.T) {
_, greska := parseFormuNaloga(formZahtev(url.Values{"opis_kvara": {"ne radi"}}))
if greska == "" {
t.Fatal("nedostatak uređaja mora dati grešku")
}
})
t.Run("opis kvara obavezan", func(t *testing.T) {
_, greska := parseFormuNaloga(formZahtev(url.Values{"uredjaj": {"Laptop"}}))
if greska == "" {
t.Fatal("nedostatak opisa kvara mora dati grešku")
}
})
t.Run("validan nalog sa podrazumevanim statusom", func(t *testing.T) {
nalog, greska := parseFormuNaloga(formZahtev(url.Values{
"uredjaj": {"Laptop"}, "opis_kvara": {"Ne pali se"},
}))
if greska != "" {
t.Fatalf("neočekivana greška: %q", greska)
}
if nalog.Status != model.StatusPrimljeno {
t.Fatalf("podrazumevani status treba da bude %q, dobijeno %q", model.StatusPrimljeno, nalog.Status)
}
})
}