203 lines
6.4 KiB
Go
203 lines
6.4 KiB
Go
package threshold_activity
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"bindbox-game/internal/repository/mysql"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func newThresholdTestService(t *testing.T) (*service, mysql.Repo, *gorm.DB) {
|
|
t.Helper()
|
|
repo, err := mysql.NewSQLiteRepoForTest()
|
|
if err != nil {
|
|
t.Fatalf("create sqlite repo failed: %v", err)
|
|
}
|
|
db := repo.GetDbW()
|
|
initThresholdTestTables(t, db)
|
|
return &service{repo: repo}, repo, db
|
|
}
|
|
|
|
func initThresholdTestTables(t *testing.T, db *gorm.DB) {
|
|
t.Helper()
|
|
stmts := []string{
|
|
`CREATE TABLE threshold_activities (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
title TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
qualification_mode TEXT NOT NULL,
|
|
spend_threshold_amount INTEGER NOT NULL DEFAULT 0,
|
|
invite_threshold_count INTEGER NOT NULL DEFAULT 0,
|
|
invite_effective_amount INTEGER NOT NULL DEFAULT 0,
|
|
min_participants INTEGER NOT NULL DEFAULT 1,
|
|
start_time DATETIME NOT NULL,
|
|
end_time DATETIME NOT NULL,
|
|
draw_time DATETIME NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'active',
|
|
description TEXT,
|
|
cover_image TEXT,
|
|
draw_batch TEXT NOT NULL DEFAULT '',
|
|
abort_reason TEXT NOT NULL DEFAULT '',
|
|
aborted_at DATETIME,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
deleted_at DATETIME
|
|
);`,
|
|
`CREATE TABLE threshold_activity_prizes (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
activity_id INTEGER NOT NULL,
|
|
reward_type TEXT NOT NULL,
|
|
reward_ref_id INTEGER NOT NULL,
|
|
reward_name_snapshot TEXT NOT NULL DEFAULT '',
|
|
reward_image_snapshot TEXT NOT NULL DEFAULT '',
|
|
reward_value_snapshot_cents INTEGER NOT NULL DEFAULT 0,
|
|
cost_snapshot_cents INTEGER NOT NULL DEFAULT 0,
|
|
quantity INTEGER NOT NULL DEFAULT 0,
|
|
remaining_quantity INTEGER NOT NULL DEFAULT 0,
|
|
sort INTEGER NOT NULL DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);`,
|
|
`CREATE TABLE threshold_activity_participants (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
activity_id INTEGER NOT NULL,
|
|
user_id INTEGER NOT NULL,
|
|
period_key TEXT NOT NULL,
|
|
qualification_source TEXT NOT NULL DEFAULT '',
|
|
paid_amount_snapshot INTEGER NOT NULL DEFAULT 0,
|
|
effective_invite_count_snapshot INTEGER NOT NULL DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(activity_id, user_id, period_key)
|
|
);`,
|
|
`CREATE TABLE threshold_activity_winners (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
activity_id INTEGER NOT NULL,
|
|
prize_id INTEGER NOT NULL,
|
|
reward_type TEXT NOT NULL,
|
|
reward_ref_id INTEGER NOT NULL,
|
|
prize_name_snapshot TEXT NOT NULL DEFAULT '',
|
|
prize_image_snapshot TEXT NOT NULL DEFAULT '',
|
|
prize_value_snapshot_cents INTEGER NOT NULL DEFAULT 0,
|
|
user_id INTEGER NOT NULL,
|
|
grant_record_type TEXT NOT NULL DEFAULT '',
|
|
grant_record_id INTEGER NOT NULL DEFAULT 0,
|
|
cost_cents INTEGER NOT NULL DEFAULT 0,
|
|
draw_batch TEXT NOT NULL DEFAULT '',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(activity_id, user_id)
|
|
);`,
|
|
`CREATE TABLE users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
nickname TEXT,
|
|
avatar TEXT,
|
|
invite_code TEXT,
|
|
inviter_id INTEGER NOT NULL DEFAULT 0,
|
|
status INTEGER NOT NULL DEFAULT 1,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
deleted_at DATETIME
|
|
);`,
|
|
`CREATE TABLE user_invites (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
inviter_id INTEGER NOT NULL,
|
|
invitee_id INTEGER NOT NULL,
|
|
invite_code TEXT NOT NULL DEFAULT '',
|
|
reward_points INTEGER NOT NULL DEFAULT 0,
|
|
rewarded_at DATETIME,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
deleted_at DATETIME,
|
|
is_effective BOOLEAN NOT NULL DEFAULT 0,
|
|
accumulated_amount INTEGER NOT NULL DEFAULT 0
|
|
);`,
|
|
`CREATE TABLE orders (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
user_id INTEGER NOT NULL,
|
|
order_no TEXT NOT NULL,
|
|
source_type INTEGER NOT NULL DEFAULT 1,
|
|
total_amount INTEGER NOT NULL DEFAULT 0,
|
|
discount_amount INTEGER NOT NULL DEFAULT 0,
|
|
points_amount INTEGER NOT NULL DEFAULT 0,
|
|
actual_amount INTEGER NOT NULL DEFAULT 0,
|
|
status INTEGER NOT NULL DEFAULT 1,
|
|
pay_preorder_id INTEGER NOT NULL DEFAULT 0,
|
|
paid_at DATETIME,
|
|
cancelled_at DATETIME,
|
|
user_address_id INTEGER NOT NULL DEFAULT 0,
|
|
is_consumed INTEGER NOT NULL DEFAULT 0,
|
|
points_ledger_id INTEGER NOT NULL DEFAULT 0,
|
|
coupon_id INTEGER NOT NULL DEFAULT 0,
|
|
item_card_id INTEGER NOT NULL DEFAULT 0,
|
|
remark TEXT,
|
|
ext_order_id TEXT NOT NULL DEFAULT ''
|
|
);`,
|
|
`CREATE TABLE products (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT,
|
|
price INTEGER NOT NULL,
|
|
cost_price INTEGER NOT NULL DEFAULT 0,
|
|
stock INTEGER NOT NULL,
|
|
images_json TEXT,
|
|
updated_at DATETIME,
|
|
deleted_at DATETIME
|
|
);`,
|
|
`CREATE TABLE order_items (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
order_id INTEGER NOT NULL,
|
|
product_id INTEGER NOT NULL,
|
|
title TEXT,
|
|
quantity INTEGER NOT NULL DEFAULT 1,
|
|
price INTEGER NOT NULL DEFAULT 0,
|
|
total_amount INTEGER NOT NULL DEFAULT 0,
|
|
product_images TEXT,
|
|
status INTEGER NOT NULL DEFAULT 1
|
|
);`,
|
|
`CREATE TABLE user_inventory (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
user_id INTEGER NOT NULL,
|
|
product_id INTEGER NOT NULL,
|
|
value_cents INTEGER NOT NULL DEFAULT 0,
|
|
value_source INTEGER NOT NULL DEFAULT 0,
|
|
value_snapshot_at DATETIME,
|
|
order_id INTEGER NOT NULL DEFAULT 0,
|
|
activity_id INTEGER NOT NULL DEFAULT 0,
|
|
reward_id INTEGER NOT NULL DEFAULT 0,
|
|
status INTEGER NOT NULL DEFAULT 1,
|
|
shipping_no TEXT NOT NULL DEFAULT '',
|
|
remark TEXT
|
|
);`,
|
|
}
|
|
for _, stmt := range stmts {
|
|
if err := db.Exec(stmt).Error; err != nil {
|
|
t.Fatalf("create table failed: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func mustExec(t *testing.T, db *gorm.DB, sql string, args ...any) {
|
|
t.Helper()
|
|
if err := db.Exec(sql, args...).Error; err != nil {
|
|
t.Fatalf("exec failed: %v, sql=%s", err, sql)
|
|
}
|
|
}
|
|
|
|
func mustInsertActivity(t *testing.T, db *gorm.DB, activity Activity) {
|
|
t.Helper()
|
|
if activity.CreatedAt.IsZero() {
|
|
activity.CreatedAt = time.Now()
|
|
}
|
|
if activity.UpdatedAt.IsZero() {
|
|
activity.UpdatedAt = activity.CreatedAt
|
|
}
|
|
if err := db.Create(&activity).Error; err != nil {
|
|
t.Fatalf("insert activity failed: %v", err)
|
|
}
|
|
}
|