2026-04-27 19:12:00 +08:00

195 lines
6.0 KiB
Go

package weekstar
import (
"context"
"encoding/json"
"strings"
"testing"
"time"
"chatapp3-golang/internal/config"
"chatapp3-golang/internal/integration"
"chatapp3-golang/internal/model"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type weekStarTestGateway struct{}
func (g weekStarTestGateway) GetRewardGroupDetail(_ context.Context, groupID int64) (integration.RewardGroupDetail, error) {
if groupID < 2004471533988167125 || groupID > 2004471533988167127 {
return integration.RewardGroupDetail{ID: integration.Int64Value(groupID)}, nil
}
return integration.RewardGroupDetail{
ID: integration.Int64Value(groupID),
Name: "Top Reward",
RewardConfigList: []integration.RewardGroupItem{
{
ID: 2004471533988167001,
Type: "PROPS",
Name: "Frame",
Content: "1001",
Quantity: 7,
Cover: "https://example.com/frame.png",
},
},
}, nil
}
func (g weekStarTestGateway) GetUserProfile(context.Context, int64) (integration.UserProfile, error) {
return integration.UserProfile{}, nil
}
func newTestWeekStarService(t *testing.T) (*WeekStarService, *gorm.DB) {
t.Helper()
dbName := strings.NewReplacer("/", "_", " ", "_").Replace(t.Name())
db, err := gorm.Open(sqlite.Open("file:"+dbName+"?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("open sqlite: %v", err)
}
if err := db.AutoMigrate(
&model.WeekStarActivityConfig{},
&model.WeekStarActivityGiftConfig{},
&model.WeekStarActivityRewardConfig{},
); err != nil {
t.Fatalf("auto migrate: %v", err)
}
service := NewWeekStarService(config.Config{
WeekStar: config.WeekStarConfig{
DefaultSysOrigin: "LIKEI",
Timezone: "Asia/Riyadh",
},
}, db, nil, weekStarTestGateway{})
return service, db
}
func TestSaveWeekStarConfigRequestPreservesStringIDs(t *testing.T) {
const longID int64 = 2004471533988167125
var req SaveWeekStarConfigRequest
if err := json.Unmarshal([]byte(`{
"id": "2004471533988167125",
"giftConfigs": [{"giftId": "2004471533988167125"}],
"rewardConfigs": [{"rank": 1, "rewardGroupId": "2004471533988167125"}]
}`), &req); err != nil {
t.Fatalf("Unmarshal() error = %v", err)
}
if req.ID.Int64() != longID {
t.Fatalf("req.ID = %d, want %d", req.ID.Int64(), longID)
}
if req.GiftConfigs[0].GiftID.Int64() != longID {
t.Fatalf("giftId = %d, want %d", req.GiftConfigs[0].GiftID.Int64(), longID)
}
if req.RewardConfigs[0].RewardGroupID.Int64() != longID {
t.Fatalf("rewardGroupId = %d, want %d", req.RewardConfigs[0].RewardGroupID.Int64(), longID)
}
}
func TestWeekStarConfigResponseSerializesLongIDsAsStrings(t *testing.T) {
const longID int64 = 2004471533988167125
data, err := json.Marshal(WeekStarConfigResponse{
ID: longID,
GiftConfigs: []WeekStarGiftConfigPayload{
{GiftID: longID},
},
RewardConfigs: []WeekStarRewardConfigPayload{
{Rank: 1, RewardGroupID: longID},
},
})
if err != nil {
t.Fatalf("Marshal() error = %v", err)
}
jsonText := string(data)
for _, want := range []string{
`"id":"2004471533988167125"`,
`"giftId":"2004471533988167125"`,
`"rewardGroupId":"2004471533988167125"`,
} {
if !strings.Contains(jsonText, want) {
t.Fatalf("json = %s, want contains %s", jsonText, want)
}
}
}
func TestSaveConfigAllowsCurrentWeekWhenNoActiveConfigExists(t *testing.T) {
service, _ := newTestWeekStarService(t)
now := time.Now().In(service.location)
cycleStart, cycleEnd := service.cycleBounds(now)
resp, err := service.SaveConfig(context.Background(), SaveWeekStarConfigRequest{
SysOrigin: "LIKEI",
Enabled: true,
StartAt: formatDateTime(cycleStart),
EndAt: formatDateTime(cycleEnd),
Timezone: "Asia/Riyadh",
GiftConfigs: []WeekStarGiftConfigInput{
{GiftID: flexibleInt64(101), GiftName: "Gift 1", Sort: 1},
{GiftID: flexibleInt64(102), GiftName: "Gift 2", Sort: 2},
{GiftID: flexibleInt64(103), GiftName: "Gift 3", Sort: 3},
},
RewardConfigs: []WeekStarRewardConfigInput{
{Rank: 1, RewardGroupID: flexibleInt64(2004471533988167125), RewardGroupName: "Top1"},
{Rank: 2, RewardGroupID: flexibleInt64(2004471533988167126), RewardGroupName: "Top2"},
{Rank: 3, RewardGroupID: flexibleInt64(2004471533988167127), RewardGroupName: "Top3"},
},
})
if err != nil {
t.Fatalf("SaveConfig() error = %v", err)
}
if resp == nil || !resp.Configured || resp.Status != weekStarActivityStatusOngoing {
t.Fatalf("SaveConfig() response = %#v, want ongoing configured response", resp)
}
if got := resp.RewardConfigs[0].RewardGroupID; got != 2004471533988167125 {
t.Fatalf("rewardGroupId = %d, want exact long id", got)
}
if len(resp.RewardConfigs[0].Items) != 1 {
t.Fatalf("reward items length = %d, want 1", len(resp.RewardConfigs[0].Items))
}
}
func TestSaveConfigRejectsCurrentWeekWhenActiveConfigExists(t *testing.T) {
service, db := newTestWeekStarService(t)
now := time.Now().In(service.location)
cycleStart, cycleEnd := service.cycleBounds(now)
if err := db.Create(&model.WeekStarActivityConfig{
ID: 1,
SysOrigin: "LIKEI",
Enabled: true,
StartAt: service.toStorageWallClock(cycleStart),
EndAt: service.toStorageWallClock(cycleEnd),
Timezone: "Asia/Riyadh",
CreateTime: now,
UpdateTime: now,
}).Error; err != nil {
t.Fatalf("seed active config: %v", err)
}
_, err := service.SaveConfig(context.Background(), SaveWeekStarConfigRequest{
SysOrigin: "LIKEI",
Enabled: true,
StartAt: formatDateTime(cycleStart),
EndAt: formatDateTime(cycleEnd),
Timezone: "Asia/Riyadh",
GiftConfigs: []WeekStarGiftConfigInput{
{GiftID: flexibleInt64(101), GiftName: "Gift 1", Sort: 1},
{GiftID: flexibleInt64(102), GiftName: "Gift 2", Sort: 2},
{GiftID: flexibleInt64(103), GiftName: "Gift 3", Sort: 3},
},
RewardConfigs: []WeekStarRewardConfigInput{
{Rank: 1, RewardGroupID: flexibleInt64(2004471533988167125), RewardGroupName: "Top1"},
{Rank: 2, RewardGroupID: flexibleInt64(2004471533988167126), RewardGroupName: "Top2"},
{Rank: 3, RewardGroupID: flexibleInt64(2004471533988167127), RewardGroupName: "Top3"},
},
})
if err == nil {
t.Fatalf("SaveConfig() error = nil, want overlap error")
}
}