Files

65 lines
1.9 KiB
C#

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<ArgumentException>(() => SafeFilename.Create("bestand\0.txt"));
}
[Fact]
public void Create_rejects_a_filename_containing_a_control_character()
{
Assert.Throws<ArgumentException>(() => SafeFilename.Create("bestand.txt"));
}
[Fact]
public void Create_rejects_an_empty_or_dot_only_filename()
{
Assert.Throws<ArgumentException>(() => SafeFilename.Create(""));
Assert.Throws<ArgumentException>(() => SafeFilename.Create("."));
Assert.Throws<ArgumentException>(() => 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());
}
}