Add profile download policy

This commit is contained in:
2026-05-07 21:43:28 -04:00
parent 0ed8c09395
commit 6d47b26090
9 changed files with 347 additions and 12 deletions
+77 -1
View File
@@ -1,7 +1,10 @@
use std::error::Error;
use ely_browser_core::{BrowserCore, CoreError, InitialBrowserConfig};
use ely_domain::{DomainError, DownloadId, DownloadState, ProfileKind, UrlText};
use ely_domain::{
DomainError, DownloadDestination, DownloadId, DownloadPolicy, DownloadSecurity, DownloadState,
ProfileKind, UrlText,
};
#[test]
fn download_entries_stay_with_active_profile() -> Result<(), Box<dyn Error>> {
@@ -62,6 +65,79 @@ fn controls_download_lifecycle() -> Result<(), Box<dyn Error>> {
Ok(())
}
#[test]
fn records_active_profile_download_policy_on_started_entry() -> Result<(), Box<dyn Error>> {
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let profile_id = core.active_tab()?.profile_id().clone();
let policy = DownloadPolicy::fixed_directory("/tmp/ely-work-downloads")?;
core.set_profile_download_policy(&profile_id, policy.clone())?;
core.record_download_started(
UrlText::parse("https://example.com/installer.dmg")?,
"installer.dmg",
Some(4096),
)?;
let snapshot = core.snapshot()?;
let entry = active_download(&core)?;
assert_eq!(snapshot.active_download_policy, policy);
assert_eq!(entry.destination(), policy.destination());
assert_eq!(entry.security(), &DownloadSecurity::DangerousExtension);
Ok(())
}
#[test]
fn download_policies_stay_with_profile() -> Result<(), Box<dyn Error>> {
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let default_profile_id = core.active_tab()?.profile_id().clone();
let default_policy = DownloadPolicy::fixed_directory("/tmp/ely-default-downloads")?;
core.set_profile_download_policy(&default_profile_id, default_policy.clone())?;
let personal_profile_id = core.create_profile("Personal", 0xf54e00, ProfileKind::Standard)?;
assert_eq!(
core.snapshot()?.active_download_policy.destination(),
&DownloadDestination::AskEveryTime
);
let personal_policy = DownloadPolicy::fixed_directory("/tmp/ely-personal-downloads")?;
core.set_profile_download_policy(&personal_profile_id, personal_policy.clone())?;
assert_eq!(core.snapshot()?.active_download_policy, personal_policy);
core.select_profile(&default_profile_id)?;
assert_eq!(core.snapshot()?.active_download_policy, default_policy);
Ok(())
}
#[test]
fn rejects_relative_download_directory() -> Result<(), Box<dyn Error>> {
let error = match DownloadPolicy::fixed_directory("downloads") {
Ok(_) => return Err("relative download directory should be rejected".into()),
Err(error) => error,
};
assert_eq!(error, DomainError::InvalidDownloadDirectory { path: "downloads".to_string() });
Ok(())
}
#[test]
fn rejects_path_like_download_file_name() -> Result<(), Box<dyn Error>> {
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
let error = match core.record_download_started(
UrlText::parse("https://example.com/evil.sh")?,
"../evil.sh",
None,
) {
Ok(_) => return Err("path-like download file name should be rejected".into()),
Err(error) => error,
};
assert_eq!(
error,
CoreError::Domain(DomainError::InvalidFileName { value: "../evil.sh".to_string() })
);
Ok(())
}
#[test]
fn retries_cancelled_download_from_zero_bytes() -> Result<(), Box<dyn Error>> {
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;