package registerreward import ( "chatapp3-golang/internal/model" "testing" "time" ) func TestDeriveRegisterRewardStatus(t *testing.T) { t.Run("old register date defaults to success", func(t *testing.T) { record := &model.ResidentRegisterRewardLog{Status: registerRewardStatusSuccess} if got := deriveRegisterRewardStatus(record, false, true); got != registerRewardStatusSuccess { t.Fatalf("deriveRegisterRewardStatus() = %s, want %s", got, registerRewardStatusSuccess) } }) t.Run("same day register uses log status when present", func(t *testing.T) { record := &model.ResidentRegisterRewardLog{Status: registerRewardStatusFailed} if got := deriveRegisterRewardStatus(record, true, true); got != registerRewardStatusFailed { t.Fatalf("deriveRegisterRewardStatus() = %s, want %s", got, registerRewardStatusFailed) } }) t.Run("same day register falls back to processing when activity enabled", func(t *testing.T) { if got := deriveRegisterRewardStatus(nil, true, true); got != registerRewardStatusProcessing { t.Fatalf("deriveRegisterRewardStatus() = %s, want %s", got, registerRewardStatusProcessing) } }) t.Run("same day register falls back to not triggered when activity disabled", func(t *testing.T) { if got := deriveRegisterRewardStatus(nil, true, false); got != registerRewardStatusNotTriggered { t.Fatalf("deriveRegisterRewardStatus() = %s, want %s", got, registerRewardStatusNotTriggered) } }) } func TestIsRegisterRewardCurrentServerDate(t *testing.T) { location, err := time.LoadLocation(registerRewardDailyQuotaTimezone) if err != nil { t.Fatalf("LoadLocation() error = %v", err) } now := time.Now().In(location) if !isRegisterRewardCurrentServerDate(now) { t.Fatalf("isRegisterRewardCurrentServerDate(now) = false, want true") } yesterday := now.AddDate(0, 0, -1) if isRegisterRewardCurrentServerDate(yesterday) { t.Fatalf("isRegisterRewardCurrentServerDate(yesterday) = true, want false") } } func TestResolveRegisterRewardPayload(t *testing.T) { configRewardGroupID := int64(2001) logRewardGroupID := int64(3001) t.Run("prefer log payload", func(t *testing.T) { goldAmount, rewardGroupID := resolveRegisterRewardPayload( &model.ResidentRegisterRewardConfig{GoldAmount: 100, RewardGroupID: &configRewardGroupID}, &model.ResidentRegisterRewardLog{GoldAmount: 200, RewardGroupID: &logRewardGroupID}, ) if goldAmount != 200 { t.Fatalf("goldAmount = %d, want 200", goldAmount) } if rewardGroupID == nil || *rewardGroupID != logRewardGroupID { t.Fatalf("rewardGroupID = %v, want %d", rewardGroupID, logRewardGroupID) } }) t.Run("fallback to config payload", func(t *testing.T) { goldAmount, rewardGroupID := resolveRegisterRewardPayload( &model.ResidentRegisterRewardConfig{GoldAmount: 100, RewardGroupID: &configRewardGroupID}, nil, ) if goldAmount != 100 { t.Fatalf("goldAmount = %d, want 100", goldAmount) } if rewardGroupID == nil || *rewardGroupID != configRewardGroupID { t.Fatalf("rewardGroupID = %v, want %d", rewardGroupID, configRewardGroupID) } }) }