// -------------------------------------------------------------------------------------------------------------------- // // (c) 2011 KARL STORZ GmbH and Co. KG. // // -------------------------------------------------------------------------------------------------------------------- namespace KS.OR1.DomainLayer.Export.Tests.JobManagement.Helper { using System; using System.Collections.Generic; using System.IO; using System.Linq; using FluentAssertions; using KS.OR1.DomainLayer.Entities.Documentation; using KS.OR1.DomainLayer.Entities.Documentation.Enums; using KS.OR1.DomainLayer.Export.JobManagement.ExportJobs.Helper; using KS.OR1.Infrastructure; using KS.OR1.Infrastructure.Core.Services; using KS.OR1.Infrastructure.Persistency; using Moq; using Xunit; public class ExportTreatmentToFileSystemTests { private const string AnExportFolder = @"C:\export"; private const string AFileLink = @"C:\export\file1.jpg"; private const string AFileLinkThumbnail = @"C:\export\filethumb.jpg"; private readonly Mock fileSystemMock; private readonly Mock fileExportMock; private readonly Mock cancelableFileCopierMock; private readonly IExportTreatmentToFileSystem testee; public ExportTreatmentToFileSystemTests() { this.fileSystemMock = new Mock(); this.fileExportMock = new Mock(); this.cancelableFileCopierMock = new Mock(); this.fileSystemMock .Setup(fileSystem => fileSystem.DirectoryExists(It.IsAny())) .Returns(false); this.testee = new ExportTreatmentToFileSystem(this.fileSystemMock.Object, this.fileExportMock.Object, this.cancelableFileCopierMock.Object); } [Fact] public void Export_WhenDataProvided_ThenExported() { var treatment = this.GetTreatment(); this.testee.Export(treatment, AnExportFolder); this.fileExportMock .Verify(fileExport => fileExport.Export(treatment, Path.Combine(AnExportFolder, "TreatmentInfo.xml"))); } [Fact] public void Export_WhenTreatmentHasArtifacts_ThenExportArtifacts() { var treatment = this.GetTreatmentWithArtifacts(); this.testee.Export(treatment, AnExportFolder); var expectedDestination = Path.Combine(AnExportFolder, Path.GetFileName(AFileLink)); var expectedThumbmnailDestination = Path.Combine(AnExportFolder, Path.GetFileName(AFileLinkThumbnail)); this.cancelableFileCopierMock.Verify( asynchronousFileCopier => asynchronousFileCopier .BeginCopy(AFileLink, expectedDestination), Times.Exactly(treatment.Artifacts.Count)); this.fileSystemMock .Verify(fileSystem => fileSystem.Copy(AFileLinkThumbnail, expectedThumbmnailDestination), Times.Exactly(treatment.Artifacts.Count)); } [Fact] public void Export_WhenExportPathDoesNotExists_ThenCreateDirectory() { var treatment = this.GetTreatment(); this.fileSystemMock .Setup(fileSystem => fileSystem.DirectoryExists(AnExportFolder)) .Returns(false); this.testee.Export(treatment, AnExportFolder); this.fileSystemMock .Verify(fileSystem => fileSystem.CreateDirectory(AnExportFolder)); } [Fact] public void Export_WhenExportPathExists_ThenCreateDirectoryWithIncrementedNumber() { const string FirstIncrementedFolder = AnExportFolder + "_1"; const string ExpectedExportFolder = AnExportFolder + "_2"; var treatment = this.GetTreatment(); this.DefineDirectoyExistence(AnExportFolder, true); this.DefineDirectoyExistence(FirstIncrementedFolder, true); this.DefineDirectoyExistence(ExpectedExportFolder, false); this.testee.Export(treatment, AnExportFolder); this.fileSystemMock .Verify(fileSystem => fileSystem.CreateDirectory(ExpectedExportFolder), Times.Once()); } private void DefineDirectoyExistence(string path, bool isExiting) { this.fileSystemMock.Setup(fileSystem => fileSystem.DirectoryExists(path)).Returns(isExiting); } [Fact] public void Export_WhenTreatmentIsNull_ThenArgumentNullExceptionThrown() { this.testee .Invoking(exporter => exporter.Export(null, AnExportFolder)) .ShouldThrow(); } [Fact] public void Export_WhenPathIsNull_ThenArgumentNullExceptionThrown() { this.testee .Invoking(exporter => exporter.Export(this.GetTreatment(), null)) .ShouldThrow(); } [Fact] public void Export_WhenFilterProvided_ThenOnlyCertainArtifactsExported() { var treatment = this.GetTreatmentWithArtifacts(); var filter = new List { treatment.Artifacts.First().Id }; this.testee.Export(treatment, AnExportFolder, filter); var expectedDestination = Path.Combine(AnExportFolder, Path.GetFileName(AFileLink)); var expectedthumbnailDestination = Path.Combine(AnExportFolder, Path.GetFileName(AFileLinkThumbnail)); this.fileSystemMock.Verify( fileSystem => fileSystem.Copy(AFileLinkThumbnail, expectedthumbnailDestination), Times.Once()); this.cancelableFileCopierMock.Verify( asynchronousFileCopier => asynchronousFileCopier.BeginCopy(AFileLink, expectedDestination)); } [Fact] public void Export_WhenExportIsRunningAndIsCanceled_ThenDeleteExportFolder() { this.cancelableFileCopierMock .Setup(cancelableFileCopier => cancelableFileCopier.BeginCopy(It.IsAny(), It.IsAny())) .Callback(() => this.testee.CancelExport()); this.fileSystemMock.Setup(fileSystem => fileSystem.DirectoryExists(AnExportFolder)).Returns(true); var treatment = this.GetTreatmentWithArtifacts(); this.testee.Export(treatment, AnExportFolder); this.fileSystemMock.Verify(fileSystem => fileSystem.DeleteDirectory(AnExportFolder)); } [Fact] public void Export_WhenExportCanceled_ThenCallCancelOnAsynchronousCopier() { this.testee.CancelExport(); this.cancelableFileCopierMock.Verify(asynchronousFileCopier => asynchronousFileCopier.CancelCopy()); } [Fact] public void Export_WhenFilterIsEmptyList_ThenNoArtifactExported() { var treatment = this.GetTreatmentWithArtifacts(); var filter = new List(); this.testee.Export(treatment, AnExportFolder, filter); this.fileSystemMock .Verify(fileSystem => fileSystem.Copy(It.IsAny(), It.IsAny()), Times.Never()); } private Treatment GetTreatment() { return new Treatment { Patient = new Patient("PatientFirstName", "PatientLastName", "PatientId", Sex.Female, DateTime.Now, "OtherPatientId", "Comment"), }; } private Treatment GetTreatmentWithArtifacts() { var treatment = this.GetTreatment(); treatment.AddArtifact( new Artifact { ArtifactType = ArtifactType.ImageArtifact(), FileLink = AFileLink, FileLinkThumbnail = AFileLinkThumbnail }); treatment.AddArtifact( new Artifact { ArtifactType = ArtifactType.VideoArtifact(), FileLink = AFileLink, FileLinkThumbnail = AFileLinkThumbnail }); return treatment; } } }