package processing import ( "context" "testing" ) func TestMapAttrsOntoAllowedKeys_monitorAliases(t *testing.T) { allowed := map[string]struct{}{ "barva": {}, "diagonala_zaslona": {}, "diagonala-zaslona": {}, "locljivost": {}, "nastavljivo_po_visini": {}, "nastavljivo-po-visini": {}, "odzivni_cas": {}, "odzivni-cas": {}, "zaslon_obcutljiv_na_dotik": {}, "zaslon-obcutljiv-na-dotik": {}, "vrsta_panela": {}, "vrsta-panela": {}, "vgrajeni_zvocniki": {}, "vgrajeni-zvocniki": {}, } in := map[string]any{ "brand": "Xiaomi", "barva": "Črna", "locljivost": "1920 x 1080", "odzivni-cas": "6 ms", "velikost-zaslona": `68,58 cm (27,0")`, "nastavljiv-po-visini": "Ne", "zaslon-na-dotik": "Ne", "tip-matrike": "IPS", "zvocniki": "Ne", "kontrast": "1000:1", // not on allowlist } got := MapAttrsOntoAllowedKeys(in, allowed) if got["diagonala_zaslona"] != `68,58 cm (27,0")` { t.Fatalf("diagonala_zaslona=%v keys=%v", got["diagonala_zaslona"], got) } if got["nastavljivo_po_visini"] != "Ne" { t.Fatalf("nastavljivo_po_visini=%v", got["nastavljivo_po_visini"]) } if got["zaslon_obcutljiv_na_dotik"] != "Ne" { t.Fatalf("zaslon_obcutljiv_na_dotik=%v", got["zaslon_obcutljiv_na_dotik"]) } if got["vrsta_panela"] != "IPS" { t.Fatalf("vrsta_panela=%v", got["vrsta_panela"]) } if got["vgrajeni_zvocniki"] != "Ne" { t.Fatalf("vgrajeni_zvocniki=%v", got["vgrajeni_zvocniki"]) } // Exact keys untouched. if got["locljivost"] != "1920 x 1080" || got["barva"] != "Črna" { t.Fatalf("exact keys: %v", got) } } func TestMapAttrsOntoAllowedKeys_headphonesAliases(t *testing.T) { allowed := map[string]struct{}{ "brezzicna_povezava": {}, "brezzicna-povezava": {}, "brezzicna_tehnologija": {}, "brezzicna-tehnologija": {}, "odpravljanje_hrupa": {}, "odpravljanje-hrupa": {}, "vgrajen_mikrofon": {}, "vgrajen-mikrofon": {}, } in := map[string]any{ "slusalke-z-mikrofonom": "Da", "brezzicne": "Da", "bluetooth": "5.3", "vrsta-slusalk": "Naglavne", } got := MapAttrsOntoAllowedKeys(in, allowed) if got["vgrajen_mikrofon"] != "Da" { t.Fatalf("vgrajen_mikrofon=%v got=%v", got["vgrajen_mikrofon"], got) } if got["brezzicna_povezava"] != "Da" { t.Fatalf("brezzicna_povezava=%v", got["brezzicna_povezava"]) } if got["brezzicna_tehnologija"] != "5.3" { t.Fatalf("brezzicna_tehnologija=%v", got["brezzicna_tehnologija"]) } } func TestAttrsForPersist_keepsMappedFormulaKeys(t *testing.T) { attrs := map[string]any{ "brand": "Xiaomi", "velikost-zaslona": "27\"", "locljivost": "1920 x 1080", "tip-matrike": "IPS", "kontrast": "1000:1", } allowed := map[string]struct{}{ "diagonala_zaslona": {}, "diagonala-zaslona": {}, "locljivost": {}, "vrsta_panela": {}, "vrsta-panela": {}, "barva": {}, } got := AttrsForPersist(attrs, allowed) if got["brand"] != "Xiaomi" { t.Fatalf("brand=%v", got) } if got["diagonala_zaslona"] != "27\"" { t.Fatalf("formula diagonala_zaslona missing: %v", got) } if got["locljivost"] != "1920 x 1080" { t.Fatalf("locljivost missing: %v", got) } if got["vrsta_panela"] != "IPS" { t.Fatalf("vrsta_panela missing: %v", got) } if _, ok := got["kontrast"]; ok { t.Fatalf("non-formula junk must drop: %v", got) } if _, ok := got["velikost_zaslona"]; ok { t.Fatalf("unmapped alias key should not persist after filter: %v", got) } } func TestRunSteps_parseFillMapsMonitorFormulaAttrs(t *testing.T) { e := &Engine{} in := ProductInput{ GTIN: "6941948701199", Name: "Monitor Xiaomi A27i", Mapped: map[string]any{ "name": "Monitor Xiaomi A27i", "category": "25", "brand": "Xiaomi", "specifications": map[string]any{ "barva": "Črna", "locljivost": "1920 x 1080", "odzivni-cas": "6 ms", "velikost-zaslona": "27\"", "nastavljiv-po-visini": "Ne", "zaslon-na-dotik": "Ne", "kontrast": "1000:1", }, }, CategoryAttrKeys: map[string]map[string]struct{}{ "25": { "barva": {}, "diagonala_zaslona": {}, "diagonala-zaslona": {}, "locljivost": {}, "nastavljivo_po_visini": {}, "nastavljivo-po-visini": {}, "odzivni_cas": {}, "odzivni-cas": {}, "zaslon_obcutljiv_na_dotik": {}, "zaslon-obcutljiv-na-dotik": {}, }, }, } out, err := e.RunSteps(context.Background(), "co", in, "attributes", nil, StepPolicy{}) if err != nil { t.Fatal(err) } pa := out.ProcessedAttributes if pa["barva"] != "Črna" || pa["locljivost"] != "1920 x 1080" { t.Fatalf("exact formula keys: %v", pa) } if pa["diagonala_zaslona"] != "27\"" { t.Fatalf("diagonala_zaslona=%v pa=%v", pa["diagonala_zaslona"], pa) } if pa["nastavljivo_po_visini"] != "Ne" { t.Fatalf("nastavljivo_po_visini=%v", pa["nastavljivo_po_visini"]) } if pa["zaslon_obcutljiv_na_dotik"] != "Ne" { t.Fatalf("zaslon_obcutljiv_na_dotik=%v", pa["zaslon_obcutljiv_na_dotik"]) } if _, ok := pa["kontrast"]; ok { t.Fatalf("kontrast must not persist: %v", pa) } } func TestRunSteps_parseFillMapsHeadphonesFormulaAttrs(t *testing.T) { e := &Engine{} in := ProductInput{ GTIN: "650311612227", Name: "UVI Gear WRATH V2", Mapped: map[string]any{ "name": "UVI Gear WRATH V2", "category": "48", "brand": "UVI Gear", "specifications": map[string]any{ "barva": "Črna", "slusalke-z-mikrofonom": "Da", "brezzicne": "Ne", "vrsta-slusalk": "Naglavne", }, }, CategoryAttrKeys: map[string]map[string]struct{}{ "48": { "brezzicna_povezava": {}, "brezzicna-povezava": {}, "vgrajen_mikrofon": {}, "vgrajen-mikrofon": {}, }, }, } out, err := e.RunSteps(context.Background(), "co", in, "attributes", nil, StepPolicy{}) if err != nil { t.Fatal(err) } pa := out.ProcessedAttributes if pa["vgrajen_mikrofon"] != "Da" { t.Fatalf("vgrajen_mikrofon=%v pa=%v", pa["vgrajen_mikrofon"], pa) } if pa["brezzicna_povezava"] != "Ne" { t.Fatalf("brezzicna_povezava=%v", pa["brezzicna_povezava"]) } if _, ok := pa["vrsta_slusalk"]; ok { t.Fatalf("unlinked feed key must drop: %v", pa) } }