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)); }
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); }
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); } }