65 lines
1.9 KiB
C#
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());
|
|
}
|
|
}
|