use revue::utils::browser::{
launch_suppressed, open_browser, open_file, open_folder, open_url, reveal_in_finder,
NO_LAUNCH_ENV,
};
use serial_test::serial;
#[test]
fn test_functions_exist() {
let _ = open_browser;
let _ = open_url;
let _ = open_file;
let _ = open_folder;
let _ = reveal_in_finder;
}
#[test]
fn test_open_browser_return_type() {
let _: fn(&str) -> bool = open_browser;
}
#[test]
fn test_open_url_return_type() {
let _: fn(&str) -> Result<(), revue::utils::browser::BrowserError> = open_url;
}
#[test]
fn test_open_file_return_type() {
let _: fn(&str) -> bool = open_file;
}
#[test]
fn test_open_folder_return_type() {
let _: fn(&str) -> bool = open_folder;
}
#[test]
fn test_reveal_in_finder_return_type() {
let _: fn(&str) -> bool = reveal_in_finder;
}
#[test]
fn test_reject_shell_metacharacter_ampersand() {
assert!(!open_browser("https://example.com & malware.exe"));
assert!(open_url("https://example.com & malware.exe").is_err());
assert!(!open_folder("/path & rm -rf /"));
}
#[test]
fn test_reject_shell_metacharacter_pipe() {
assert!(!open_browser("https://example.com | cat /etc/passwd"));
assert!(open_url("url | malicious").is_err());
}
#[test]
fn test_reject_shell_metacharacter_semicolon() {
assert!(!open_browser("https://example.com; rm -rf /"));
assert!(open_url("url; malicious").is_err());
}
#[test]
fn test_reject_backtick() {
assert!(!open_browser("https://example.com`malicious`"));
assert!(open_url("url`malicious`").is_err());
}
#[test]
fn test_reject_newline() {
assert!(!open_browser("https://example.com\nrm -rf /"));
assert!(open_url("url\nmalicious").is_err());
}
#[test]
fn test_reject_command_substitution() {
assert!(!open_browser("https://example.com$(rm -rf /)"));
assert!(open_url("url$(malicious)").is_err());
}
#[test]
fn test_reject_empty_url() {
assert!(open_url("").is_err());
}
#[test]
fn test_reject_unicode_control_characters() {
assert!(open_url("https://example.com\u{0090}malicious").is_err());
}
#[test]
fn test_reject_file_url_with_path_traversal() {
assert!(open_url("file://../../../etc/passwd").is_err());
}
#[test]
fn test_reject_remote_file_urls() {
assert!(open_url("file://evil.com/etc/passwd").is_err());
assert!(open_url("file://192.168.1.1/share/file").is_err());
}
#[test]
fn test_error_messages() {
let err = open_url("https://example.com & malware").unwrap_err();
assert!(err.to_string().contains("dangerous") || err.to_string().contains("character"));
}
#[test]
#[serial]
fn test_no_browser_env_suppresses_launch() {
std::env::set_var(NO_LAUNCH_ENV, "1");
assert!(launch_suppressed());
assert!(open_browser("https://example.com"));
assert!(open_url("https://example.com").is_ok());
assert!(open_file("/tmp"));
assert!(open_folder("/tmp"));
assert!(reveal_in_finder("/tmp"));
std::env::remove_var(NO_LAUNCH_ENV);
assert!(!launch_suppressed());
}
#[test]
#[serial]
fn test_no_browser_env_empty_does_not_suppress() {
std::env::set_var(NO_LAUNCH_ENV, "");
assert!(!launch_suppressed());
std::env::remove_var(NO_LAUNCH_ENV);
}
#[test]
#[serial]
fn test_suppressed_still_rejects_dangerous_input() {
std::env::set_var(NO_LAUNCH_ENV, "1");
assert!(!open_browser("https://example.com; rm -rf /"));
assert!(open_url("url | malicious").is_err());
std::env::remove_var(NO_LAUNCH_ENV);
}