public async Task WhenAModelStateValidationExceptionIsRaised_AValidationErrorWillBeReturned_WithBadRequestHttpStatus()
        {
            // Arrange
            var requestDTO = new RequestModelBasic()
            {
                Id = 0, Message = string.Empty, CreatedOn = DateTime.Now
            };

            // Perform a validation using ModelState
            var modelState = new ModelStateDictionary();

            modelState.AddModelError("Error_1", "Input string '1.3' is not a valid integer. Path 'userId', line 2, position 17.");
            modelState["Error_1"].RawValue = "1.3";
            modelState.AddModelError("Error_2", "Could not convert string to DateTime: 2018:10. Path 'momentsDate', line 4, position 28.");
            ValidationException thrownException = new ValidationException("bad_request", modelState, string.Empty);

            ValidationError expectedResponse = new ValidationError(thrownException.ValidationFailures, string.Empty);

            var middleware = new ExceptionHandlerMiddleware((innerHttpContext) =>
            {
                throw thrownException;
            }, _logger);

            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            //Act
            await middleware.Invoke(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);
            var reader         = new StreamReader(context.Response.Body);
            var streamText     = reader.ReadToEnd();
            var actualResponse = JsonConvert.DeserializeObject <ValidationError>(streamText);

            //Assert
            Assert.Equal(expectedResponse.StatusCode, actualResponse.StatusCode);
            Assert.Equal(expectedResponse.StatusCode, context.Response.StatusCode);
            Assert.Equal(expectedResponse.StatusMessage, actualResponse.StatusMessage);
            Assert.NotNull(actualResponse.Errors);
            Assert.Equal(expectedResponse.Errors.Count, actualResponse.Errors.Count);

            for (int i = 0; i < actualResponse.Errors.Count; i++)
            {
                Assert.Equal(expectedResponse.Errors[i].Code, actualResponse.Errors[i].Code);
                Assert.Equal(expectedResponse.Errors[i].Message, actualResponse.Errors[i].Message);
                Assert.Equal(expectedResponse.Errors[i].AttemptedValue, actualResponse.Errors[i].AttemptedValue);
                Assert.Equal(expectedResponse.Errors[i].Field, actualResponse.Errors[i].Field);
            }
        }
        public async Task WhenAFluentValidationExceptionIsRaised_AValidationErrorWillBeReturned_WithBadRequestHttpStatus()
        {
            // Arrange
            var requestDTO = new RequestModelBasic()
            {
                Id = 0, Message = string.Empty, CreatedOn = DateTime.Now
            };

            // Perform a validation using a FluentValidator
            var validator = new RequestModelBasicValidator();

            FluentValidation.Results.ValidationResult validationResult = validator.Validate(requestDTO);
            ValidationException thrownException = new ValidationException(validationResult.Errors, string.Empty);

            ValidationError expectedResponse = new ValidationError(validationResult.Errors, string.Empty);

            var middleware = new ExceptionHandlerMiddleware((innerHttpContext) =>
            {
                throw thrownException;
            }, _logger);

            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            //Act
            await middleware.Invoke(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);
            var reader         = new StreamReader(context.Response.Body);
            var streamText     = reader.ReadToEnd();
            var actualResponse = JsonConvert.DeserializeObject <ValidationError>(streamText);

            //Assert
            Assert.Equal(expectedResponse.StatusCode, actualResponse.StatusCode);
            Assert.Equal(expectedResponse.StatusCode, context.Response.StatusCode);
            Assert.Equal(expectedResponse.StatusMessage, actualResponse.StatusMessage);
            Assert.NotNull(actualResponse.Errors);
            Assert.Equal(expectedResponse.Errors.Count, actualResponse.Errors.Count);

            for (int i = 0; i < actualResponse.Errors.Count; i++)
            {
                Assert.Equal(expectedResponse.Errors[i].Code, actualResponse.Errors[i].Code);
                Assert.Equal(expectedResponse.Errors[i].Message, actualResponse.Errors[i].Message);
                Assert.Equal(expectedResponse.Errors[i].AttemptedValue.ToString(), actualResponse.Errors[i].AttemptedValue.ToString());
                Assert.Equal(expectedResponse.Errors[i].Field, actualResponse.Errors[i].Field);
            }
        }