#!/bin/bash # Selbst-Test für ollama-update: Versionsvergleich und Update-Entscheidung. # Benötigt keine Netzverbindung und installiert nichts (curl/ollama werden gefälscht). set -euo pipefail cd "$(dirname "$0")" fails=0 check() { # check if [[ "$2" == "$3" ]]; then printf 'ok: %s\n' "$1" else printf 'FEHLER: %s — erwartet %q, bekommen %q\n' "$1" "$2" "$3" >&2 fails=$((fails + 1)) fi } # --- cmp_versions --- source ./ollama-update check "gleich" "0" "$(cmp_versions 0.5.7 0.5.7)" check "neuer" "1" "$(cmp_versions 0.5.8 0.5.7)" check "aelter" "-1" "$(cmp_versions 0.5.7 0.5.8)" check "fehlende Stelle = 0" "0" "$(cmp_versions 0.5 0.5.0)" check "zweistellig" "1" "$(cmp_versions 0.10.0 0.9.9)" check "stable ueber rc" "1" "$(cmp_versions 0.5.7 0.5.7-rc1)" check "rc unter stable" "-1" "$(cmp_versions 0.5.7-rc1 0.5.7)" check "rc2 ueber rc1" "1" "$(cmp_versions 0.5.7-rc2 0.5.7-rc1)" check "rc10 ueber rc2" "1" "$(cmp_versions 0.5.7-rc10 0.5.7-rc2)" check "v-Praefix ignoriert" "0" "$(cmp_versions v0.5.7 0.5.7)" # --- Entscheidungs-Matrix mit gefälschten curl/ollama --- # GitHub liefert stable=v0.5.7 und beta=v0.6.0-rc1; install.sh ist ein Stub. tmpbin=$(mktemp -d) trap 'rm -rf "$tmpbin"' EXIT cat > "$tmpbin/curl" <<'EOF' #!/bin/bash url=""; out="" while [[ $# -gt 0 ]]; do case "$1" in -o) out=$2; shift 2 ;; -*) shift ;; *) url=$1; shift ;; esac done if [[ "$url" == *install.sh ]]; then printf '#!/bin/bash\nexit 0\n' > "$out" elif [[ "$url" == *releases/latest ]]; then printf '{\n "tag_name": "v0.5.7"\n}\n' else printf '[\n {\n "tag_name": "v0.6.0-rc1"\n }\n]\n' fi EOF cat > "$tmpbin/ollama" <<'EOF' #!/bin/bash if [[ "${FAKE_LOCAL_VERSION:-}" == "none" ]]; then exit 1 fi printf 'ollama version is %s\n' "${FAKE_LOCAL_VERSION:-0.5.7}" EOF chmod +x "$tmpbin/curl" "$tmpbin/ollama" expect() { # expect [Argumente...] local desc=$1 pattern=$2 ver=$3 shift 3 local out out=$(PATH="$tmpbin:$PATH" FAKE_LOCAL_VERSION="$ver" ./ollama-update "$@" 2>&1 || true) if grep -qF -- "$pattern" <<< "$out"; then printf 'ok: %s\n' "$desc" else printf 'FEHLER: %s — erwartet %q, bekommen:\n%s\n' "$desc" "$pattern" "$out" >&2 fails=$((fails + 1)) fi } expect "aktuell: kein Update" "Kein Update erforderlich." 0.5.7 expect "stable-Update" "Update verfuegbar: 0.5.6 -> 0.5.7" 0.5.6 expect "beta-Update" "Beta-Update verfuegbar: 0.5.7 -> 0.6.0-rc1" 0.5.7 --beta expect "downgrade ohne --force blockiert" "Kein Update erforderlich." 0.9.9 expect "downgrade mit --force" "Downgrade wird erzwungen: 0.9.9 -> 0.5.7" 0.9.9 --force expect "beta-downgrade mit --force" "Downgrade wird erzwungen: 0.9.9 -> 0.6.0-rc1" 0.9.9 --beta --force expect "nicht installiert: stable" "Installation der Stable 0.5.7" none expect "nicht installiert: beta" "Installation der Beta 0.6.0-rc1" none --beta if [[ "$fails" -gt 0 ]]; then printf '%d Test(s) fehlgeschlagen\n' "$fails" >&2 exit 1 fi printf 'Alle Tests bestanden.\n'