115 lines
5.8 KiB
Go
115 lines
5.8 KiB
Go
package business
|
|
|
|
import (
|
|
"context"
|
|
"kra/internal/biz/business"
|
|
"testing"
|
|
)
|
|
|
|
func TestServerAnalysisStorageScopeSnapshotAndPreference(t *testing.T) {
|
|
db, _ := prepareChannels(t)
|
|
for _, sql := range []string{
|
|
"CREATE TABLE tab_game_server(id INTEGER,source_db TEXT,game_id INTEGER,server_num TEXT,server_name TEXT,start_time INTEGER)",
|
|
"INSERT INTO tab_game_server VALUES(1,'lx',1,'001','龙翔一区',100),(2,'hw',1,'001','汇玩一区',200),(3,'lx',2,'001','游戏乙一区',300),(4,'yq',1,'001','无权区服',400)",
|
|
"CREATE TABLE tab_sw_report_server_day(source_db TEXT,game_id INTEGER,game_name TEXT,promote_id INTEGER,server_num TEXT,stat_date DATE,dedup_mode INTEGER,total_pay DECIMAL(20,2))",
|
|
"INSERT INTO tab_sw_report_server_day VALUES('lx',1,'历史游戏',100,'001','2026-11-04',0,10),('lx',1,'历史游戏',101,'001','2026-11-04',0,20),('hw',1,'历史游戏',100,'001','2026-11-04',0,40),('yq',1,'历史游戏',100,'001','2026-11-04',0,999),('lx',1,'历史游戏',100,'001','2026-11-04',1,9999),('lx',1,'历史游戏',0,'official','2026-11-04',0,5),('lx',1,'历史游戏',100,'','2026-11-04',0,9999)",
|
|
"CREATE TABLE tab_sw_report_server_day_key(source_db TEXT,game_id INTEGER,game_name TEXT,promote_id INTEGER,server_num TEXT,stat_date DATE,dedup_mode INTEGER,metric INTEGER,identity_key TEXT)",
|
|
"INSERT INTO tab_sw_report_server_day_key VALUES('lx',1,'历史游戏',100,'001','2026-11-04',1,1,'A'),('lx',1,'历史游戏',101,'001','2026-11-04',1,1,'A'),('lx',1,'历史游戏',100,'001','2026-11-04',0,1,'1'),('lx',1,'历史游戏',101,'001','2026-11-04',0,1,'2'),('hw',1,'历史游戏',100,'001','2026-11-04',1,1,'A'),('lx',2,'游戏乙',100,'001','2026-11-04',1,1,'B')",
|
|
} {
|
|
if err := db.Exec(sql).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
r := NewServerAnalysisRepo(testData{db})
|
|
ctx := context.Background()
|
|
s := business.AnalyticsScope{Viewer: channelTestScope(), IncludeSub: true, IDCardDedup: true}
|
|
f := business.ServerAnalysisFilter{AnalyticsFilter: business.AnalyticsFilter{Sources: []string{"lx", "hw", "yq"}, GameNames: []string{"历史游戏", "游戏乙"}, Begin: "2026-11-04", End: "2026-11-04"}}
|
|
p, err := r.Aggregate(ctx, s, f)
|
|
if err != nil || len(p.Rows) != 3 {
|
|
t.Fatalf("区服范围错误: %+v %v", p, err)
|
|
}
|
|
for _, row := range p.Rows {
|
|
switch {
|
|
case row.SourceDB == "lx" && row.GameID == 1:
|
|
if row.GameName != "历史游戏" || row.ServerName != "龙翔一区" || row.OpenTime == nil || *row.OpenTime != 100 || row.Counts.Register != 1 || portraitTestMoney(row.Pay) != "30.00" {
|
|
t.Fatalf("去重、资料或金额错误: %+v", row)
|
|
}
|
|
case row.SourceDB == "hw":
|
|
if row.ServerName != "汇玩一区" || portraitTestMoney(row.Pay) != "40.00" {
|
|
t.Fatalf("跨平台同号串联: %+v", row)
|
|
}
|
|
case row.GameID == 2:
|
|
if row.GameName != "游戏乙" || row.ServerName != "游戏乙一区" {
|
|
t.Fatalf("只有人数的行应补当前游戏名: %+v", row)
|
|
}
|
|
default:
|
|
t.Fatalf("出现无权行: %+v", row)
|
|
}
|
|
}
|
|
s.IDCardDedup = false
|
|
f.Sources = []string{"lx"}
|
|
f.GameNames = []string{"历史游戏"}
|
|
p, err = r.Aggregate(ctx, s, f)
|
|
if err != nil || len(p.Rows) != 1 || p.Rows[0].Counts.Register != 2 || portraitTestMoney(p.Rows[0].Pay) != "30.00" {
|
|
t.Fatal("身份证偏好影响了金额或未切换人数")
|
|
}
|
|
s.IncludeSub = false
|
|
p, err = r.Aggregate(ctx, s, f)
|
|
if err != nil || p.Rows[0].Counts.Register != 1 || portraitTestMoney(p.Rows[0].Pay) != "10.00" {
|
|
t.Fatal("下级开关未生效")
|
|
}
|
|
s = business.AnalyticsScope{Viewer: business.UserScope{All: true}, IncludeSub: true, IDCardDedup: true}
|
|
p, err = r.Aggregate(ctx, s, f)
|
|
if err != nil || len(p.Rows) != 2 {
|
|
t.Fatal("超管漏掉官方区服流水")
|
|
}
|
|
f.ServerNum = "001"
|
|
p, err = r.Aggregate(ctx, s, f)
|
|
if err != nil || len(p.Rows) != 1 {
|
|
t.Fatal("区服编号筛选错误")
|
|
}
|
|
options, err := r.Servers(ctx, []string{"lx"}, []string{"游戏甲"}, "一区", 50)
|
|
if err != nil || len(options) != 1 || options[0].Number != "001" || options[0].Name != "龙翔一区" {
|
|
t.Fatal("选项应按当前游戏名、同平台游戏关联及区服名称筛选")
|
|
}
|
|
f.GameNames = []string{"游戏甲"}
|
|
p, err = r.Aggregate(ctx, s, f)
|
|
if err != nil || len(p.Rows) != 0 {
|
|
t.Fatal("报表必须按快照游戏名筛选")
|
|
}
|
|
if err := db.Exec("DROP TABLE tab_sw_report_server_day_key").Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
p, err = r.Aggregate(ctx, s, f)
|
|
if err != nil || p.Available {
|
|
t.Fatal("缺身份表应明确未接入")
|
|
}
|
|
}
|
|
|
|
func TestServerOptionsPreservePlatformFilterAndDoNotDuplicateMatches(t *testing.T) {
|
|
db := openTestDB(t)
|
|
for _, sql := range []string{
|
|
"CREATE TABLE tab_game(id INTEGER,source_db TEXT,game_name TEXT)",
|
|
"INSERT INTO tab_game VALUES(1,'lx','甲'),(1,'lx','甲'),(1,'hw','乙'),(2,'lx','乙')",
|
|
"CREATE TABLE tab_game_server(id INTEGER,source_db TEXT,game_id INTEGER,server_num TEXT,server_name TEXT,start_time INTEGER)",
|
|
"INSERT INTO tab_game_server VALUES(1,'lx',1,'001','一区',100),(2,'lx',1,'002','二区',200),(3,'hw',1,'001','其他平台',300),(4,'lx',2,'001','其他游戏',400)",
|
|
} {
|
|
if err := db.Exec(sql).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
repo := NewServerAnalysisRepo(testData{db})
|
|
rows, err := repo.Servers(context.Background(), nil, []string{"甲"}, "", 100)
|
|
if err != nil || len(rows) != 2 || rows[0].Name != "一区" || rows[1].Number != "002" {
|
|
t.Fatalf("相同游戏资料不能扩增区服,异平台同号不能匹配: %+v %v", rows, err)
|
|
}
|
|
rows, err = repo.Servers(context.Background(), []string{"lx"}, []string{"甲", "乙"}, "区", 1)
|
|
if err != nil || len(rows) != 1 || rows[0].Name != "一区" {
|
|
t.Fatalf("名称筛选、排序或数量限制改变: %+v %v", rows, err)
|
|
}
|
|
rows, err = repo.Servers(context.Background(), []string{"hw"}, []string{"甲"}, "", 100)
|
|
if err != nil || len(rows) != 0 {
|
|
t.Fatalf("平台筛选被忽略: %+v %v", rows, err)
|
|
}
|
|
}
|