public static float GetTrollyTotal(Trolly request) { float totalSplPrice = 0; float totalNormalPrice = 0; float trollyTotal = 0; try { // loop through products foreach (var product in request.Products) { // select a quantity var trollyItem = request.Quantities.Where(q => q.Name == product.Name).FirstOrDefault(); if (trollyItem != null) { totalNormalPrice += (product.Price * trollyItem.Quantity); } } totalSplPrice = GetSpecialPrice(request.Specials, request.Quantities); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } trollyTotal = totalNormalPrice; if (totalSplPrice < totalNormalPrice) { trollyTotal = totalSplPrice; } return(trollyTotal); }
public async Task HttpPost_WhenCorrectToken_And_NullRequestProductsPassed_ReturnsZeroTrollyTotal() { // Arrange string strToken = "e3b5361b-e85c-4c62-85fd-4c9e2af2c053"; Trolly request = FakeTrollyRequest.GetRequest(); // remove request products request.Products = null; string strJson = JsonConvert.SerializeObject(request); var stringContent = new StringContent(strJson, System.Text.Encoding.UTF8, "application/json"); string strError = ""; // Act var response = await httpClient.PostAsync("api/wooliesx/TrollyTotal?token=" + strToken, stringContent); // Assert // shoud return 400 BadRequest // should return error products required var stringResponse = await response.Content.ReadAsStringAsync(); JObject dynJson = (JObject)JsonConvert.DeserializeObject(stringResponse); foreach (var item in dynJson) { JArray jarray = (JArray)item.Value; strError = (string)((JValue)jarray.First).Value; } Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); Assert.Equal("products required", strError); }
public static Trolly GetRequest() { // add products List <TrollyProduct> FackProducts = new List <TrollyProduct> { new TrollyProduct { Name = "Apple", Price = 6.0f }, new TrollyProduct { Name = "Bread", Price = 4.50f }, new TrollyProduct { Name = "Milk", Price = 3.0f }, }; List <TrollyQuantity> SpecialQuantities = new List <TrollyQuantity> { new TrollyQuantity { Name = "Apple", Quantity = 6 }, new TrollyQuantity { Name = "Bread", Quantity = 2 }, new TrollyQuantity { Name = "Milk", Quantity = 1 }, }; // add specials List <Special> FackSpecials = new List <Special> { new Special { Quantities = SpecialQuantities, Total = 40 } }; // add qunatities List <TrollyQuantity> FackQuantities = new List <TrollyQuantity> { new TrollyQuantity { Name = "Apple", Quantity = 6 }, new TrollyQuantity { Name = "Bread", Quantity = 2 }, new TrollyQuantity { Name = "Milk", Quantity = 1 }, }; Trolly request = new Trolly { Products = FackProducts, Specials = FackSpecials, Quantities = FackQuantities }; return(request); }
public void HttpPost_WhenCorrectToken_And_NullRequestProductsPassed_ReturnsZeroTrollyTotal() { // Arrange string strToken = "e3b5361b-e85c-4c62-85fd-4c9e2af2c053"; Trolly request = FakeTrollyRequest.GetRequest(); _mockService.Setup(repo => repo.GetTrollyTotal(request)) .Returns(FakeTrollyRequest.GetTrollyTotal(request)); _controller = new TrollyTotalController(_mockService.Object); // Act // remove request products request.Products = null; _controller = new TrollyTotalController(_mockService.Object); var modelState = _controller.ModelState; var actionResult = _controller.Post(strToken, request); var result = (BadRequestObjectResult)actionResult.Result; // Assert // should return model state error products required // should return trolly total 0 // shoud return 400 BadRequest Assert.Equal("products required", modelState["products"].Errors[0].ErrorMessage); Assert.Equal(0, actionResult.Value); Assert.Equal(400, result.StatusCode); }
public async Task HttpPost_WhenCorrectToken_And_EqualRequestProductsSpecialsAndQuantitiesPassed_ReturnsOKTrollyTotal() { // Arrange string strToken = "e3b5361b-e85c-4c62-85fd-4c9e2af2c053"; Trolly request = FakeTrollyRequest.GetRequest(); string strJson = JsonConvert.SerializeObject(request); var stringContent = new StringContent(strJson, System.Text.Encoding.UTF8, "application/json"); string strData = ""; // Act var response = await httpClient.PostAsync("api/wooliesx/TrollyTotal?token=" + strToken, stringContent); // Assert // normal price (6*6 + 2*4.5 + 1*3) = 48 // special price 40 // shoud return 200 OK // should return trolly total 40 var stringResponse = await response.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(40.0f, Convert.ToSingle(stringResponse)); }
public decimal CalculateTrollyTotal(Trolly trolly) { decimal trollyTotal = 0; foreach (var product in trolly.Products) { var quantity = trolly.Quantities.FirstOrDefault(q => q.Name == product.Name); var special = trolly.Specials.FirstOrDefault(s => s.Quantities.Name == product.Name); if (quantity != null && special != null) { if (quantity.Quantity >= special.Quantities.Quantity) { var specialUnit = quantity.Quantity / special.Quantities.Quantity; var individualUnits = quantity.Quantity % special.Quantities.Quantity; trollyTotal = trollyTotal + ((specialUnit * special.Total) + (individualUnits * product.Price)); } } if (quantity != null && special == null) { trollyTotal = trollyTotal + (product.Price * quantity.Quantity); } } return(trollyTotal); }
public void HttpPost_WhenEmptyTokenPassed_ReturnsZeroTrollyTotal() { // Arrange string strToken = string.Empty; Trolly request = FakeTrollyRequest.GetRequest(); _mockService.Setup(repo => repo.GetTrollyTotal(request)) .Returns(FakeTrollyRequest.GetTrollyTotal(request)); _controller = new TrollyTotalController(_mockService.Object); // Act _controller = new TrollyTotalController(_mockService.Object); var modelState = _controller.ModelState; var actionResult = _controller.Post(strToken, request); var result = (BadRequestObjectResult)actionResult.Result; // Assert // should return model state error token is required // should return trolly total 0 // shoud return 400 BadRequest Assert.Equal("token is required", modelState["token"].Errors[0].ErrorMessage); Assert.Equal(0, actionResult.Value); Assert.Equal(400, result.StatusCode); }
public void HttpPost_WhenCorrectToken_And_NotEqualRequestProductsAndQuantitiesPassed_ReturnsZeroTrollyTotal() { // Arrange string strToken = "e3b5361b-e85c-4c62-85fd-4c9e2af2c053"; Trolly request = FakeTrollyRequest.GetRequest(); _mockService.Setup(repo => repo.GetTrollyTotal(request)) .Returns(FakeTrollyRequest.GetTrollyTotal(request)); _controller = new TrollyTotalController(_mockService.Object); // Act // add request product to make products and quantities not equal request.Products.Add(new TrollyProduct { Name = "Additional Product", Price = 100.00f }); _controller = new TrollyTotalController(_mockService.Object); var modelState = _controller.ModelState; var actionResult = _controller.Post(strToken, request); var result = (BadRequestObjectResult)actionResult.Result; // Assert // should return model state error same number of products and quantities required // should return trolly total 0 // shoud return 400 BadRequest Assert.Equal("same number of products and quantities required", modelState["mismatch"].Errors[0].ErrorMessage); Assert.Equal(0, actionResult.Value); Assert.Equal(400, result.StatusCode); }
public decimal Total([FromBody] Trolly trolly) { var total = TrollyService.CalculateTrollyTotal(trolly); string json = JsonConvert.SerializeObject(total); telemetryClient.TrackTrace($"JSON Sent from trolly/total API :{json})", SeverityLevel.Error); return(total); }
public ActionResult <float> Post(string token, Trolly request) { float total = 0; try { if (string.IsNullOrEmpty(token)) { ModelState.AddModelError("token", "token is required"); return(BadRequest(ModelState)); } if (token != strToken) { ModelState.AddModelError("token", "invalid token"); return(BadRequest(ModelState)); } if (request == null) { ModelState.AddModelError("request", "request is emplty"); return(BadRequest(ModelState)); } if (request.Products == null || request.Products.Count <= 0) { ModelState.AddModelError("products", "products required"); return(BadRequest(ModelState)); } if (request.Specials == null || request.Specials.Count <= 0) { ModelState.AddModelError("specials", "specials required"); return(BadRequest(ModelState)); } if (request.Quantities == null || request.Quantities.Count <= 0) { ModelState.AddModelError("quantities", "quantities required"); return(BadRequest(ModelState)); } if (request.Products.Count != request.Quantities.Count) { ModelState.AddModelError("mismatch", "same number of products and quantities required"); return(BadRequest(ModelState)); } total = _trollyService.GetTrollyTotal(request); return(Ok(total)); } catch { return(BadRequest()); } }
public decimal GetLowestTotal([FromBody] Trolly trolly) { var trollyString = JsonConvert.SerializeObject(trolly); _logger.LogError($"Trolly: {trollyString}"); var productQuantity = from product in trolly.Products join quantity in trolly.Quantities on product.Name equals quantity.Name select new ProductInTrolly { Name = product.Name, Price = product.Price, Quantity = quantity.Quantity }; return(MatchSpecialInProducts(trolly.Specials, trolly.Quantities, trolly.Products)); }
public void HttpPost_WhenCorrectToken_And_EqualRequestProductsSpecialsAndQuantitiesPassed_ReturnsOKTrollyTotal() { // Arrange string strToken = "e3b5361b-e85c-4c62-85fd-4c9e2af2c053"; Trolly request = FakeTrollyRequest.GetRequest(); _mockService.Setup(repo => repo.GetTrollyTotal(request)) .Returns(FakeTrollyRequest.GetTrollyTotal(request)); _controller = new TrollyTotalController(_mockService.Object); // Act _controller = new TrollyTotalController(_mockService.Object); var actionResult = _controller.Post(strToken, request); var result = (OkObjectResult)actionResult.Result; // Assert // normal price (6*6 + 2*4.5 + 1*3) = 48 // special price 40 // shoud return 200 OK // should return trolly total 40 Assert.Equal(200, result.StatusCode); Assert.Equal(40, (float)result.Value); }