Add application and autostart settings
This commit is contained in:
Executable
+230
@@ -0,0 +1,230 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
fail() {
|
||||
printf 'default apps contract: %s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
project_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
helper="$project_root/config/dot/quickshell/scripts/panama-default-apps"
|
||||
service="$project_root/config/dot/quickshell/services/DefaultApps.qml"
|
||||
test_root="$(mktemp -d /tmp/panama-default-apps.XXXXXX)"
|
||||
trap 'rm -rf "$test_root"' EXIT
|
||||
|
||||
[[ -x "$helper" ]] || fail 'helper is missing or not executable'
|
||||
[[ -f "$service" ]] || fail 'DefaultApps service is missing'
|
||||
|
||||
assert_service_contains() {
|
||||
rg -F --quiet "$1" "$service" || fail "service is missing: $1"
|
||||
}
|
||||
|
||||
assert_service_contains 'pragma Singleton'
|
||||
assert_service_contains 'property var handlers'
|
||||
assert_service_contains 'property var autostartEntries'
|
||||
assert_service_contains 'property var luaAutostartEntries'
|
||||
assert_service_contains 'readonly property bool busy'
|
||||
assert_service_contains 'property string lastError'
|
||||
assert_service_contains 'function refresh(): void'
|
||||
assert_service_contains 'function setDefault(role: string, desktopId: string): void'
|
||||
assert_service_contains 'function setAutostart(desktopId: string, enabled: bool): void'
|
||||
assert_service_contains 'DesktopEntries.applications.values'
|
||||
if rg --quiet 'command\s*:\s*"' "$service"; then
|
||||
fail 'Process command must be an argument array'
|
||||
fi
|
||||
|
||||
config_home="$test_root/config"
|
||||
data_home="$test_root/data"
|
||||
data_dirs="$test_root/data-dirs"
|
||||
fake_bin="$test_root/bin"
|
||||
call_log="$test_root/calls"
|
||||
lua_fixture="$test_root/autostart.lua"
|
||||
mkdir -p "$config_home/autostart" "$data_home/applications" "$data_dirs" "$fake_bin"
|
||||
|
||||
write_application() {
|
||||
local desktop_id="$1"
|
||||
local name="$2"
|
||||
local generic_name="$3"
|
||||
local categories="$4"
|
||||
cat >"$data_home/applications/$desktop_id" <<EOF
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=$name
|
||||
GenericName=$generic_name
|
||||
Categories=$categories
|
||||
Exec=/usr/bin/true
|
||||
EOF
|
||||
}
|
||||
|
||||
write_application org.mozilla.firefox.desktop Firefox 'Web Browser' 'Network;WebBrowser;'
|
||||
write_application org.gnome.Geary.desktop Geary 'Mail Client' 'Network;Email;'
|
||||
write_application org.gnome.Nautilus.desktop Files 'File Manager' 'System;FileManager;'
|
||||
write_application org.gnome.Ptyxis.desktop Ptyxis Terminal 'System;TerminalEmulator;'
|
||||
write_application org.gnome.Rhythmbox3.desktop Rhythmbox 'Music Player' 'AudioVideo;Audio;Player;'
|
||||
write_application org.gnome.Loupe.desktop Loupe 'Image Viewer' 'Graphics;Viewer;'
|
||||
write_application org.gnome.Totem.desktop Videos 'Video Player' 'AudioVideo;Video;Player;'
|
||||
|
||||
cat >"$config_home/autostart/nextcloud.desktop" <<'EOF'
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Nextcloud
|
||||
Exec=nextcloud --background
|
||||
Hidden=true
|
||||
EOF
|
||||
|
||||
cat >"$lua_fixture" <<'EOF'
|
||||
hl.on("hyprland.start", function()
|
||||
hl.exec_cmd("quickshell --daemonize")
|
||||
hl.exec_cmd("nextcloud --background")
|
||||
end)
|
||||
|
||||
hl.on("hyprland.shutdown", function()
|
||||
hl.exec_cmd("systemctl --user stop hyprland-session.target")
|
||||
end)
|
||||
EOF
|
||||
|
||||
cat >"$fake_bin/xdg-settings" <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
printf '%s\n' "$@" >>"$PANAMA_CALL_LOG"
|
||||
if [[ "$1" == "get" && "$2" == "default-web-browser" ]]; then
|
||||
printf '%s\n' 'org.mozilla.firefox.desktop'
|
||||
exit 0
|
||||
fi
|
||||
EOF
|
||||
chmod +x "$fake_bin/xdg-settings"
|
||||
|
||||
cat >"$fake_bin/xdg-mime" <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
printf '%s\n' "$@" >>"$PANAMA_CALL_LOG"
|
||||
if [[ "$1" == "query" && "$2" == "default" ]]; then
|
||||
case "$3" in
|
||||
x-scheme-handler/mailto) printf '%s\n' 'org.gnome.Geary.desktop' ;;
|
||||
inode/directory) printf '%s\n' 'org.gnome.Nautilus.desktop' ;;
|
||||
x-scheme-handler/terminal) printf '%s\n' 'org.gnome.Ptyxis.desktop' ;;
|
||||
audio/mpeg) printf '%s\n' 'org.gnome.Rhythmbox3.desktop' ;;
|
||||
image/png) printf '%s\n' 'org.gnome.Loupe.desktop' ;;
|
||||
video/mp4) printf '%s\n' 'org.gnome.Totem.desktop' ;;
|
||||
*) exit 91 ;;
|
||||
esac
|
||||
exit 0
|
||||
fi
|
||||
EOF
|
||||
chmod +x "$fake_bin/xdg-mime"
|
||||
|
||||
export XDG_CONFIG_HOME="$config_home"
|
||||
export XDG_DATA_HOME="$data_home"
|
||||
export XDG_DATA_DIRS="$data_dirs"
|
||||
export PANAMA_HYPR_AUTOSTART="$lua_fixture"
|
||||
export PANAMA_CALL_LOG="$call_log"
|
||||
export PATH="$fake_bin:$PATH"
|
||||
|
||||
snapshot="$($helper snapshot)" || fail 'snapshot command failed'
|
||||
[[ "$(rg --count '^get$' "$call_log")" == "1" ]] \
|
||||
|| fail 'browser handler was queried more than once'
|
||||
[[ "$(rg --count '^query$' "$call_log")" == "6" ]] \
|
||||
|| fail 'MIME handlers were queried more than once'
|
||||
jq -e '
|
||||
.handlers == {
|
||||
browser: "org.mozilla.firefox.desktop",
|
||||
mail: "org.gnome.Geary.desktop",
|
||||
files: "org.gnome.Nautilus.desktop",
|
||||
terminal: "org.gnome.Ptyxis.desktop",
|
||||
music: "org.gnome.Rhythmbox3.desktop",
|
||||
images: "org.gnome.Loupe.desktop",
|
||||
video: "org.gnome.Totem.desktop"
|
||||
} and
|
||||
.autostartEntries == [{id: "nextcloud.desktop", name: "Nextcloud", enabled: false}] and
|
||||
(.luaAutostartEntries | length == 2) and
|
||||
([.luaAutostartEntries[] |
|
||||
.enabled == true and .readOnly == true and
|
||||
.source == "config/dot/hypr/autostart.lua" and
|
||||
(.id | startswith("hyprland:")) and
|
||||
(.name | length > 0) and (.command | length > 0)
|
||||
] | all) and
|
||||
([.luaAutostartEntries[].command] |
|
||||
index("systemctl --user stop hyprland-session.target") == null)
|
||||
' <<<"$snapshot" >/dev/null || fail 'snapshot shape, handlers, or autostart parsing is incorrect'
|
||||
|
||||
assert_call() {
|
||||
local expected="$1"
|
||||
local actual
|
||||
actual="$(cat "$call_log")"
|
||||
[[ "$actual" == "$expected" ]] || {
|
||||
printf 'expected argv:\n%s\nactual argv:\n%s\n' "$expected" "$actual" >&2
|
||||
fail 'setter did not pass separate arguments'
|
||||
}
|
||||
}
|
||||
|
||||
: >"$call_log"
|
||||
$helper set-default browser org.mozilla.firefox.desktop
|
||||
assert_call $'set\ndefault-web-browser\norg.mozilla.firefox.desktop'
|
||||
|
||||
roles=(mail files terminal music images video)
|
||||
desktop_ids=(
|
||||
org.gnome.Geary.desktop
|
||||
org.gnome.Nautilus.desktop
|
||||
org.gnome.Ptyxis.desktop
|
||||
org.gnome.Rhythmbox3.desktop
|
||||
org.gnome.Loupe.desktop
|
||||
org.gnome.Totem.desktop
|
||||
)
|
||||
mime_types=(
|
||||
x-scheme-handler/mailto
|
||||
inode/directory
|
||||
x-scheme-handler/terminal
|
||||
audio/mpeg
|
||||
image/png
|
||||
video/mp4
|
||||
)
|
||||
for index in "${!roles[@]}"; do
|
||||
: >"$call_log"
|
||||
$helper set-default "${roles[$index]}" "${desktop_ids[$index]}"
|
||||
assert_call $'default\n'"${desktop_ids[$index]}"$'\n'"${mime_types[$index]}"
|
||||
done
|
||||
|
||||
: >"$call_log"
|
||||
if $helper set-default unknown org.mozilla.firefox.desktop >/dev/null 2>&1; then
|
||||
fail 'unknown role was accepted'
|
||||
fi
|
||||
[[ ! -s "$call_log" ]] || fail 'unknown role reached an xdg command'
|
||||
|
||||
if $helper set-default browser org.example.Missing.desktop >/dev/null 2>&1; then
|
||||
fail 'undiscovered desktop id was accepted'
|
||||
fi
|
||||
if $helper set-default browser ../escape.desktop >/dev/null 2>&1; then
|
||||
fail 'unsafe desktop id was accepted'
|
||||
fi
|
||||
|
||||
$helper set-autostart nextcloud.desktop true
|
||||
rg --quiet '^Hidden=false$' "$config_home/autostart/nextcloud.desktop" \
|
||||
|| fail 'enabling autostart did not set Hidden=false'
|
||||
[[ "$(rg --count '^Hidden=' "$config_home/autostart/nextcloud.desktop")" == "1" ]] \
|
||||
|| fail 'enabling autostart duplicated Hidden'
|
||||
rg --quiet '^Exec=nextcloud --background$' "$config_home/autostart/nextcloud.desktop" \
|
||||
|| fail 'autostart update damaged another desktop key'
|
||||
jq -e '.autostartEntries == [{id: "nextcloud.desktop", name: "Nextcloud", enabled: true}]' \
|
||||
<<<"$($helper snapshot)" >/dev/null || fail 'enabled state did not round-trip'
|
||||
|
||||
$helper set-autostart nextcloud.desktop false
|
||||
rg --quiet '^Hidden=true$' "$config_home/autostart/nextcloud.desktop" \
|
||||
|| fail 'disabling autostart did not set Hidden=true'
|
||||
|
||||
outside_entry="$test_root/outside.desktop"
|
||||
cp "$config_home/autostart/nextcloud.desktop" "$outside_entry"
|
||||
ln -s "$outside_entry" "$config_home/autostart/linked.desktop"
|
||||
if $helper set-autostart linked.desktop true >/dev/null 2>&1; then
|
||||
fail 'autostart symlink escaping XDG config was accepted'
|
||||
fi
|
||||
rg --quiet '^Hidden=true$' "$outside_entry" || fail 'outside autostart file was modified'
|
||||
|
||||
if $helper set-autostart missing.desktop true >/dev/null 2>&1; then
|
||||
fail 'unknown autostart desktop id was accepted'
|
||||
fi
|
||||
if $helper set-autostart 'hyprland:1' false >/dev/null 2>&1; then
|
||||
fail 'read-only compositor entry was accepted for mutation'
|
||||
fi
|
||||
|
||||
printf 'default apps contract: PASS\n'
|
||||
Reference in New Issue
Block a user