using System; using System.IO; using System.Linq; using Paca.Browser; using Paca.Browser.Tabs; using Xunit; namespace Paca.Tests.Browser; public class ChromeSitePermissionsTests { [Fact] public void PermissionGate_Origin_Listing_And_Reset_Work() { var gate = new PermissionGate(); gate.Remember("Camera", "https://meet.google.com", PermissionVerdict.Allow); gate.Remember("Microphone", "https://meet.google.com", PermissionVerdict.Allow); gate.Remember("Geolocation", "https://maps.google.com", PermissionVerdict.Deny); var meetPerms = gate.GetOriginPermissions("https://meet.google.com"); Assert.Equal(2, meetPerms.Count); Assert.Equal(PermissionVerdict.Allow, meetPerms["Camera"]); Assert.Equal(PermissionVerdict.Allow, meetPerms["Microphone"]); var allOrigins = gate.GetAllOrigins(); Assert.Contains("https://meet.google.com", allOrigins); Assert.Contains("https://maps.google.com", allOrigins); // Reset meet.google.com gate.ResetOrigin("https://meet.google.com"); Assert.Empty(gate.GetOriginPermissions("https://meet.google.com")); Assert.Equal(PermissionVerdict.Ask, gate.Decide("Camera", "https://meet.google.com")); // maps.google.com remains intact Assert.Equal(PermissionVerdict.Deny, gate.Decide("Geolocation", "https://maps.google.com")); } [Fact] public void PermissionGate_File_Persistence_Works() { var tempFile = Path.Combine(Path.GetTempPath(), "paca_perm_test_" + Guid.NewGuid().ToString("N") + ".json"); try { var gate1 = new PermissionGate(); gate1.Remember("Camera", "https://app.slack.com", PermissionVerdict.Allow); gate1.Remember("Notifications", "https://app.slack.com", PermissionVerdict.Deny); gate1.Save(tempFile); var gate2 = new PermissionGate(); gate2.Load(tempFile); Assert.Equal(PermissionVerdict.Allow, gate2.Decide("Camera", "https://app.slack.com")); Assert.Equal(PermissionVerdict.Deny, gate2.Decide("Notifications", "https://app.slack.com")); Assert.Equal(PermissionVerdict.Ask, gate2.Decide("Microphone", "https://app.slack.com")); } finally { if (File.Exists(tempFile)) File.Delete(tempFile); } } [Fact] public void OmniboxActionEvaluator_Matches_SiteSettings() { var actionsKr = OmniboxActionEvaluator.GetMatchingActions("사이트 설정"); Assert.Contains(actionsKr, a => a.ActionId == "action:site-settings"); var actionsEn = OmniboxActionEvaluator.GetMatchingActions("permissions"); Assert.Contains(actionsEn, a => a.ActionId == "action:site-settings"); var action = OmniboxActionEvaluator.AllActions.FirstOrDefault(a => a.ActionId == "action:site-settings"); Assert.NotNull(action); Assert.Contains("사이트", action.DisplayTitle); } [Fact] public void ChromeInternalUrlRouter_Routes_SiteSettings() { Assert.True(ChromeInternalUrlRouter.IsInternal("chrome://settings/content")); var action1 = ChromeInternalUrlRouter.Route("chrome://settings/content"); Assert.Equal(ChromeInternalAction.SiteSettings, action1); var action2 = ChromeInternalUrlRouter.Route("paca://settings/content"); Assert.Equal(ChromeInternalAction.SiteSettings, action2); var suggestions = ChromeInternalUrlRouter.GetSuggestions("chrome://settings"); Assert.Contains(suggestions, s => s.Url.Contains("settings")); } }