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));
            }
        }