public async void Create_ShallReturnCreatedJson()
        {
            var mockLogger = new Mock <ILogger <AeTitleJobProcessorValidator> >();

            _serviceProvider.Setup(p => p.GetService(typeof(ILogger <AeTitleJobProcessorValidator>))).Returns(mockLogger.Object);

            var response = new HttpOperationResponse <object>();

            response.Response         = new HttpResponseMessage(HttpStatusCode.OK);
            response.Response.Content = new StringContent("Go!Clara");
            _kubernetesClient
            .Setup(p => p.CreateNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>(), It.IsAny <object>()))
            .Returns(() =>
            {
                return(Task.FromResult(response));
            });

            var claraAeTitle = new DestinationApplicationEntity
            {
                Name    = "AETITLE",
                AeTitle = "AET",
                HostIp  = "localhost",
                Port    = 104
            };

            var result = await _controller.Create(claraAeTitle);

            _kubernetesClient.Verify(p => p.CreateNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>(), It.IsAny <object>()), Times.Once());
            Assert.NotNull(result);
            var contentResult = result.Result as ContentResult;

            Assert.NotNull(contentResult);
            Assert.Equal(response.Response.Content.AsString(), contentResult.Content);
        }
        public async void Create_ShallReturnBadRequestOnAddFailure()
        {
            var aeTitle      = "AET";
            var claraAeTitle = new DestinationApplicationEntity
            {
                Name    = aeTitle,
                AeTitle = aeTitle,
                HostIp  = "host",
                Port    = 1
            };

            _repository.Setup(p => p.AddAsync(It.IsAny <DestinationApplicationEntity>(), It.IsAny <CancellationToken>())).Throws(new Exception("error"));

            var result = await _controller.Create(claraAeTitle);

            var objectResult = result.Result as ObjectResult;

            Assert.NotNull(objectResult);
            var problem = objectResult.Value as ProblemDetails;

            Assert.NotNull(problem);
            Assert.Equal("Error adding new Destination Application Entity.", problem.Title);
            Assert.Equal($"error", problem.Detail);
            Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status);

            _repository.Verify(p => p.AddAsync(It.IsAny <DestinationApplicationEntity>(), It.IsAny <CancellationToken>()), Times.Once());
        }
        public async void Delete_ShallReturnProblemOnFailure()
        {
            var value  = "AET";
            var entity = new DestinationApplicationEntity
            {
                AeTitle = value,
                Name    = value
            };

            _repository.Setup(p => p.FindAsync(It.IsAny <string>())).Returns(Task.FromResult(entity));
            _repository.Setup(p => p.Remove(It.IsAny <DestinationApplicationEntity>())).Throws(new Exception("error"));

            var result = await _controller.Delete(value);

            var objectResult = result.Result as ObjectResult;

            Assert.NotNull(objectResult);
            var problem = objectResult.Value as ProblemDetails;

            Assert.NotNull(problem);
            Assert.Equal("Error deleting Destination Application Entity.", problem.Title);
            Assert.Equal("error", problem.Detail);
            Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status);
            _repository.Verify(p => p.FindAsync(value), Times.Once());
        }
示例#4
0
        public async Task <ActionResult <string> > Create(DestinationApplicationEntity item)
        {
            try
            {
                if (!item.IsValid(_dicomAdapterRepository.AsQueryable().Select(p => p.Name), out IList <string> validationErrors))
                {
                    throw new ConfigurationException(string.Join(Environment.NewLine, validationErrors));
                }

                await _dicomAdapterRepository.AddAsync(item);

                await _dicomAdapterRepository.SaveChangesAsync();

                _logger.Log(LogLevel.Information, $"DICOM destination added AE Title={item.AeTitle}, Host/IP={item.HostIp}.");
                return(CreatedAtAction(nameof(GetAeTitle), new { name = item.Name }, item));
            }
            catch (ConfigurationException ex)
            {
                return(Problem(title: "Validation error.", statusCode: (int)System.Net.HttpStatusCode.BadRequest, detail: ex.Message));
            }
            catch (Exception ex)
            {
                _logger.Log(LogLevel.Error, ex, "Error adding new Destination Application Entity.");
                return(Problem(title: "Error adding new Destination Application Entity.", statusCode: (int)System.Net.HttpStatusCode.InternalServerError, detail: ex.Message));
            }
        }
示例#5
0
        public void DestinationApplicationEntity_InvalidWhenNameIsEmpty()
        {
            var destinationApplicationEntity = new DestinationApplicationEntity();

            destinationApplicationEntity.Name    = "     ";
            destinationApplicationEntity.AeTitle = "AET";
            Assert.False(destinationApplicationEntity.IsValid(new List <string>(), out _));
        }
 public OutputJobTest()
 {
     _logger                  = new Mock <ILogger <ScuService> >();
     _resultsService          = new Mock <IResultsService>();
     _config                  = new DestinationApplicationEntity();
     _cancellationTokenSource = new CancellationTokenSource();
     _resultsService.Setup(p => p.ReportFailure(It.IsAny <Guid>(), It.IsAny <bool>(), It.IsAny <CancellationToken>()));
     _resultsService.Setup(p => p.ReportSuccess(It.IsAny <Guid>(), It.IsAny <CancellationToken>()));
 }
