public async Task InvalidPostcode()
        {
            _postcodeValidator.Setup(x => x.IsPostcodeValidAsync(It.IsAny <string>())).ReturnsAsync(false);

            GetPostcodeRequest req = new GetPostcodeRequest()
            {
                Postcode = "NG1 5FS"
            };

            GetPostcode   getPostcode = new GetPostcode(_mediator.Object, _postcodeValidator.Object, _logger.Object);
            IActionResult result      = await getPostcode.Run(req, CancellationToken.None);

            ObjectResult objectResult = result as ObjectResult;

            Assert.IsNotNull(objectResult);
            Assert.AreEqual(422, objectResult.StatusCode);

            ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode> deserialisedResponse = objectResult.Value as ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode>;

            Assert.IsNotNull(deserialisedResponse);

            Assert.IsFalse(deserialisedResponse.HasContent);
            Assert.IsFalse(deserialisedResponse.IsSuccessful);
            Assert.AreEqual(1, deserialisedResponse.Errors.Count());
            Assert.AreEqual(AddressServiceErrorCode.InvalidPostcode, deserialisedResponse.Errors[0].ErrorCode);

            _mediator.Verify(x => x.Send(It.IsAny <GetPostcodeRequest>(), It.IsAny <CancellationToken>()), Times.Never);
        }
        public async Task ValidationFails()
        {
            _mediator.Setup(x => x.Send(It.IsAny <GetPostcodeCoordinatesRequest>(), It.IsAny <CancellationToken>())).Throws <Exception>();

            GetPostcodeRequest req = new GetPostcodeRequest()
            {
                Postcode = null
            };

            GetPostcode getPostcode = new GetPostcode(_mediator.Object, _postcodeValidator.Object, _logger.Object);

            IActionResult result = await getPostcode.Run(req, CancellationToken.None);

            ObjectResult objectResult = result as ObjectResult;

            Assert.IsNotNull(objectResult);

            ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode> deserialisedResponse = objectResult.Value as ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode>;

            Assert.IsNotNull(deserialisedResponse);
            Assert.AreEqual(422, objectResult.StatusCode);;


            Assert.IsFalse(deserialisedResponse.HasContent);
            Assert.IsFalse(deserialisedResponse.IsSuccessful);
            Assert.AreEqual(1, deserialisedResponse.Errors.Count());
            Assert.AreEqual(AddressServiceErrorCode.ValidationError, deserialisedResponse.Errors[0].ErrorCode);

            _mediator.Verify(x => x.Send(It.IsAny <GetPostcodeCoordinatesRequest>(), It.IsAny <CancellationToken>()), Times.Never);
        }
        public async Task HappyPath()
        {
            GetPostcodeRequest req = new GetPostcodeRequest()
            {
                Postcode = "NG1 5FS"
            };

            GetPostcode   getPostcode = new GetPostcode(_mediator.Object, _postcodeValidator.Object, _logger.Object);
            IActionResult result      = await getPostcode.Run(req, CancellationToken.None);

            OkObjectResult objectResult = result as OkObjectResult;

            Assert.IsNotNull(objectResult);
            Assert.AreEqual(200, objectResult.StatusCode);

            ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode> deserialisedResponse = objectResult.Value as ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode>;

            Assert.IsNotNull(deserialisedResponse);

            Assert.IsTrue(deserialisedResponse.HasContent);
            Assert.IsTrue(deserialisedResponse.IsSuccessful);
            Assert.AreEqual(0, deserialisedResponse.Errors.Count());
            Assert.AreEqual("NG1 5FS", deserialisedResponse.Content.Postcode);

            _mediator.Verify(x => x.Send(It.IsAny <GetPostcodeRequest>(), It.IsAny <CancellationToken>()));
        }
        public async Task ErrorThrown()
        {
            _mediator.Setup(x => x.Send(It.IsAny <GetPostcodeRequest>(), It.IsAny <CancellationToken>())).Throws <Exception>();

            GetPostcodeRequest req = new GetPostcodeRequest()
            {
                Postcode = "NG1 5FS"
            };

            GetPostcode   getPostcode = new GetPostcode(_mediator.Object, _postcodeValidator.Object, _logger.Object);
            IActionResult result      = await getPostcode.Run(req, CancellationToken.None);

            ObjectResult objectResult = result as ObjectResult;

            Assert.IsNotNull(objectResult);

            ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode> deserialisedResponse = objectResult.Value as ResponseWrapper <GetPostcodeResponse, AddressServiceErrorCode>;

            Assert.IsNotNull(deserialisedResponse);
            Assert.AreEqual(500, objectResult.StatusCode);;


            Assert.IsFalse(deserialisedResponse.HasContent);
            Assert.IsFalse(deserialisedResponse.IsSuccessful);
            Assert.AreEqual(1, deserialisedResponse.Errors.Count());
            Assert.AreEqual(AddressServiceErrorCode.UnhandledError, deserialisedResponse.Errors[0].ErrorCode);

            _mediator.Verify(x => x.Send(It.IsAny <GetPostcodeRequest>(), It.IsAny <CancellationToken>()));

            _logger.Verify(x => x.LogErrorAndNotifyNewRelic(It.Is <string>(y => y.Contains("Unhandled error")), It.IsAny <Exception>(), It.IsAny <GetPostcodeRequest>()));
        }