public void test_that_controller_returns_correct_message_and_status_code_when_no_document_was_found_for_update()
        {
            //arange
            var matProcessData = new MatUpdateProcessData();

            //add fields to be updated
            matProcessData.ProcessData = new
            {
                firstField  = faker.Random.Word(),
                anyField    = faker.Random.Words(),
                numberField = faker.Random.Number()
            };
            //set up Guid to filder by
            var processRef    = faker.Random.Guid().ToString();
            var errorResponse = $"Document with reference {processRef} was not found in the database." +
                                $" An update is not possible on non-existent documents.";
            var request = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = matProcessData
            };

            _mockUsecase.Setup(x => x.ExecuteUpdate(request)).Throws <DocumentNotFound>();
            _mockValidatorUpdate.Setup(x => x.Validate(request)).Returns(new FV.ValidationResult());
            //act
            var actualResponse = _processDataController.UpdateExistingProcessDocument(request);
            var result         = (ObjectResult)actualResponse;
            var resultContent  = result.Value;

            //assert
            Assert.NotNull(actualResponse);
            Assert.NotNull(result);
            Assert.NotNull(resultContent);
            Assert.AreEqual(errorResponse, resultContent);
            Assert.AreEqual(200, result.StatusCode);
        }
예제 #2
0
        public void can_check_for_fields_to_be_updated_from_a_request_object_and_prepare_update_definition()
        {
            //arrange
            var matProcessData = new MatUpdateProcessData();

            //add fields to be updated
            matProcessData.ProcessData = new
            {
                firstField  = _faker.Random.Word(),
                anyField    = _faker.Random.Words(),
                numberField = _faker.Random.Number()
            };
            matProcessData.DateLastModified = _faker.Date.Recent();
            var expectedUpdateDefinition = Builders <BsonDocument> .Update.Combine(
                Builders <BsonDocument> .Update.Set("dateLastModified", matProcessData.DateLastModified),
                Builders <BsonDocument> .Update.Set("processDataAvailable", true),
                Builders <BsonDocument> .Update.Set("processData", BsonDocument.Parse(JsonConvert.SerializeObject(matProcessData.ProcessData))));

            //act
            UpdateDefinition <BsonDocument> processDataUpdateDefinition = UpdateProcessDocumentHelper.PrepareFieldsToBeUpdated(matProcessData);
            //assert
            var serializerRegistry = BsonSerializer.SerializerRegistry;
            var documentSerializer = serializerRegistry.GetSerializer <BsonDocument>();

            //compare what the update definitions render to
            Assert.AreEqual(expectedUpdateDefinition.Render(documentSerializer, serializerRegistry).ToString(),
                            processDataUpdateDefinition.Render(documentSerializer, serializerRegistry).ToString());
        }
        public void update_process_controller_end_to_end_test(string processRef)
        {
            //arrange
            var dataToInsert = MatProcessDataHelper.CreateProcessDataObject();

            dataToInsert.Id = processRef;
            _dbcontext.getCollection().InsertOne(BsonDocument.Parse(JsonConvert.SerializeObject(dataToInsert)));
            //fields to update
            var dataToUpdate = new MatUpdateProcessData();

            dataToUpdate.DateLastModified = DateTime.Now;
            dataToUpdate.PreProcessData   = new
            {
                randomField = "abc"
            };
            var request = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = dataToUpdate
            };
            //act
            var response = _processDataController.UpdateExistingProcessDocument(request);
            var okResult = (OkObjectResult)response;
            var updateProcessDataResponse = okResult.Value as UpdateProcessDataResponse;

            //assert
            Assert.IsInstanceOf <MatProcessData>(updateProcessDataResponse.UpdatedProcessData);
            Assert.AreEqual(processRef, updateProcessDataResponse.UpdatedProcessData.Id);
            Assert.AreEqual(dataToUpdate.DateLastModified.ToShortDateString(),
                            updateProcessDataResponse.UpdatedProcessData.DateLastModified.ToShortDateString());
            Assert.AreEqual(JsonConvert.SerializeObject(dataToUpdate.PreProcessData),
                            JsonConvert.SerializeObject(updateProcessDataResponse.UpdatedProcessData.PreProcessData));
        }
        public void test_that_object_can_be_successfully_updated()
        {
            //arrange
            MatProcessData processData = MatProcessDataHelper.CreateProcessDataObject();
            var            bsonObject  = BsonDocument.Parse(JsonConvert.SerializeObject(processData));

            collection.InsertOne(bsonObject);
            //object to update
            var objectToUpdate = new MatUpdateProcessData();
            var processRef     = processData.Id;

            objectToUpdate.DateLastModified = _faker.Date.Recent();
            objectToUpdate.ProcessData      = new
            {
                firstField  = _faker.Random.Word(),
                anyField    = _faker.Random.Words(),
                numberField = _faker.Random.Number()
            };
            //get update definition
            var updateDefinition = UpdateProcessDocumentHelper.PrepareFieldsToBeUpdated(objectToUpdate);

            //act
            var result = processDataGateway.UpdateProcessData(updateDefinition, processRef);

            //assert
            Assert.AreEqual(processRef, result.Id);
            Assert.AreEqual(JsonConvert.SerializeObject(objectToUpdate.ProcessData), JsonConvert.SerializeObject(result.ProcessData));
            Assert.AreEqual(objectToUpdate.DateLastModified.ToShortDateString(), result.DateLastModified.ToShortDateString());
            Assert.IsInstanceOf <MatProcessData>(result);
        }
        public void test_that_update_controller_returns_correct_500_status_code_when_an_error_has_occured()
        {
            //arange
            var matProcessData = new MatUpdateProcessData();

            //add fields to be updated
            matProcessData.ProcessData = new
            {
                firstField  = faker.Random.Word(),
                anyField    = faker.Random.Words(),
                numberField = faker.Random.Number()
            };
            //set up Guid to filder by
            var processRef = faker.Random.Guid().ToString();
            var request    = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = matProcessData
            };

            _mockUsecase.Setup(x => x.ExecuteUpdate(request)).Throws <AggregateException>();
            _mockValidatorUpdate.Setup(x => x.Validate(request)).Returns(new FV.ValidationResult());
            //act
            var actualResponse = _processDataController.UpdateExistingProcessDocument(request);
            var result         = (ObjectResult)actualResponse;
            var resultContent  = result.Value;

            //assert
            Assert.NotNull(actualResponse);
            Assert.NotNull(result);
            Assert.NotNull(resultContent);
            Assert.AreEqual(500, result.StatusCode);
        }
