Example #1
0
        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;
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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;
        }
Example #5
0
        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);
        }
Example #6
0
        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();
        }
Example #9
0
        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);
        }
Example #10
0
        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);
        }
Example #11
0
        public void Placing_a_bet_does_not_change_wagering_completed()
        {
            MakeDeposit(PlayerId);
            PlaceBet(27, PlayerId, Guid.NewGuid(), Guid.NewGuid());

            BonusRedemptions.First().Contributions.Should().BeEmpty();
        }
Example #12
0
        public void Bet_lost_increases_wagering_completed()
        {
            MakeDeposit(PlayerId);
            PlaceAndLoseBet(27, PlayerId);

            BonusRedemptions.First().Contributions.SingleOrDefault(c => c.Contribution == 27).Should().NotBeNull();
        }
Example #13
0
        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();
        }
Example #14
0
        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);
        }
Example #15
0
        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);
        }
Example #16
0
        public void System_activates_Automatic_mode_bonus_redemption()
        {
            CreateFirstDepositBonus();

            MakeDeposit(PlayerId);

            BonusRedemptions.First().ActivationState.Should().Be(ActivationStatus.Activated);
        }
Example #17
0
        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();
        }
Example #19
0
        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);
        }
Example #20
0
        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);
        }
Example #21
0
        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);
        }
Example #22
0
        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);
        }
Example #23
0
        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);
        }
Example #26
0
        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);
        }
Example #28
0
        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();
        }
Example #30
0
        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();
        }