Exemplo n.º 1
0
        private async Task <Ticket> CreateTicket(CommitTicketRequest request)
        {
            var pairsToBetIds = request.BetingPairs.Select(p => p.BetedPairId);

            var betablePairs = await _dataProvider.BetablePairs(pairsToBetIds);

            if (request.BetingPairs.Count != betablePairs.Count)
            {
                var betablePairsIds = betablePairs.Select(p => p.Id);
                var difference      = pairsToBetIds.Except(betablePairsIds);
                throw new BetablePairsNotFound(difference);
            }

            var betedPairs = CreateBetedPairs(request, betablePairs).ToArray();

            var ticket = new Ticket
            {
                BetedPairs = betedPairs,
                Stake      = request.Stake,
                UserId     = _currentUser.Id()
            };

            CalculateQuota(ticket);
            _unitOfWork.Add(ticket);
            _unitOfWork.AddRange(ticket.BetedPairs);
            await _unitOfWork.SaveChanges();

            return(ticket);
        }
Exemplo n.º 2
0
        public async Task <TicketDto> Handle(CommitTicketRequest request)
        {
            var ticket = await CreateTicket(request);

            await _walletService.SubtractMoney(ticket.Stake, WalletTransaction.WalletTransactionType.TicketCommit);

            await _bonusService.ApplyBonuses(ticket);

            return(_mapper.Map <TicketDto>(ticket));
        }
Exemplo n.º 3
0
        private static IEnumerable <BetedPair> CreateBetedPairs(CommitTicketRequest request, IEnumerable <BetablePair> betablePairs)
        {
            BetingType GetSelectedTypeOfPair(int pairId) =>
            request.BetingPairs.First(p => p.BetedPairId == pairId).BetingType;

            return(betablePairs.Select(p => new BetedPair
            {
                BetedType = GetSelectedTypeOfPair(p.Id),
                BetablePair = p,
                BetablePairId = p.Id
            }));
        }
Exemplo n.º 4
0
        public async Task Run()
        {
            var data           = new DataFactory();
            var unitOfWorkMock = new UnitOfWorkMock();

            var pair1SelectedQuota = 23;
            var pair2SelectedQuota = 6;
            var pair3SelectedQuota = 2;

            var betablePair1 = data.BetablePair(1, pair1SelectedQuota, -1, -1, new Team(), new Team());
            var betablePair2 = data.BetablePair(2, -1, pair2SelectedQuota, -1, new Team(), new Team());
            var betablePair3 = data.BetablePair(3, -1, -1, pair3SelectedQuota, new Team(), new Team());
            IReadOnlyCollection <BetablePair> betablePairs = new[] { betablePair1, betablePair2, betablePair3 };

            var request = new CommitTicketRequest
            {
                Stake       = 19,
                BetingPairs = new[]
                {
                    new CommitTicketRequest.BetingPair
                    {
                        BetedPairId = betablePair1.Id,
                        BetingType  = BetingType.Team1Win
                    },
                    new CommitTicketRequest.BetingPair
                    {
                        BetedPairId = betablePair2.Id,
                        BetingType  = BetingType.Team2Win
                    },
                    new CommitTicketRequest.BetingPair
                    {
                        BetedPairId = betablePair3.Id,
                        BetingType  = BetingType.Draw
                    },
                }
            };

            var userId = "a";

            var currentUserAccessor = TestServicesFactory.CureCurrentUserAccessor(userId);

            var dataProviderMock = new Mock <IDataProvider>();

            dataProviderMock.Setup(dp => dp.BetablePairs(It.IsAny <IEnumerable <int> >())).Returns(Task.FromResult(betablePairs));

            var service = new TicketService(
                Mock.Of <IBonusService>(),
                unitOfWorkMock.Object,
                Mock.Of <IWalletService>(),
                currentUserAccessor,
                dataProviderMock.Object,
                Mock.Of <IMapper>());

            await service.Handle(request);

            unitOfWorkMock.Changes.SavedChanges.Should().BeTrue();

            var insertedObjects = unitOfWorkMock.Changes.Inserted;

            insertedObjects.OfType <Ticket>().Should().ContainSingle();
            var commitedTicket = insertedObjects.OfType <Ticket>().Single();

            var betedPairs = insertedObjects.OfType <BetedPair>().ToArray();

            betedPairs.Length.Should().Be(3);

            void AssertOnPair(int betablePairId, int quota, BetingType type)
            {
                var pair = betedPairs.Single(p => p.BetablePairId == betablePairId);

                pair.GetQuota().Should().Be(quota);
                pair.BetedType.Should().Be(type);
            }

            AssertOnPair(betablePair1.Id, pair1SelectedQuota, BetingType.Team1Win);
            AssertOnPair(betablePair2.Id, pair2SelectedQuota, BetingType.Team2Win);
            AssertOnPair(betablePair3.Id, pair3SelectedQuota, BetingType.Draw);

            commitedTicket.Quota.Should().Be(pair1SelectedQuota * pair2SelectedQuota * pair3SelectedQuota);
            commitedTicket.UserId.Should().Be(userId);
            commitedTicket.Stake.Should().Be(request.Stake);
        }
Exemplo n.º 5
0
 public Task <IActionResult> Post([FromBody] CommitTicketRequest request) =>
 _safeRunner.Run(() => _ticketService.Handle(request), ticket => Created("", ticket));