package pricelist import ( "math" "testing" "time" "git.mchus.pro/mchus/quoteforge/internal/models" "git.mchus.pro/mchus/quoteforge/internal/repository" "github.com/glebarez/sqlite" "gorm.io/gorm" ) func TestCreateWarehousePricelistFromStockLog(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Fatalf("open sqlite: %v", err) } if err := db.AutoMigrate( &models.Pricelist{}, &models.PricelistItem{}, &models.StockLog{}, &models.Lot{}, &models.LotPartnumber{}, ); err != nil { t.Fatalf("automigrate: %v", err) } if err := db.Create(&models.Lot{LotName: "CPU_X", LotDescription: "CPU"}).Error; err != nil { t.Fatalf("seed lot: %v", err) } if err := db.Create(&models.LotPartnumber{Partnumber: "PN-CPU-X", LotName: "CPU_X"}).Error; err != nil { t.Fatalf("seed mapping: %v", err) } qty1 := 2.0 qty2 := 8.0 now := time.Now() rows := []models.StockLog{ {Partnumber: "PN-CPU-X", Date: now, Price: 100, Qty: &qty1}, {Partnumber: "PN-CPU-X", Date: now, Price: 200, Qty: &qty2}, } if err := db.Create(&rows).Error; err != nil { t.Fatalf("seed stock log: %v", err) } repo := repository.NewPricelistRepository(db) svc := NewService(db, repo, nil, nil) pl, err := svc.CreateForSourceWithProgress("tester", string(models.PricelistSourceWarehouse), nil, nil) if err != nil { t.Fatalf("create warehouse pricelist: %v", err) } if pl.Source != string(models.PricelistSourceWarehouse) { t.Fatalf("unexpected source: %s", pl.Source) } var items []models.PricelistItem if err := db.Where("pricelist_id = ?", pl.ID).Find(&items).Error; err != nil { t.Fatalf("load pricelist items: %v", err) } if len(items) != 1 { t.Fatalf("expected 1 item, got %d", len(items)) } if items[0].LotName != "CPU_X" { t.Fatalf("unexpected lot name: %s", items[0].LotName) } if math.Abs(items[0].Price-200) > 0.001 { t.Fatalf("expected weighted median price 200, got %f", items[0].Price) } }