feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization
This commit is contained in:
parent
a88aafa1e5
commit
0e568f1f0a
975 changed files with 130593 additions and 16783 deletions
73
tests/Paca.Tests/Core/MediaFileNameTemplateGateTests.cs
Normal file
73
tests/Paca.Tests/Core/MediaFileNameTemplateGateTests.cs
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
using System;
|
||||
using Paca.Mobile.Core;
|
||||
using Xunit;
|
||||
|
||||
namespace Paca.Tests.Core;
|
||||
|
||||
public class MediaFileNameTemplateGateTests
|
||||
{
|
||||
[Fact]
|
||||
public void Gate361_MediaFileNameTemplate_SubstitutesTokens_Accurately()
|
||||
{
|
||||
var ctx = new MediaTemplateContext
|
||||
{
|
||||
Title = "Rolling in the Deep",
|
||||
Artist = "Adele",
|
||||
Channel = "AdeleVEVO",
|
||||
Domain = "youtube.com",
|
||||
Resolution = "1080p",
|
||||
UploadDate = new DateTime(2010, 11, 30),
|
||||
TrackNumber = 1
|
||||
};
|
||||
|
||||
var template = "[{domain}] {artist} - {title} ({resolution})";
|
||||
var result = MediaFileNameTemplateEngine.FormatFileName(template, ctx);
|
||||
|
||||
Assert.Equal("[youtube.com] Adele - Rolling in the Deep (1080p)", result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate362_MediaFileNameTemplate_HandlesNullTokens_Gracefully()
|
||||
{
|
||||
var ctx = new MediaTemplateContext
|
||||
{
|
||||
Title = "Solo Track",
|
||||
Artist = null,
|
||||
Resolution = null
|
||||
};
|
||||
|
||||
var template = "{artist} - {title} [{resolution}]";
|
||||
var result = MediaFileNameTemplateEngine.FormatFileName(template, ctx);
|
||||
|
||||
// Null tokens are omitted or stripped cleanly
|
||||
Assert.Equal("Solo Track", result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate363_MediaFileNameTemplate_SanitizesIllegalCharacters()
|
||||
{
|
||||
var dirty = "Who: Are / You * In <Wonderland>? | Check \"This\"";
|
||||
var clean = MediaFileNameTemplateEngine.SanitizePathSegment(dirty);
|
||||
|
||||
Assert.DoesNotContain(":", clean);
|
||||
Assert.DoesNotContain("/", clean);
|
||||
Assert.DoesNotContain("*", clean);
|
||||
Assert.DoesNotContain("<", clean);
|
||||
Assert.DoesNotContain(">", clean);
|
||||
Assert.DoesNotContain("?", clean);
|
||||
Assert.DoesNotContain("|", clean);
|
||||
Assert.DoesNotContain("\"", clean);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate364_MediaFileNameTemplate_TruncatesExcessiveLength_PreservingFormat()
|
||||
{
|
||||
var longTitle = new string('A', 300);
|
||||
var ctx = new MediaTemplateContext { Title = longTitle };
|
||||
|
||||
var formatted = MediaFileNameTemplateEngine.FormatFileName("{title}", ctx, maxLength: 50);
|
||||
|
||||
Assert.Equal(50, formatted.Length);
|
||||
Assert.StartsWith("AAAA", formatted);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue