diff --git a/migrations/1780057136.sh b/migrations/user/1780057136.sh similarity index 100% rename from migrations/1780057136.sh rename to migrations/user/1780057136.sh diff --git a/migrations/1780294774.sh b/migrations/user/1780294774.sh similarity index 100% rename from migrations/1780294774.sh rename to migrations/user/1780294774.sh diff --git a/migrations/1780517689.sh b/migrations/user/1780517689.sh similarity index 100% rename from migrations/1780517689.sh rename to migrations/user/1780517689.sh diff --git a/test/cli b/test/cli index b9564111..6d945fde 100755 --- a/test/cli +++ b/test/cli @@ -338,6 +338,14 @@ HOME="$PI_TMPDIR" "$ROOT/bin/omarchy-theme-set-pi" --activate jq -e '.theme == "omarchy-system" and .model == "keep-me"' "$PI_TMPDIR/.pi/agent/settings.json" >/dev/null pass "pi theme activation preserves existing settings" +THEME_TMPDIR=$(mktemp -d) +OMARCHY_PATH="$ROOT" HOME="$THEME_TMPDIR" OMARCHY_THEME_HEADLESS=1 "$ROOT/bin/omarchy-theme-set" "Tokyo Night" +background_path=$(readlink -f "$THEME_TMPDIR/.config/omarchy/current/background" 2>/dev/null || true) +expected_background="$THEME_TMPDIR/.config/omarchy/current/theme/backgrounds/0-swirl-buck.jpg" +[[ $background_path == "$expected_background" ]] || fail "headless theme set creates current background symlink" +[[ -f $background_path ]] || fail "headless theme background target exists" +pass "headless theme set creates current background symlink" + cp "$NEXT_THEME/colors.toml" "$CURRENT_THEME/colors.toml" cp "$NEXT_THEME/vscode-theme.json" "$CURRENT_THEME/vscode-theme.json" @@ -375,7 +383,7 @@ echo "$*" >>"${GSETTINGS_LOG:-/dev/null}" EOF chmod +x "$FAKE_BIN/gsettings" -GSETTINGS_LOG="$PI_TMPDIR/gsettings.log" PATH="$FAKE_BIN:$ROOT/bin:$PATH" HOME="$PI_TMPDIR" "$ROOT/bin/omarchy-theme-set-gnome" +GSETTINGS_LOG="$PI_TMPDIR/gsettings.log" DBUS_SESSION_BUS_ADDRESS="unix:path=$PI_TMPDIR/bus" PATH="$FAKE_BIN:$ROOT/bin:$PATH" HOME="$PI_TMPDIR" "$ROOT/bin/omarchy-theme-set-gnome" grep -q 'org.gnome.desktop.interface color-scheme prefer-light' "$PI_TMPDIR/gsettings.log" || fail "gnome sync reads mode from colors.toml" pass "gnome sync reads mode from colors.toml" @@ -404,14 +412,6 @@ pass "vscode generated theme clears obsolete extension marker" jq -e '.[] | select(.identifier.id == "local.omarchy-theme" and .relativeLocation == "omarchy-theme")' "$PI_TMPDIR/.vscode/extensions/extensions.json" >/dev/null || fail "vscode generated theme registers local extension" pass "vscode generated theme registers local extension" -THEME_TMPDIR=$(mktemp -d) -OMARCHY_PATH="$ROOT" HOME="$THEME_TMPDIR" OMARCHY_THEME_HEADLESS=1 "$ROOT/bin/omarchy-theme-set" "Tokyo Night" -background_path=$(readlink -f "$THEME_TMPDIR/.config/omarchy/current/background" 2>/dev/null || true) -expected_background="$THEME_TMPDIR/.config/omarchy/current/theme/backgrounds/0-swirl-buck.jpg" -[[ $background_path == "$expected_background" ]] || fail "headless theme set creates current background symlink" -[[ -f $background_path ]] || fail "headless theme background target exists" -pass "headless theme set creates current background symlink" - for binary in \ omarchy-update \ omarchy-theme-set \ diff --git a/test/shell.d/config-test.sh b/test/shell.d/config-test.sh index 8caf2e0e..a5de3b2c 100755 --- a/test/shell.d/config-test.sh +++ b/test/shell.d/config-test.sh @@ -93,8 +93,15 @@ import sys from pathlib import Path root = Path(os.environ["ROOT"]) -pkgbuild = (root.parent / "omarchy-pkgs/pkgbuilds/omarchy-settings/PKGBUILD").read_text() -omarchy_pkgbuild = (root.parent / "omarchy-pkgs/pkgbuilds/omarchy/PKGBUILD").read_text() +pkgs_root = root.parent / "omarchy-pkgs/pkgbuilds" +settings_pkgbuild_path = pkgs_root / "omarchy-settings/PKGBUILD" +omarchy_pkgbuild_path = pkgs_root / "omarchy/PKGBUILD" +if not settings_pkgbuild_path.exists(): + settings_pkgbuild_path = pkgs_root / "omarchy-settings-dev/PKGBUILD" +if not omarchy_pkgbuild_path.exists(): + omarchy_pkgbuild_path = pkgs_root / "omarchy-dev/PKGBUILD" +pkgbuild = settings_pkgbuild_path.read_text() +omarchy_pkgbuild = omarchy_pkgbuild_path.read_text() errors = [] package_defaults = [ ("default/uwsm/env.d/10-omarchy", "/usr/share/uwsm/env.d/10-omarchy", "uwsm/env"), @@ -133,6 +140,137 @@ if errors: PY pass "package-owned defaults live outside config" +TMPDIR=$(mktemp -d) +mkdir -p "$TMPDIR/home/.config/omarchy" + +cat >"$TMPDIR/home/.config/omarchy/shell.json" <<'JSON' +{ + "version": 1, + "bar": { + "layout": { + "left": [{ "id": "omarchy.menu" }, { "id": "omarchy.workspaces" }], + "center": [{ "id": "omarchy.clock" }, { "id": "omarchy.weather" }], + "right": [{ "id": "omarchy.tray" }, { "id": "omarchy.bluetooth" }] + } + }, + "plugins": [] +} +JSON + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar add omarchy.tailscale +jq -e ' + def ids: map(.id // .); + .bar.layout.right | ids == ["omarchy.tray", "omarchy.tailscale", "omarchy.bluetooth"] +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config appends widgets to right by default" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar add local.left left +jq -e ' + def ids: map(.id // .); + .bar.layout.left | ids == ["omarchy.menu", "omarchy.workspaces", "local.left"] +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config appends left widgets after workspaces" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar add local.center center +jq -e ' + def ids: map(.id // .); + .bar.layout.center | ids == ["omarchy.clock", "omarchy.weather", "local.center"] +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config appends center widgets after weather" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar add local.first right +jq -e ' + def ids: map(.id // .); + .bar.layout.right | ids == ["omarchy.tray", "local.first", "omarchy.tailscale", "omarchy.bluetooth"] +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config moves existing widgets without duplicates" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar show | jq -e ' + def ids: map(.id // .); + (.layout.right | ids == ["omarchy.tray", "local.first", "omarchy.tailscale", "omarchy.bluetooth"]) and + has("version") | not +' >/dev/null +pass "shell config shows only bar json" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar list --json | jq -e ' + any(.[]; .id == "omarchy.system-stats" and .addable == true and .inBar == false) and + all(.[]; .id != "omarchy.tailscale") +' >/dev/null +pass "shell config lists addable bar widgets" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar list --json --all | jq -e ' + any(.[]; .id == "omarchy.tailscale" and .inBar == true and .addable == false) and + any(.[]; .id == "omarchy.indicators" and .addable == true) +' >/dev/null +pass "shell config list --all includes current widget status" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar position bottom +jq -e ' + .bar.position == "bottom" and + .plugins == [] +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config sets bar position" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar transparent true +jq -e ' + .bar.transparent == true and + .bar.position == "bottom" and + .plugins == [] +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config sets bar transparency" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar drop local.left +jq -e ' + def ids: map(.id // .); + (.bar.layout.left | ids == ["omarchy.menu", "omarchy.workspaces"]) and + (.bar.layout.center | ids == ["omarchy.clock", "omarchy.weather", "local.center"]) and + (.bar.layout.right | ids == ["omarchy.tray", "local.first", "omarchy.tailscale", "omarchy.bluetooth"]) +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config drops widgets from any section" + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" omarchy-config-shell-bar remove local.center +jq -e ' + def ids: map(.id // .); + .bar.layout.center | ids == ["omarchy.clock", "omarchy.weather"] +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "shell config removes widgets with remove alias" + mapfile -t migrations < <(find "$ROOT/migrations" -maxdepth 1 -type f -name '*.sh' -printf '%f\n' | sort) [[ ${#migrations[@]} -eq 0 ]] || fail "4.0 upgrade is not modeled as a migration" pass "4.0 upgrade is handled outside the migration runner" + +clock_migration=$(grep -rl 'Remove leading zero from bar clock date' "$ROOT/migrations/user" | head -n 1 || true) +[[ -n $clock_migration ]] || fail "clock date format user migration exists" + +cat >"$TMPDIR/home/.config/omarchy/shell.json" <<'JSON' +{ + "version": 1, + "bar": { + "layout": { + "left": [], + "center": [ + { "id": "omarchy.clock", "formatAlt": "dd MMMM 'W'ww yyyy" }, + { "id": "omarchy.weather" } + ], + "right": [ + { "id": "local.clock", "formatAlt": "dd MMMM 'W'ww yyyy" } + ] + } + }, + "plugins": [] +} +JSON + +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" bash "$clock_migration" + +jq -e ' + .bar.layout.center[0].formatAlt == "d MMMM \u0027W\u0027ww yyyy" and + .bar.layout.right[0].formatAlt == "dd MMMM \u0027W\u0027ww yyyy" +' "$TMPDIR/home/.config/omarchy/shell.json" >/dev/null +pass "clock date format migration removes leading zero from clock" + +before=$(sha256sum "$TMPDIR/home/.config/omarchy/shell.json" | awk '{print $1}') +HOME="$TMPDIR/home" OMARCHY_PATH="$ROOT" bash "$clock_migration" +after=$(sha256sum "$TMPDIR/home/.config/omarchy/shell.json" | awk '{print $1}') +[[ $before == "$after" ]] || fail "clock date format migration is idempotent" +pass "clock date format migration is idempotent"