102 lines
3.1 KiB
Go
102 lines
3.1 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
|
|
"ntech/internal/db"
|
|
"ntech/internal/model"
|
|
)
|
|
|
|
// TestPromeniCenu_AzuriraCenuIUpisujeNivelaciju: PromeniCenu čita staru cenu iz
|
|
// baze, menja prodajnu cenu i kreira nivelacioni zapis u jednoj transakciji.
|
|
func TestPromeniCenu_AzuriraCenuIUpisujeNivelaciju(t *testing.T) {
|
|
ctx := context.Background()
|
|
baza := testDB(t)
|
|
artRepo := NoviArtikalRepo(baza)
|
|
nivRepo := NoviNivelacijaRepo(baza)
|
|
|
|
artID, _ := artRepo.Kreiraj(ctx, &model.Artikal{Naziv: "Miš", ProdajnaCena: 1000})
|
|
|
|
niv, err := nivRepo.PromeniCenu(ctx, artID, 1200, "sezonska korekcija", nil)
|
|
if err != nil {
|
|
t.Fatalf("PromeniCenu: %v", err)
|
|
}
|
|
|
|
// povratna vrednost
|
|
if niv.StaraCena != 1000 {
|
|
t.Errorf("StaraCena = %.2f, očekivano 1000", niv.StaraCena)
|
|
}
|
|
if niv.NovaCena != 1200 {
|
|
t.Errorf("NovaCena = %.2f, očekivano 1200", niv.NovaCena)
|
|
}
|
|
if niv.Izvor != "rucno" {
|
|
t.Errorf("Izvor = %q, očekivano \"rucno\"", niv.Izvor)
|
|
}
|
|
|
|
// artikal u bazi mora imati novu cenu
|
|
a, _ := artRepo.DohvatiID(ctx, artID)
|
|
if a.ProdajnaCena != 1200 {
|
|
t.Errorf("prodajna_cena u bazi = %.2f, očekivano 1200", a.ProdajnaCena)
|
|
}
|
|
|
|
// nivelacioni zapis mora postojati u bazi
|
|
var stara, nova float64
|
|
var izvor string
|
|
err = baza.QueryRowContext(ctx,
|
|
"SELECT stara_cena, nova_cena, izvor FROM nivelacije WHERE artikal_id = ?", artID,
|
|
).Scan(&stara, &nova, &izvor)
|
|
if err != nil {
|
|
t.Fatalf("nivelacioni zapis nije pronađen: %v", err)
|
|
}
|
|
if stara != 1000 || nova != 1200 || izvor != "rucno" {
|
|
t.Errorf("zapis: stara=%.2f nova=%.2f izvor=%q, očekivano 1000/1200/rucno", stara, nova, izvor)
|
|
}
|
|
}
|
|
|
|
// TestPromeniCenu_NepostojeciArtikal: pokušaj promene cene nepostojećeg artikla
|
|
// vraća ErrArtikalNePostoji, baza ostaje neizmenjena.
|
|
func TestPromeniCenu_NepostojeciArtikal(t *testing.T) {
|
|
ctx := context.Background()
|
|
baza := testDB(t)
|
|
nivRepo := NoviNivelacijaRepo(baza)
|
|
|
|
_, err := nivRepo.PromeniCenu(ctx, 9999, 500, "test", nil)
|
|
if !errors.Is(err, db.ErrArtikalNePostoji) {
|
|
t.Errorf("greška = %v, očekivano ErrArtikalNePostoji", err)
|
|
}
|
|
|
|
// nivelacioni zapis ne sme biti kreiran
|
|
var br int
|
|
baza.QueryRowContext(ctx, "SELECT COUNT(*) FROM nivelacije").Scan(&br)
|
|
if br != 0 {
|
|
t.Errorf("nivelacije = %d, očekivano 0 (transakcija rollback)", br)
|
|
}
|
|
}
|
|
|
|
// TestPromeniCenu_VisePromena: svaka promena čita prethodnu cenu kao "staru".
|
|
func TestPromeniCenu_VisePromena(t *testing.T) {
|
|
ctx := context.Background()
|
|
baza := testDB(t)
|
|
artRepo := NoviArtikalRepo(baza)
|
|
nivRepo := NoviNivelacijaRepo(baza)
|
|
|
|
artID, _ := artRepo.Kreiraj(ctx, &model.Artikal{Naziv: "Tastatura", ProdajnaCena: 800})
|
|
|
|
nivRepo.PromeniCenu(ctx, artID, 900, "korekcija 1", nil)
|
|
niv2, _ := nivRepo.PromeniCenu(ctx, artID, 750, "korekcija 2", nil)
|
|
|
|
// druga promena čita 900 (ne originalni 800) kao staru cenu
|
|
if niv2.StaraCena != 900 {
|
|
t.Errorf("StaraCena druge promene = %.2f, očekivano 900", niv2.StaraCena)
|
|
}
|
|
|
|
// ukupno 2 zapisa u nivelacije
|
|
var br int
|
|
baza.QueryRowContext(ctx, "SELECT COUNT(*) FROM nivelacije WHERE artikal_id = ?", artID).Scan(&br)
|
|
if br != 2 {
|
|
t.Errorf("broj nivelacijskih zapisa = %d, očekivano 2", br)
|
|
}
|
|
}
|