public void DeleteBet_UserDoesNotHaveBet_ThrowsForbiddenException()
        {
            var user = new UserDto()
            {
                Id = 1
            };
            var bet = new DiceBetDto()
            {
                Id           = 1337,
                UserId       = 1234,
                CreationDate = DateTime.Now
            };

            //Arrange
            Mock <IUserRepository>    mockUserRepository  = new Mock <IUserRepository>();
            Mock <ILoginRepository>   mockLoginRepository = new Mock <ILoginRepository>();
            Mock <IDiceBetRepository> mockBetRepository   = new Mock <IDiceBetRepository>();

            mockLoginRepository.Setup(l => l.HasUserAndToken(user.Id, It.IsAny <string>())).Returns(true);
            mockBetRepository.Setup(b => b.Get(bet.Id)).Returns(bet);

            var controller     = new DiceBetController(mockUserRepository.Object, mockLoginRepository.Object, mockBetRepository.Object);
            var requestMessage = new HttpRequestMessage();

            requestMessage.Headers.Add("OnlineCasino-Token", "token");
            controller.Request       = requestMessage;
            controller.Configuration = new HttpConfiguration();

            //Act / Assert
            Assert.Throws <ForbiddenException>(() => controller.DeleteBet(user.Id, bet.Id));
        }
Example #2
0
        public Task <HttpResponseMessage> Bet(int userId, [FromBody] DiceBetRequest betRequest)
        {
            string token = Request.Headers.GetValues("OnlineCasino-Token").FirstOrDefault();

            if (!loginRepository.HasUserAndToken(userId, token))
            {
                throw new ForbiddenException();
            }

            int     userBet = betRequest.Bet;
            decimal stake   = betRequest.Stake;

            var user = userRepository.Get(userId);

            if (user.Money < stake)
            {
                throw new BadRequestException("Not enough money in balance!");
            }

            decimal win  = 0;
            int     roll = RollDices();

            if (roll == userBet)
            {
                decimal multiplier = StakeMultiplier(userBet);
                win  = stake * multiplier;
                win -= win / 10; // for the house
            }

            var bet = new DiceBetDto()
            {
                UserId        = userId,
                DiceSumBet    = userBet,
                DiceSumResult = roll,
                Stake         = stake,
                Win           = win,
                CreationDate  = DateTime.Now
            };

            bet = betRepository.Create(bet);

            user.Money = user.Money - stake + win;

            userRepository.UpdateMoney(user.Id, user.Money);

            var response = new
            {
                BetId      = bet.Id,
                Bet        = bet.DiceSumBet,
                ActualRoll = bet.DiceSumResult,
                Stake      = bet.Stake,
                Win        = bet.Win,
                Timestamp  = bet.CreationDate
            };

            return(Task.FromResult(Request.CreateResponse(HttpStatusCode.Created, response)));
        }
        public async Task GetBet_UserHasBet_ReturnsBetInfoAndOKStatusCode()
        {
            var user = new UserDto()
            {
                Id = 1
            };
            var bet = new DiceBetDto()
            {
                Id            = 1337,
                UserId        = user.Id,
                DiceSumBet    = 10,
                DiceSumResult = 8,
                Win           = 0,
                Stake         = 20,
                CreationDate  = DateTime.Now
            };

            //Arrange
            Mock <IUserRepository>    mockUserRepository  = new Mock <IUserRepository>();
            Mock <ILoginRepository>   mockLoginRepository = new Mock <ILoginRepository>();
            Mock <IDiceBetRepository> mockBetRepository   = new Mock <IDiceBetRepository>();

            mockLoginRepository.Setup(l => l.HasUserAndToken(user.Id, It.IsAny <string>())).Returns(true);
            mockBetRepository.Setup(b => b.Get(bet.Id)).Returns(bet);

            var controller     = new DiceBetController(mockUserRepository.Object, mockLoginRepository.Object, mockBetRepository.Object);
            var requestMessage = new HttpRequestMessage();

            requestMessage.Headers.Add("OnlineCasino-Token", "token");
            controller.Request       = requestMessage;
            controller.Configuration = new HttpConfiguration();

            //Act
            var response = await controller.GetBet(user.Id, bet.Id);

            //Assert
            string cnt = await response.Content.ReadAsStringAsync();

            dynamic respData = JsonConvert.DeserializeObject(cnt);

            Assert.IsTrue(respData.CreationDate == bet.CreationDate);
            Assert.IsTrue(respData.Bet == bet.DiceSumBet);
            Assert.IsTrue(respData.Stake == bet.Stake);
            Assert.IsTrue(respData.Win == bet.Win);
            Assert.IsTrue(respData.ActualRoll == bet.DiceSumResult);

            Assert.IsTrue(response.StatusCode == HttpStatusCode.OK);
        }
        public DiceBetDto Create(DiceBetDto bet)
        {
            var newBet = new DiceBet()
            {
                UserId        = bet.UserId,
                DiceSumBet    = bet.DiceSumBet,
                DiceSumResult = bet.DiceSumResult,
                Stake         = bet.Stake,
                Win           = bet.Win,
                CreationDate  = bet.CreationDate
            };

            using (var db = new OnlineCasinoDb())
            {
                db.DiceBets.Add(newBet);
                db.SaveChanges();
            }

            return(CreateBetDTO(newBet));
        }
        public async Task DeleteBet_UserHasBetAndOneMinuteHaveNotPassed_DeletesBetAndReturnsNoContentStatusCode()
        {
            var user = new UserDto()
            {
                Id = 1
            };
            var bet = new DiceBetDto()
            {
                Id           = 1337,
                UserId       = user.Id,
                CreationDate = DateTime.Now
            };

            //Arrange
            Mock <IUserRepository>    mockUserRepository  = new Mock <IUserRepository>();
            Mock <ILoginRepository>   mockLoginRepository = new Mock <ILoginRepository>();
            Mock <IDiceBetRepository> mockBetRepository   = new Mock <IDiceBetRepository>();

            mockLoginRepository.Setup(l => l.HasUserAndToken(user.Id, It.IsAny <string>())).Returns(true);
            mockBetRepository.Setup(b => b.Get(bet.Id)).Returns(bet);

            var controller     = new DiceBetController(mockUserRepository.Object, mockLoginRepository.Object, mockBetRepository.Object);
            var requestMessage = new HttpRequestMessage();

            requestMessage.Headers.Add("OnlineCasino-Token", "token");
            controller.Request       = requestMessage;
            controller.Configuration = new HttpConfiguration();

            //Act
            var response = await controller.DeleteBet(user.Id, bet.Id);

            //Assert
            mockBetRepository.Verify(b => b.Delete(bet.Id));

            Assert.IsTrue(response.StatusCode == HttpStatusCode.NoContent);
        }