예제 #6
0
 private bool ValidateAnUpdateIsProvided(MatUpdateProcessData request)
 { //user must provide at least one object to update
     if (request.PostProcessData != null)
     {
         return(true);
     }
     else if (request.PreProcessData != null)
     {
         return(true);
     }
     else if (request.ProcessDataSchemaVersion != 0)
     {
         return(true);
     }
     else if (request.ProcessData != null)
     {
         return(true);
     }
     else if (request.ProcessStage != null)
     {
         return(true);
     }
     else if (request.DateCompleted != null && request.DateCompleted != DateTime.MinValue)
     {
         return(true);
     }
     return(false); //if non of the objects were non empty
 }
예제 #7
0
        public void can_check_for_fields_to_be_updated_from_a_request_object_correctly(string firstField)
        {
            //this test ensures that the update definition is built correctly and will be recognised as different when compared to a different
            //update definition
            //arrange
            var matProcessData = new MatUpdateProcessData();

            //add fields to be updated
            matProcessData.ProcessData = new
            {
                firstField  = _faker.Random.Word(),
                anyField    = _faker.Random.Words(),
                numberField = _faker.Random.Number()
            };

            matProcessData.DateLastModified = _faker.Date.Recent();

            var expectedUpdateDefinition = Builders <BsonDocument> .Update.Combine(
                Builders <BsonDocument> .Update.Set("dateLastModified", matProcessData.DateLastModified),
                Builders <BsonDocument> .Update.Set("processDataa", matProcessData.ProcessData));

            //act
            UpdateDefinition <BsonDocument> processDataUpdateDefinition = UpdateProcessDocumentHelper.PrepareFieldsToBeUpdated(matProcessData);
            //assert
            var serializerRegistry = BsonSerializer.SerializerRegistry;
            var documentSerializer = serializerRegistry.GetSerializer <BsonDocument>();

            //test that update definitions are succesfully recognised as different
            Assert.AreNotEqual(expectedUpdateDefinition.Render(documentSerializer, serializerRegistry).ToString(),
                               processDataUpdateDefinition.Render(documentSerializer, serializerRegistry).ToString());
        }
        public void update_process_controller_end_to_end_testing_error_message_when_document_is_not_found()
        {
            //arrange
            var dataToUpdate = new MatUpdateProcessData();
            var processRef   = _faker.Random.Guid().ToString();

            dataToUpdate.PreProcessData = new
            {
                randomField = "abc"
            };

            var request = new UpdateProcessDataRequest()
            {
                processDataToUpdate = dataToUpdate, processRef = processRef
            };
            //act
            var response = _processDataController.UpdateExistingProcessDocument(request);
            var okResult = (ObjectResult)response;
            var error    = okResult.Value;

            //assert
            Assert.AreEqual(200, okResult.StatusCode);
            Assert.AreEqual($"Document with reference { processRef} was not found in the database." +
                            $" An update is not possible on non-existent documents.", error);
        }
