Files
Panama/tests/quickshell/lock-screen-settings-contract.sh

93 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
preview="$repo_dir/config/dot/quickshell/modules/settings/LockScreenPreview.qml"
appearance="$repo_dir/config/dot/quickshell/modules/settings/AppearancePage.qml"
power="$repo_dir/config/dot/quickshell/modules/settings/PowerPage.qml"
privacy="$repo_dir/config/dot/quickshell/modules/settings/PrivacyPage.qml"
harness="$repo_dir/config/dot/quickshell/lock-screen-settings-harness.qml"
state_home="$(mktemp -d /tmp/panama-lock-settings-state.XXXXXX)"
shell_log="$state_home/quickshell.log"
harness_pid=""
fail() {
printf 'lock screen settings contract: %s\n' "$1" >&2
[[ -s "$shell_log" ]] && sed -n '1,160p' "$shell_log" >&2
exit 1
}
instances_for_harness() {
qs list --all 2>/dev/null | awk -v expected="$harness" '
/^Instance / { pid = "" }
/^[[:space:]]*Process ID:/ { pid = $3 }
/^[[:space:]]*Config path:/ {
path = $0
sub(/^[[:space:]]*Config path: /, "", path)
if (path == expected && pid ~ /^[0-9]+$/) print pid
}
'
}
cleanup() {
if [[ "$harness_pid" =~ ^[0-9]+$ ]] && kill -0 "$harness_pid" 2>/dev/null; then
kill "$harness_pid" 2>/dev/null || true
fi
rm -rf "$state_home"
}
trap cleanup EXIT
[[ -f "$preview" ]] || fail 'LockScreenPreview.qml is missing'
rg -Fq 'title: "Lock screen"' "$appearance" || fail 'Appearance has no Lock screen card'
for key in lockBackgroundMode lockBlurLevel lockShowClock lockShowDate lockShowUser lockFadeOnEmpty; do
rg -Fq "setting: \"$key\"" "$appearance" || fail "Appearance does not expose $key"
! rg -Fq "setting: \"$key\"" "$power" "$privacy" \
|| fail "$key was duplicated onto Power or Privacy"
done
python3 - "$appearance" <<'PY' || fail 'Lock screen card is not between Background and Shell typography'
import sys
text = open(sys.argv[1], encoding="utf-8").read()
background = text.index('title: "Background"')
lock = text.index('title: "Lock screen"')
typography = text.index('title: "Shell typography"')
raise SystemExit(0 if background < lock < typography else 1)
PY
qs_for_harness() {
if [[ "$harness_pid" =~ ^[0-9]+$ && "${1:-}" == "ipc" ]]; then
XDG_STATE_HOME="$state_home" qs -p "$harness" ipc --pid "$harness_pid" "${@:2}"
else
XDG_STATE_HOME="$state_home" qs -p "$harness" "$@"
fi
}
before_lockers="$(pgrep -x hyprlock | sort -n || true)"
qs_for_harness --daemonize >"$shell_log" 2>&1 || fail 'isolated preview harness did not launch'
for _ in $(seq 1 60); do
harness_pid="$(instances_for_harness | head -1)"
if [[ "$harness_pid" =~ ^[0-9]+$ ]] \
&& qs_for_harness ipc show 2>/dev/null | rg -q '^target lock-screen-settings-test$'; then
break
fi
sleep 0.1
done
[[ "$harness_pid" =~ ^[0-9]+$ ]] || fail 'isolated preview harness process did not start'
status="$(qs_for_harness ipc call lock-screen-settings-test status)"
jq -e '
.screenshot == {"mode":"screenshot","wallpaperVisible":false,"blurStrength":0.8,"clockVisible":true,"dateVisible":true,"userVisible":true,"passwordVisible":true}
and .wallpaper == {"mode":"wallpaper","wallpaperVisible":true,"blurStrength":0.4,"clockVisible":false,"dateVisible":true,"userVisible":false,"passwordVisible":false}
and .solid == {"mode":"solid","wallpaperVisible":false,"blurStrength":0,"clockVisible":true,"dateVisible":false,"userVisible":true,"passwordVisible":true}
' <<<"$status" >/dev/null || fail "preview roles did not follow their settings: $status"
after_lockers="$(pgrep -x hyprlock | sort -n || true)"
[[ "$after_lockers" == "$before_lockers" ]] || fail 'preview started a real hyprlock process'
if rg -n 'ReferenceError|TypeError|Binding loop|Unable to assign|Cannot assign|Failed to load' "$shell_log"; then
fail 'preview harness emitted a QML runtime warning'
fi
printf 'lock screen settings contract: PASS\n'