Esempio n. 1
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);
        }
Esempio n. 2
0
 public IssueBonusController(
     BonusCommands bonusCommands,
     BonusQueries bonusQueries)
 {
     _bonusCommands = bonusCommands;
     _bonusQueries  = bonusQueries;
 }
        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);
        }
Esempio n. 4
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);
        }
Esempio n. 5
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);
        }
Esempio n. 6
0
        public Guid SubmitDeposit(Guid playerId, decimal depositAmount = 200, string bonusCode = null, Guid?bonusId = null)
        {
            var depositId = Guid.NewGuid();

            ServiceBus.PublishMessage(new DepositSubmitted
            {
                DepositId = depositId,
                PlayerId  = playerId,
                Amount    = depositAmount
            });

            if (bonusId.HasValue || string.IsNullOrWhiteSpace(bonusCode) == false)
            {
                BonusCommands.ApplyForBonus(new DepositBonusApplication
                {
                    PlayerId  = playerId,
                    BonusId   = bonusId,
                    BonusCode = bonusCode,
                    Amount    = depositAmount,
                    DepositId = depositId
                });
            }

            return(depositId);
        }
Esempio n. 7
0
        public void MakeFundIn(Guid playerId, Guid destinationWalletStructureId, decimal amount, string bonusCode = null, Guid?bonusId = null)
        {
            if (bonusId.HasValue || string.IsNullOrWhiteSpace(bonusCode) == false)
            {
                BonusCommands.ApplyForBonus(new FundInBonusApplication
                {
                    PlayerId  = playerId,
                    BonusId   = bonusId,
                    BonusCode = bonusCode,
                    Amount    = amount,
                    DestinationWalletTemplateId = destinationWalletStructureId
                });
            }

            ServiceBus.PublishMessage(new TransferFundCreated
            {
                PlayerId = playerId,
                DestinationWalletStructureId = destinationWalletStructureId,
                Amount    = amount,
                BonusCode = bonusCode,
                Type      = TransferFundType.FundIn,
                Status    = TransferFundStatus.Approved
            });

            // Here we need somehow create an event to mimic a wallet fund-in
        }
Esempio n. 8
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);
        }
Esempio n. 9
0
        public void Referer_can_claim_2_different_bonus_redemptions()
        {
            var bonus = CreateBonusWithReferFriendTiers();

            bonus.Template.Info.Mode = IssuanceMode.ManualByPlayer;
            CompleteReferAFriendRequirments(PlayerId);
            bonus.IsActive = false;

            var bonus2 = CreateBonusWithReferFriendTiers();

            bonus2.Template.Info.Mode = IssuanceMode.ManualByPlayer;
            CompleteReferAFriendRequirments(PlayerId);
            bonus.IsActive = true;

            var bonusPlayer = BonusRepository.GetLockedPlayer(PlayerId);

            bonusPlayer.BonusesRedeemed.Count.Should().Be(2);
            bonusPlayer.BonusesRedeemed.All(br => br.Amount == 10).Should().BeTrue();

            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusPlayer.BonusesRedeemed.ElementAt(0).Id
            });
            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusPlayer.BonusesRedeemed.ElementAt(1).Id
            });
        }
Esempio n. 10
0
 public BonusHistoryController(
     BonusCommands bonusCommands,
     BonusQueries bonusQueries,
     IEventRepository eventRepository)
 {
     _bonusCommands   = bonusCommands;
     _bonusQueries    = bonusQueries;
     _eventRepository = eventRepository;
 }
Esempio n. 11
0
        public void Bonus_cancellation_sets_rollover_status_to_None()
        {
            MakeDeposit(PlayerId);
            var bonusRedemption = BonusRedemptions.First();
            var model           = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            };

            BonusCommands.CancelBonusRedemption(model);

            Assert.AreEqual(RolloverStatus.None, bonusRedemption.RolloverState);
        }
Esempio n. 12
0
        public void Bonus_cancellation_sets_activation_status_to_Cancelled()
        {
            MakeDeposit(PlayerId);
            var bonusRedemption = BonusRedemptions.First();
            var model           = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            };

            BonusCommands.CancelBonusRedemption(model);

            Assert.AreEqual(ActivationStatus.Canceled, bonusRedemption.ActivationState);
        }