예제 #9
0
        public void given_missing_fields_to_update_in_request_object_validator_returns_correct_error_message()
        {
            var updateData = new MatUpdateProcessData();
            var processRef = randomGuid;
            var request    = new UpdateProcessDataRequest()
            {
                processDataToUpdate = updateData
            };

            _updateProcessDocValidator.ShouldHaveValidationErrorFor(r => r.processDataToUpdate, request.processDataToUpdate).WithErrorMessage("At least one object must be providef for an update.");
        }
예제 #10
0
        public void given_an_invalid_process_ref_validator_returns_correct_error_message(string processReference)
        {
            var updateData = new MatUpdateProcessData();
            var processRef = processReference;
            var request    = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = updateData
            };

            _updateProcessDocValidator.ShouldHaveValidationErrorFor(r => r.processRef, request).WithErrorMessage("You need to provide a valid process reference.");
        }
        public static UpdateDefinition <BsonDocument> PrepareFieldsToBeUpdated(MatUpdateProcessData matProcessData)
        {
            var listOfUpdates = new List <UpdateDefinition <BsonDocument> >();
            //mandatory field
            var dateLastModified = Builders <BsonDocument> .Update.Set("dateLastModified", matProcessData.DateLastModified);

            listOfUpdates.Add(dateLastModified);
            //update has occurred
            var processDataAvailable = Builders <BsonDocument> .Update.Set("processDataAvailable", true);

            listOfUpdates.Add(processDataAvailable);

            if (matProcessData.DateCompleted != DateTime.MinValue)
            {
                var dateCompleted = Builders <BsonDocument> .Update.Set("dateCompleted", matProcessData.DateCompleted);

                listOfUpdates.Add(dateCompleted);
            }
            if (matProcessData.PostProcessData != null)
            {
                var postProcessData = Builders <BsonDocument> .Update.Set("postProcessData",
                                                                          BsonDocument.Parse(JsonConvert.SerializeObject(matProcessData.PostProcessData)));

                listOfUpdates.Add(postProcessData);
            }
            if (matProcessData.PreProcessData != null)
            {
                var preProcessData = Builders <BsonDocument> .Update.Set("preProcessData",
                                                                         BsonDocument.Parse(JsonConvert.SerializeObject(matProcessData.PreProcessData)));

                listOfUpdates.Add(preProcessData);
            }
            if (matProcessData.ProcessData != null)
            {
                var processData = Builders <BsonDocument> .Update.Set("processData",
                                                                      BsonDocument.Parse(JsonConvert.SerializeObject(matProcessData.ProcessData)));

                listOfUpdates.Add(processData);
            }
            if (matProcessData.ProcessDataSchemaVersion != 0)
            {
                var processDataSchemaVersion = Builders <BsonDocument> .Update.Set("dataSchemaVersion", matProcessData.ProcessDataSchemaVersion);

                listOfUpdates.Add(processDataSchemaVersion);
            }
            if (!string.IsNullOrWhiteSpace(matProcessData.ProcessStage))
            {
                var processStage = Builders <BsonDocument> .Update.Set("processStage", matProcessData.ProcessStage);

                listOfUpdates.Add(processStage);
            }

            return(Builders <BsonDocument> .Update.Combine(listOfUpdates));
        }
