refactor!: make addrkit a multi-city address normalizer
- remove the events/outages module, ArcGIS adapter, portal config and event statuses - add a configurable city dictionary/parser and make City part of StreetKey - seed: read city/city_name, namespace IDs by city, keep structures distinct - fix reliability: schema v2 with fail-closed load, deterministic ordering, input limits, config validation, atomic DB publish, LLM response caps - add read-only shadow mode comparing the old ES path with addrkit - breaking: registry.db must be re-seeded; config has no portal section
This commit is contained in:
@@ -4,6 +4,9 @@ import (
|
||||
"math/rand"
|
||||
"testing"
|
||||
"unicode/utf8"
|
||||
|
||||
"git.totmin.ru/en2zmax/addrkit/internal/domain/address"
|
||||
"git.totmin.ru/en2zmax/addrkit/internal/domain/match"
|
||||
)
|
||||
|
||||
// TestMoveTypeFront guards against the slice-aliasing regression that made the
|
||||
@@ -47,3 +50,37 @@ func TestMutateOnlyNameTokens(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestRunDetectsWrongCity guards the multi-city safety net: canonical address
|
||||
// text is identical across cities, so a found result must be checked against
|
||||
// the expected city, not only against street/house text.
|
||||
func TestRunDetectsWrongCity(t *testing.T) {
|
||||
parser := address.NewParser(address.NewDictionary([]address.City{{Name: "Бердск"}}), "")
|
||||
p := parser.ParseInCity("Ленина улица 5", "Бердск")
|
||||
entries := []address.Entry{{
|
||||
ID: "b1", Address: "Ленина улица 5",
|
||||
City: p.City, CityKey: p.CityKey,
|
||||
Ordinal: p.Ordinal, NameKey: p.NameKey, StreetKey: p.StreetKey, House: p.House,
|
||||
}}
|
||||
resolver := match.NewResolverWithOptions(
|
||||
match.NewIndex("test", entries, match.DefaultOptions()),
|
||||
nil,
|
||||
match.ResolverOptions{Parser: parser},
|
||||
)
|
||||
|
||||
cases := []Case{
|
||||
{Query: "Ленина 5", Expect: "Ленина улица 5", ExpectCity: "Новосибирск", Category: "wrong_city", RequireExact: true},
|
||||
{Query: "Ленина 5", Expect: "Ленина улица 5", ExpectCity: "Бердск", Category: "right_city", RequireExact: true},
|
||||
}
|
||||
rep := Run(resolver, cases)
|
||||
|
||||
if got := rep.Categories["wrong_city"]; got.WrongCity != 1 || got.Exact != 0 {
|
||||
t.Fatalf("wrong_city = %+v, want WrongCity=1 Exact=0", got)
|
||||
}
|
||||
if got := rep.Categories["right_city"]; got.Exact != 1 || got.WrongCity != 0 {
|
||||
t.Fatalf("right_city = %+v, want Exact=1 WrongCity=0", got)
|
||||
}
|
||||
if rep.Wrong != 1 {
|
||||
t.Fatalf("report Wrong = %d, want 1", rep.Wrong)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user