示例#7
0
        public void DestinationApplicationEntity_ShallThrowOnNull()
        {
            DestinationApplicationEntity destinationApplicationEntity = null;

            Assert.Throws <ArgumentNullException>(() => destinationApplicationEntity.IsValid(new List <string>(), out _));

            destinationApplicationEntity = new DestinationApplicationEntity();
            Assert.Throws <ArgumentNullException>(() => destinationApplicationEntity.IsValid(null, out _));
        }
示例#8
0
        public void DestinationApplicationEntity_InvalidWhenAeTitleIsEmpty()
        {
            var destinationApplicationEntity = new DestinationApplicationEntity();

            destinationApplicationEntity.AeTitle = "             ";
            Assert.False(destinationApplicationEntity.IsValid(new List <string>(), out _));

            destinationApplicationEntity.AeTitle = "ABCDEFGHIJKLMNOPQRSTUVW";
            Assert.False(destinationApplicationEntity.IsValid(new List <string>(), out _));
        }
示例#9
0
        public void DestinationApplicationEntity_Valid()
        {
            var destinationApplicationEntity = new DestinationApplicationEntity();

            destinationApplicationEntity.Name    = "NAME";
            destinationApplicationEntity.AeTitle = "AET";
            destinationApplicationEntity.HostIp  = "HOSTNAME";
            destinationApplicationEntity.Port    = 104;
            Assert.True(destinationApplicationEntity.IsValid(new List <string>(), out _));
        }
示例#10
0
        public void DestinationApplicationEntity_InvalidIfAlreadyExists()
        {
            var destinationApplicationEntity = new DestinationApplicationEntity();

            destinationApplicationEntity.Name    = "NAME";
            destinationApplicationEntity.AeTitle = "AET";
            Assert.False(destinationApplicationEntity.IsValid(new List <string>()
            {
                "NAME"
            }, out _));
        }
