public void ShallSaveAndNotify()
        {
            _dicomToolkit.Setup(p => p.Save(It.IsAny <DicomFile>(), It.IsAny <string>()));
            _notificationService.Setup(p => p.NewInstanceStored(It.IsAny <InstanceStorageInfo>()));

            var config = new ClaraApplicationEntity();

            config.AeTitle   = "my-aet";
            config.Processor = "Nvidia.Clara.DicomAdapter.Test.Unit.MockJobProcessor, Nvidia.Clara.Dicom.Test.Unit";
            var handler = new ApplicationEntityHandler(_serviceProvider, config, _rootStoragePath, _cancellationTokenSource.Token, _fileSystem);

            var request  = GenerateRequest();
            var instance = InstanceStorageInfo.CreateInstanceStorageInfo(request, _rootStoragePath, config.AeTitle, _fileSystem);

            handler.Save(request, instance);
            _fileSystem.File.Create(instance.InstanceStorageFullPath);
            handler.Save(request, instance);

            _logger.VerifyLogging(LogLevel.Error, Times.Never());
            _logger.VerifyLogging("Instance already exists, skipping.", LogLevel.Information, Times.Once());
            _logger.VerifyLogging("Instance saved successfully.", LogLevel.Debug, Times.Once());
            _logger.VerifyLogging("Instance stored and notified successfully.", LogLevel.Information, Times.Once());

            _dicomToolkit.Verify(p => p.Save(It.IsAny <DicomFile>(), It.IsAny <string>()), Times.Exactly(1));
            _notificationService.Verify(p => p.NewInstanceStored(instance), Times.Once());
        }
        public void ShallRespectRetryPolicyOnFailures()
        {
            _dicomToolkit.Setup(p => p.Save(It.IsAny <DicomFile>(), It.IsAny <string>())).Throws <Exception>();

            var config = new ClaraApplicationEntity();

            config.AeTitle   = "my-aet";
            config.Processor = "Nvidia.Clara.DicomAdapter.Test.Unit.MockJobProcessor, Nvidia.Clara.Dicom.Test.Unit";
            var handler = new ApplicationEntityHandler(_serviceProvider, config, _rootStoragePath, _cancellationTokenSource.Token, _fileSystem);

            var request  = GenerateRequest();
            var instance = InstanceStorageInfo.CreateInstanceStorageInfo(request, _rootStoragePath, config.AeTitle, _fileSystem);

            var exception = Assert.Throws <Exception>(() =>
            {
                handler.Save(request, instance);
            });

            _logger.VerifyLogging(LogLevel.Error, Times.Exactly(3));
            _dicomToolkit.Verify(p => p.Save(It.IsAny <DicomFile>(), It.IsAny <string>()), Times.Exactly(4));
        }
        public void ShallIngoreInstancesWithConfiguredSopClassUids()
        {
            _dicomToolkit.Setup(p => p.Save(It.IsAny <DicomFile>(), It.IsAny <string>()));

            var config = new ClaraApplicationEntity();

            config.AeTitle           = "my-aet";
            config.IgnoredSopClasses = new List <string>()
            {
                DicomUID.SecondaryCaptureImageStorage.UID
            };
            config.Processor = "Nvidia.Clara.DicomAdapter.Test.Unit.MockJobProcessor, Nvidia.Clara.Dicom.Test.Unit";
            var handler = new ApplicationEntityHandler(_serviceProvider, config, _rootStoragePath, _cancellationTokenSource.Token, _fileSystem);

            var request  = GenerateRequest();
            var instance = InstanceStorageInfo.CreateInstanceStorageInfo(request, _rootStoragePath, config.AeTitle, _fileSystem);

            handler.Save(request, instance);

            _logger.VerifyLogging($"Instance with SOP Class {DicomUID.SecondaryCaptureImageStorage.UID} ignored based on configured AET {config.AeTitle}", LogLevel.Warning, Times.Once());
            _dicomToolkit.Verify(p => p.Save(It.IsAny <DicomFile>(), It.IsAny <string>()), Times.Never());
        }
        public void ShallRemoveExistingDataAtStartup()
        {
            var config = new ClaraApplicationEntity();

            config.AeTitle           = "my-aet";
            config.IgnoredSopClasses = new List <string>()
            {
                DicomUID.SecondaryCaptureImageStorage.UID
            };
            config.Processor = "Nvidia.Clara.DicomAdapter.Test.Unit.MockJobProcessor, Nvidia.Clara.Dicom.Test.Unit";
            var rootPath = _fileSystem.Path.Combine(_rootStoragePath, config.AeTitle.RemoveInvalidPathChars());

            _fileSystem.Directory.CreateDirectory(rootPath);
            _fileSystem.File.Create(_fileSystem.Path.Combine(rootPath, "test.txt"));
            #pragma warning disable xUnit2013
            Assert.Equal(1, _fileSystem.Directory.GetFiles(rootPath).Count());

            var handler = new ApplicationEntityHandler(_serviceProvider, config, _rootStoragePath, _cancellationTokenSource.Token, _fileSystem);

            _logger.VerifyLogging($"Existing AE Title storage directory {rootPath} found, deleting...", LogLevel.Information, Times.Once());
            _logger.VerifyLogging($"Existing AE Title storage directory {rootPath} deleted.", LogLevel.Information, Times.Once());
            Assert.Equal(0, _fileSystem.Directory.GetFiles(rootPath).Count());
            #pragma warning restore  xUnit2013
        }