package main import ( "database/sql" "testing" ) func TestResolveVINPrefersConsistentCurrentMapping(t *testing.T) { current := mappingIndex{Unique: map[string]string{"沪A12345": "LA9GG64L0NBAF4175"}} legacy := mappingIndex{Unique: map[string]string{"沪A12345": "LA9GG64L0NBAF4175"}} vin, origin, conflict := resolveVIN("沪A12345", current, legacy) if conflict || vin != "LA9GG64L0NBAF4175" || origin != "current_vehicle" { t.Fatalf("unexpected resolution: vin=%q origin=%q conflict=%v", vin, origin, conflict) } } func TestResolveVINRejectsCurrentLegacyConflict(t *testing.T) { current := mappingIndex{Unique: map[string]string{"沪A12345": "LA9GG64L0NBAF4175"}} legacy := mappingIndex{Unique: map[string]string{"沪A12345": "LA9GG64L0NBAF4176"}} vin, _, conflict := resolveVIN("沪A12345", current, legacy) if !conflict || vin != "" { t.Fatalf("expected conflict rejection, got vin=%q conflict=%v", vin, conflict) } } func TestResolveVINUsesLegacyFallback(t *testing.T) { current := mappingIndex{Unique: map[string]string{}} legacy := mappingIndex{Unique: map[string]string{"沪A12345": "LA9GG64L0NBAF4175"}} vin, origin, conflict := resolveVIN("沪A12345", current, legacy) if conflict || vin != "LA9GG64L0NBAF4175" || origin != "legacy_vehicle" { t.Fatalf("unexpected resolution: vin=%q origin=%q conflict=%v", vin, origin, conflict) } } func TestResolveVINAcceptsSourceVIN(t *testing.T) { vin, origin, conflict := resolveVIN("LA9GG64L0NBAF4175", mappingIndex{}, mappingIndex{}) if conflict || vin != "LA9GG64L0NBAF4175" || origin != "source_vin" { t.Fatalf("unexpected resolution: vin=%q origin=%q conflict=%v", vin, origin, conflict) } } func TestNormalizeIdentifierRemovesWhitespace(t *testing.T) { if got := normalizeIdentifier(" 沪 a 12345 \n"); got != "沪A12345" { t.Fatalf("normalizeIdentifier() = %q", got) } } func TestNullableTotalMileageConvertsMetersToKM(t *testing.T) { got := nullableTotalMileageKM(sql.NullFloat64{Float64: 59198000, Valid: true}) if got != 59198.0 { t.Fatalf("nullableTotalMileageKM() = %#v", got) } if got := nullableTotalMileageKM(sql.NullFloat64{}); got != nil { t.Fatalf("invalid mileage should remain nil, got %#v", got) } }