public async Task PostExtractData_WithInvalidFormatException_BadRequest()
        {
            // Arrange
            var stubRequest = "Invalid request";

            var httpContext = new DefaultHttpContext();

            var stream = new MemoryStream(Encoding.UTF8.GetBytes(stubRequest));

            httpContext.Request.Body          = stream;
            httpContext.Request.ContentLength = stream.Length;

            _stubExtractorService = new Mock <IExtractorService>();
            _stubExtractorService.Setup(svc => svc.ExtractData(It.IsAny <string>())).Throws(new InvalidFormatException());

            _claimExpenseController = new ClaimExpenseController(_stubExtractorService.Object)
            {
                ControllerContext = new ControllerContext()
                {
                    HttpContext = httpContext
                }
            };

            // Act
            var actionResult = await _claimExpenseController.Post();

            var resultStatus = ((ObjectResult)actionResult).StatusCode;
            var resultValue  = ((ObjectResult)actionResult).Value as Fault;

            // Assert
            Assert.IsNotNull(actionResult);
            Assert.AreEqual((int)HttpStatusCode.BadRequest, resultStatus);
            Assert.AreEqual("Invalid Request", resultValue.Message);
        }
        public async Task PostExtractData_ValidRequest_Success()
        {
            // Arrange
            var stubRequest = @"Please create an expense claim for the below. Relevant details are marked up as requested
                <expense>
                    <cost_centre>DEV002</cost_centre>
                    <total>1150.00</total>
                    <payment_method>personal card</payment_method>
                </expense>";

            var httpContext = new DefaultHttpContext();

            var stream = new MemoryStream(Encoding.UTF8.GetBytes(stubRequest));

            httpContext.Request.Body          = stream;
            httpContext.Request.ContentLength = stream.Length;

            var expectedResult = new ClaimExpense()
            {
                CostCentre    = "DEV002",
                TotalAmount   = 1150,
                PaymentMethod = "Credit Card"
            };

            _stubExtractorService = new Mock <IExtractorService>();
            _stubExtractorService.Setup(svc => svc.ExtractData(It.IsAny <string>())).Returns(expectedResult);

            _claimExpenseController = new ClaimExpenseController(_stubExtractorService.Object)
            {
                ControllerContext = new ControllerContext()
                {
                    HttpContext = httpContext
                }
            };

            // Act
            var actionResult = await _claimExpenseController.Post();

            var resultStatus = ((ObjectResult)actionResult).StatusCode;
            var resultValue  = ((ObjectResult)actionResult).Value as ClaimExpense;

            // Assert
            Assert.IsNotNull(actionResult);
            Assert.AreEqual(expectedResult, resultValue);
            Assert.AreEqual((int)HttpStatusCode.OK, resultStatus);
        }