Files
hfb_sys/backend/internal/modules/adtracking/service_test.go
T
yml2213 2b11d70ebe feat(adtracking): 新增推广链接追踪与数据大盘,支持自定义短码、注册与下单归因及二维码物料生成
1. 数据库新增 000064_ad_tracking.sql 迁移,创建 ad_tracking_links 和 ad_tracking_clicks 表,并在 users、rental_orders 增加归因字段
2. 后端新增 adtracking 模块,挂载 GET /r/:code 302 智能重定向、点击流水异步记录、转化率/GMV聚合统计及管理接口
3. 用户认证 (auth) 与订单创建 (order) 链路贯通,实现注册用户与订单成交推广短码全链路归因
4. 前端管理后台左侧新增【推广追踪】目录,支持大盘指标总览、推广链接 CRUD、状态启停、一键复制短链及二维码下载 (PNG)
2026-09-10 11:05:47 +08:00

91 lines
2.4 KiB
Go

package adtracking
import (
"testing"
)
func TestAppendTrackCode(t *testing.T) {
tests := []struct {
target string
code string
expected string
}{
{
target: "https://hao858.com",
code: "wb01",
expected: "https://hao858.com?track_code=wb01",
},
{
target: "https://hao858.com/",
code: "campus99",
expected: "https://hao858.com/?track_code=campus99",
},
{
target: "https://hao858.com/listings?game=delta",
code: "poster01",
expected: "https://hao858.com/listings?game=delta&track_code=poster01",
},
}
for _, tt := range tests {
got := appendTrackCode(tt.target, tt.code)
if got != tt.expected {
t.Errorf("appendTrackCode(%q, %q) = %q; want %q", tt.target, tt.code, got, tt.expected)
}
}
}
func TestParseUserAgent(t *testing.T) {
tests := []struct {
ua string
wantDeviceType string
wantOS string
wantBrowser string
}{
{
ua: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
wantDeviceType: "pc",
wantOS: "macOS",
wantBrowser: "Chrome",
},
{
ua: "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.38",
wantDeviceType: "mobile",
wantOS: "iOS",
wantBrowser: "WeChat",
},
{
ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
wantDeviceType: "pc",
wantOS: "Windows",
wantBrowser: "Edge",
},
}
for _, tt := range tests {
deviceType, _, browser := parseUserAgent(tt.ua)
if deviceType != tt.wantDeviceType {
t.Errorf("parseUserAgent(%q) deviceType = %q; want %q", tt.ua, deviceType, tt.wantDeviceType)
}
if browser != tt.wantBrowser {
t.Errorf("parseUserAgent(%q) browser = %q; want %q", tt.ua, browser, tt.wantBrowser)
}
}
}
func TestCodePattern(t *testing.T) {
validCodes := []string{"wb01", "campus_2026", "poster-hefei", "NetBar99"}
for _, c := range validCodes {
if !codePattern.MatchString(c) {
t.Errorf("expected valid code %q", c)
}
}
invalidCodes := []string{"a", "has space", "bad@code", "中文短码", "a!b"}
for _, c := range invalidCodes {
if codePattern.MatchString(c) {
t.Errorf("expected invalid code %q", c)
}
}
}