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 }