示例#11
0
        public void DestinationApplicationEntity_InvalidPort()
        {
            var destinationApplicationEntity = new DestinationApplicationEntity();

            destinationApplicationEntity.Name    = "NAME";
            destinationApplicationEntity.HostIp  = "SERVER";
            destinationApplicationEntity.AeTitle = "AET";

            destinationApplicationEntity.Port = 0;
            Assert.False(destinationApplicationEntity.IsValid(new List <string>(), out _));

            destinationApplicationEntity.Port = 65536;
            Assert.False(destinationApplicationEntity.IsValid(new List <string>(), out _));
        }
        public async void Delete_Returns404IfNotFound()
        {
            var value  = "AET";
            var entity = new DestinationApplicationEntity
            {
                AeTitle = value,
                Name    = value
            };

            _repository.Setup(p => p.FindAsync(It.IsAny <string>())).Returns(Task.FromResult(default(DestinationApplicationEntity)));

            var result = await _controller.Delete(value);

            Assert.IsType <NotFoundResult>(result.Result);
            _repository.Verify(p => p.FindAsync(value), Times.Once());
        }
        public async void Create_ShallReturnBadRequestWHenCrdIsDisabled(string aeTitle, string hostIp, int port)
        {
            var claraAeTitle = new DestinationApplicationEntity
            {
                Name    = aeTitle,
                AeTitle = aeTitle,
                HostIp  = hostIp,
                Port    = port
            };
            var result = await _controller.Create(claraAeTitle);

            Assert.NotNull(result);
            var objectResult = result.Result as ObjectResult;

            Assert.NotNull(objectResult);
            var problem = objectResult.Value as ProblemDetails;

            Assert.NotNull(problem);
            Assert.Equal("Invalid destination specs provided", problem.Title);
            Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status);
        }
        public async void Create_ShallReturnCreatedAtAction()
        {
            var aeTitle      = "AET";
            var claraAeTitle = new DestinationApplicationEntity
            {
                Name    = aeTitle,
                AeTitle = aeTitle,
                HostIp  = "host",
                Port    = 1
            };

            _repository.Setup(p => p.AddAsync(It.IsAny <DestinationApplicationEntity>(), It.IsAny <CancellationToken>()));
            _repository.Setup(p => p.SaveChangesAsync(It.IsAny <CancellationToken>()));

            var result = await _controller.Create(claraAeTitle);

            Assert.IsType <CreatedAtActionResult>(result.Result);

            _repository.Verify(p => p.AddAsync(It.IsAny <DestinationApplicationEntity>(), It.IsAny <CancellationToken>()), Times.Once());
            _repository.Verify(p => p.SaveChangesAsync(It.IsAny <CancellationToken>()), Times.Once());
        }
        public async void Delete_ReturnsDeleted()
        {
            var value  = "AET";
            var entity = new DestinationApplicationEntity
            {
                AeTitle = value,
                Name    = value
            };

            _repository.Setup(p => p.FindAsync(It.IsAny <string>())).Returns(Task.FromResult(entity));

            _repository.Setup(p => p.Remove(It.IsAny <DestinationApplicationEntity>()));
            _repository.Setup(p => p.SaveChangesAsync(It.IsAny <CancellationToken>()));

            var result = await _controller.Delete(value);

            Assert.NotNull(result.Value);
            Assert.Equal(value, result.Value.AeTitle);
            _repository.Verify(p => p.FindAsync(value), Times.Once());
            _repository.Verify(p => p.Remove(entity), Times.Once());
            _repository.Verify(p => p.SaveChangesAsync(It.IsAny <CancellationToken>()), Times.Once());
        }
        public async void Create_ShallReturnBadRequestWithBadJobProcessType()
        {
            var aeTitle      = "TOOOOOOOOOOOOOOOOOOOOOOOLONG";
            var claraAeTitle = new DestinationApplicationEntity
            {
                Name    = aeTitle,
                AeTitle = aeTitle,
                HostIp  = "host",
                Port    = 1
            };

            var result = await _controller.Create(claraAeTitle);

            var objectResult = result.Result as ObjectResult;

            Assert.NotNull(objectResult);
            var problem = objectResult.Value as ProblemDetails;

            Assert.NotNull(problem);
            Assert.Equal("Validation error.", problem.Title);
            Assert.Equal($"'{aeTitle}' is not a valid AE Title (source: DestinationApplicationEntity).", problem.Detail);
            Assert.Equal((int)HttpStatusCode.BadRequest, problem.Status);
        }
        public async void Create_ShallReturnServiceUnavailableWHenCrdIsDisabled()
        {
            var claraAeTitle = new DestinationApplicationEntity
            {
                Name    = "AETITLE",
                AeTitle = "AET",
                HostIp  = "localhost",
                Port    = 104
            };

            _configuration.Value.ReadAeTitlesFromCrd = false;
            var result = await _controller.Create(claraAeTitle);

            Assert.NotNull(result);
            var objectResult = result.Result as ObjectResult;

            Assert.NotNull(objectResult);
            var problem = objectResult.Value as ProblemDetails;

            Assert.NotNull(problem);
            Assert.Equal("Reading AE Titles from Kubernetes CRD is not enabled.", problem.Title);
            Assert.Equal(503, problem.Status);
        }
        public async void Create_ShallPropagateErrorBackToCaller()
        {
            var response = new HttpOperationResponse <object>();

            response.Response         = new HttpResponseMessage(HttpStatusCode.OK);
            response.Response.Content = new StringContent("Go!Clara!");
            _kubernetesClient
            .Setup(p => p.CreateNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>(), It.IsAny <object>()))
            .Throws(new HttpOperationException("error message")
            {
                Response = new HttpResponseMessageWrapper(new HttpResponseMessage(HttpStatusCode.Conflict), "error content")
            });

            var destinationAeTitle = new DestinationApplicationEntity
            {
                Name    = "AETITLE",
                AeTitle = "AETITLE",
                HostIp  = "localhost",
                Port    = 104
            };

            var result = await _controller.Create(destinationAeTitle);

            _kubernetesClient.Verify(p => p.CreateNamespacedCustomObjectWithHttpMessagesAsync(It.IsAny <CustomResourceDefinition>(), It.IsAny <object>()), Times.Once());

            Assert.NotNull(result);
            var objectResult = result.Result as ObjectResult;

            Assert.NotNull(objectResult);
            var problem = objectResult.Value as ProblemDetails;

            Assert.NotNull(problem);
            Assert.Equal("error message", problem.Detail);
            Assert.Equal("error content", problem.Title);
            Assert.Equal((int)HttpStatusCode.Conflict, problem.Status.Value);
        }
示例#19
0
        public OutputJob(TaskResponse task, ILogger <ScuService> logger, IResultsService iResultsService, DestinationApplicationEntity destination)
        {
            CopyBaseProperties(task);
            Logger         = logger ?? throw new ArgumentNullException(nameof(logger));
            resultsService = iResultsService ?? throw new ArgumentNullException(nameof(iResultsService));

            AeTitle = destination.AeTitle;
            HostIp  = destination.HostIp;
            Port    = destination.Port;

            FailedDicomFiles    = new Dictionary <DicomFile, string>();
            FailedFiles         = new List <string>();
            ProcessedDicomFiles = new List <DicomFile>();
            PendingDicomFiles   = new Queue <DicomFile>();
        }