示例#1
0
        public async Task BuyLotteryTicket_Should_Return_Bad_Request()
        {
            // Arrange
            var ticketViewModel = new BuyLotteryTicketViewModel
            {
                LotteryId = 1,
                Tickets   = 5
            };

            var ticketDto = new BuyLotteryTicketDto
            {
                LotteryId = 1,
                Tickets   = 5
            };

            _mapper.Map <BuyLotteryTicketViewModel, BuyLotteryTicketDto>(ticketViewModel).Returns(ticketDto);

            _lotteryService.BuyLotteryTicketAsync(ticketDto, UserAndOrganizationArg).Throws(new LotteryException("Exception"));

            // Act
            var response = await _lotteryController.BuyLotteryTicket(ticketViewModel);

            // Assert
            Assert.IsNotNull(response);
            Assert.IsInstanceOf <BadRequestErrorMessageResult>(response);
            await _lotteryService.Received(1).BuyLotteryTicketAsync(ticketDto, UserAndOrganizationArg);
        }
示例#2
0
        public async Task BuyLotteryTicket_Should_Return_Ok()
        {
            // Arrange
            var ticketViewModel = new BuyLotteryTicketViewModel
            {
                LotteryId = 1,
                Tickets   = 5
            };

            var ticketDto = new BuyLotteryTicketDto
            {
                LotteryId = 1,
                Tickets   = 5
            };

            _mapper.Map <BuyLotteryTicketViewModel, BuyLotteryTicketDto>(ticketViewModel).Returns(ticketDto);

            // Act
            var response = await _lotteryController.BuyLotteryTicket(ticketViewModel);

            // Assert
            Assert.IsNotNull(response);
            Assert.IsInstanceOf <OkResult>(response);
            await _lotteryService.Received(1).BuyLotteryTicketAsync(ticketDto, UserAndOrganizationArg);
        }
示例#3
0
 private static LotteryParticipant MapNewLotteryParticipant(BuyLotteryTicketDto lotteryTicketDto, UserAndOrganizationDto userOrg)
 {
     return(new LotteryParticipant
     {
         LotteryId = lotteryTicketDto.LotteryId,
         UserId = userOrg.UserId,
         Joined = DateTime.Now,
         CreatedBy = userOrg.UserId,
         ModifiedBy = userOrg.UserId,
         Modified = DateTime.Now,
         Created = DateTime.Now
     });
 }
示例#4
0
        public async Task BuyLotteryTicketAsync(BuyLotteryTicketDto lotteryTicketDto, UserAndOrganizationDto userOrg)
        {
            var applicationUser = await _userService.GetApplicationUserAsync(userOrg.UserId);

            var lotteryDetails = await GetLotteryDetailsAsync(lotteryTicketDto.LotteryId, userOrg);

            if (lotteryDetails is null || applicationUser is null)
            {
                return;
            }

            if (lotteryTicketDto.Tickets <= 0)
            {
                await AddKudosLogForCheatingAsync(userOrg, lotteryDetails.EntryFee, applicationUser);

                throw new LotteryException("Thanks for trying - you were charged double Kudos for this without getting a ticket.");
            }

            if (applicationUser.RemainingKudos < lotteryDetails.EntryFee * lotteryTicketDto.Tickets)
            {
                throw new LotteryException("User does not have enough kudos for the purchase.");
            }

            if (DateTime.UtcNow > lotteryDetails.EndDate)
            {
                throw new LotteryException("Lottery has already ended.");
            }

            var kudosLog = new AddKudosLogDto
            {
                ReceivingUserIds = new List <string> {
                    userOrg.UserId
                },
                PointsTypeId   = await _kudosService.GetKudosTypeIdAsync(KudosTypeEnum.Minus),
                MultiplyBy     = lotteryTicketDto.Tickets * lotteryDetails.EntryFee,
                Comment        = $"{lotteryTicketDto.Tickets} ticket(s) for lottery {lotteryDetails.Title}",
                UserId         = userOrg.UserId,
                OrganizationId = userOrg.OrganizationId
            };

            await _kudosService.AddLotteryKudosLogAsync(kudosLog, userOrg);

            if (applicationUser.RemainingKudos < 0)
            {
                kudosLog.PointsTypeId = await _kudosService.GetKudosTypeIdAsync(KudosTypeEnum.Refund);

                await _kudosService.AddRefundKudosLogsAsync(new List <AddKudosLogDto> {
                    kudosLog
                });
            }
            else
            {
                for (var i = 0; i < lotteryTicketDto.Tickets; i++)
                {
                    _participantsDbSet.Add(MapNewLotteryParticipant(lotteryTicketDto, userOrg));
                }
            }

            await _uow.SaveChangesAsync(applicationUser.Id);

            await _kudosService.UpdateProfileKudosAsync(applicationUser, userOrg);
        }