Esempio n. 13
0
        public void Bonus_cancellation_releases_bonus_lock()
        {
            MakeDeposit(PlayerId, 300);
            var model = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = BonusRedemptions.First().Id
            };

            BonusCommands.CancelBonusRedemption(model);

            _wallet.Locks.Count(tr => tr.UnlockedOn.HasValue)
            .Should()
            .Be(2, "Unlock of deposit, bonus amount");
        }
Esempio n. 14
0
        public void Player_should_activate_ManualByPlayer_mode_bonus_redemption()
        {
            var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer);

            MakeDeposit(PlayerId, bonusId: bonus.Id);

            var bonusRedemption = BonusRedemptions.First();

            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            });

            bonusRedemption.ActivationState.Should().Be(ActivationStatus.Activated);
        }
Esempio n. 15
0
        public void Qualification_ignores_fraudulent_status_for_Manual_by_CS_issuance()
        {
            MakeDeposit(PlayerId);
            var transaction = BonusRepository.Players.Single(p => p.Id == PlayerId).Wallets.SelectMany(t => t.Transactions).First();
            var bonus       = CreateFirstDepositBonus();

            DisableBonusesForPlayer(PlayerId);

            BonusCommands.IssueBonusByCs(new IssueBonusByCs
            {
                BonusId       = bonus.Id,
                PlayerId      = PlayerId,
                TransactionId = transaction.Id
            });

            BonusRedemptions.Single().ActivationState.Should().Be(ActivationStatus.Activated);
        }
Esempio n. 16
0
        public void Can_issue_first_deposit_bonus()
        {
            MakeDeposit(PlayerId);
            var transaction = BonusRepository.Players.Single(p => p.Id == PlayerId).Wallets.SelectMany(t => t.Transactions).First();
            var bonus       = CreateFirstDepositBonus();

            BonusCommands.IssueBonusByCs(new IssueBonusByCs
            {
                BonusId       = bonus.Id,
                PlayerId      = PlayerId,
                TransactionId = transaction.Id
            });

            var bonusRedemption = BonusRedemptions.Single();

            bonusRedemption.ActivationState.Should().Be(ActivationStatus.Activated);
        }
Esempio n. 17
0
        public void Bonus_claim_by_fraudulent_player_negates_it()
        {
            var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer);

            MakeDeposit(PlayerId, bonusId: bonus.Id);
            DisableBonusesForPlayer(PlayerId);

            var bonusRedemption = BonusRedemptions.First();

            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            });

            bonusRedemption.ActivationState.Should().Be(ActivationStatus.Negated);
        }
Esempio n. 18
0
        public void Bonus_cancellation_creates_Cancellation_wagering_contribution_record()
        {
            MakeDeposit(PlayerId, 300);

            var bonusRedemption = BonusRedemptions.First();
            var model           = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            };

            BonusCommands.CancelBonusRedemption(model);

            bonusRedemption.Contributions.SingleOrDefault(c => c.Type == ContributionType.Cancellation)
            .Should()
            .NotBeNull();
        }
Esempio n. 19
0
        public void System_does_not_claim_ManualByPlayer_bonus_issued_by_CS()
        {
            MakeDeposit(PlayerId);
            var transaction = BonusRepository.Players.Single(p => p.Id == PlayerId).Wallets.SelectMany(t => t.Transactions).First();
            var bonus       = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer);

            BonusCommands.IssueBonusByCs(new IssueBonusByCs
            {
                BonusId       = bonus.Id,
                PlayerId      = PlayerId,
                TransactionId = transaction.Id
            });

            var bonusRedemption = BonusRedemptions.Single();

            bonusRedemption.ActivationState.Should().Be(ActivationStatus.Claimable);
        }
Esempio n. 20
0
        public void Bonus_cancellation_discards_applied_bonus_statistics_changes()
        {
            MakeDeposit(PlayerId);

            Assert.AreEqual(100, _bonus.Statistic.TotalRedeemedAmount);
            Assert.AreEqual(1, _bonus.Statistic.TotalRedemptionCount);

            var model = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = BonusRedemptions.First().Id
            };

            BonusCommands.CancelBonusRedemption(model);

            Assert.AreEqual(0, _bonus.Statistic.TotalRedeemedAmount);
            Assert.AreEqual(0, _bonus.Statistic.TotalRedemptionCount);
        }
