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); } } }