Harden Home preferences reset contract
This commit is contained in:
@@ -4,6 +4,7 @@ set -euo pipefail
|
|||||||
|
|
||||||
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||||
harness="$repo_dir/config/dot/quickshell/home-preferences-harness.qml"
|
harness="$repo_dir/config/dot/quickshell/home-preferences-harness.qml"
|
||||||
|
preferences="$repo_dir/config/dot/quickshell/config/HomePreferences.qml"
|
||||||
state_home="$(mktemp -d /tmp/panama-home-preferences-state.XXXXXX)"
|
state_home="$(mktemp -d /tmp/panama-home-preferences-state.XXXXXX)"
|
||||||
|
|
||||||
fail() {
|
fail() {
|
||||||
@@ -73,9 +74,7 @@ wait_for_file_content() {
|
|||||||
for _ in $(seq 1 40); do
|
for _ in $(seq 1 40); do
|
||||||
state_file="$(find "$state_home" -name panama-home.json -print -quit)"
|
state_file="$(find "$state_home" -name panama-home.json -print -quit)"
|
||||||
if [[ -n "$state_file" ]] \
|
if [[ -n "$state_file" ]] \
|
||||||
&& jq -e --argjson expected "$expected" \
|
&& jq -e --argjson expected "$expected" '. == $expected' "$state_file" >/dev/null; then
|
||||||
'.initialized == $expected.initialized and .favorites == $expected.favorites' \
|
|
||||||
"$state_file" >/dev/null; then
|
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
sleep 0.1
|
sleep 0.1
|
||||||
@@ -83,19 +82,13 @@ wait_for_file_content() {
|
|||||||
fail 'preferences file did not contain the complete atomic update'
|
fail 'preferences file did not contain the complete atomic update'
|
||||||
}
|
}
|
||||||
|
|
||||||
wait_for_reset_file_content() {
|
assert_reset_persists_without_debounce() {
|
||||||
local expected='{"initialized":false,"favorites":[]}'
|
local expected=$' function resetHomeDefaults(): void {\n persistTimer.stop();\n values.favorites = [];\n values.initialized = false;\n root.saveError = "";\n preferencesFile.writeAdapter();\n }'
|
||||||
local state_file=""
|
local actual
|
||||||
|
|
||||||
for _ in $(seq 1 18); do
|
actual="$(sed -n '/^ function resetHomeDefaults(): void {$/,/^ }$/p' "$preferences")"
|
||||||
state_file="$(find "$state_home" -name panama-home.json -print -quit)"
|
[[ "$actual" == "$expected" ]] \
|
||||||
if [[ -n "$state_file" ]] \
|
|| fail 'resetHomeDefaults must stop debounce before directly writing the default state'
|
||||||
&& jq -e --argjson expected "$expected" '. == $expected' "$state_file" >/dev/null; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
sleep 0.01
|
|
||||||
done
|
|
||||||
fail 'reset did not persist the default Home state before the debounce interval'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# A leading JSON whitespace prevents qs from expanding the array into IPC
|
# A leading JSON whitespace prevents qs from expanding the array into IPC
|
||||||
@@ -106,7 +99,9 @@ expected_file='{"initialized":true,"favorites":[{"id":"light.desk","alias":""},{
|
|||||||
empty_expected='{"initialized":true,"favorites":[],"saveError":""}'
|
empty_expected='{"initialized":true,"favorites":[],"saveError":""}'
|
||||||
empty_file='{"initialized":true,"favorites":[]}'
|
empty_file='{"initialized":true,"favorites":[]}'
|
||||||
reset_expected='{"initialized":false,"favorites":[],"saveError":""}'
|
reset_expected='{"initialized":false,"favorites":[],"saveError":""}'
|
||||||
|
reset_file='{"initialized":false,"favorites":[]}'
|
||||||
|
|
||||||
|
assert_reset_persists_without_debounce
|
||||||
start_harness
|
start_harness
|
||||||
qs_for_harness ipc call home-pref-test initialize "$initial_ids" >/dev/null
|
qs_for_harness ipc call home-pref-test initialize "$initial_ids" >/dev/null
|
||||||
qs_for_harness ipc call home-pref-test alias light.kitchen ' Island ' >/dev/null
|
qs_for_harness ipc call home-pref-test alias light.kitchen ' Island ' >/dev/null
|
||||||
@@ -117,7 +112,7 @@ wait_for_file_content "$expected_file"
|
|||||||
|
|
||||||
qs_for_harness ipc call home-pref-test reset >/dev/null
|
qs_for_harness ipc call home-pref-test reset >/dev/null
|
||||||
wait_for_status "$reset_expected"
|
wait_for_status "$reset_expected"
|
||||||
wait_for_reset_file_content
|
wait_for_file_content "$reset_file"
|
||||||
|
|
||||||
stop_harness
|
stop_harness
|
||||||
start_harness
|
start_harness
|
||||||
|
|||||||
Reference in New Issue
Block a user