feat(sync): include site permissions in snapshots

This commit is contained in:
2026-05-16 06:43:04 -04:00
parent d5e25345c5
commit 00d48a9286
6 changed files with 194 additions and 2 deletions
+10 -1
View File
@@ -1,7 +1,10 @@
use std::error::Error;
use ely_browser_core::{BrowserCore, InitialBrowserConfig};
use ely_domain::{ProfileKind, ProfileSyncPolicy, UrlText};
use ely_domain::{
ProfileKind, ProfileSyncPolicy, SiteOrigin, SitePermissionDecision, SitePermissionFeature,
UrlText,
};
#[test]
fn sync_snapshot_imports_remote_profiles_before_spaces() -> Result<(), Box<dyn Error>> {
@@ -76,6 +79,11 @@ fn paused_profile_data_is_omitted_from_sync_snapshots() -> Result<(), Box<dyn Er
source.bookmark_active_tab()?;
source.save_active_url_note("profile paused")?;
source.save_active_tab_to_reading_list()?;
source.set_site_permission(
SiteOrigin::parse("https://example.com")?,
SitePermissionFeature::Camera,
SitePermissionDecision::AllowAlways,
)?;
let bytes = source.build_sync_snapshot_bytes()?;
let mut target = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
@@ -92,5 +100,6 @@ fn paused_profile_data_is_omitted_from_sync_snapshots() -> Result<(), Box<dyn Er
assert!(snapshot.bookmarks.is_empty());
assert!(snapshot.notes.is_empty());
assert!(snapshot.reading_list.is_empty());
assert!(snapshot.site_permissions.is_empty());
Ok(())
}
@@ -0,0 +1,100 @@
use std::error::Error;
use ely_browser_core::{BrowserCore, InitialBrowserConfig};
use ely_domain::{
SiteOrigin, SitePermissionDecision, SitePermissionFeature, SyncObjectKind, SyncObjectPolicy,
};
#[test]
fn sync_snapshot_imports_remote_site_permissions() -> Result<(), Box<dyn Error>> {
let mut source = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let source_home_tab_id = source.snapshot()?.active_tab_id;
source.set_tab_sync_enabled(&source_home_tab_id, false)?;
let origin = SiteOrigin::parse("https://example.com")?;
source.set_site_permission(
origin.clone(),
SitePermissionFeature::Camera,
SitePermissionDecision::AllowAlways,
)?;
let bytes = source.build_sync_snapshot_bytes()?;
let mut target = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let target_profile_id = target.snapshot()?.active_profile_id;
let summary = target.apply_sync_snapshot_bytes(&bytes)?;
let snapshot = target.snapshot()?;
let [entry] = snapshot.site_permissions.as_slice() else {
return Err(
format!("expected 1 site permission, got {}", snapshot.site_permissions.len()).into()
);
};
assert_eq!(summary.imported(), 1);
assert_eq!(summary.updated(), 0);
assert_eq!(summary.skipped(), 0);
assert_eq!(entry.profile_id(), &target_profile_id);
assert_eq!(entry.origin(), &origin);
assert_eq!(entry.feature(), SitePermissionFeature::Camera);
assert_eq!(entry.decision(), SitePermissionDecision::AllowAlways);
assert!(snapshot.site_permission_audit_events.is_empty());
Ok(())
}
#[test]
fn sync_snapshot_updates_existing_site_permission() -> Result<(), Box<dyn Error>> {
let mut source = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let source_home_tab_id = source.snapshot()?.active_tab_id;
source.set_tab_sync_enabled(&source_home_tab_id, false)?;
let origin = SiteOrigin::parse("https://example.com")?;
source.set_site_permission(
origin.clone(),
SitePermissionFeature::Notifications,
SitePermissionDecision::AllowAlways,
)?;
let bytes = source.build_sync_snapshot_bytes()?;
let mut target = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
target.set_site_permission(
origin,
SitePermissionFeature::Notifications,
SitePermissionDecision::DenyAlways,
)?;
let summary = target.apply_sync_snapshot_bytes(&bytes)?;
let snapshot = target.snapshot()?;
let [entry] = snapshot.site_permissions.as_slice() else {
return Err(
format!("expected 1 site permission, got {}", snapshot.site_permissions.len()).into()
);
};
assert_eq!(summary.imported(), 0);
assert_eq!(summary.updated(), 1);
assert_eq!(summary.skipped(), 0);
assert_eq!(entry.feature(), SitePermissionFeature::Notifications);
assert_eq!(entry.decision(), SitePermissionDecision::AllowAlways);
assert_eq!(snapshot.site_permission_audit_events.len(), 1);
Ok(())
}
#[test]
fn sync_snapshot_omits_paused_site_permissions() -> Result<(), Box<dyn Error>> {
let mut source = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let source_home_tab_id = source.snapshot()?.active_tab_id;
source.set_tab_sync_enabled(&source_home_tab_id, false)?;
source.set_site_permission(
SiteOrigin::parse("https://example.com")?,
SitePermissionFeature::Popups,
SitePermissionDecision::DenyAlways,
)?;
source.set_sync_object_policy(SyncObjectKind::SitePermissions, SyncObjectPolicy::Paused);
let bytes = source.build_sync_snapshot_bytes()?;
let mut target = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let summary = target.apply_sync_snapshot_bytes(&bytes)?;
let snapshot = target.snapshot()?;
assert_eq!(summary.imported(), 0);
assert_eq!(summary.updated(), 0);
assert_eq!(summary.skipped(), 0);
assert!(snapshot.site_permissions.is_empty());
Ok(())
}