public void given_an_invalid_request_when_postProcessImage_controller_method_is_called_then_the_response_BadRequest_result_contains_correct_error_messages() { //arrange var expectedStatusCode = 400; var request = new PostProcessImageRequest(); //an empty request will be invalid int errorCount = _faker.Random.Int(1, 10); //simulate from 1 to 10 validation errors (triangulation). var validationErrorList = new List <ValidationFailure>(); //this list will be used as constructor argument for 'ValidationResult'. for (int i = errorCount; i > 0; i--) { validationErrorList.Add(new ValidationFailure(_faker.Random.Word(), _faker.Random.Word())); } //generate from 1 to 10 fake validation errors. Single line for-loop so that it wouldn't distract from what's key in this test. var fakeValidationResult = new FV.ValidationResult(validationErrorList); //Need to create ValidationResult so that I could setup Validator mock to return it upon '.Validate()' call. Also this is the only place where it's possible to manipulate the validation result - You can only make the validation result invalid by inserting a list of validation errors as a parameter through a constructor. The boolean '.IsValid' comes from expression 'IsValid => Errors.Count == 0;', so it can't be set manually. _mockPostValidator.Setup(v => v.Validate(It.IsAny <PostProcessImageRequest>())).Returns(fakeValidationResult); var expectedControllerResponse = new BadRequestObjectResult(validationErrorList); // build up expected controller response to check if the contents of the errors match - that's probably the easiest way to check that. //act var controllerResponse = _processImageController.PostProcessImage(request); var result = controllerResponse as ObjectResult; var resultContents = (IList <ValidationFailure>)result.Value; //assert Assert.NotNull(controllerResponse); Assert.NotNull(result); Assert.IsInstanceOf <BadRequestObjectResult>(result); Assert.IsInstanceOf <IList <ValidationFailure> >(resultContents); Assert.NotNull(resultContents); Assert.AreEqual(errorCount, resultContents.Count); // there should be 1 validation failure coming from the invalid guid Assert.AreEqual(JsonConvert.SerializeObject(expectedControllerResponse), JsonConvert.SerializeObject(controllerResponse)); //expectedControllerResponse }
public void ExecutePost(PostProcessImageRequest request) { Base64DecodedData base64Decoded = _processImageDecoder.DecodeBase64ImageString(request.base64Image); ProcessImageData imageData = ImageDataFactory.CreateImageDataObject(request, base64Decoded); _processImageGateway.UploadImage(imageData); }
public static ProcessImageData CreateImageDataObject(PostProcessImageRequest request, Base64DecodedData decodedStringData) { return(new ProcessImageData() { processRef = request.processRef, imageId = request.imageId, imageData = decodedStringData, key = ImagePersistingHelper.generateImageKey(request.processType, request.imageId, request.processRef, decodedStringData.imageExtension) }); }
public void given_any_request_when_postProcessImage_controller_method_is_called_then_it_calls_the_validator_with_that_request_object() { //arrange var request = new PostProcessImageRequest(); _mockPostValidator.Setup(x => x.Validate(request)).Returns(new FV.ValidationResult()); //setup validator to return a no error validation result //act _processImageController.PostProcessImage(request); //assert _mockPostValidator.Verify(v => v.Validate(It.Is <PostProcessImageRequest>(obj => obj == request)), Times.Once); }
public void given_valid_request_when_postProcessImage_controller_method_is_called_then_usecase_is_called() { //arrange var request = new PostProcessImageRequest(); _mockPostValidator.Setup(x => x.Validate(request)).Returns(new FV.ValidationResult()); //setup validator to return a no error validation result //act _processImageController.PostProcessImage(request); //assert _mockUsecase.Verify(u => u.ExecutePost(It.IsAny <PostProcessImageRequest>()), Times.Once); }
public void given_valid_request_when_postProcessImage_controller_method_is_called_then_it_returns_204_NoContent_result() { //arrange var expectedStatusCode = 204; var request = new PostProcessImageRequest(); _mockPostValidator.Setup(x => x.Validate(request)).Returns(new FV.ValidationResult()); //setup validator to return a no error validation result //act var controllerResponse = _processImageController.PostProcessImage(request); var result = (StatusCodeResult)controllerResponse; //not 'ObjectResult' because there's no object contained in this response //assert Assert.IsInstanceOf <NoContentResult>(result); Assert.AreEqual(expectedStatusCode, result.StatusCode); }
public void given_an_exception_thrown_check_that_the_controller_throws_correct_exception_and_500_status_code() { var expectedStatusCode = 500; var request = new PostProcessImageRequest(); //an empty request will be invalid var fakeValidationResult = new FV.ValidationResult(); //Need to create ValidationResult so that I could setup Validator mock to return it upon '.Validate()' call. Also this is the only place where it's possible to manipulate the validation result - You can only make the validation result invalid by inserting a list of validation errors as a parameter through a constructor. The boolean '.IsValid' comes from expression 'IsValid => Errors.Count == 0;', so it can't be set manually. _mockPostValidator.Setup(v => v.Validate(It.IsAny <PostProcessImageRequest>())).Returns(fakeValidationResult); _mockUsecase.Setup(x => x.ExecutePost(request)).Throws <ImageNotInsertedToS3>(); //act var controllerResponse = _processImageController.PostProcessImage(request); var result = controllerResponse as ObjectResult; //assert Assert.NotNull(controllerResponse); Assert.NotNull(result); Assert.AreEqual(expectedStatusCode, result.StatusCode); }
public IActionResult PostProcessImage([FromBody] PostProcessImageRequest imageData) { try { var validationResult = _postValidator.Validate(imageData); if (validationResult.IsValid) { _processImageUseCase.ExecutePost(imageData); return(NoContent()); } return(BadRequest(validationResult.Errors)); } catch (ImageNotInsertedToS3 ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex)); } }