9aaafa2358
dashboard.go i izvestaji.go više ne sadrže direktan SQL — svih 12 upita prebačeno u novi IzvestajRepository (internal/db/sqlite/izvestaj.go). Repo vraća sirove redove (model.*Red tipovi), a handleri zadržavaju prezentaciju (formatiranje datuma, boje tačaka, rang, sklapanje niza 12 meseci). Žičenje kroz Handler.IzvestajRepo (+ reinicijalizuj). Dobici: testabilnost (dodati integracioni testovi izvestaj_test.go) i put ka Postgres-u bez prepravke handlera. dashboard.prihod provera ostaje u handleru. Van obima: middleware/flash.go i backup VACUUM INTO (ne pripadaju repo sloju).
67 lines
2.0 KiB
Go
67 lines
2.0 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"ntech/internal/model"
|
|
)
|
|
|
|
func TestIzvestajArtikliBrojaci(t *testing.T) {
|
|
ctx := context.Background()
|
|
db := testDB(t)
|
|
art := NoviArtikalRepo(db)
|
|
izv := NoviIzvestajRepo(db)
|
|
|
|
dodaj := func(a *model.Artikal) {
|
|
if _, err := art.Kreiraj(ctx, a); err != nil {
|
|
t.Fatalf("Kreiraj: %v", err)
|
|
}
|
|
}
|
|
dodaj(&model.Artikal{Naziv: "A", Kolicina: 10, KolicinMin: 5})
|
|
dodaj(&model.Artikal{Naziv: "B", Kolicina: 2, KolicinMin: 5}) // kritičan
|
|
dodaj(&model.Artikal{Naziv: "C", Kolicina: 0, KolicinMin: 5}) // kritičan, nula
|
|
|
|
if n, err := izv.BrojArtikala(ctx); err != nil || n != 3 {
|
|
t.Fatalf("BrojArtikala = %d, err=%v; očekivano 3", n, err)
|
|
}
|
|
if n, err := izv.BrojKriticnihZaliha(ctx); err != nil || n != 2 {
|
|
t.Fatalf("BrojKriticnihZaliha = %d, err=%v; očekivano 2", n, err)
|
|
}
|
|
|
|
zalihe, err := izv.KriticneZalihe(ctx, 5)
|
|
if err != nil {
|
|
t.Fatalf("KriticneZalihe: %v", err)
|
|
}
|
|
if len(zalihe) != 2 {
|
|
t.Fatalf("KriticneZalihe vratio %d, očekivano 2", len(zalihe))
|
|
}
|
|
// sortirano po količini rastuće → prvi je onaj sa 0
|
|
if zalihe[0].Kolicina != 0 {
|
|
t.Fatalf("prvi kritičan treba da ima količinu 0, ima %d", zalihe[0].Kolicina)
|
|
}
|
|
}
|
|
|
|
// prazna baza — brojači 0, liste prazne, bez greške
|
|
func TestIzvestajPraznaBaza(t *testing.T) {
|
|
ctx := context.Background()
|
|
db := testDB(t)
|
|
izv := NoviIzvestajRepo(db)
|
|
|
|
if n, err := izv.BrojArtikala(ctx); err != nil || n != 0 {
|
|
t.Errorf("BrojArtikala = %d, err=%v", n, err)
|
|
}
|
|
if v, err := izv.PrihodTekuciMesec(ctx); err != nil || v != 0 {
|
|
t.Errorf("PrihodTekuciMesec = %v, err=%v", v, err)
|
|
}
|
|
if l, err := izv.PoslednjiServisi(ctx, 5); err != nil || len(l) != 0 {
|
|
t.Errorf("PoslednjiServisi len=%d, err=%v", len(l), err)
|
|
}
|
|
if l, err := izv.TopKlijenti(ctx, 10); err != nil || len(l) != 0 {
|
|
t.Errorf("TopKlijenti len=%d, err=%v", len(l), err)
|
|
}
|
|
if l, err := izv.MesecniPrihodProdaja(ctx); err != nil || len(l) != 0 {
|
|
t.Errorf("MesecniPrihodProdaja len=%d, err=%v", len(l), err)
|
|
}
|
|
}
|