Esempio n. 21
0
        public void Disqualification_is_processed_during_activation()
        {
            var depositId = Guid.NewGuid();

            BonusCommands.ApplyForBonus(new DepositBonusApplication
            {
                PlayerId  = PlayerId,
                Amount    = 200,
                BonusCode = _bonus.Code,
                DepositId = depositId
            });
            var bonusRedemption = BonusRedemptions.First();

            MakeDeposit(PlayerId, bonusCode: _excludedBonus1.Code);
            ApproveDeposit(depositId, PlayerId, 100);

            bonusRedemption.ActivationState.Should().Be(ActivationStatus.Negated);
        }
Esempio n. 22
0
        public void Can_claim_percentage_reward_type_bonus()
        {
            var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer);

            bonus.Template.Rules.RewardType = BonusRewardType.Percentage;
            bonus.Template.Rules.RewardTiers.Single().Tiers.Single().Reward = 0.5m;

            MakeDeposit(PlayerId, 1000, bonusId: bonus.Id);

            var bonusRedemption = BonusRedemptions.Single();

            Assert.DoesNotThrow(() => BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            }));
            bonusRedemption.Amount.Should().Be(500);
            bonusRedemption.ActivationState.Should().Be(ActivationStatus.Activated);
        }
        public void Deposit_ManualByPlayer_bonus_rollover_is_calculated()
        {
            var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer);

            bonus.Template.Wagering.HasWagering = true;
            bonus.Template.Wagering.Method      = WageringMethod.TransferAmount;
            bonus.Template.Wagering.Multiplier  = 2;

            MakeDeposit(PlayerId, bonusId: bonus.Id);

            var bonusRedemption = BonusRedemptions.First();

            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            });

            bonusRedemption.Rollover.Should().Be(400);
        }
Esempio n. 24
0
        public void Can_cancel_a_bonus_that_has_no_wagering_contributions()
        {
            MakeDeposit(PlayerId, 300);
            var model = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = BonusRedemptions.First().Id
            };

            BonusCommands.CancelBonusRedemption(model);

            _wallet.Main.Should().Be(300);
            _wallet.Bonus.Should().Be(0);
            _wallet.NonTransferableBonus.Should().Be(0);
            var transaction = _wallet.Transactions.SingleOrDefault(tr => tr.Type == TransactionType.BonusCancelled);

            transaction.Should().NotBeNull();
            transaction.MainBalanceAmount.Should().Be(0);
            transaction.BonusBalanceAmount.Should().Be(0);
            transaction.NonTransferableAmount.Should().Be(-100);
        }
Esempio n. 25
0
        public void NotWithrawable_bonus_cancellation_decreases_NonTransferableBonus()
        {
            _bonus.Template.Rules.RewardTiers.Single().BonusTiers.Single().Reward = 100;
            _bonus.Template.Info.IsWithdrawable  = false;
            _bonus.Template.Wagering.HasWagering = true;
            _bonus.Template.Wagering.Multiplier  = 3m;

            MakeDeposit(PlayerId, 100);

            PlaceAndWinBet(20, 40, PlayerId);
            PlaceAndLoseBet(50, PlayerId);
            var model = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = BonusRedemptions.First().Id
            };

            BonusCommands.CancelBonusRedemption(model);

            _bonusWallet.NonTransferableBonus.Should().Be(0);
        }
