using AvParser.Infrastructure.Media; namespace AvParser.Infrastructure.Tests.Media; public class ShowcaseNameTests { private const string Hash = "a3f19b7c5d2e8f0142536475869708192a3b4c5d6e7f8091a2b3c4d5e6f70819"; [Fact] public void A_plain_name_is_kept() { ShowcaseLinker.SanitiseName("kitten", Hash).ShouldBe("kitten"); } [Fact] public void An_absent_name_falls_back_to_the_hash() { ShowcaseLinker.SanitiseName(null, Hash).ShouldBe(Hash[..12]); ShowcaseLinker.SanitiseName(" ", Hash).ShouldBe(Hash[..12]); } [Theory] [InlineData("../../etc/passwd")] [InlineData("..\\..\\windows\\system32\\config")] [InlineData("/absolute/path/name")] public void A_name_cannot_walk_out_of_its_directory(string suggested) { // The suggestion comes from a remote server, so it is treated as hostile rather than // merely untidy: only the last segment survives, and separators never do. var name = ShowcaseLinker.SanitiseName(suggested, Hash); name.ShouldNotContain("/"); name.ShouldNotContain("\\"); name.ShouldNotContain(".."); } [Fact] public void The_extension_the_origin_suggested_is_dropped() { // The extension is derived from the sniffed kind, never from what the origin claimed. ShowcaseLinker.SanitiseName("photo.exe", Hash).ShouldBe("photo"); } [Theory] [InlineData("CON")] [InlineData("nul")] [InlineData("COM1")] [InlineData("lpt9")] public void Windows_device_names_are_pushed_out_of_the_way(string reserved) { ShowcaseLinker.SanitiseName(reserved, Hash).ShouldBe($"_{reserved}"); } [Fact] public void An_over_long_name_is_trimmed() { var name = ShowcaseLinker.SanitiseName(new string('x', 400), Hash); name.Length.ShouldBeLessThanOrEqualTo(80); } [Fact] public void A_name_of_nothing_but_junk_falls_back_to_the_hash() { // Dots rather than, say, '?': the set of invalid filename characters differs by platform, // but a name that trims away to nothing does so everywhere. ShowcaseLinker.SanitiseName("...", Hash).ShouldBe(Hash[..12]); ShowcaseLinker.SanitiseName("\t\t", Hash).ShouldBe(Hash[..12]); } [Fact] public void Control_characters_are_replaced_but_spaces_survive() { ShowcaseLinker.SanitiseName("a b\tc", Hash).ShouldBe("a b_c"); } }