增加渠道上传预统计
This commit is contained in:
@@ -319,6 +319,34 @@ func TestApplySellerListingPriceKeepsFallbackPrice(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyPublicListingURLsHidesSourceChannel(t *testing.T) {
|
||||
item := &ListingDTO{
|
||||
ID: 1,
|
||||
Status: "published",
|
||||
ReviewStatus: "approved",
|
||||
SourceChannel: "淘宝",
|
||||
ScreenshotURLS: []string{
|
||||
"https://example.com/account.png",
|
||||
},
|
||||
AssetSummary: map[string]any{
|
||||
"import_meta": map[string]any{"uploader_name": "客服1"},
|
||||
"price_breakdown": map[string]any{"buyer_total_price": 100},
|
||||
},
|
||||
}
|
||||
|
||||
applyPublicListingURLs(item)
|
||||
|
||||
if item.SourceChannel != "" {
|
||||
t.Fatalf("expected public listing source channel hidden, got %q", item.SourceChannel)
|
||||
}
|
||||
if _, ok := item.AssetSummary["import_meta"]; ok {
|
||||
t.Fatal("expected import_meta hidden from public listing")
|
||||
}
|
||||
if _, ok := item.AssetSummary["price_breakdown"]; ok {
|
||||
t.Fatal("expected price_breakdown hidden from public listing")
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseExternalUploadItemsAcceptsSingleObject(t *testing.T) {
|
||||
items, err := parseExternalUploadItems(json.RawMessage(validExternalUploadDataJSON()))
|
||||
if err != nil {
|
||||
@@ -346,18 +374,118 @@ func TestParseExternalUploadItemsReportsMissingFields(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestImportExternalUploadStoresSourceChannel(t *testing.T) {
|
||||
db := database.NewTestDB()
|
||||
if err := database.MigrateListingLifecycleTestSchema(db); err != nil {
|
||||
t.Fatalf("failed to migrate test db: %v", err)
|
||||
}
|
||||
if err := db.AutoMigrate(&model.AdminUser{}, &model.ListingUpload{}); err != nil {
|
||||
t.Fatalf("failed to migrate upload tables: %v", err)
|
||||
}
|
||||
admin := model.AdminUser{
|
||||
Username: "客服1",
|
||||
PasswordHash: "hash",
|
||||
Nickname: "客服1",
|
||||
Status: "active",
|
||||
}
|
||||
if err := db.Create(&admin).Error; err != nil {
|
||||
t.Fatalf("failed to create admin: %v", err)
|
||||
}
|
||||
|
||||
service := NewService(NewRepository(db, nil), nil)
|
||||
resp, err := service.ImportExternalUpload(t.Context(), ExternalUploadRequest{
|
||||
UploaderName: "客服1",
|
||||
SourceChannel: "淘宝",
|
||||
Data: json.RawMessage(validExternalUploadDataJSON()),
|
||||
}, ExternalUploadMeta{})
|
||||
if err != nil {
|
||||
t.Fatalf("ImportExternalUpload() error = %v", err)
|
||||
}
|
||||
if resp.Success != 1 || resp.ListingID == 0 {
|
||||
t.Fatalf("unexpected response: %#v", resp)
|
||||
}
|
||||
|
||||
var upload model.ListingUpload
|
||||
if err := db.Where("listing_id = ?", resp.ListingID).First(&upload).Error; err != nil {
|
||||
t.Fatalf("failed to find listing upload: %v", err)
|
||||
}
|
||||
if upload.SourceChannel != "淘宝" {
|
||||
t.Fatalf("source channel = %q, want 淘宝", upload.SourceChannel)
|
||||
}
|
||||
}
|
||||
|
||||
func TestListPendingReviewIncludesSourceChannel(t *testing.T) {
|
||||
db := database.NewTestDB()
|
||||
if err := database.MigrateListingLifecycleTestSchema(db); err != nil {
|
||||
t.Fatalf("failed to migrate test db: %v", err)
|
||||
}
|
||||
if err := db.AutoMigrate(&model.ListingUpload{}); err != nil {
|
||||
t.Fatalf("failed to migrate listing uploads: %v", err)
|
||||
}
|
||||
user := model.User{Phone: "18800000001", RealnameStatus: "verified", Status: "active"}
|
||||
if err := db.Create(&user).Error; err != nil {
|
||||
t.Fatalf("failed to create user: %v", err)
|
||||
}
|
||||
account := model.GameAccount{
|
||||
OwnerID: user.ID,
|
||||
GameName: "delta_force",
|
||||
ServerRegion: "QQ",
|
||||
LoginPlatform: "QQ账号密码",
|
||||
Title: "待审核账号",
|
||||
RankLevel: "黑鹰",
|
||||
Status: "draft",
|
||||
}
|
||||
if err := db.Create(&account).Error; err != nil {
|
||||
t.Fatalf("failed to create account: %v", err)
|
||||
}
|
||||
listing := model.RentalListing{
|
||||
ListingNo: "202607250001",
|
||||
AccountID: account.ID,
|
||||
OwnerID: user.ID,
|
||||
PriceCent: 10000,
|
||||
DepositAmountCent: 50000,
|
||||
Status: "draft",
|
||||
ReviewStatus: "pending",
|
||||
}
|
||||
if err := db.Create(&listing).Error; err != nil {
|
||||
t.Fatalf("failed to create listing: %v", err)
|
||||
}
|
||||
listingID := listing.ID
|
||||
if err := db.Create(&model.ListingUpload{
|
||||
UploaderName: "客服1",
|
||||
SourceChannel: "淘宝",
|
||||
OwnerID: &user.ID,
|
||||
ListingID: &listingID,
|
||||
Status: "draft_created",
|
||||
}).Error; err != nil {
|
||||
t.Fatalf("failed to create listing upload: %v", err)
|
||||
}
|
||||
|
||||
items, err := NewRepository(db, nil).ListPendingReview(t.Context())
|
||||
if err != nil {
|
||||
t.Fatalf("ListPendingReview() error = %v", err)
|
||||
}
|
||||
if len(items) != 1 {
|
||||
t.Fatalf("expected 1 pending listing, got %d", len(items))
|
||||
}
|
||||
if items[0].SourceChannel != "淘宝" {
|
||||
t.Fatalf("source channel = %q, want 淘宝", items[0].SourceChannel)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExternalAccountToCreateRequestMapsUploadFields(t *testing.T) {
|
||||
req := externalAccountToCreateRequest("客服1", 1772526103000, ExternalAccountData{
|
||||
LoginMethod: "QQ账号密码",
|
||||
Rank: "黑鹰",
|
||||
Level: 60,
|
||||
SafeSlots: 9,
|
||||
SecretKD: 1.6,
|
||||
DailyLossM: 7,
|
||||
Deposit: 400,
|
||||
BanRecord: "有",
|
||||
CommonRegion: "郑州",
|
||||
Remark: "有语音封禁\n封禁历史:2026/01/23封禁3天",
|
||||
LoginMethod: "QQ账号密码",
|
||||
Rank: "黑鹰",
|
||||
Level: 60,
|
||||
SafeSlots: 9,
|
||||
SecretKD: 1.6,
|
||||
DailyLossM: 7,
|
||||
Deposit: 400,
|
||||
BanRecord: "有",
|
||||
CommonRegion: "郑州",
|
||||
OwnerOnlineTime: "8:00-1:00",
|
||||
Remark: "有语音封禁\n封禁历史:2026/01/23封禁3天",
|
||||
Currency: ExternalUploadCurrency{
|
||||
HafuCoin: 197.1,
|
||||
RecycleRatio: 43,
|
||||
@@ -399,6 +527,16 @@ func TestExternalAccountToCreateRequestMapsUploadFields(t *testing.T) {
|
||||
if req.AssetSummary["stamina_level"] != "7级" || req.AssetSummary["load_level"] != "7级" {
|
||||
t.Fatalf("unexpected stamina/load: %#v", req.AssetSummary)
|
||||
}
|
||||
if req.AssetSummary["online_time_text"] != "08:00 至 01:00" {
|
||||
t.Fatalf("online_time_text = %#v", req.AssetSummary["online_time_text"])
|
||||
}
|
||||
onlineTime, ok := req.AssetSummary["online_time"].(map[string]any)
|
||||
if !ok {
|
||||
t.Fatalf("online_time missing: %#v", req.AssetSummary["online_time"])
|
||||
}
|
||||
if onlineTime["start"] != "08:00" || onlineTime["end"] != "01:00" {
|
||||
t.Fatalf("online_time = %#v", onlineTime)
|
||||
}
|
||||
groups := req.AssetSummary["skin_groups"].(map[string][]string)
|
||||
if len(groups["melee"]) != 2 {
|
||||
t.Fatalf("expected melee skins mapped, got %#v", groups)
|
||||
|
||||
Reference in New Issue
Block a user