/// <inheritdoc/>
        public async Task <UpdatedContractStatusResponse> WithdrawalAsync(UpdateContractWithdrawalRequest request)
        {
            _logger.LogInformation($"[{nameof(WithdrawalAsync)}] called with contract number: {request.ContractNumber} and contract version {request.ContractVersion}.");

            var contract = await _repository.GetByContractNumberAndVersionWithIncludesAsync(request.ContractNumber, request.ContractVersion, ContractDataEntityInclude.Datas);

            ContractStatus newContractStatus = request.WithdrawalType;

            _contractValidator.Validate(contract, request);
            _contractValidator.ValidateStatusChange(contract, newContractStatus);

            var updatedContractStatusResponse = new UpdatedContractStatusResponse
            {
                Id              = contract.Id,
                ContractNumber  = contract.ContractNumber,
                ContractVersion = contract.ContractVersion,
                Ukprn           = contract.Ukprn,
                Status          = (ContractStatus)contract.Status,
                Action          = ActionType.ContractWithdrawal
            };

            contract.Status = (int)newContractStatus;

            await _contractDocumentService.UpsertOriginalContractXmlAsync(contract, request);

            await _repository.UpdateContractAsync(contract);

            updatedContractStatusResponse.NewStatus = (ContractStatus)contract.Status;

            await _mediator.Publish(updatedContractStatusResponse);

            return(updatedContractStatusResponse);
        }
        public async Task WithdrawalAsync_WithDefaultParameters_Returns404Response()
        {
            // Arrange
            var content = new UpdateContractWithdrawalRequest()
            {
                ContractNumber  = "Levy-0099",
                ContractVersion = 1,
                WithdrawalType  = ContractStatus.WithdrawnByAgency,
                FileName        = _blobName
            };

            // Act
            var response = await _testClient.PatchAsync(_withdrawUrl, GetStringContent(content));

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.NotFound);
        }
        public async Task UpdateContractWithdrawalAsync_ReturnsExpectedResult_Test()
        {
            //Arrange
            string baseUrl = $"https://localhost:5001";

            SetMapperHelper();
            var contracts = GetDataModel_Contracts();

            var request = new UpdateContractWithdrawalRequest()
            {
                ContractNumber = "main-0001", ContractVersion = 1, WithdrawalType = ContractStatus.WithdrawnByAgency, FileName = BlobHelper.BlobName
            };

            ILoggerAdapter <ContractService> logger = new LoggerAdapter <ContractService>(new Logger <ContractService>(new LoggerFactory()));

            MockAuditService();

            var contractRepo = await GetContractRepository(contracts);

            var uriService = new UriService(baseUrl);
            var asposeDocumentManagementContractService = GetDocumentService();
            var contractValidationService = GetContractValidationService();
            var mediator = BuildMediator();
            var contractDocumentService = BuildContractDocumentService();
            var service = new ContractService(contractRepo, _mapper, uriService, logger, _mockAuditService.Object, _semaphoreOnEntity, asposeDocumentManagementContractService, contractValidationService, mediator, contractDocumentService);

            //Act
            var beforeUpdate = await contractRepo.GetByContractNumberAndVersionWithIncludesAsync(request.ContractNumber, request.ContractVersion, ContractDataEntityInclude.Datas);

            // assigning to a new variable before update because this is an in memory db the
            // update will update the object.
            var actualBeforeUpdate = GetClonedContract(beforeUpdate);

            var contract = await service.WithdrawalAsync(request);

            var afterUpdate = await contractRepo.GetByContractNumberAndVersionWithIncludesAsync(request.ContractNumber, request.ContractVersion, ContractDataEntityInclude.Datas);

            //Assert
            contract.Should().NotBeNull();
            actualBeforeUpdate.Status.Should().Be((int)ContractStatus.PublishedToProvider);
            afterUpdate.Status.Should().Be((int)ContractStatus.WithdrawnByAgency);
            afterUpdate.ContractData.OriginalContractXml.Should().Be(BlobHelper.BlobSampleContent);
        }