- install_desktop_integration_to() writes .desktop and downloads icon - setup_desktop_integration_wizard() prompts and installs to XDG paths - --create-desktop-shortcut flag to re-run at any time - First-run wizard now also offers desktop integration after shortcut setup - 164 tests passing
166 lines
5.0 KiB
Rust
166 lines
5.0 KiB
Rust
use std::fs;
|
|
use tempfile::tempdir;
|
|
use tmuxido::shortcut::{
|
|
KeyCombo, check_kde_conflict, install_desktop_integration_to, write_hyprland_binding,
|
|
write_kde_shortcut,
|
|
};
|
|
|
|
#[test]
|
|
fn writes_hyprland_binding_to_new_file() {
|
|
let dir = tempdir().unwrap();
|
|
let path = dir.path().join("bindings.conf");
|
|
let combo = KeyCombo::parse("Super+Shift+T").unwrap();
|
|
|
|
write_hyprland_binding(&path, &combo).unwrap();
|
|
|
|
let content = fs::read_to_string(&path).unwrap();
|
|
assert!(
|
|
content.contains("SUPER SHIFT, T"),
|
|
"should contain Hyprland combo"
|
|
);
|
|
assert!(content.contains("tmuxido"), "should mention tmuxido");
|
|
assert!(
|
|
content.starts_with("bindd"),
|
|
"should start with bindd directive"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn write_hyprland_binding_skips_when_tmuxido_already_present() {
|
|
let dir = tempdir().unwrap();
|
|
let path = dir.path().join("bindings.conf");
|
|
fs::write(&path, "bindd = SUPER SHIFT, T, Tmuxido, exec, tmuxido\n").unwrap();
|
|
|
|
let combo = KeyCombo::parse("Super+Shift+T").unwrap();
|
|
write_hyprland_binding(&path, &combo).unwrap();
|
|
|
|
let content = fs::read_to_string(&path).unwrap();
|
|
let count = content.lines().filter(|l| l.contains("tmuxido")).count();
|
|
assert_eq!(count, 1, "should not add a duplicate line");
|
|
}
|
|
|
|
#[test]
|
|
fn write_hyprland_binding_creates_parent_dirs() {
|
|
let dir = tempdir().unwrap();
|
|
let path = dir.path().join("nested").join("hypr").join("bindings.conf");
|
|
|
|
let combo = KeyCombo::parse("Super+Ctrl+T").unwrap();
|
|
write_hyprland_binding(&path, &combo).unwrap();
|
|
|
|
assert!(
|
|
path.exists(),
|
|
"file should be created even when parent dirs are missing"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn writes_kde_shortcut_to_new_file() {
|
|
let dir = tempdir().unwrap();
|
|
let path = dir.path().join("kglobalshortcutsrc");
|
|
let combo = KeyCombo::parse("Super+Shift+T").unwrap();
|
|
|
|
write_kde_shortcut(&path, &combo).unwrap();
|
|
|
|
let content = fs::read_to_string(&path).unwrap();
|
|
assert!(
|
|
content.contains("[tmuxido]"),
|
|
"should contain [tmuxido] section"
|
|
);
|
|
assert!(
|
|
content.contains("Meta+Shift+T"),
|
|
"should use Meta notation for KDE"
|
|
);
|
|
assert!(
|
|
content.contains("Launch Tmuxido"),
|
|
"should include action description"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn write_kde_shortcut_skips_when_section_already_exists() {
|
|
let dir = tempdir().unwrap();
|
|
let path = dir.path().join("kglobalshortcutsrc");
|
|
fs::write(
|
|
&path,
|
|
"[tmuxido]\nLaunch Tmuxido=Meta+Shift+T,none,Launch Tmuxido\n",
|
|
)
|
|
.unwrap();
|
|
|
|
let combo = KeyCombo::parse("Super+Shift+P").unwrap();
|
|
write_kde_shortcut(&path, &combo).unwrap();
|
|
|
|
let content = fs::read_to_string(&path).unwrap();
|
|
let count = content.matches("[tmuxido]").count();
|
|
assert_eq!(count, 1, "should not add a duplicate section");
|
|
}
|
|
|
|
#[test]
|
|
fn check_kde_conflict_finds_existing_binding() {
|
|
let dir = tempdir().unwrap();
|
|
let path = dir.path().join("kglobalshortcutsrc");
|
|
fs::write(
|
|
&path,
|
|
"[myapp]\nLaunch Something=Meta+Shift+T,none,Launch Something\n",
|
|
)
|
|
.unwrap();
|
|
|
|
let combo = KeyCombo::parse("Super+Shift+T").unwrap();
|
|
let conflict = check_kde_conflict(&path, &combo);
|
|
|
|
assert_eq!(conflict, Some("myapp".to_string()));
|
|
}
|
|
|
|
#[test]
|
|
fn check_kde_conflict_returns_none_for_free_binding() {
|
|
let dir = tempdir().unwrap();
|
|
let path = dir.path().join("kglobalshortcutsrc");
|
|
fs::write(
|
|
&path,
|
|
"[myapp]\nLaunch Something=Meta+Ctrl+T,none,Launch Something\n",
|
|
)
|
|
.unwrap();
|
|
|
|
let combo = KeyCombo::parse("Super+Shift+T").unwrap();
|
|
assert!(check_kde_conflict(&path, &combo).is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn check_kde_conflict_returns_none_when_file_missing() {
|
|
let combo = KeyCombo::parse("Super+Shift+T").unwrap();
|
|
assert!(check_kde_conflict(std::path::Path::new("/nonexistent/path"), &combo).is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn installs_desktop_file_to_given_path() {
|
|
let dir = tempdir().unwrap();
|
|
let desktop_path = dir.path().join("applications").join("tmuxido.desktop");
|
|
let icon_path = dir
|
|
.path()
|
|
.join("icons")
|
|
.join("hicolor")
|
|
.join("96x96")
|
|
.join("apps")
|
|
.join("tmuxido.png");
|
|
|
|
let result = install_desktop_integration_to(&desktop_path, &icon_path).unwrap();
|
|
|
|
assert!(result.desktop_path.exists(), ".desktop file should exist");
|
|
let content = fs::read_to_string(&result.desktop_path).unwrap();
|
|
assert!(content.contains("[Desktop Entry]"));
|
|
assert!(content.contains("Exec=tmuxido"));
|
|
assert!(content.contains("Icon=tmuxido"));
|
|
assert!(content.contains("Terminal=true"));
|
|
assert!(content.contains("StartupWMClass=tmuxido"));
|
|
}
|
|
|
|
#[test]
|
|
fn desktop_install_creates_parent_dirs() {
|
|
let dir = tempdir().unwrap();
|
|
let desktop_path = dir.path().join("a").join("b").join("tmuxido.desktop");
|
|
let icon_path = dir.path().join("icons").join("tmuxido.png");
|
|
|
|
install_desktop_integration_to(&desktop_path, &icon_path).unwrap();
|
|
|
|
assert!(desktop_path.exists());
|
|
}
|