material_manage_system/internal/service/stock_test.go

48 lines
1.8 KiB
Go

package service
import (
"testing"
"github.com/shopspring/decimal"
"github.com/wmms/wmms/internal/model"
)
// ClassifyStock 是库存状态的唯一判定入口,这张表同时钉住"新增物料不误报"和
// "真的低于阈值要报警"两侧的边界。它必须与 repository.stockWarningHavingSQL 一致。
func TestClassifyStockBoundaries(t *testing.T) {
cases := []struct {
name string
totalOnHand string
warningStock string
warningEnabled bool
want string
}{
{"用完且没设过预警值", "0", "0", true, model.StockStatusNormal},
{"有货且没设过预警值", "5", "0", true, model.StockStatusNormal},
{"设了阈值但库存归零", "0", "10", true, model.StockStatusLow},
{"低于阈值", "5", "10", true, model.StockStatusLow},
{"恰好触达阈值即预警", "10", "10", true, model.StockStatusLow},
{"略高于阈值", "10.000001", "10", true, model.StockStatusNormal},
{"高于阈值", "15", "10", true, model.StockStatusNormal},
{"用完但手动关闭预警", "0", "10", false, model.StockStatusNormal},
{"低于阈值但手动关闭预警", "5", "10", false, model.StockStatusNormal},
{"有货且手动关闭预警", "15", "10", false, model.StockStatusNormal},
// 数量是 decimal 字符串,按字典序比较会把 "370" 判成小于 "50"。
{"大数按数值而非字典序比较", "370.000000", "50.000000", true, model.StockStatusNormal},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
got := ClassifyStock(
decimal.RequireFromString(tc.totalOnHand),
decimal.RequireFromString(tc.warningStock),
tc.warningEnabled,
)
if got != tc.want {
t.Fatalf("ClassifyStock(%s, %s, %v) = %s, want %s",
tc.totalOnHand, tc.warningStock, tc.warningEnabled, got, tc.want)
}
})
}
}