예제 #12
0
        public void given_a_valid_request_validator_should_return_no_errors()
        {
            var updateData = new MatUpdateProcessData();
            var processRef = randomGuid;

            updateData.DateCompleted = _faker.Date.Recent();
            var request = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = updateData
            };

            _updateProcessDocValidator.ShouldNotHaveValidationErrorFor(r => r.processDataToUpdate, request.processDataToUpdate);
        }
        public void update_process_data_verify_gateway_calls_database_with_parameters(string processRef)
        {
            //arrange
            var dataToUpdate = new MatUpdateProcessData();
            var request      = new UpdateProcessDataRequest {
                processRef = processRef, processDataToUpdate = dataToUpdate
            };
            //act
            var result = processDataUseCase.ExecuteUpdate(request);

            //assert
            mockMatGateway.Verify(v => v.UpdateProcessData(It.IsAny <UpdateDefinition <BsonDocument> >(), It.Is <string>(i => i == processRef)), Times.Once);
        }
        public void update_process_data_gateway_call_returns_updateprocsesdataresponse_object()
        {
            //arrange
            var updateData = new MatUpdateProcessData();
            var request    = new UpdateProcessDataRequest()
            {
                processDataToUpdate = updateData
            };

            //act
            mockMatGateway.Setup(x => x.UpdateProcessData(It.IsAny <UpdateDefinition <BsonDocument> >(), It.IsAny <string>())).Returns(new MatProcessData());
            var result = processDataUseCase.ExecuteUpdate(request);

            //assert
            Assert.IsInstanceOf <MatProcessData>(result.UpdatedProcessData);
            Assert.IsInstanceOf <UpdateProcessDataResponse>(result);
        }
        public void update_process_controller_end_to_end_testing_for_bad_request_given_invalid_request()
        {
            //arrange
            var dataToUpdate = new MatUpdateProcessData();
            var processRef   = _faker.Random.Word();

            var request = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = dataToUpdate
            };
            //act
            var response = _processDataController.UpdateExistingProcessDocument(request);
            var okResult = (ObjectResult)response;

            //assert
            Assert.AreEqual(400, okResult.StatusCode); //check if it was a bad request
        }
        public void test_if_object_to_be_updated_is_not_found_exception_is_thrown()
        {
            //arrange
            //object to update
            var objectToUpdate = new MatUpdateProcessData();

            objectToUpdate.DateLastModified = _faker.Date.Recent();
            objectToUpdate.ProcessData      = new
            {
                firstField  = _faker.Random.Word(),
                anyField    = _faker.Random.Words(),
                numberField = _faker.Random.Number()
            };
            var processRef = _faker.Random.Guid().ToString();
            //get update definition
            var updateDefinition = UpdateProcessDocumentHelper.PrepareFieldsToBeUpdated(objectToUpdate);

            //assert
            Assert.Throws <DocumentNotFound>(() => processDataGateway.UpdateProcessData(updateDefinition, processRef));
        }
        public void ensure_update_controller_calls_use_case_with_request_object()
        {
            //arrange
            var matProcessData = new MatUpdateProcessData();

            //add fields to be updated
            matProcessData.ProcessData = new
            {
                firstField = faker.Random.Word()
            };
            //set up Guid to filder by
            var processRef = faker.Random.Guid().ToString();
            var request    = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = matProcessData
            };

            _mockValidatorUpdate.Setup(x => x.Validate(request)).Returns(new FV.ValidationResult());
            var actualResponse = _processDataController.UpdateExistingProcessDocument(request);

            //verify usecase is called with an update process request object
            _mockUsecase.Verify(x => x.ExecuteUpdate((It.Is <UpdateProcessDataRequest>(i => i == request))));
        }
        public void given_an_update_object_when_update_process_data_method_is_called_the_controller_returns_correct_json_response()
        {
            //arange
            var matProcessData = new MatUpdateProcessData();

            //add fields to be updated
            matProcessData.ProcessData = new
            {
                firstField  = faker.Random.Word(),
                anyField    = faker.Random.Words(),
                numberField = faker.Random.Number()
            };
            //set up Guid to filder by
            var processRef = faker.Random.Guid().ToString();

            var request = new UpdateProcessDataRequest()
            {
                processRef = processRef, processDataToUpdate = matProcessData
            };
            var response = new UpdateProcessDataResponse(request, new MatProcessData(), DateTime.Now);

            _mockValidatorUpdate.Setup(x => x.Validate(request)).Returns(new FV.ValidationResult());
            _mockUsecase.Setup(x => x.ExecuteUpdate(request)).Returns(response);
            //act
            var actualResponse = _processDataController.UpdateExistingProcessDocument(request);
            var okResult       = (OkObjectResult)actualResponse;
            var resultContent  = (UpdateProcessDataResponse)okResult.Value;

            //assert
            Assert.NotNull(actualResponse);
            Assert.NotNull(okResult);
            Assert.IsInstanceOf <UpdateProcessDataResponse>(resultContent);
            Assert.NotNull(resultContent);
            Assert.AreEqual(JsonConvert.SerializeObject(response), JsonConvert.SerializeObject(resultContent));
            Assert.AreEqual(200, okResult.StatusCode);
        }
예제 #19
0
 public void set_up()
 {
     processData = new MatUpdateProcessData();
 }