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
76
tests/Paca.Tests/Core/WorkspaceEncodingSanitizerTests.cs
Normal file
76
tests/Paca.Tests/Core/WorkspaceEncodingSanitizerTests.cs
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
using Paca.Core.Config;
|
||||
using Xunit;
|
||||
|
||||
namespace Paca.Tests.Core;
|
||||
|
||||
public class WorkspaceEncodingSanitizerTests
|
||||
{
|
||||
[Fact]
|
||||
public void IsCorrupted_ReturnsTrue_ForUnicodeReplacementAndMojibake()
|
||||
{
|
||||
// Corrupted characters found in real user config.json
|
||||
string corrupted1 = "\uFFFD\u06FE\uFFFD";
|
||||
string corrupted2 = "\uFFFD\uFFFD\uFFFD\uFFFD";
|
||||
string corrupted3 = "\uFFFD\u043D\uFFFD";
|
||||
string corrupted4 = "??";
|
||||
string empty = " ";
|
||||
|
||||
Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted1));
|
||||
Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted2));
|
||||
Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted3));
|
||||
Assert.True(WorkspaceConfigSanitizer.IsCorrupted(corrupted4));
|
||||
Assert.True(WorkspaceConfigSanitizer.IsCorrupted(empty));
|
||||
Assert.True(WorkspaceConfigSanitizer.IsCorrupted(null));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IsCorrupted_ReturnsFalse_ForValidKoreanAndEnglishNames()
|
||||
{
|
||||
Assert.False(WorkspaceConfigSanitizer.IsCorrupted("작업"));
|
||||
Assert.False(WorkspaceConfigSanitizer.IsCorrupted("개인"));
|
||||
Assert.False(WorkspaceConfigSanitizer.IsCorrupted("학습"));
|
||||
Assert.False(WorkspaceConfigSanitizer.IsCorrupted("기본"));
|
||||
Assert.False(WorkspaceConfigSanitizer.IsCorrupted("Work"));
|
||||
Assert.False(WorkspaceConfigSanitizer.IsCorrupted("Research 2026"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sanitize_ReplacesAllCorruptedNamesWithCleanDefaults()
|
||||
{
|
||||
var corruptedList = new List<string> { "\uFFFD\u06FE\uFFFD", "\uFFFD\uFFFD\uFFFD\uFFFD", "\uFFFD\u043D\uFFFD" };
|
||||
var sanitized = WorkspaceConfigSanitizer.Sanitize(corruptedList);
|
||||
|
||||
Assert.NotNull(sanitized);
|
||||
Assert.NotEmpty(sanitized);
|
||||
Assert.All(sanitized, name => Assert.False(WorkspaceConfigSanitizer.IsCorrupted(name)));
|
||||
Assert.Contains("작업", sanitized);
|
||||
Assert.Contains("개인", sanitized);
|
||||
Assert.Contains("학습", sanitized);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sanitize_PreservesValidNamesAndFiltersCorrupted()
|
||||
{
|
||||
var mixedList = new List<string> { "프로젝트A", "\uFFFD\u06FE\uFFFD", "디자인" };
|
||||
var sanitized = WorkspaceConfigSanitizer.Sanitize(mixedList);
|
||||
|
||||
Assert.Equal(2, sanitized.Count);
|
||||
Assert.Equal("프로젝트A", sanitized[0]);
|
||||
Assert.Equal("디자인", sanitized[1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppConfig_Sanitize_CleansCorruptedWorkspaceNames()
|
||||
{
|
||||
var config = new AppConfig
|
||||
{
|
||||
WorkspaceNames = new List<string> { "\uFFFD\u06FE\uFFFD", "\uFFFD\uFFFD\uFFFD\uFFFD" }
|
||||
};
|
||||
|
||||
config.Sanitize();
|
||||
|
||||
Assert.NotNull(config.WorkspaceNames);
|
||||
Assert.All(config.WorkspaceNames, name => Assert.False(WorkspaceConfigSanitizer.IsCorrupted(name)));
|
||||
Assert.Equal("작업", config.WorkspaceNames[0]);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue