Files
Logseq-Installer/test/logseq-installer.bats
T
2026-07-06 21:51:48 +02:00

361 lines
11 KiB
Bash

#!/usr/bin/env bats
# Test-Suite für logseq-install.sh
# Verwendet Mocks für wget, pgrep, find, update-desktop-database
# =============================================================================
# VERSIONS-KONSTANTEN (nur hier ändern, Tests passen sich automatisch an)
# =============================================================================
# Version, die als "neueste" von GitHub gemeldet wird
VERSION_LATEST="0.10.15"
# Version, die als bereits installiert simuliert wird (älter als LATEST)
VERSION_INSTALLED="0.10.14"
# Noch ältere Version für Cleanup-Tests (mehrere alte Versionen)
VERSION_OUTDATED="0.10.13"
# =============================================================================
# TEST-SETUP / TEARDOWN
# =============================================================================
setup() {
# Pfade relativ zur Testdatei ableiten (funktioniert unabhängig vom Ablageort)
# BATS_TEST_DIRNAME zeigt immer auf das Verzeichnis der .bats-Datei.
export MOCKS_DIR="${BATS_TEST_DIRNAME}/mocks"
export FIXTURES_DIR="${BATS_TEST_DIRNAME}/fixtures"
export SCRIPT_PATH="${BATS_TEST_DIRNAME}/../logseq-install.sh"
# Test-Verzeichnis
export TEST_DIR="$(mktemp -d)"
export HOME="${TEST_DIR}/home"
export INSTALL_DIR="${HOME}/.local/bin"
export DESKTOP_DIR="${HOME}/.local/share/applications"
# Mock-PATH vorbereiten (Mocks vor echten Befehlen)
export PATH="${MOCKS_DIR}:${PATH}"
# Home-Verzeichnis erstellen
mkdir -p "${HOME}" "${INSTALL_DIR}" "${DESKTOP_DIR}"
# Dummy-AppImages für alle benötigten Versionen on-the-fly erstellen
create_dummy_appimage "${VERSION_LATEST}"
create_dummy_appimage "${VERSION_INSTALLED}"
create_dummy_appimage "${VERSION_OUTDATED}"
# Mock-States zurücksetzen
reset_mocks
}
teardown() {
rm -rf "${TEST_DIR}"
}
# =============================================================================
# HELPER-FUNKTIONEN
# =============================================================================
# Erzeugt ein Dummy-AppImage für eine bestimmte Version (falls nicht vorhanden)
create_dummy_appimage() {
local version="$1"
local file="${FIXTURES_DIR}/Logseq-linux-x64-${version}.AppImage"
if [[ ! -f "${file}" ]]; then
{
echo "#!/bin/bash"
echo "echo \"Logseq ${version} dummy\""
} > "${file}"
chmod +x "${file}"
fi
}
# Mock-States auf Default zurücksetzen
reset_mocks() {
set_wget_latest_version "${VERSION_LATEST}"
set_wget_download_success "true"
set_pgrep_running 0
set_find_installed_version ""
}
# Mock-State für wget: neueste Version setzen
set_wget_latest_version() {
local version="$1"
create_dummy_appimage "${version}"
cat > "${FIXTURES_DIR}/wget_state" <<EOF
WGET_LATEST_VERSION="${version}"
WGET_DOWNLOAD_SUCCESS="${WGET_DOWNLOAD_SUCCESS:-true}"
WGET_DOWNLOAD_FILE="Logseq-linux-x64-${version}.AppImage"
EOF
}
# Mock-State für wget: Download-Erfolg steuern
set_wget_download_success() {
WGET_DOWNLOAD_SUCCESS="$1"
# State-Datei neu schreiben mit aktuellem Erfolgswert
cat > "${FIXTURES_DIR}/wget_state" <<EOF
WGET_LATEST_VERSION="${VERSION_LATEST}"
WGET_DOWNLOAD_SUCCESS="${1}"
WGET_DOWNLOAD_FILE="Logseq-linux-x64-${VERSION_LATEST}.AppImage"
EOF
}
# Mock-State für pgrep: Prozess läuft (1) oder nicht (0)
set_pgrep_running() {
cat > "${FIXTURES_DIR}/pgrep_state" <<EOF
PGREP_MATCH_COUNT=${1}
EOF
}
# Mock-State für find: installierte Version setzen
set_find_installed_version() {
cat > "${FIXTURES_DIR}/find_state" <<EOF
FIND_INSTALLED_VERSION="${1}"
FIND_FILES_RAW=""
EOF
}
# Mock-State für find: mehrere Dateien setzen (pipe-getrennt)
set_find_files() {
cat > "${FIXTURES_DIR}/find_state" <<EOF
FIND_INSTALLED_VERSION=""
FIND_FILES_RAW="${1}"
EOF
}
# Erzeugt eine echte Dummy-AppImage-Datei im Installationsverzeichnis
create_installed_appimage() {
local version="$1"
local file="${INSTALL_DIR}/Logseq-linux-x64-${version}.AppImage"
touch "${file}"
chmod +x "${file}"
}
# Das Skript mit Test-Umgebung ausführen
run_installer() {
HOME="${HOME}" \
PATH="${PATH}" \
"${SCRIPT_PATH}" "$@"
}
# =============================================================================
# TESTS: Hilfsfunktionen / Argument-Parsing
# =============================================================================
@test "show_help zeigt Hilfe an und exited mit Code 1" {
run run_installer -h
[ "$status" -eq 1 ]
[[ "$output" == *"Logseq Installer"* ]]
[[ "$output" == *"--hilfe"* ]]
[[ "$output" == *"--entfernen"* ]]
[[ "$output" == *"--root"* ]]
}
@test "show_help mit langem Parameter --hilfe" {
run run_installer --hilfe
[ "$status" -eq 1 ]
[[ "$output" == *"Logseq Installer"* ]]
}
@test "unbekannte kurze Option gibt Fehler" {
run run_installer -x
[ "$status" -eq 1 ]
[[ "$output" == *"Unbekannte Option"* ]]
}
@test "unbekannte lange Option gibt Fehler" {
run run_installer --unknown
[ "$status" -eq 1 ]
[[ "$output" == *"Unbekannte Option"* ]]
}
@test "root-Option ohne Root-Rechte wird akzeptiert" {
run run_installer -r --hilfe
[ "$status" -eq 1 ] # Hilfe wird angezeigt
[[ "$output" == *"Logseq Installer"* ]]
}
# =============================================================================
# TESTS: Deinstallation
# =============================================================================
@test "uninstall entfernt Dateien und exited mit 0" {
create_installed_appimage "${VERSION_INSTALLED}"
touch "${INSTALL_DIR}/Logseq"
touch "${DESKTOP_DIR}/logseq.desktop"
touch "${DESKTOP_DIR}/logseq.png"
run run_installer --entfernen
[ "$status" -eq 0 ]
[[ "$output" == *"deinstalliert"* ]]
[ ! -f "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_INSTALLED}.AppImage" ]
[ ! -f "${INSTALL_DIR}/Logseq" ]
[ ! -f "${DESKTOP_DIR}/logseq.desktop" ]
[ ! -f "${DESKTOP_DIR}/logseq.png" ]
}
# =============================================================================
# TESTS: Version-Erkennung
# =============================================================================
@test "get_latest_version ermittelt Version aus GitHub" {
run run_installer --hilfe
[ "$status" -eq 1 ]
}
@test "get_current_version erkennt installierte Version" {
set_find_installed_version "${VERSION_INSTALLED}"
run run_installer --hilfe
[ "$status" -eq 1 ]
}
@test "get_current_version erkennt keine Installation" {
set_find_installed_version ""
run run_installer --hilfe
[ "$status" -eq 1 ]
}
# =============================================================================
# TESTS: Hauptablauf (Integration)
# =============================================================================
@test "Installation: neueste Version wird heruntergeladen und installiert" {
set_wget_latest_version "${VERSION_LATEST}"
set_find_installed_version ""
set_pgrep_running 0
run run_installer
[ "$status" -eq 0 ]
[[ "$output" == *"erfolgreich"* ]]
[ -f "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_LATEST}.AppImage" ]
[ -L "${INSTALL_DIR}/Logseq" ]
[ "$(readlink "${INSTALL_DIR}/Logseq")" = "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_LATEST}.AppImage" ]
[ -f "${DESKTOP_DIR}/logseq.desktop" ]
}
@test "Update: alte Version wird durch neue ersetzt" {
set_find_installed_version "${VERSION_INSTALLED}"
set_wget_latest_version "${VERSION_LATEST}"
set_pgrep_running 0
create_installed_appimage "${VERSION_INSTALLED}"
run run_installer
[ "$status" -eq 0 ]
[ -f "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_LATEST}.AppImage" ]
[ ! -f "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_INSTALLED}.AppImage" ]
[ "$(readlink "${INSTALL_DIR}/Logseq")" = "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_LATEST}.AppImage" ]
}
@test "Kein Update: bereits aktuelle Version beendet mit Code 0" {
set_find_installed_version "${VERSION_LATEST}"
set_wget_latest_version "${VERSION_LATEST}"
run run_installer
[ "$status" -eq 0 ]
[[ "$output" == *"bereits auf dem neuesten Stand"* ]]
}
@test "Abbruch: Logseq läuft noch" {
set_pgrep_running 1
set_find_installed_version "${VERSION_INSTALLED}"
set_wget_latest_version "${VERSION_LATEST}"
run run_installer
[ "$status" -eq 1 ]
[[ "$output" == *"läuft noch"* ]] || [[ "$output" == *"beendet werden"* ]]
}
@test "Fehler: Download fehlschlägt" {
set_wget_download_success "false"
set_find_installed_version ""
set_pgrep_running 0
run run_installer
[ "$status" -eq 1 ]
[[ "$output" == *"Download fehlgeschlagen"* ]] || [[ "$output" == *"Fehler"* ]]
}
# =============================================================================
# TESTS: Desktop-Datei Erstellung
# =============================================================================
@test "Desktop-Datei wird korrekt erstellt" {
set_wget_latest_version "${VERSION_LATEST}"
set_find_installed_version ""
set_pgrep_running 0
run run_installer
[ "$status" -eq 0 ]
desktop_file="${DESKTOP_DIR}/logseq.desktop"
[ -f "${desktop_file}" ]
grep -q "Name=Logseq" "${desktop_file}"
grep -q "Exec=${HOME}/.local/bin/Logseq-linux-x64-${VERSION_LATEST}.AppImage --no-sandbox" "${desktop_file}"
grep -q "Icon=${DESKTOP_DIR}/logseq.png" "${desktop_file}"
grep -q "Categories=Office;" "${desktop_file}"
}
@test "Icon wird heruntergeladen wenn nicht vorhanden" {
set_wget_latest_version "${VERSION_LATEST}"
set_find_installed_version ""
set_pgrep_running 0
[ ! -f "${DESKTOP_DIR}/logseq.png" ]
run run_installer
[ "$status" -eq 0 ]
[ -f "${DESKTOP_DIR}/logseq.png" ]
}
# =============================================================================
# TESTS: Root-Prüfung
# =============================================================================
@test "Root-Check: als root ohne -r Option schlägt fehl" {
run grep -q "whoami.*root" "${SCRIPT_PATH}"
[ "$status" -eq 0 ]
}
# =============================================================================
# TESTS: Cleanup alter Versionen
# =============================================================================
@test "Cleanup: mehrere alte Versionen werden entfernt" {
set_find_files "Logseq-linux-x64-${VERSION_OUTDATED}.AppImage|Logseq-linux-x64-${VERSION_INSTALLED}.AppImage"
set_wget_latest_version "${VERSION_LATEST}"
set_pgrep_running 0
create_installed_appimage "${VERSION_OUTDATED}"
create_installed_appimage "${VERSION_INSTALLED}"
run run_installer
[ "$status" -eq 0 ]
[ -f "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_LATEST}.AppImage" ]
[ ! -f "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_OUTDATED}.AppImage" ]
[ ! -f "${INSTALL_DIR}/Logseq-linux-x64-${VERSION_INSTALLED}.AppImage" ]
}
# =============================================================================
# TESTS: Farb-Codes und Output
# =============================================================================
@test "Farbcodes werden gesetzt (tput)" {
run grep -q "tput setaf" "${SCRIPT_PATH}"
[ "$status" -eq 0 ]
}
# =============================================================================
# TESTS: Error-Handling
# =============================================================================
@test "Fehlerbehandlung: Trap für ERR gesetzt" {
run grep -q "trap.*handle_error.*ERR" "${SCRIPT_PATH}"
[ "$status" -eq 0 ]
}
@test "require_command prüft Abhängigkeiten" {
run grep -q "require_command" "${SCRIPT_PATH}"
[ "$status" -eq 0 ]
}