示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#10
0
        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());
            }
        }
示例#11
0
        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));
        }
示例#12
0
        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);
        }