mirror of
https://github.com/tw93/Mole.git
synced 2026-02-04 12:41:46 +00:00
240 lines
7.4 KiB
Bash
240 lines
7.4 KiB
Bash
#!/usr/bin/env bats
|
|
|
|
setup_file() {
|
|
PROJECT_ROOT="$(cd "${BATS_TEST_DIRNAME}/.." && pwd)"
|
|
export PROJECT_ROOT
|
|
|
|
ORIGINAL_HOME="${HOME:-}"
|
|
export ORIGINAL_HOME
|
|
|
|
HOME="$(mktemp -d "${BATS_TEST_DIRNAME}/tmp-installers-home.XXXXXX")"
|
|
export HOME
|
|
|
|
mkdir -p "$HOME"
|
|
}
|
|
|
|
teardown_file() {
|
|
rm -rf "$HOME"
|
|
if [[ -n "${ORIGINAL_HOME:-}" ]]; then
|
|
export HOME="$ORIGINAL_HOME"
|
|
fi
|
|
}
|
|
|
|
setup() {
|
|
export TERM="xterm-256color"
|
|
export MO_DEBUG=0
|
|
|
|
# Create standard scan directories
|
|
mkdir -p "$HOME/Downloads"
|
|
mkdir -p "$HOME/Desktop"
|
|
mkdir -p "$HOME/Documents"
|
|
mkdir -p "$HOME/Public"
|
|
mkdir -p "$HOME/Library/Downloads"
|
|
|
|
# Clear previous test files
|
|
rm -rf "${HOME:?}/Downloads"/*
|
|
rm -rf "${HOME:?}/Desktop"/*
|
|
rm -rf "${HOME:?}/Documents"/*
|
|
}
|
|
|
|
# Test arguments
|
|
|
|
@test "installer.sh rejects unknown options" {
|
|
run "$PROJECT_ROOT/bin/installer.sh" --unknown-option
|
|
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" == *"Unknown option"* ]]
|
|
}
|
|
|
|
# Test scan_installers_in_path function directly
|
|
|
|
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
# Tests using find (forced fallback by hiding fd)
|
|
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
@test "scan_installers_in_path (fallback find): finds .dmg files" {
|
|
touch "$HOME/Downloads/Chrome.dmg"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"Chrome.dmg"* ]]
|
|
}
|
|
|
|
@test "scan_installers_in_path (fallback find): finds multiple installer types" {
|
|
touch "$HOME/Downloads/App1.dmg"
|
|
touch "$HOME/Downloads/App2.pkg"
|
|
touch "$HOME/Downloads/App3.iso"
|
|
touch "$HOME/Downloads/App.mpkg"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"App1.dmg"* ]]
|
|
[[ "$output" == *"App2.pkg"* ]]
|
|
[[ "$output" == *"App3.iso"* ]]
|
|
[[ "$output" == *"App.mpkg"* ]]
|
|
}
|
|
|
|
@test "scan_installers_in_path (fallback find): respects max depth" {
|
|
mkdir -p "$HOME/Downloads/level1/level2/level3"
|
|
touch "$HOME/Downloads/shallow.dmg"
|
|
touch "$HOME/Downloads/level1/mid.dmg"
|
|
touch "$HOME/Downloads/level1/level2/deep.dmg"
|
|
touch "$HOME/Downloads/level1/level2/level3/too-deep.dmg"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
# Default max depth is 2
|
|
[[ "$output" == *"shallow.dmg"* ]]
|
|
[[ "$output" == *"mid.dmg"* ]]
|
|
[[ "$output" == *"deep.dmg"* ]]
|
|
[[ "$output" != *"too-deep.dmg"* ]]
|
|
}
|
|
|
|
@test "scan_installers_in_path (fallback find): honors MOLE_INSTALLER_SCAN_MAX_DEPTH" {
|
|
mkdir -p "$HOME/Downloads/level1"
|
|
touch "$HOME/Downloads/top.dmg"
|
|
touch "$HOME/Downloads/level1/nested.dmg"
|
|
|
|
run env PATH="/usr/bin:/bin" MOLE_INSTALLER_SCAN_MAX_DEPTH=1 bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"top.dmg"* ]]
|
|
[[ "$output" != *"nested.dmg"* ]]
|
|
}
|
|
|
|
@test "scan_installers_in_path (fallback find): handles non-existent directory" {
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/NonExistent"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ -z "$output" ]]
|
|
}
|
|
|
|
@test "scan_installers_in_path (fallback find): ignores non-installer files" {
|
|
touch "$HOME/Downloads/document.pdf"
|
|
touch "$HOME/Downloads/image.jpg"
|
|
touch "$HOME/Downloads/archive.tar.gz"
|
|
touch "$HOME/Downloads/Installer.dmg"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" != *"document.pdf"* ]]
|
|
[[ "$output" != *"image.jpg"* ]]
|
|
[[ "$output" != *"archive.tar.gz"* ]]
|
|
[[ "$output" == *"Installer.dmg"* ]]
|
|
}
|
|
|
|
@test "scan_all_installers: handles missing paths gracefully" {
|
|
# Don't create all scan directories, some may not exist
|
|
# Only create Downloads, delete others if they exist
|
|
rm -rf "$HOME/Desktop"
|
|
rm -rf "$HOME/Documents"
|
|
rm -rf "$HOME/Public"
|
|
rm -rf "$HOME/Public/Downloads"
|
|
rm -rf "$HOME/Library/Downloads"
|
|
mkdir -p "$HOME/Downloads"
|
|
|
|
# Add an installer to the one directory that exists
|
|
touch "$HOME/Downloads/test.dmg"
|
|
|
|
run bash -euo pipefail -c '
|
|
export MOLE_TEST_MODE=1
|
|
source "$1"
|
|
scan_all_installers
|
|
' bash "$PROJECT_ROOT/bin/installer.sh"
|
|
|
|
# Should succeed even with missing paths
|
|
[ "$status" -eq 0 ]
|
|
# Should still find the installer in the existing directory
|
|
[[ "$output" == *"test.dmg"* ]]
|
|
}
|
|
|
|
# Test edge cases
|
|
|
|
@test "scan_installers_in_path (fallback find): handles filenames with spaces" {
|
|
touch "$HOME/Downloads/My App Installer.dmg"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"My App Installer.dmg"* ]]
|
|
}
|
|
|
|
@test "scan_installers_in_path (fallback find): handles filenames with special characters" {
|
|
touch "$HOME/Downloads/App-v1.2.3_beta.pkg"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"App-v1.2.3_beta.pkg"* ]]
|
|
}
|
|
|
|
@test "scan_installers_in_path (fallback find): returns empty for directory with no installers" {
|
|
# Create some non-installer files
|
|
touch "$HOME/Downloads/document.pdf"
|
|
touch "$HOME/Downloads/image.png"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ -z "$output" ]]
|
|
}
|
|
|
|
# Symlink handling tests
|
|
|
|
@test "scan_installers_in_path (fallback find): skips symlinks to regular files" {
|
|
touch "$HOME/Downloads/real.dmg"
|
|
ln -s "$HOME/Downloads/real.dmg" "$HOME/Downloads/symlink.dmg"
|
|
ln -s /nonexistent "$HOME/Downloads/dangling.lnk"
|
|
|
|
run env PATH="/usr/bin:/bin" bash -euo pipefail -c "
|
|
export MOLE_TEST_MODE=1
|
|
source \"\$1\"
|
|
scan_installers_in_path \"\$2\"
|
|
" bash "$PROJECT_ROOT/bin/installer.sh" "$HOME/Downloads"
|
|
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"real.dmg"* ]]
|
|
[[ "$output" != *"symlink.dmg"* ]]
|
|
[[ "$output" != *"dangling.lnk"* ]]
|
|
}
|