Add duplicate detection before batch insert of auto-mappings: - Query existing partnumbers from lot_partnumbers table - Build case-insensitive set of existing entries - Filter out duplicates before CreateInBatches - Also prevent duplicates within single batch This ensures partnumber uniqueness as primary key requires. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package lotmatch
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"git.mchus.pro/mchus/priceforge/internal/models"
|
|
)
|
|
|
|
func TestLotResolverPrecedence(t *testing.T) {
|
|
resolver := NewLotResolver(
|
|
[]models.LotPartnumber{
|
|
{Partnumber: "PN-1", LotName: "LOT_A"},
|
|
},
|
|
[]models.Lot{
|
|
{LotName: "CPU_X_LONG"},
|
|
{LotName: "CPU_X"},
|
|
},
|
|
)
|
|
|
|
lot, by, err := resolver.Resolve("PN-1")
|
|
if err != nil || lot != "LOT_A" || by != "mapping_table" {
|
|
t.Fatalf("expected mapping_table LOT_A, got lot=%s by=%s err=%v", lot, by, err)
|
|
}
|
|
|
|
lot, by, err = resolver.Resolve("CPU_X")
|
|
if err != nil || lot != "CPU_X" || by != "article_exact" {
|
|
t.Fatalf("expected article_exact CPU_X, got lot=%s by=%s err=%v", lot, by, err)
|
|
}
|
|
|
|
lot, by, err = resolver.Resolve("CPU_X_LONG_001")
|
|
if err != nil || lot != "CPU_X_LONG" || by != "prefix" {
|
|
t.Fatalf("expected prefix CPU_X_LONG, got lot=%s by=%s err=%v", lot, by, err)
|
|
}
|
|
}
|
|
|
|
func TestMappingMatcherWildcardAndExactLot(t *testing.T) {
|
|
matcher := NewMappingMatcher(
|
|
[]models.LotPartnumber{
|
|
{Partnumber: "R750*", LotName: "SERVER_R750"},
|
|
{Partnumber: "HDD-01", LotName: "HDD_01"},
|
|
},
|
|
[]models.Lot{
|
|
{LotName: "MEM_DDR5_16G_4800"},
|
|
},
|
|
)
|
|
|
|
check := func(partnumber string, want string) {
|
|
t.Helper()
|
|
got := matcher.MatchLots(partnumber)
|
|
if len(got) != 1 || got[0] != want {
|
|
t.Fatalf("partnumber %s: expected [%s], got %#v", partnumber, want, got)
|
|
}
|
|
}
|
|
|
|
check("R750XD", "SERVER_R750")
|
|
check("HDD-01", "HDD_01")
|
|
check("MEM_DDR5_16G_4800", "MEM_DDR5_16G_4800")
|
|
|
|
if got := matcher.MatchLots("UNKNOWN"); len(got) != 0 {
|
|
t.Fatalf("expected no matches for UNKNOWN, got %#v", got)
|
|
}
|
|
}
|