Files
GoNtech/internal/model/model_test.go
T
Dasko 34a427e046 Cena sa PDV-om u magacinu + uslovno prikazivanje po modulu
- migrations/087: nova kolona cena_sa_pdv + popunjavanje postojećih
- model.Artikal: polje CenaSaPdv, ispravljene CenaBezPdv/PdvIznos (neto)
- sqlite/artikal.go: SELECT/Scan/INSERT/UPDATE za cena_sa_pdv (6 mesta)
- magacin_forma.go: pdv_stopa iz forme, kalkulacija cena_sa_pdv, default PDV 20%
- magacin.html: dinari format (25.999,00), kolona Sa PDV-om, uslovno po Moduli.pdv
- magacin_forma.html: PDV dropdown + Cena sa PDV polje, uslovno po Moduli.pdv,
  optimizovan layout (Naziv/Jed. mere/Kategorija u 1 redu)
- main.go: demo mod bez keširanja šablona (hot-reload)
- model_test.go: ažurirani testovi za novo ponašanje CenaBezPdv/PdvIznos
2026-06-26 23:47:52 +02:00

88 lines
2.6 KiB
Go

package model
import (
"math"
"testing"
)
// jednako proverava jednakost realnih brojeva uz malu toleranciju
func jednako(a, b float64) bool {
return math.Abs(a-b) < 0.0001
}
func ptr(v float64) *float64 { return &v }
func TestArtikalCenaBezPdvIPdvIznos(t *testing.T) {
testovi := []struct {
naziv string
prodajna float64 // neto
cenaSaPdv float64 // bruto
stopa float64
ocekBezPdv float64
ocekPdvIznos float64
}{
{"stopa 20%", 100, 120, 20, 100, 20},
{"stopa 0%", 100, 100, 0, 100, 0},
{"stopa 10%", 100, 110, 10, 100, 10},
{"nula cena", 0, 0, 20, 0, 0},
}
for _, tt := range testovi {
t.Run(tt.naziv, func(t *testing.T) {
a := Artikal{ProdajnaCena: tt.prodajna, CenaSaPdv: tt.cenaSaPdv, PdvStopa: tt.stopa}
if got := a.CenaBezPdv(); !jednako(got, tt.ocekBezPdv) {
t.Errorf("CenaBezPdv() = %v, očekivano %v", got, tt.ocekBezPdv)
}
if got := a.PdvIznos(); !jednako(got, tt.ocekPdvIznos) {
t.Errorf("PdvIznos() = %v, očekivano %v", got, tt.ocekPdvIznos)
}
})
}
}
func TestKlijentPunoIme(t *testing.T) {
testovi := []struct {
naziv string
k Klijent
ocek string
}{
{"pravno lice", Klijent{Tip: "pravno", NazivFirme: "Firma DOO", Ime: "x", Prezime: "y"}, "Firma DOO"},
{"fizičko lice", Klijent{Tip: "fizicko", Ime: "Petar", Prezime: "Petrović"}, "Petar Petrović"},
{"fizičko bez prezimena", Klijent{Tip: "fizicko", Ime: "Petar"}, "Petar"},
{"fizičko prazno", Klijent{Tip: "fizicko"}, ""},
}
for _, tt := range testovi {
t.Run(tt.naziv, func(t *testing.T) {
if got := tt.k.PunoIme(); got != tt.ocek {
t.Errorf("PunoIme() = %q, očekivano %q", got, tt.ocek)
}
})
}
}
func TestServisniNalogPreostaloZaNaplatu(t *testing.T) {
t.Run("bez konačne cene → nil", func(t *testing.T) {
n := ServisniNalog{CenaKonacna: nil, Avans: ptr(50)}
if got := n.PreostaloZaNaplatu(); got != nil {
t.Errorf("očekivan nil, dobijeno %v", *got)
}
})
t.Run("konačna minus avans", func(t *testing.T) {
n := ServisniNalog{CenaKonacna: ptr(1000), Avans: ptr(300)}
if got := n.PreostaloZaNaplatu(); got == nil || !jednako(*got, 700) {
t.Errorf("očekivano 700, dobijeno %v", got)
}
})
t.Run("bez avansa → puna cena", func(t *testing.T) {
n := ServisniNalog{CenaKonacna: ptr(1000)}
if got := n.PreostaloZaNaplatu(); got == nil || !jednako(*got, 1000) {
t.Errorf("očekivano 1000, dobijeno %v", got)
}
})
t.Run("avans veći od cene → 0 (ne negativno)", func(t *testing.T) {
n := ServisniNalog{CenaKonacna: ptr(500), Avans: ptr(800)}
if got := n.PreostaloZaNaplatu(); got == nil || !jednako(*got, 0) {
t.Errorf("očekivano 0, dobijeno %v", got)
}
})
}