2026-05-19 15:17:47 +08:00

141 lines
4.7 KiB
Go

package roomturnoverreward
import (
"context"
"testing"
"time"
"chatapp3-golang/internal/common"
"chatapp3-golang/internal/model"
)
func TestGetClaimStatusReturnsClaimableRecordWhenAutoRewardDisabled(t *testing.T) {
service, db := newTestService(t)
ctx := context.Background()
autoRewardEnabled := false
configResp, err := service.SaveConfig(ctx, SaveRoomTurnoverRewardConfigRequest{
SysOrigin: "LIKEI",
Enabled: true,
AutoRewardEnabled: &autoRewardEnabled,
Timezone: "Asia/Riyadh",
LevelConfigs: []RoomTurnoverRewardLevelInput{
{Level: 1, TurnoverThreshold: 100000, RewardGold: 2000, Enabled: true},
},
})
if err != nil {
t.Fatalf("SaveConfig() error = %v", err)
}
record := seedRoomTurnoverRewardRecord(t, db, configResp.ID, roomTurnoverRewardStatusPending)
resp, err := service.GetClaimStatus(ctx, common.AuthUser{UserID: record.OwnerUserID, SysOrigin: "LIKEI"})
if err != nil {
t.Fatalf("GetClaimStatus() error = %v", err)
}
if !resp.CanClaim || resp.Reason != "available" || resp.Record == nil || resp.Record.ID != record.ID {
t.Fatalf("claim status = %+v", resp)
}
}
func TestGetClaimStatusDisablesButtonWhenAutoRewardEnabled(t *testing.T) {
service, db := newTestService(t)
ctx := context.Background()
configResp, err := service.SaveConfig(ctx, SaveRoomTurnoverRewardConfigRequest{
SysOrigin: "LIKEI",
Enabled: true,
Timezone: "Asia/Riyadh",
LevelConfigs: []RoomTurnoverRewardLevelInput{
{Level: 1, TurnoverThreshold: 100000, RewardGold: 2000, Enabled: true},
},
})
if err != nil {
t.Fatalf("SaveConfig() error = %v", err)
}
record := seedRoomTurnoverRewardRecord(t, db, configResp.ID, roomTurnoverRewardStatusPending)
resp, err := service.GetClaimStatus(ctx, common.AuthUser{UserID: record.OwnerUserID, SysOrigin: "LIKEI"})
if err != nil {
t.Fatalf("GetClaimStatus() error = %v", err)
}
if resp.CanClaim || resp.Reason != "auto_reward_enabled" {
t.Fatalf("claim status = %+v", resp)
}
}
func TestClaimRewardDispatchesGoldAndMarksRecordSuccess(t *testing.T) {
service, db := newTestService(t)
gateway := &stubRoomTurnoverRewardJavaGateway{}
service.repo.Java = gateway
ctx := context.Background()
autoRewardEnabled := false
configResp, err := service.SaveConfig(ctx, SaveRoomTurnoverRewardConfigRequest{
SysOrigin: "LIKEI",
Enabled: true,
AutoRewardEnabled: &autoRewardEnabled,
Timezone: "Asia/Riyadh",
LevelConfigs: []RoomTurnoverRewardLevelInput{
{Level: 1, TurnoverThreshold: 100000, RewardGold: 2000, Enabled: true},
},
})
if err != nil {
t.Fatalf("SaveConfig() error = %v", err)
}
record := seedRoomTurnoverRewardRecord(t, db, configResp.ID, roomTurnoverRewardStatusPending)
resp, err := service.ClaimReward(ctx, common.AuthUser{UserID: record.OwnerUserID, SysOrigin: "LIKEI"}, RoomTurnoverRewardClaimRequest{
RecordID: flexibleInt64(record.ID),
})
if err != nil {
t.Fatalf("ClaimReward() error = %v", err)
}
if !resp.Claimed || resp.Record.Status != roomTurnoverRewardStatusSuccess || resp.Record.SentAt == "" {
t.Fatalf("claim response = %+v", resp)
}
if len(gateway.changed) != 1 {
t.Fatalf("wallet change count = %d, want 1", len(gateway.changed))
}
if got := gateway.changed[0]; got.EventID != record.TrackID || got.UserID != record.OwnerUserID || got.Amount.DollarAmount != record.RewardGold {
t.Fatalf("wallet command = %+v", got)
}
if len(gateway.markedIDs) != 1 || gateway.markedIDs[0] != record.SourceID {
t.Fatalf("marked IDs = %+v", gateway.markedIDs)
}
var saved model.RoomTurnoverRewardRecord
if err := db.Where("id = ?", record.ID).First(&saved).Error; err != nil {
t.Fatalf("load saved record: %v", err)
}
if saved.Status != roomTurnoverRewardStatusSuccess || saved.SentAt == nil {
t.Fatalf("saved record = %+v", saved)
}
}
func seedRoomTurnoverRewardRecord(t *testing.T, db roomTurnoverRewardDB, configID int64, status string) model.RoomTurnoverRewardRecord {
t.Helper()
now := time.Now()
record := model.RoomTurnoverRewardRecord{
ID: now.UnixNano(),
ConfigID: configID,
SysOrigin: "LIKEI",
CycleKey: "20260511",
PeriodStartAt: now.AddDate(0, 0, -7),
PeriodEndAt: now,
RoomID: 101,
RoomAccount: "R101",
RoomName: "Owner room",
OwnerUserID: 9001,
TurnoverAmount: 120000,
Level: 1,
TurnoverThreshold: 100000,
RewardGold: 2000,
TrackID: "room-turnover:LIKEI:20260511:101",
SourceID: "source-101",
Status: status,
CreateTime: now,
UpdateTime: now,
}
if err := db.WithContext(context.Background()).Create(&record).Error; err != nil {
t.Fatalf("seed reward record: %v", err)
}
return record
}