From 5241b59ea9f09af8557673a423126456e5cdce0c Mon Sep 17 00:00:00 2001 From: tw93 Date: Wed, 25 Feb 2026 10:32:12 +0800 Subject: [PATCH] refactor: reuse sudo cache checks in clean dry-run tests --- bin/clean.sh | 11 ++++++-- tests/clean_core.bats | 66 +++++++++++++++++++++++++++---------------- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/bin/clean.sh b/bin/clean.sh index b5f16ea..914cb09 100755 --- a/bin/clean.sh +++ b/bin/clean.sh @@ -137,6 +137,11 @@ note_activity() { fi } +# shellcheck disable=SC2329 +has_cached_sudo() { + sudo -n true 2> /dev/null +} + CLEANUP_DONE=false # shellcheck disable=SC2329 cleanup() { @@ -733,7 +738,7 @@ start_cleanup() { EOF # Preview system section when sudo is already cached (no password prompt). - if sudo -n true 2> /dev/null; then + if has_cached_sudo; then SYSTEM_CLEAN=true echo -e "${GREEN}${ICON_SUCCESS}${NC} Admin access available, system preview included" echo "" @@ -746,7 +751,7 @@ EOF fi if [[ -t 0 ]]; then - if sudo -n true 2> /dev/null; then + if has_cached_sudo; then SYSTEM_CLEAN=true echo -e "${GREEN}${ICON_SUCCESS}${NC} Admin access already available" echo "" @@ -786,7 +791,7 @@ EOF else echo "" echo "Running in non-interactive mode" - if sudo -n true 2> /dev/null; then + if has_cached_sudo; then SYSTEM_CLEAN=true echo " ${ICON_LIST} System-level cleanup enabled, sudo session active" else diff --git a/tests/clean_core.bats b/tests/clean_core.bats index 0b78f6a..8da50b2 100644 --- a/tests/clean_core.bats +++ b/tests/clean_core.bats @@ -25,19 +25,13 @@ setup() { rm -rf "${HOME:?}"/* rm -rf "$HOME/Library" "$HOME/.config" mkdir -p "$HOME/Library/Caches" "$HOME/.config/mole" + unset TEST_MOCK_BIN } -@test "mo clean --dry-run skips system cleanup in non-interactive mode" { - run env HOME="$HOME" MOLE_TEST_MODE=1 "$PROJECT_ROOT/mole" clean --dry-run - [ "$status" -eq 0 ] - [[ "$output" == *"Dry Run Mode"* ]] - [[ "$output" != *"Deep system-level cleanup"* ]] -} - -@test "mo clean --dry-run includes system preview when sudo is cached" { - local mock_bin="$HOME/bin" - mkdir -p "$mock_bin" - cat > "$mock_bin/sudo" << 'MOCK' +set_mock_sudo_cached() { + TEST_MOCK_BIN="$HOME/bin" + mkdir -p "$TEST_MOCK_BIN" + cat > "$TEST_MOCK_BIN/sudo" << 'MOCK' #!/bin/bash # Shim: sudo -n true succeeds, all other sudo calls are no-ops. if [[ "$1" == "-n" && "$2" == "true" ]]; then exit 0; fi @@ -45,26 +39,49 @@ if [[ "$1" == "test" ]]; then exit 1; fi if [[ "$1" == "find" ]]; then exit 0; fi exit 0 MOCK - chmod +x "$mock_bin/sudo" + chmod +x "$TEST_MOCK_BIN/sudo" +} - run env HOME="$HOME" MOLE_TEST_MODE=1 PATH="$mock_bin:$PATH" \ +set_mock_sudo_uncached() { + TEST_MOCK_BIN="$HOME/bin" + mkdir -p "$TEST_MOCK_BIN" + cat > "$TEST_MOCK_BIN/sudo" << 'MOCK' +#!/bin/bash +# Shim: sudo -n always fails (no cached credentials). +exit 1 +MOCK + chmod +x "$TEST_MOCK_BIN/sudo" +} + +run_clean_dry_run() { + local test_path="$PATH" + if [[ -n "${TEST_MOCK_BIN:-}" ]]; then + test_path="$TEST_MOCK_BIN:$PATH" + fi + + run env HOME="$HOME" MOLE_TEST_MODE=1 PATH="$test_path" \ "$PROJECT_ROOT/mole" clean --dry-run +} + +@test "mo clean --dry-run skips system cleanup in non-interactive mode" { + set_mock_sudo_uncached + run_clean_dry_run + [ "$status" -eq 0 ] + [[ "$output" == *"Dry Run Mode"* ]] + [[ "$output" == *"sudo -v && mo clean --dry-run"* ]] + [[ "$output" != *"system preview included"* ]] +} + +@test "mo clean --dry-run includes system preview when sudo is cached" { + set_mock_sudo_cached + run_clean_dry_run [ "$status" -eq 0 ] [[ "$output" == *"system preview included"* ]] } @test "mo clean --dry-run shows hint when sudo is not cached" { - local mock_bin="$HOME/bin" - mkdir -p "$mock_bin" - cat > "$mock_bin/sudo" << 'MOCK' -#!/bin/bash -# Shim: sudo -n always fails (no cached credentials). -exit 1 -MOCK - chmod +x "$mock_bin/sudo" - - run env HOME="$HOME" MOLE_TEST_MODE=1 PATH="$mock_bin:$PATH" \ - "$PROJECT_ROOT/mole" clean --dry-run + set_mock_sudo_uncached + run_clean_dry_run [ "$status" -eq 0 ] [[ "$output" == *"sudo -v"* ]] [[ "$output" == *"full preview"* ]] @@ -300,4 +317,3 @@ EOF [[ "$output" == *"Time Machine backup in progress, skipping cleanup"* ]] } -