Files
PriceForge/internal/services/pricelist/service_warehouse_test.go
2026-02-20 19:01:07 +03:00

112 lines
3.1 KiB
Go

package pricelist
import (
"math"
"testing"
"time"
"git.mchus.pro/mchus/priceforge/internal/models"
"git.mchus.pro/mchus/priceforge/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-180) > 0.001 {
t.Fatalf("expected weighted average price 180, got %f", items[0].Price)
}
}
func TestCreateWarehousePricelist_DefaultCategoryWhenLotMissing(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.Lot{},
&models.Category{},
); err != nil {
t.Fatalf("automigrate: %v", err)
}
repo := repository.NewPricelistRepository(db)
svc := NewService(db, repo, nil, nil)
items := []CreateItemInput{
{LotName: "LOT_NOT_IN_LOT_TABLE", Price: 42, PriceMethod: "weighted_avg"},
}
pl, err := svc.CreateForSourceWithProgress("tester", string(models.PricelistSourceWarehouse), items, nil)
if err != nil {
t.Fatalf("create warehouse pricelist: %v", err)
}
var item models.PricelistItem
if err := db.Where("pricelist_id = ? AND lot_name = ?", pl.ID, "LOT_NOT_IN_LOT_TABLE").First(&item).Error; err != nil {
t.Fatalf("load pricelist item: %v", err)
}
if item.LotCategory == nil || *item.LotCategory != models.DefaultLotCategoryCode {
got := "<nil>"
if item.LotCategory != nil {
got = *item.LotCategory
}
t.Fatalf("expected default category %q, got %q", models.DefaultLotCategoryCode, got)
}
}