public void Make_sure_duplicate_file_names_are_extended_with_suffix()
        {
            // Arrange
            var validator = new PackageValidator();
            var package   = CreateTestData();
            // Pick a directory and add files with same name
            var dir = package.Folders.FirstOrDefault(f => f.Id == "Dir00000032");

            dir.Files.AddRange(new[]
            {
                new RepositoryFile {
                    Id = "T1", LogicalName = "p1.pdf", PhysicalName = "p1.pdf"
                },
                new RepositoryFile {
                    Id = "T2", LogicalName = "p1.pdf", PhysicalName = "p1.pdf"
                },
                new RepositoryFile {
                    Id = "T3", LogicalName = "p1.pdf", PhysicalName = "p1.pdf"
                }
            });

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package, @"C:\Users\jlang\Downloads\Repository");

            // Assert
            var flatList = validator.ConvertToRepositoryObject(package);

            flatList.First(f => f.RepositoryId == "T1").Name.Should().Be("p1.pdf");
            flatList.First(f => f.RepositoryId == "T2").Name.Should().Be("p1_1.pdf");
            flatList.First(f => f.RepositoryId == "T3").Name.Should().Be("p1_2.pdf");
        }
        public void Make_sure_very_long_duplicate_file_names_on_deep_nested_folders_are_extended_with_suffix()
        {
            // Arrange
            var validator = new PackageValidator();
            var package   = CreateTestData();

            // Get to the lowest level folder
            var dir = package.Folders.First();

            while (dir.Folders.Any())
            {
                dir = dir.Folders.First();
            }

            // Add duplicate files too long names
            dir.Files.AddRange(new[]
            {
                new RepositoryFile
                {
                    Id          = "T1",
                    LogicalName =
                        "this is a very long name for the pdf file that might lead to problems when saving the content to disk and might be problematic when creating the package.pdf",
                    PhysicalName =
                        "this is a very long name for the pdf file that might lead to problems when saving the content to disk and might be problematic when creating the package.pdf"
                },
                new RepositoryFile
                {
                    Id          = "T2",
                    LogicalName =
                        "this is a very long name for the pdf file that might lead to problems when saving the content to disk and might be problematic when creating the package.pdf",
                    PhysicalName =
                        "this is a very long name for the pdf file that might lead to problems when saving the content to disk and might be problematic when creating the package.pdf"
                },
                new RepositoryFile
                {
                    Id          = "T3",
                    LogicalName =
                        "this is a very long name for the pdf file that might lead to problems when saving the content to disk and might be problematic when creating the package.pdf",
                    PhysicalName =
                        "this is a very long name for the pdf file that might lead to problems when saving the content to disk and might be problematic when creating the package.pdf"
                }
            });

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package, @"C:\Users\jlang\Downloads\Repository");

            // Assert
            var flatList = validator.ConvertToRepositoryObject(package);

            flatList.First(f => f.RepositoryId == "T1").Name.Should().Be("this is a very long name for.pdf");
            flatList.First(f => f.RepositoryId == "T2").Name.Should().Be("this is a very long name for_1.pdf");
            flatList.First(f => f.RepositoryId == "T3").Name.Should().Be("this is a very long name for_2.pdf");
        }
        public void Make_sure_a_normal_root_path_shortens_max_path_length_to_exactly_200_chars()
        {
            // Arrange
            var validator = new PackageValidator();
            var package   = CreateTestData();

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package, @"C:\Users\jlang\Downloads\Repository\");
            var list = validator.ConvertToRepositoryObject(package);

            // Assert
            validator.MaxPathLength.Should().Be(200);
        }
        public void Make_sure_too_long_path_names_are_shortened()
        {
            // Arrange
            var validator = new PackageValidator();
            var package   = CreateTestData();

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package, @"C:\Users\jlang\Downloads\Repository");
            var list = validator.ConvertToRepositoryObject(package);

            // Assert
            (list.Max(l => l.FullName.Length) > validator.MaxPathLength).Should().BeFalse();
        }
        public void Make_sure_a_long_root_path_shortens_max_path_length_below_200_chars()
        {
            // Arrange
            var validator = new PackageValidator();
            var package   = CreateTestData();

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package,
                                                            @"C:\Users\jlang\Downloads\Repository\with a very long path name\that exceeds 60 chars\just for testing");
            var list = validator.ConvertToRepositoryObject(package);

            // Assert
            validator.MaxPathLength.Should().BeLessThan(200);
        }
        public void Make_sure_trainling_dots_at_the_end_of_names_are_removed()
        {
            // Arrange
            var validator = new PackageValidator();
            // file 119 and Dir 5 have illegal endings in test file
            var package = CreateTestData();

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package, @"C:\Users\jlang\Downloads\Repository");

            // Assert
            var flatList = validator.ConvertToRepositoryObject(package);

            flatList.First(f => f.RepositoryId == "F00000119").Name.Should().Be("TABLE BROWN.pdf");
            flatList.First(f => f.RepositoryId == "Dir00000005").Name.Should().Be("Zjing Oil");
        }
        public void Make_sure_duplicate_file_names_are_extended_with_suffix2()
        {
            // Arrange
            var validator = new PackageValidator();

            // Sample Package has one duplicate file "\PLUS_3\PLUS3_Bern_V1\P0.pdf"
            var packageTestData = File.ReadAllText(Path.Combine(TestContext.CurrentContext.TestDirectory, "packageSampleData.json"), Encoding.UTF8);
            var package         = JsonConvert.DeserializeObject <RepositoryPackage>(packageTestData);

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package, @"C:\Users\jlang\Downloads\Repository");

            // Assert
            var flatList = validator.ConvertToRepositoryObject(package);

            flatList.First(f => f.RepositoryId == "sdb:digitalFile|685fbf49-d67c-4f60-9842-96c35d009210").Name.Should().Be("P0_1.pdf");
        }
        public void Make_sure_duplicate_file_names_on_deep_nested_folders_with_illegal_chars_are_extended_with_suffix()
        {
            // Arrange
            var validator = new PackageValidator();
            var package   = CreateTestData();

            // Get to the lowest level folder
            var dir = package.Folders.First();

            while (dir.Folders.Any())
            {
                dir = dir.Folders.First();
            }

            // Add duplicate files with illegal chars
            dir.Files.AddRange(new[]
            {
                new RepositoryFile {
                    Id = "T1", LogicalName = "p??1.pdf", PhysicalName = "p??1.pdf"
                },
                new RepositoryFile {
                    Id = "T2", LogicalName = "p??1.pdf", PhysicalName = "p??1.pdf"
                },
                new RepositoryFile {
                    Id = "T3", LogicalName = "p??1.pdf", PhysicalName = "p??1.pdf"
                }
            });

            // Act
            validator.EnsureValidPhysicalFileAndFolderNames(package, @"C:\Users\jlang\Downloads\Repository");

            // Assert
            var flatList = validator.ConvertToRepositoryObject(package);

            flatList.First(f => f.RepositoryId == "T1").Name.Should().Be("p__1.pdf");
            flatList.First(f => f.RepositoryId == "T2").Name.Should().Be("p__1_1.pdf");
            flatList.First(f => f.RepositoryId == "T3").Name.Should().Be("p__1_2.pdf");
        }