public void Application_to_bonus_is_active_inside_Duration_only() { MakeDeposit(PlayerId); var bonus = CreateFirstDepositBonus(); bonus.Template.Info.TemplateType = BonusType.ReloadDeposit; bonus.DurationType = DurationType.Custom; bonus.DurationStart = SystemTime.Now.AddMinutes(5); bonus.DurationEnd = SystemTime.Now.AddMinutes(10); MakeDeposit(PlayerId); BonusRedemptions.Should().BeEmpty(); SystemTime.Factory = () => DateTimeOffset.Now.AddMinutes(11); MakeDeposit(PlayerId); BonusRedemptions.Should().BeEmpty(); SystemTime.Factory = () => DateTimeOffset.Now.AddMinutes(9); MakeDeposit(PlayerId); BonusRedemptions.Should().NotBeEmpty(); SystemTime.Factory = () => DateTimeOffset.Now; }
public void RedemptionCanceled_is_saved_in_event_store() { _bonus.Template.Rules.RewardTiers.Single().BonusTiers.Single().Reward = 100; _bonus.Template.Wagering.HasWagering = true; _bonus.Template.Wagering.Multiplier = 3m; MakeDeposit(PlayerId, 100); var bonusRedemption = BonusRedemptions.Single(); PlaceAndWinBet(20, 40, PlayerId); PlaceAndLoseBet(50, PlayerId); var model = new CancelBonusRedemption { PlayerId = PlayerId, RedemptionId = bonusRedemption.Id }; BonusCommands.CancelBonusRedemption(model); var theEvent = _eventRepository.Events.Single(e => e.DataType == typeof(RedemptionCanceled).Name); var data = JsonConvert.DeserializeObject <RedemptionCanceled>(theEvent.Data); data.AggregateId.Should().Be(bonusRedemption.Id); data.MainBalanceAdjustment.Should().Be(40); data.BonusBalanceAdjustment.Should().Be(-40); data.NonTransferableAdjustment.Should().Be(-100); data.UnlockedAmount.Should().Be(bonusRedemption.LockedAmount); }
public void Bonus_issued_by_Cs_ignores_bonus_claim_duration_qualification() { MakeDeposit(PlayerId); var transaction = BonusRepository.Players.Single(p => p.Id == PlayerId).Wallets.SelectMany(t => t.Transactions).First(); var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer); bonus.DaysToClaim = 1; BonusCommands.IssueBonusByCs(new IssueBonusByCs { BonusId = bonus.Id, PlayerId = PlayerId, TransactionId = transaction.Id }); var bonusRedemption = BonusRedemptions.Single(); //expiring the bonus bonus.ActiveTo = bonus.ActiveTo.AddDays(-2); BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption { PlayerId = PlayerId, RedemptionId = bonusRedemption.Id }); bonusRedemption.ActivationState.Should().Be(ActivationStatus.Activated); }
public void Per_player_bonus_issuance_limit_qualification_per_period(BonusPlayerRedemptionsLimitType periodType, int daysOffset) { MakeDeposit(PlayerId); var bonus = CreateFirstDepositBonus(); bonus.ActiveTo = bonus.ActiveTo.AddDays(60); bonus.Template.Availability.PlayerRedemptionsLimitType = periodType; bonus.Template.Availability.PlayerRedemptionsLimit = 2; bonus.Template.Info.TemplateType = BonusType.ReloadDeposit; MakeDeposit(PlayerId); MakeDeposit(PlayerId); MakeDeposit(PlayerId); BonusRedemptions.Count(br => br.ActivationState == ActivationStatus.Activated).Should().Be(2, because: "Only first 2 bonuses should be activated."); BonusRedemptions.Count(br => br.ActivationState != ActivationStatus.Activated).Should().Be(0, because: "Last deposit should not redeem bonus."); // Switch to the next datetime period SystemTime.Factory = () => DateTimeOffset.Now.AddDays(daysOffset); MakeDeposit(PlayerId); BonusRedemptions.Count(br => br.ActivationState == ActivationStatus.Activated).Should().Be(3, because: "Deposit falls into next period."); SystemTime.Factory = () => DateTimeOffset.Now; }
public void Qualification_runs_after_rollover_fulfillment_for_AfterWager_bonus() { var reloadBonus = CreateFirstDepositBonus(mode: IssuanceMode.AutomaticWithCode); reloadBonus.Template.Info.TemplateType = BonusType.ReloadDeposit; var firstDeposit = CreateFirstDepositBonus(mode: IssuanceMode.AutomaticWithCode); firstDeposit.Template.Info.TemplateType = BonusType.FirstDeposit; firstDeposit.Template.Wagering.HasWagering = true; firstDeposit.Template.Wagering.IsAfterWager = true; firstDeposit.Template.Wagering.Multiplier = 1; firstDeposit.Template.Availability.ExcludeBonuses.Add(new BonusExclude { ExcludedBonusId = reloadBonus.Id }); firstDeposit.Template.Availability.ExcludeOperation = Operation.Any; MakeDeposit(PlayerId, 200, firstDeposit.Code); MakeDeposit(PlayerId, 200, reloadBonus.Code); var walletQueriesMock = new Mock <IBrandOperations>(); walletQueriesMock.Setup(queries => queries.GetPlayerBalance(It.IsAny <Guid>(), It.IsAny <string>())).Returns(10m); Container.RegisterInstance(walletQueriesMock.Object); PlaceAndWinBet(50, 100, PlayerId); BonusRedemptions.First().ActivationState.Should().Be(ActivationStatus.Negated); }
public void Qualification_runs_before_rollover_is_issued_for_AfterWager_bonus() { MakeDeposit(PlayerId); var excludedReloadedDeposit = CreateFirstDepositBonus(mode: IssuanceMode.AutomaticWithCode); excludedReloadedDeposit.Template.Info.TemplateType = BonusType.ReloadDeposit; var reloadDepositWithExclude = CreateFirstDepositBonus(mode: IssuanceMode.AutomaticWithCode); reloadDepositWithExclude.Template.Info.TemplateType = BonusType.ReloadDeposit; reloadDepositWithExclude.Template.Wagering.HasWagering = true; reloadDepositWithExclude.Template.Wagering.IsAfterWager = true; reloadDepositWithExclude.Template.Wagering.Multiplier = 1; reloadDepositWithExclude.Template.Availability.ExcludeBonuses.Add(new BonusExclude { ExcludedBonusId = excludedReloadedDeposit.Id }); reloadDepositWithExclude.Template.Availability.ExcludeOperation = Operation.Any; var depositId = Guid.NewGuid(); BonusCommands.ApplyForBonus(new DepositBonusApplication { PlayerId = PlayerId, Amount = 200, DepositId = depositId, BonusCode = reloadDepositWithExclude.Code }); MakeDeposit(PlayerId, 200, excludedReloadedDeposit.Code); ApproveDeposit(depositId, PlayerId, 200); BonusRedemptions.First().ActivationState.Should().Be(ActivationStatus.Negated); }
public void Fundin_ManualByPlayer_bonus_rollover_is_calculated() { var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer); var brandWalletId = bonus.Template.Info.Brand.WalletTemplates.First().Id; bonus.Template.Info.TemplateType = BonusType.FundIn; bonus.Template.Rules.FundInWallets = new List <BonusFundInWallet> { new BonusFundInWallet { WalletId = brandWalletId } }; bonus.Template.Wagering.HasWagering = true; bonus.Template.Wagering.Method = WageringMethod.TransferAmount; bonus.Template.Wagering.Multiplier = 2; //depositing funds to use them for fund in MakeDeposit(PlayerId); MakeFundIn(PlayerId, brandWalletId, 100, bonusId: bonus.Id); var bonusRedemption = BonusRedemptions.First(); BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption { PlayerId = PlayerId, RedemptionId = bonusRedemption.Id }); bonusRedemption.Rollover.Should().Be(200); }
public void Cannot_redeem_bonus_with_unmatched_tiers() { CreateBonusWithHighDepositTiers(false); MakeDeposit(PlayerId, 450); BonusRedemptions.Should().BeEmpty(); }
public bool Status_of_bonus_redemption_is_validated_during_cancellation(RolloverStatus status) { var bonus = CreateFirstDepositBonus(); bonus.Template.Wagering.HasWagering = true; bonus.Template.Wagering.Multiplier = 3m; MakeDeposit(PlayerId); var bonusRedemption = BonusRedemptions.First(); bonusRedemption.RolloverState = status; var validationResult = BonusQueries.GetValidationResult(new CancelBonusRedemption { PlayerId = PlayerId, RedemptionId = bonusRedemption.Id }); if (validationResult.IsValid == false) { validationResult.Errors.Single().ErrorMessage.Should().Be(ValidatorMessages.BonusRedemptionStatusIsIncorrectForCancellation); } return(validationResult.IsValid); }
public void Can_issue_fundin_bonus() { var brandWalletId = BonusRepository.Brands.First().WalletTemplates.First().Id; var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByCs); bonus.Template.Info.TemplateType = BonusType.FundIn; bonus.Template.Rules.FundInWallets = new List <BonusFundInWallet> { new BonusFundInWallet { WalletId = brandWalletId } }; MakeDeposit(PlayerId); MakeFundIn(PlayerId, brandWalletId, 100); var transaction = BonusRepository.Players.Single(p => p.Id == PlayerId).Wallets.SelectMany(t => t.Transactions).Single(t => t.Type == TransactionType.FundIn); BonusCommands.IssueBonusByCs(new IssueBonusByCs { BonusId = bonus.Id, PlayerId = PlayerId, TransactionId = transaction.Id }); var bonusRedemption = BonusRedemptions.Single(); bonusRedemption.ActivationState.Should().Be(ActivationStatus.Activated); }
public void Placing_a_bet_does_not_change_wagering_completed() { MakeDeposit(PlayerId); PlaceBet(27, PlayerId, Guid.NewGuid(), Guid.NewGuid()); BonusRedemptions.First().Contributions.Should().BeEmpty(); }
public void Bet_lost_increases_wagering_completed() { MakeDeposit(PlayerId); PlaceAndLoseBet(27, PlayerId); BonusRedemptions.First().Contributions.SingleOrDefault(c => c.Contribution == 27).Should().NotBeNull(); }
public void All_contribution_are_calculated_as_100_percents_when_no_game_to_rollover_contributions_defined() { MakeDeposit(PlayerId); PlaceAndLoseBet(27, PlayerId); BonusRedemptions.First().Contributions.SingleOrDefault(c => c.Contribution == 27).Should().NotBeNull(); }
public void System_activates_AutomaticWithBonusCode_mode_bonus_redemption() { var bonus = CreateFirstDepositBonus(mode: IssuanceMode.AutomaticWithCode); MakeDeposit(PlayerId, bonusCode: bonus.Code); BonusRedemptions.First().ActivationState.Should().Be(ActivationStatus.Activated); }
public void Can_redeem_bonus_with_matched_auto_generate_tier(int depositAmount, int expectedRedemptionsAmount) { CreateBonusWithHighDepositTiers(); MakeDeposit(PlayerId, depositAmount); BonusRedemptions.All(br => br.ActivationState == ActivationStatus.Activated).Should().BeTrue(); BonusRedemptions.Sum(br => br.Amount).Should().Be(expectedRedemptionsAmount); }
public void System_activates_Automatic_mode_bonus_redemption() { CreateFirstDepositBonus(); MakeDeposit(PlayerId); BonusRedemptions.First().ActivationState.Should().Be(ActivationStatus.Activated); }
public void System_does_not_redeem_ManualByCS_bonus_automatically() { CreateFirstDepositBonus(mode: IssuanceMode.ManualByCs); MakeDeposit(PlayerId); BonusRedemptions.Should().BeEmpty(); }
public void Cannot_redeem_deposit_bonus(decimal depositAmount, BonusRewardType rewardType) { CreateBonusWithBonusTiers(rewardType); MakeDeposit(PlayerId, depositAmount); BonusRedemptions.Should().BeEmpty(); }
public void Bonus_redemption_without_rollover_has_None_rollover_status_after_activation() { _bonus.Template.Wagering.HasWagering = false; MakeDeposit(PlayerId); Assert.AreEqual(RolloverStatus.None, BonusRedemptions.First().RolloverState); }
public void Playable_balance_is_taken_into_account_to_trigger_wagering_threshold() { _bonus.Template.Wagering.Threshold = 125; MakeDeposit(PlayerId); PlaceAndLoseBet(175, PlayerId); BonusRedemptions.Single().RolloverState.Should().Be(RolloverStatus.ZeroedOut); }
public void Player_redeems_ManualByPlayer_deposit_bonus() { var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer); MakeDeposit(PlayerId, bonusId: bonus.Id); BonusRedemptions.Count.Should().Be(1); BonusRedemptions.First().Bonus.Id.Should().Be(bonus.Id); }
public void Player_redeems_AutomaticWithBonusCode_deposit_bonus() { var bonus = CreateFirstDepositBonus(mode: IssuanceMode.AutomaticWithCode); MakeDeposit(PlayerId, bonusCode: bonus.Code); BonusRedemptions.Count.Should().Be(1); BonusRedemptions.First().Bonus.Id.Should().Be(bonus.Id); }
public void Auto_generated_bonus_rewards_are_calculated_correctly_across_several_deposits() { CreateBonusWithHighDepositTiers(); MakeDeposit(PlayerId, 600); MakeDeposit(PlayerId, 400); BonusRedemptions.Count.Should().Be(2); BonusRedemptions.All(br => br.ActivationState == ActivationStatus.Activated).Should().BeTrue(); BonusRedemptions.All(br => br.Amount == 50).Should().BeTrue(); }
public void Cancel_of_deposit_negates_related_bonus_redemption() { CreateFirstDepositBonus(); var depositId = SubmitDeposit(PlayerId, 100); UnverifyDeposit(depositId, PlayerId); BonusRedemptions.First().ActivationState.Should().Be(ActivationStatus.Negated); }
public void Percentage_deposit_bonus_reward_calculated_correctly() { var bonus = CreateFirstDepositBonus(); bonus.Template.Rules.RewardType = BonusRewardType.Percentage; MakeDeposit(PlayerId); BonusRedemptions.Last().Amount.Should().Be(5400); }
public void Can_redeem_bonus_providing_correct_bonusCode() { var bonus = CreateFirstDepositBonus(mode: IssuanceMode.AutomaticWithCode); MakeDeposit(PlayerId, bonusCode: bonus.Code); BonusRedemptions .Count(br => br.ActivationState == ActivationStatus.Activated) .Should().Be(1); }
public void First_deposit_bonus_works() { var bonus = CreateFirstDepositBonus(); bonus.Template.Info.TemplateType = BonusType.FirstDeposit; MakeDeposit(PlayerId); BonusRedemptions.Last().Amount.Should().Be(27); }
public void Min_fund_in_amount_restriction_works() { _bonus.Template.Rules.RewardTiers.Single().BonusTiers.Single().From = 100; //depositing funds to use them for fund in MakeDeposit(PlayerId); MakeFundIn(PlayerId, _brandWalletId, 99); BonusRedemptions.Should().BeEmpty(); }
public void First_deposit_bonus_is_applied_to_first_deposit_only() { MakeDeposit(PlayerId); CreateFirstDepositBonus(); MakeDeposit(PlayerId); BonusRedemptions.Should().BeEmpty(); }
public void Bonus_is_not_issed_if_no_matching_currency_is_found() { var bonus = CreateFirstDepositBonus(); bonus.Template.Rules.RewardTiers.Single().CurrencyCode = "ABC"; MakeDeposit(PlayerId); BonusRedemptions.Should().BeEmpty(); }