tauri-plugin-single-window 1.2.0

Desktop-only Tauri plugin that prevents duplicate app launches and redirects activation to the existing instance.
Documentation
use super::*;

#[test]
fn duplicate_notice_renders_default_message_with_pid() {
    let notice = render_duplicate_notice("demo-app", Some(Pid::from_u32(42)), None);
    assert_eq!(
        notice,
        "Detected existing process 'demo-app' (pid 42): focusing the existing window and exiting."
    );
}

#[test]
fn duplicate_notice_renders_template_placeholders() {
    let notice = render_duplicate_notice(
        "demo-app",
        Some(Pid::from_u32(7)),
        Some("proc={{proc}},pid={{pid}}"),
    );
    assert_eq!(notice, "proc=demo-app,pid=7");
}

#[test]
fn activation_payload_parser_accepts_json_line() {
    let payload = parse_activation_payload(
        r#"{"processName":"demo-app","pid":9,"argv":["demo","--flag"],"cwd":"/tmp"}"#,
    )
    .unwrap();

    assert_eq!(payload.process_name, "demo-app");
    assert_eq!(payload.pid, 9);
    assert_eq!(payload.argv, vec!["demo", "--flag"]);
    assert_eq!(payload.cwd.as_deref(), Some("/tmp"));
}

#[test]
fn activation_payload_parser_rejects_invalid_json() {
    assert!(parse_activation_payload("not json").is_none());
}

#[test]
fn stale_pid_file_cleanup_removes_invalid_contents() {
    let dir =
        std::env::temp_dir().join(format!("single-window-test-invalid-{}", std::process::id()));
    let _ = fs::create_dir_all(&dir);
    let path = dir.join("invalid.pid");
    fs::write(&path, "not-a-pid").unwrap();

    cleanup_stale_pid_file(&path, None);

    assert!(!path.exists());
    let _ = fs::remove_dir_all(&dir);
}

#[test]
fn stale_pid_file_cleanup_removes_dead_pid() {
    let dir = std::env::temp_dir().join(format!("single-window-test-dead-{}", std::process::id()));
    let _ = fs::create_dir_all(&dir);
    let path = dir.join("dead.pid");
    fs::write(&path, u32::MAX.to_string()).unwrap();

    cleanup_stale_pid_file(&path, None);

    assert!(!path.exists());
    let _ = fs::remove_dir_all(&dir);
}

#[test]
fn config_can_set_target_window_label() {
    let config = crate::Config::new().with_target_window("secondary");
    assert_eq!(config.target_window_label.as_deref(), Some("secondary"));
}

#[test]
fn config_can_disable_window_focus() {
    let config = crate::Config::new().without_window_focus();
    assert!(!config.focus_existing_window);
}

#[test]
fn stale_pid_reason_rejects_invalid_data() {
    assert_eq!(
        stale_pid_reason("abc", None),
        Some("PID file contained invalid data")
    );
}

#[test]
fn stale_pid_reason_rejects_dead_pid() {
    let current_pid = std::process::id().to_string();
    assert_eq!(
        stale_pid_reason(&current_pid, None),
        Some("PID file pointed to a non-primary process")
    );
}

#[test]
fn same_executable_matches_identical_filenames() {
    let left = std::path::Path::new("/tmp/a/tauri-app");
    let right = std::path::Path::new("/proc/self/cwd/tauri-app");
    assert!(same_executable(left, right));
}