141 lines
4.7 KiB
Go
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
|
|
}
|