#!/usr/bin/env bats setup() { SCRIPT_DIR="$(cd "$BATS_TEST_DIRNAME/.." && pwd)" TMP_HOME="$(mktemp -d)" export HOME="$TMP_HOME" STUB_DIR="$TMP_HOME/stubs" mkdir -p "$STUB_DIR" export PATH="$STUB_DIR:$PATH" local bin for bin in swaybg wal qarma notify-send pkill kill; do cat > "$STUB_DIR/$bin" <> "$TMP_HOME/calls.log" exit 0 EOF chmod +x "$STUB_DIR/$bin" done source "$SCRIPT_DIR/wallp" } teardown() { rm -rf "$TMP_HOME" } @test "harness sanity" { [ "x" = "x" ] } @test "expand_tilde expands leading tilde" { run expand_tilde '~/pics/a.png' [ "$status" -eq 0 ] [ "$output" = "$HOME/pics/a.png" ] } @test "expand_tilde leaves absolute path untouched" { run expand_tilde '/abs/b.png' [ "$output" = "/abs/b.png" ] } @test "parse_conf reads keys and expands tilde in paths" { conf="$HOME/c.conf" printf '%s\n' \ '# comment' '' \ 'THEME=mytheme' \ 'OUTPUT_H=DP-1' \ 'OUTPUT_V=DP-3' \ 'DEFAULT_H=~/p/h.png' \ 'DEFAULT_V=/abs/v.png' > "$conf" parse_conf "$conf" [ "$CONF_THEME" = "mytheme" ] [ "$CONF_OUTPUT_H" = "DP-1" ] [ "$CONF_OUTPUT_V" = "DP-3" ] [ "$CONF_DEFAULT_H" = "$HOME/p/h.png" ] [ "$CONF_DEFAULT_V" = "/abs/v.png" ] } @test "load_conf bootstraps template when conf missing" { run load_conf [ "$status" -eq 10 ] [ -f "$HOME/.config/wallp/wallp.conf" ] [[ "$output" == *"fill it in"* ]] } @test "load_conf hard-errors on missing required key" { mkdir -p "$HOME/.config/wallp" printf '%s\n' 'OUTPUT_H=DP-1' 'OUTPUT_V=DP-3' 'DEFAULT_H=/a.png' \ > "$HOME/.config/wallp/wallp.conf" run load_conf [ "$status" -eq 1 ] [[ "$output" == *"DEFAULT_V"* ]] } @test "load_conf ok with THEME fallback" { mkdir -p "$HOME/.config/wallp" printf '%s\n' 'OUTPUT_H=DP-1' 'OUTPUT_V=DP-3' \ 'DEFAULT_H=/a.png' 'DEFAULT_V=/b.png' \ > "$HOME/.config/wallp/wallp.conf" load_conf [ "$?" -eq 0 ] [ "$CONF_THEME" = "sexy-splurge" ] } @test "resolve_theme flag wins over all" { CONF_THEME="conf"; mkdir -p "$HOME/.config/wallp" echo persisted > "$HOME/.config/wallp/theme" run resolve_theme flagged [ "$output" = "flagged" ] } @test "resolve_theme persisted beats conf" { CONF_THEME="conf"; mkdir -p "$HOME/.config/wallp" echo persisted > "$HOME/.config/wallp/theme" run resolve_theme '' [ "$output" = "persisted" ] } @test "resolve_theme uses conf when no persisted" { CONF_THEME="conf" run resolve_theme '' [ "$output" = "conf" ] } @test "persist_theme writes the file" { persist_theme "abc" [ "$(cat "$HOME/.config/wallp/theme")" = "abc" ] } @test "output_for maps logical to physical" { CONF_OUTPUT_H="DP-1"; CONF_OUTPUT_V="DP-3" run output_for H [ "$output" = "DP-1" ] run output_for V [ "$output" = "DP-3" ] } @test "wall_file_for returns config paths" { run wall_file_for H [ "$output" = "$HOME/.config/wallp/wall_h" ] run wall_file_for V [ "$output" = "$HOME/.config/wallp/wall_v" ] } @test "pid_file_for returns cache paths" { run pid_file_for H [ "$output" = "$HOME/.cache/wallp/H.pid" ] run pid_file_for V [ "$output" = "$HOME/.cache/wallp/V.pid" ] } @test "parse_set_args captures both" { SET_H="" SET_V="" parse_set_args "H=/a.png" "V=/b.png" [ "$SET_H" = "/a.png" ] [ "$SET_V" = "/b.png" ] } @test "parse_set_args partial leaves other empty" { SET_H="" SET_V="" parse_set_args "V=/only.png" [ "$SET_H" = "" ] [ "$SET_V" = "/only.png" ] } @test "parse_set_args expands tilde" { SET_H="" SET_V="" parse_set_args "H=~/x.png" [ "$SET_H" = "$HOME/x.png" ] } @test "parse_set_args rejects unknown token" { SET_H="" SET_V="" run parse_set_args "Z=/bad.png" [ "$status" -eq 1 ] [[ "$output" == *"Z="* ]] } @test "apply_output skips missing file without writing pid" { CONF_OUTPUT_H="DP-1" run apply_output H "$HOME/nope.png" [ "$status" -eq 1 ] [ ! -e "$HOME/.cache/wallp/H.pid" ] } @test "apply_output sets swaybg and persists path" { CONF_OUTPUT_H="DP-1" : > "$HOME/real.png" apply_output H "$HOME/real.png" [ "$?" -eq 0 ] [ "$(cat "$HOME/.config/wallp/wall_h")" = "$HOME/real.png" ] [ -f "$HOME/.cache/wallp/H.pid" ] grep -q "swaybg -o DP-1 -i $HOME/real.png" "$HOME/calls.log" } @test "apply_output on V does not touch H pid" { CONF_OUTPUT_H="DP-1"; CONF_OUTPUT_V="DP-3" mkdir -p "$HOME/.cache/wallp"; echo 99999 > "$HOME/.cache/wallp/H.pid" : > "$HOME/v.png" apply_output V "$HOME/v.png" [ "$(cat "$HOME/.cache/wallp/H.pid")" = "99999" ] } @test "update_wpaper symlinks to H image" { : > "$HOME/h.png"; mkdir -p "$HOME/.config/wallp" echo "$HOME/h.png" > "$HOME/.config/wallp/wall_h" update_wpaper [ "$(readlink "$HOME/.cache/wal/wpaper")" = "$HOME/h.png" ] } @test "apply_theme runs wal and persists theme" { apply_theme "mytheme" [ "$(cat "$HOME/.config/wallp/theme")" = "mytheme" ] grep -q "wal --backend colorz -nq --theme mytheme -o $HOME/bin/wal.sh" "$HOME/calls.log" grep -q "notify-send" "$HOME/calls.log" } @test "restore uses persisted wallpapers" { CONF_OUTPUT_H="DP-1"; CONF_OUTPUT_V="DP-3"; CONF_THEME="conf" CONF_DEFAULT_H="$HOME/dh.png"; CONF_DEFAULT_V="$HOME/dv.png" : > "$HOME/saved_h.png"; : > "$HOME/saved_v.png" mkdir -p "$HOME/.config/wallp" echo "$HOME/saved_h.png" > "$HOME/.config/wallp/wall_h" echo "$HOME/saved_v.png" > "$HOME/.config/wallp/wall_v" do_restore "" grep -q "swaybg -o DP-1 -i $HOME/saved_h.png" "$HOME/calls.log" grep -q "swaybg -o DP-3 -i $HOME/saved_v.png" "$HOME/calls.log" } @test "restore falls back to conf defaults" { CONF_OUTPUT_H="DP-1"; CONF_OUTPUT_V="DP-3"; CONF_THEME="conf" : > "$HOME/dh.png"; : > "$HOME/dv.png" CONF_DEFAULT_H="$HOME/dh.png"; CONF_DEFAULT_V="$HOME/dv.png" do_restore "" grep -q "swaybg -o DP-1 -i $HOME/dh.png" "$HOME/calls.log" [ "$(cat "$HOME/.config/wallp/wall_h")" = "$HOME/dh.png" ] } @test "set CLI partial sets only V" { CONF_OUTPUT_H="DP-1"; CONF_OUTPUT_V="DP-3"; CONF_THEME="conf" : > "$HOME/v.png" do_set "" "V=$HOME/v.png" grep -q "swaybg -o DP-3 -i $HOME/v.png" "$HOME/calls.log" ! grep -q "swaybg -o DP-1" "$HOME/calls.log" } @test "set CLI persists flag theme" { CONF_OUTPUT_H="DP-1"; CONF_OUTPUT_V="DP-3"; CONF_THEME="conf" : > "$HOME/h.png" do_set "flagtheme" "H=$HOME/h.png" [ "$(cat "$HOME/.config/wallp/theme")" = "flagtheme" ] } @test "set with no args and no display errors" { CONF_OUTPUT_H="DP-1"; CONF_OUTPUT_V="DP-3"; CONF_THEME="conf" unset WAYLAND_DISPLAY run do_set "" [ "$status" -eq 1 ] [[ "$output" == *"no display"* ]] } @test "bare invocation shows help" { unset WAYLAND_DISPLAY run main [ "$status" -eq 0 ] [[ "$output" == *"Usage"* ]] } @test "unknown flag errors with help" { unset WAYLAND_DISPLAY run main --bogus [ "$status" -eq 1 ] [[ "$output" == *"Usage"* ]] } @test "bootstrap on missing conf exits zero without setting wallpaper" { unset WAYLAND_DISPLAY run main --restore [ "$status" -eq 0 ] [ ! -e "$HOME/.cache/wallp/H.pid" ] } @test "theme flag honored through main with restore" { unset WAYLAND_DISPLAY mkdir -p "$HOME/.config/wallp" printf '%s\n' 'OUTPUT_H=DP-1' 'OUTPUT_V=DP-3' \ 'DEFAULT_H=/dh.png' 'DEFAULT_V=/dv.png' > "$HOME/.config/wallp/wallp.conf" main --restore --theme tflag [ "$(cat "$HOME/.config/wallp/theme")" = "tflag" ] }