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:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -0,0 +1,160 @@
using Paca.Browser.Profiles;
using Xunit;
namespace Paca.Tests.Browser;
public sealed class ProfileManagerTests
{
[Fact]
public void DefaultProfile_IsCreatedWhenStoreIsEmpty()
{
var tempDir = Path.Combine(Path.GetTempPath(), "paca_test_profile_" + Guid.NewGuid());
Directory.CreateDirectory(tempDir);
try
{
var manager = new ProfileManager(tempDir);
var profiles = manager.GetProfiles();
var active = manager.GetActiveProfile();
Assert.NotEmpty(profiles);
Assert.NotNull(active);
Assert.Equal("default", active.Id);
Assert.Equal("기본 프로필", active.Name);
Assert.True(active.IsActive);
}
finally
{
if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true);
}
}
[Fact]
public void AddProfile_CreatesNewProfileAndPersists()
{
var tempDir = Path.Combine(Path.GetTempPath(), "paca_test_profile_" + Guid.NewGuid());
Directory.CreateDirectory(tempDir);
try
{
var manager = new ProfileManager(tempDir);
var newProfile = manager.AddProfile("업무용 프로필", "#059669", "💼");
Assert.NotNull(newProfile);
Assert.Equal("업무용 프로필", newProfile.Name);
Assert.Equal("#059669", newProfile.Color);
Assert.Equal("💼", newProfile.Icon);
Assert.False(newProfile.IsActive);
var list = manager.GetProfiles();
Assert.Equal(2, list.Count);
// 새 인스턴스로 로드해서 파일 저장 검증
var manager2 = new ProfileManager(tempDir);
var list2 = manager2.GetProfiles();
Assert.Equal(2, list2.Count);
Assert.Contains(list2, p => p.Name == "업무용 프로필");
}
finally
{
if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true);
}
}
[Fact]
public void SwitchProfile_ChangesActiveProfile()
{
var tempDir = Path.Combine(Path.GetTempPath(), "paca_test_profile_" + Guid.NewGuid());
Directory.CreateDirectory(tempDir);
try
{
var manager = new ProfileManager(tempDir);
var p2 = manager.AddProfile("개인", "#EC4899", "🎮");
manager.SwitchProfile(p2.Id);
var active = manager.GetActiveProfile();
Assert.Equal(p2.Id, active.Id);
Assert.True(active.IsActive);
var defaultProf = manager.GetProfiles().First(p => p.Id == "default");
Assert.False(defaultProf.IsActive);
// 영속화 확인
var manager2 = new ProfileManager(tempDir);
Assert.Equal(p2.Id, manager2.GetActiveProfile().Id);
}
finally
{
if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true);
}
}
[Fact]
public void UpdateProfile_UpdatesNameAndAppearance()
{
var tempDir = Path.Combine(Path.GetTempPath(), "paca_test_profile_" + Guid.NewGuid());
Directory.CreateDirectory(tempDir);
try
{
var manager = new ProfileManager(tempDir);
var p2 = manager.AddProfile("이전 이름", "#4F46E5", "👤");
manager.UpdateProfile(p2.Id, "새 이름", "#DC2626", "🚀");
var updated = manager.GetProfile(p2.Id);
Assert.NotNull(updated);
Assert.Equal("새 이름", updated.Name);
Assert.Equal("#DC2626", updated.Color);
Assert.Equal("🚀", updated.Icon);
}
finally
{
if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true);
}
}
[Fact]
public void DeleteProfile_RemovesProfile_CannotDeleteLastOrActive()
{
var tempDir = Path.Combine(Path.GetTempPath(), "paca_test_profile_" + Guid.NewGuid());
Directory.CreateDirectory(tempDir);
try
{
var manager = new ProfileManager(tempDir);
var p2 = manager.AddProfile("삭제할 프로필", "#D97706", "⭐");
Assert.Equal(2, manager.GetProfiles().Count);
var deleted = manager.DeleteProfile(p2.Id);
Assert.True(deleted);
Assert.Single(manager.GetProfiles());
// 기본(유일한) 프로필 삭제 시도 -> 실패해야 함
var deletedDefault = manager.DeleteProfile("default");
Assert.False(deletedDefault);
Assert.Single(manager.GetProfiles());
}
finally
{
if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true);
}
}
[Fact]
public void ProfileFolder_ReturnsUniquePathForProfile()
{
var tempDir = Path.Combine(Path.GetTempPath(), "paca_test_profile_" + Guid.NewGuid());
Directory.CreateDirectory(tempDir);
try
{
var manager = new ProfileManager(tempDir);
var defaultFolder = manager.GetProfileUserDataFolder("default");
var customFolder = manager.GetProfileUserDataFolder("custom_123");
Assert.NotEqual(defaultFolder, customFolder);
Assert.Contains("custom_123", customFolder);
}
finally
{
if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true);
}
}
}