Example #6
0
        public async Task MakeABetWithValidDataThenGetTheNewBetToCheckInfoAndDeleteIt()
        {
            string userIdString = TestHelper.TestUser.Id.ToString();

            // Make a bet

            decimal initialUserMoney = TestHelper.TestUser.Money;

            // Arrange
            var betRequest = new DiceBetRequest()
            {
                Bet   = 12,
                Stake = 20
            };

            var json    = JsonConvert.SerializeObject(betRequest);
            var request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets",
                                                            method: HttpMethod.Post,
                                                            token: TestHelper.TestLogin.Token,
                                                            json: json);

            // Act
            var timeBeforeBet = DateTime.Now;
            var response      = await TestHelper.Client.SendAsync(request);

            var timeAfterBet = DateTime.Now;

            // Assert
            Assert.IsTrue(response.StatusCode == HttpStatusCode.Created);
            var content = await response.Content.ReadAsStringAsync();

            var jsonResponse = JsonConvert.DeserializeObject <Dictionary <string, string> >(content);

            var bet = new DiceBetDto()
            {
                Id           = int.Parse(jsonResponse["betId"]),
                DiceSumBet   = int.Parse(jsonResponse["bet"]),
                Stake        = decimal.Parse(jsonResponse["stake"]),
                Win          = decimal.Parse(jsonResponse["win"]),
                UserId       = TestHelper.TestUser.Id,
                CreationDate = DateTime.Parse(jsonResponse["timestamp"])
            };

            Assert.IsTrue(timeBeforeBet < bet.CreationDate);
            Assert.IsTrue(bet.CreationDate < timeAfterBet);

            // update new test user money
            using (var db = new OnlineCasinoDb())
            {
                var user = db.Users.First(u => u.Id == TestHelper.TestUser.Id);

                TestHelper.TestUser.Money = user.Money;
            }

            Assert.IsTrue(bet.Win > 0 ?
                          TestHelper.TestUser.Money > initialUserMoney - betRequest.Stake
                : TestHelper.TestUser.Money == initialUserMoney - betRequest.Stake);

            // Get bet info

            // Arrange 2
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets/" + bet.Id.ToString(),
                                                        method: HttpMethod.Get,
                                                        token: TestHelper.TestLogin.Token);

            // Act 2
            response = await TestHelper.Client.SendAsync(request);

            // Assert 2
            Assert.IsTrue(response.StatusCode == HttpStatusCode.OK);
            content = await response.Content.ReadAsStringAsync();

            jsonResponse = JsonConvert.DeserializeObject <Dictionary <string, string> >(content);

            Assert.IsTrue(int.Parse(jsonResponse["bet"]) == bet.DiceSumBet);
            Assert.IsTrue(decimal.Parse(jsonResponse["stake"]) == bet.Stake);
            Assert.IsTrue(decimal.Parse(jsonResponse["win"]) == bet.Win);
            Assert.IsTrue(DateTime.Parse(jsonResponse["creationDate"]) == bet.CreationDate);

            // Delete bet

            // Arrange 3
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets/" + bet.Id.ToString(),
                                                        method: HttpMethod.Delete,
                                                        token: TestHelper.TestLogin.Token);

            // Act 3
            response = await TestHelper.Client.SendAsync(request);

            // Assert 3
            Assert.IsTrue(response.StatusCode == HttpStatusCode.NoContent);

            using (var db = new OnlineCasinoDb())
            {
                var deletedBet = db.DiceBets.FirstOrDefault(b => b.Id == bet.Id);

                Assert.IsTrue(deletedBet == null);
            }
        }