public async Task Bet_EnoughMoney_CreatesBetAndReturnsBetInfoAndOKStatusCode()
        {
            var user = new UserDto()
            {
                Id    = 1,
                Money = 1234
            };

            int diceSumResult = 0;

            //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);
            mockUserRepository.Setup(u => u.Get(user.Id)).Returns(user);
            mockBetRepository.Setup(b => b.Create(It.IsAny <DiceBetDto>())).Returns <DiceBetDto>(x =>
            {
                x.Id          = 1;               // set bet Id to 1
                diceSumResult = x.DiceSumResult; // save result of dice throw. Used in assertion of win amount
                return(x);
            });

            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 betRequest = new DiceBetRequest()
            {
                Bet   = 10,
                Stake = 200
            };
            var timeBeforeBet = DateTime.Now;
            var response      = await controller.Bet(user.Id, betRequest);

            var timeAfterBet = DateTime.Now;

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

            dynamic respData = JsonConvert.DeserializeObject(cnt);
            var     win      = (decimal)respData.Win;

            mockUserRepository.Verify(u => u.UpdateMoney(user.Id, It.IsAny <decimal>()));
            Assert.IsTrue(respData.BetId == 1);
            Assert.IsTrue(respData.Bet == betRequest.Bet);
            Assert.IsTrue(respData.Stake == betRequest.Stake);
            Assert.IsTrue(betRequest.Bet == diceSumResult ? win > 0 : win == 0);
            var timestamp = (DateTime)respData.Timestamp;

            Assert.IsTrue(timeBeforeBet < timestamp);
            Assert.IsTrue(timestamp < timeAfterBet);

            Assert.IsTrue(response.StatusCode == HttpStatusCode.Created);
        }
        public void Bet_NotEnoughMoney_ThrowsBadRequestException()
        {
            var user = new UserDto()
            {
                Id    = 1,
                Money = 1234
            };

            //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);
            mockUserRepository.Setup(u => u.Get(user.Id)).Returns(user);

            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
            var betRequest = new DiceBetRequest()
            {
                Bet   = 10,
                Stake = user.Money + 1000
            };

            Assert.Throws <BadRequestException>(() => controller.Bet(user.Id, betRequest));
        }
示例#3
0
        public async Task TryBettingWithoutEnoughMoneyAndCheckIfBadRequestReturned()
        {
            string userIdString = TestHelper.TestUser.Id.ToString();

            // Make a bet

            // Arrange
            var betRequest = new DiceBetRequest()
            {
                Bet   = 12,
                Stake = TestHelper.TestUser.Money + 10000
            };

            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 response = await TestHelper.Client.SendAsync(request);

            // Assert
            Assert.IsTrue(response.StatusCode == HttpStatusCode.BadRequest);
        }
示例#4
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)));
        }
示例#5
0
        public async Task TryAllBetActionsWithInvalidTokenAndCheckIfUnauthorizedReturned()
        {
            string userIdString = TestHelper.TestUser.Id.ToString();

            // Make a bet

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

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

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

            // Assert
            Assert.IsTrue(response.StatusCode == HttpStatusCode.Unauthorized);

            // Get some bets

            // Arrange 2
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets?skip=0&take=10&orderby=win",
                                                        method: HttpMethod.Get,
                                                        token: "invalidToken");

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

            // Assert 2
            Assert.IsTrue(response.StatusCode == HttpStatusCode.Unauthorized);

            // Get a specfic bet

            // Arrange 3
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets/1",
                                                        method: HttpMethod.Get,
                                                        token: "invalidToken");

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

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

            // Delete bet

            // Arrange 4
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets/1",
                                                        method: HttpMethod.Delete,
                                                        token: "invalidToken");

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

            // Assert 4
            Assert.IsTrue(response.StatusCode == HttpStatusCode.Unauthorized);
        }
示例#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);
            }
        }
示例#7
0
        public async Task CreateSomeBetsAndGetThemSortedByWinAndByTimeAndCheckSkipAndTakeFunctionality()
        {
            string userIdString = TestHelper.TestUser.Id.ToString();

            List <DiceBetDto> allBets = new List <DiceBetDto>();

            DiceBetRequest      betRequest;
            string              json;
            HttpRequestMessage  request;
            HttpResponseMessage response;

            // Create 10 bets
            for (int i = 0; i < 10; i++)
            {
                // Arrange
                betRequest = new DiceBetRequest()
                {
                    Bet   = 12,
                    Stake = 20
                };

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

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

                var timeAfterBet = DateTime.Now;

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

                var jsonResp = JsonConvert.DeserializeObject <Dictionary <string, string> >(cnt);

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

                Assert.IsTrue(timeBeforeBet < allBets[i].CreationDate);
                Assert.IsTrue(allBets[i].CreationDate < timeAfterBet);
            }

            // Get bets sorted by win

            // Arrange 2
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets?skip=0&take=10&orderby=win",
                                                        method: HttpMethod.Get,
                                                        token: TestHelper.TestLogin.Token);

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

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

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

            decimal lastWin = 0;

            for (int i = 0; i < 10; i++)
            {
                decimal currentWin = decimal.Parse(jsonResponse[i]["win"]);
                Assert.IsTrue(lastWin <= currentWin);
                lastWin = currentWin;
            }
            Assert.IsTrue(jsonResponse.Count == 10);

            // Get bets sorted by time

            // Arrange 3
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets?skip=0&take=10&orderby=time",
                                                        method: HttpMethod.Get,
                                                        token: TestHelper.TestLogin.Token);

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

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

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

            DateTime lastDate = DateTime.Now.AddYears(-1);

            for (int i = 0; i < 10; i++)
            {
                DateTime currentDate = DateTime.Parse(jsonResponseSortedByDateAll[i]["creationDate"]);
                Assert.IsTrue(lastDate < currentDate);
                lastDate = currentDate;
            }
            Assert.IsTrue(jsonResponseSortedByDateAll.Count == 10);

            // Sort by date but skip 5 and take 3

            // Arrange 4
            request = TestHelper.GenerateRequestMessage(url: "http://localhost/api/users/" + userIdString + "/dicebets?skip=5&take=3&orderby=time",
                                                        method: HttpMethod.Get,
                                                        token: TestHelper.TestLogin.Token);

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

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

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

            Assert.IsTrue(jsonResponse.Count == 3);
            for (int i = 0; i < 3; i++)
            {
                var creationDate = DateTime.Parse(jsonResponse[i]["creationDate"]);
                Assert.IsTrue(creationDate == DateTime.Parse(jsonResponseSortedByDateAll[5 + i]["creationDate"]));
            }

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

                user.Money = TestHelper.TestUser.Money;

                db.Users.AddOrUpdate(user);
                db.SaveChanges();
            }
        }