67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
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])
|
|
}
|
|
}
|