using ItWorx.KnowledgeHub.Domain.Attachments; namespace ItWorx.KnowledgeHub.Domain.Tests; public sealed class SafeFilenameTests { [Theory] [InlineData("../../../../etc/passwd", "passwd")] [InlineData("..\\..\\windows\\system32\\config", "config")] [InlineData("subdir/verslag.pdf", "verslag.pdf")] public void Create_strips_any_directory_component_and_keeps_only_the_leaf_name(string raw, string expected) { var filename = SafeFilename.Create(raw); Assert.Equal(expected, filename.Value); } [Fact] public void Create_rejects_a_filename_containing_a_null_byte() { Assert.Throws(() => SafeFilename.Create("bestand\0.txt")); } [Fact] public void Create_rejects_a_filename_containing_a_control_character() { Assert.Throws(() => SafeFilename.Create("bestand.txt")); } [Fact] public void Create_rejects_an_empty_or_dot_only_filename() { Assert.Throws(() => SafeFilename.Create("")); Assert.Throws(() => SafeFilename.Create(".")); Assert.Throws(() => SafeFilename.Create("..")); } [Fact] public void Create_truncates_an_excessively_long_filename() { var raw = new string('a', 400) + ".txt"; var filename = SafeFilename.Create(raw); Assert.True(filename.Value.Length <= SafeFilename.MaximumLength); } [Fact] public void AllExtensions_detects_a_double_extension() { var filename = SafeFilename.Create("factuur.pdf.exe"); Assert.Equal([".pdf", ".exe"], filename.AllExtensions()); Assert.Equal(".exe", filename.LastExtension()); } [Fact] public void LastExtension_is_null_when_there_is_no_extension() { var filename = SafeFilename.Create("readme"); Assert.Null(filename.LastExtension()); } }