Files

107 lines
3.6 KiB
C#

using Explorer.Application;
using Explorer.Domain;
namespace Explorer.Application.Tests;
public class FilenamePatternTests
{
[Fact]
public void Formats_artist_title_and_dates()
{
var tags = new MediaTagFields
{
Artist = "Pink Floyd",
Title = "Comfortably Numb",
Track = 6,
Created = new DateTimeOffset(new DateTime(2024, 8, 26, 12, 0, 0, DateTimeKind.Local)),
Stem = "clip",
Extension = "mp3",
Width = 1920
};
Assert.Equal(
"Pink Floyd - Comfortably Numb",
FilenamePattern.Expand("{Artist} - {Title}", tags));
Assert.Equal("06", FilenamePattern.Expand("{Track:00}", tags));
Assert.Equal("2024-08-26", FilenamePattern.Expand("{CreatedDate}", tags));
Assert.Equal("1920_clip", FilenamePattern.Expand("{Width}_{Name}", tags));
}
[Fact]
public void Parses_filename_into_tags()
{
Assert.True(FilenamePattern.TryParse(
"{Artist} - {Title}",
"AC/DC - Hells Bells",
out var tags,
out _));
Assert.Equal("AC/DC", tags.Artist);
Assert.Equal("Hells Bells", tags.Title);
}
[Fact]
public void Parse_fails_when_the_name_does_not_match()
{
Assert.False(FilenamePattern.TryParse("{Artist} - {Title}", "JustOneName", out _, out var error));
Assert.Contains("match", error, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void Unknown_tokens_stay_in_the_name()
{
Assert.Equal("{Foo}_a", FilenamePattern.Expand("{Foo}_{Name}", new MediaTagFields { Stem = "a" }));
}
[Fact]
public void Sanitizes_illegal_filename_characters_from_tags()
{
var name = FilenamePattern.Expand("{Title}", new MediaTagFields { Title = @"a:b/c" });
Assert.Equal("a-b-c", name);
}
[Fact]
public void Taken_date_and_project_expand()
{
var tags = new MediaTagFields
{
Taken = new DateTimeOffset(new DateTime(2024, 8, 26, 15, 30, 0, DateTimeKind.Local)),
Created = new DateTimeOffset(new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Local)),
Stem = "DSC_001",
Project = "Explorer",
Parent = "photos"
};
Assert.Equal("20240826_DSC_001", FilenamePattern.Expand("{TakenDate:yyyyMMdd}_{Name}", tags));
Assert.Equal("2024-08-26", FilenamePattern.Expand("{CreatedDate}", tags));
Assert.Equal("Explorer_DSC_001", FilenamePattern.Expand("{Project}_{Name}", tags));
}
[Fact]
public void Parses_taken_date_from_filename()
{
Assert.True(FilenamePattern.TryParse(
"{TakenDate:yyyyMMdd}_{Name}",
"20240826_DSC_001",
out var tags,
out _));
Assert.Equal(2024, tags.Taken?.Year);
Assert.Equal(8, tags.Taken?.Month);
Assert.Equal(26, tags.Taken?.Day);
Assert.Equal(2024, tags.Year);
}
[Fact]
public void WithProject_uses_repo_folder_then_parent()
{
var fields = new MediaTagFields { Parent = "photos" };
Assert.Equal("Explorer", FilenamePattern.WithProject(fields, @"C:\src\Explorer").Project);
Assert.Equal("photos", FilenamePattern.WithProject(fields, null).Project);
}
[Fact]
public void TakenDate_is_media_content_CreatedDate_and_Project_are_not()
{
Assert.True(FilenamePattern.UsesMediaContent("{TakenDate}_{Name}"));
Assert.False(FilenamePattern.UsesMediaContent("{CreatedDate}_{Name}"));
Assert.False(FilenamePattern.UsesMediaContent("{Project}_{Name}"));
}
}