Files
descrybe/apps/api/internal/processing/attr_map_test.go
T
2026-08-16 16:57:36 +02:00

221 lines
6.4 KiB
Go

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)
}
}