package service import ( "context" "fmt" "testing" "time" "gorm.io/driver/sqlite" "gorm.io/gorm" "kefu-cloud/server/internal/geoip" "kefu-cloud/server/internal/model" ) func TestBackfillVisitorGeoIP(t *testing.T) { db, err := gorm.Open(sqlite.Open(fmt.Sprintf("file:kefu_geo_backfill_%d?mode=memory&cache=shared", time.Now().UnixNano())), &gorm.Config{}) if err != nil { t.Fatal(err) } if err := model.Migrate(db); err != nil { t.Fatal(err) } oldDB := model.DB model.DB = db t.Cleanup(func() { model.DB = oldDB }) originalLookup := visitorGeoLookup visitorGeoLookup = func(ip string) (geoip.Location, bool) { if ip == "152.136.121.51" { return geoip.Location{ Country: "中国", Province: "广东省", City: "深圳市", Region: "中国 广东省 深圳市", }, true } return geoip.Location{}, false } t.Cleanup(func() { visitorGeoLookup = originalLookup }) sessions := []model.Session{ {TenantID: 1, ChannelID: 1, CustomerID: 1, VisitorIP: "152.136.121.51", VisitorRegion: "未知", Status: "ended"}, {TenantID: 1, ChannelID: 1, CustomerID: 2, VisitorIP: "192.168.1.10", VisitorRegion: "未知", Status: "ended"}, } if err := db.Create(&sessions).Error; err != nil { t.Fatal(err) } updated, err := BackfillVisitorGeoIP(context.Background()) if err != nil { t.Fatal(err) } if updated != 2 { t.Fatalf("updated=%d, want 2", updated) } if err := db.First(&sessions[0], sessions[0].ID).Error; err != nil { t.Fatal(err) } if sessions[0].VisitorRegion != "中国 广东省 深圳市" || sessions[0].VisitorProvince != "广东省" || sessions[0].VisitorCity != "深圳市" { t.Fatalf("公网 IP 未正确回填: %+v", sessions[0]) } if err := db.First(&sessions[1], sessions[1].ID).Error; err != nil { t.Fatal(err) } if sessions[1].VisitorRegion != "内网" { t.Fatalf("私网 IP 应标记内网: %+v", sessions[1]) } }