using System; using System.IO; using System.Linq; using Paca.Browser; using Paca.Browser.Permissions; using Xunit; namespace Paca.Tests.Browser; public class ChromeSitePermissionsCoordinatorTests { [Theory] [InlineData("https://www.youtube.com/watch?v=123", "https://www.youtube.com")] [InlineData("http://localhost:52100/index.html#hash", "http://localhost:52100")] [InlineData("https://meet.google.com:443/abc-def-ghi", "https://meet.google.com")] [InlineData("not a valid url", "")] public void CanonicalOrigin_Extracts_Scheme_Host_Port_Correctly(string raw, string expected) { var origin = ChromeSitePermissionsCoordinator.GetCanonicalOrigin(raw); Assert.Equal(expected, origin); } [Fact] public void SiteSecurityInfo_Reflects_Https_And_Permissions() { var coord = new ChromeSitePermissionsCoordinator(); coord.SetPermission("https://app.slack.com", "Camera", PermissionVerdict.Allow); coord.SetPermission("https://app.slack.com", "Notifications", PermissionVerdict.Deny); var infoHttps = coord.GetSiteSecurityInfo("https://app.slack.com/messages/general"); Assert.True(infoHttps.IsSecure); Assert.Equal("https://app.slack.com", infoHttps.Origin); Assert.Contains("Camera", infoHttps.AllowedPermissions); Assert.Contains("Notifications", infoHttps.BlockedPermissions); var infoHttp = coord.GetSiteSecurityInfo("http://insecure-site.org/login"); Assert.False(infoHttp.IsSecure); Assert.Equal("Insecure", infoHttp.SecurityStatus); } [Fact] public void GeolocationOverride_Manages_Presets_And_Custom_Coordinates() { var coord = new ChromeSitePermissionsCoordinator(); // Default: no override active Assert.Null(coord.CurrentGeolocationOverride); // Apply Seoul preset coord.ApplyGeolocationPreset("Seoul"); Assert.NotNull(coord.CurrentGeolocationOverride); Assert.Equal("Seoul", coord.CurrentGeolocationOverride.Name); Assert.Equal(37.5665, Math.Round(coord.CurrentGeolocationOverride.Latitude, 4)); Assert.Equal(126.9780, Math.Round(coord.CurrentGeolocationOverride.Longitude, 4)); // Clear override coord.ClearGeolocationOverride(); Assert.Null(coord.CurrentGeolocationOverride); // Custom override coord.SetCustomGeolocation(35.6762, 139.6503, 10.0, "Tokyo Tower"); Assert.NotNull(coord.CurrentGeolocationOverride); Assert.Equal(35.6762, coord.CurrentGeolocationOverride.Latitude); Assert.Equal(139.6503, coord.CurrentGeolocationOverride.Longitude); Assert.Equal(10.0, coord.CurrentGeolocationOverride.Accuracy); } [Fact] public void Coordinator_Persistence_Saves_And_Restores_Correctly() { var tempFile = Path.Combine(Path.GetTempPath(), "paca_perm_coord_" + Guid.NewGuid().ToString("N") + ".json"); try { var coord1 = new ChromeSitePermissionsCoordinator(); coord1.SetPermission("https://maps.google.com", "Geolocation", PermissionVerdict.Allow); coord1.SetPermission("https://meet.google.com", "Microphone", PermissionVerdict.Allow); coord1.SaveToFile(tempFile); var coord2 = new ChromeSitePermissionsCoordinator(); coord2.LoadFromFile(tempFile); Assert.Equal(PermissionVerdict.Allow, coord2.GetPermission("https://maps.google.com", "Geolocation")); Assert.Equal(PermissionVerdict.Allow, coord2.GetPermission("https://meet.google.com", "Microphone")); Assert.Equal(PermissionVerdict.Ask, coord2.GetPermission("https://meet.google.com", "Camera")); } finally { if (File.Exists(tempFile)) File.Delete(tempFile); } } }