Esempio n. 26
0
        public void Lock_is_released_from_correct_wallets_when_bonus_is_canceled()
        {
            var player        = BonusRepository.Players.Single(p => p.Id == PlayerId);
            var productWallet = player.Wallets.Single(a => a.Template.IsMain == false);
            var bonus         = CreateFirstDepositBonus();

            bonus.Template.Info.TemplateType   = BonusType.FundIn;
            bonus.Template.Rules.FundInWallets = new List <BonusFundInWallet>
            {
                new BonusFundInWallet {
                    WalletId = productWallet.Template.Id
                }
            };
            bonus.Template.Wagering.HasWagering  = true;
            bonus.Template.Wagering.Multiplier   = 0.1m;
            bonus.Template.Info.WalletTemplateId = _mainWallet.Template.Id;

            MakeDeposit(PlayerId, 100);
            MakeFundIn(PlayerId, productWallet.Template.Id, 100);
            var model = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = BonusRedemptions.Single().Id
            };

            BonusCommands.CancelBonusRedemption(model);

            _mainWallet.BonusLock.Should().Be(0);
            _mainWallet.Locks
            .Single(tr => tr.Amount == 27)
            .UnlockedOn
            .Should()
            .HaveValue();
            productWallet.BonusLock.Should().Be(0);
            productWallet.Locks
            .Single(tr => tr.Amount == 100)
            .UnlockedOn
            .Should()
            .HaveValue();
        }
        public void Claiming_bonus_outside_claim_duration_negates_it()
        {
            var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer);

            bonus.DaysToClaim = 1;

            MakeDeposit(PlayerId, bonusId: bonus.Id);
            //expiring the bonus
            bonus.ActiveTo = bonus.ActiveTo.AddDays(-3);

            var bonusRedemption = BonusRedemptions.First();

            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            });

            bonusRedemption
            .ActivationState.Should()
            .Be(ActivationStatus.Negated);
        }
Esempio n. 28
0
        public void Before_wager_bonus_isnot_issued_before_wagering_requirement_is_fulfilled()
        {
            MakeDeposit(PlayerId);
            var transaction = BonusRepository.Players.Single(p => p.Id == PlayerId).Wallets.SelectMany(t => t.Transactions).First();
            var bonus       = CreateFirstDepositBonus(mode: IssuanceMode.ManualByCs);

            bonus.Template.Wagering.HasWagering  = true;
            bonus.Template.Wagering.Multiplier   = 2;
            bonus.Template.Wagering.IsAfterWager = true;

            BonusCommands.IssueBonusByCs(new IssueBonusByCs
            {
                BonusId       = bonus.Id,
                PlayerId      = PlayerId,
                TransactionId = transaction.Id
            });

            var bonusRedemption = BonusRedemptions.Single();

            bonusRedemption.ActivationState.Should().Be(ActivationStatus.Pending);
            bonusRedemption.RolloverState.Should().Be(RolloverStatus.Active);
        }
        public void Rest_of_qualification_is_not_processed_during_claim()
        {
            MakeDeposit(PlayerId);

            var bonus = CreateFirstDepositBonus(mode: IssuanceMode.ManualByPlayer);

            bonus.Template.Info.TemplateType = BonusType.ReloadDeposit;

            MakeDeposit(PlayerId, bonusId: bonus.Id);
            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = BonusRedemptions.First().Id
            });

            MakeDeposit(PlayerId, bonusId: bonus.Id);
            var bonusRedemption = BonusRedemptions.Last();

            bonus.DurationType  = DurationType.Custom;
            bonus.DurationStart = SystemTime.Now.AddMinutes(5);
            bonus.DurationEnd   = SystemTime.Now.AddMinutes(10);
            bonus.Template.Availability.ParentBonusId = Guid.NewGuid();
            bonus.Template.Availability.VipLevels     = new List <BonusVip> {
                new BonusVip {
                    Code = "Bronze"
                }
            };
            bonus.Template.Availability.PlayerRedemptionsLimit = 1;

            BonusCommands.ClaimBonusRedemption(new ClaimBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = bonusRedemption.Id
            });

            bonusRedemption
            .ActivationState.Should()
            .Be(ActivationStatus.Activated);
        }
Esempio n. 30
0
        public void Bonus_cancellation_after_net_win()
        {
            MakeDeposit(PlayerId, 300);
            PlaceAndWinBet(200, 300, PlayerId);
            PlaceAndLoseBet(50, PlayerId);
            var model = new CancelBonusRedemption
            {
                PlayerId     = PlayerId,
                RedemptionId = BonusRedemptions.First().Id
            };

            BonusCommands.CancelBonusRedemption(model);

            _wallet.Main.Should().Be(300);
            _wallet.Bonus.Should().Be(0);
            _wallet.NonTransferableBonus.Should().Be(0);
            var transaction = _wallet.Transactions.SingleOrDefault(tr => tr.Type == TransactionType.BonusCancelled);

            transaction.Should().NotBeNull();
            transaction.MainBalanceAmount.Should().Be(250);
            transaction.BonusBalanceAmount.Should().Be(-300);
            transaction.NonTransferableAmount.Should().Be(-100);
        }