#!/usr/bin/env bats # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026 Bryan Joshua Pedini # Backend detection (pacman > apt > dnf (else yum) > zypper), --backend override, labels, banner. # each @test runs in its own subshell: per-test exports are intended # shellcheck disable=SC2030,SC2031 load test_helper setup() { common_setup; } @test "pacman wins over apt, dnf and zypper" { use_fakes pacman apt dnf zypper rpm export SKEPTICAL_UPDATER_OS_RELEASE=$FAKE_DATA/os-release-arch run skup list --no-refresh assert_success assert_line --index 0 'Backend: pacman (Arch Linux)' log_has 'pacman -Qu' log_lacks '^(apt-get|dnf|zypper) ' } @test "apt wins over dnf and zypper" { use_fakes zypper dnf apt rpm run skup list --no-refresh assert_success assert_line --index 0 'Backend: apt (Debian GNU/Linux 12 (bookworm))' log_has 'apt-get -s --with-new-pkgs upgrade' } @test "dnf wins over zypper" { use_fakes zypper dnf rpm export SKEPTICAL_UPDATER_OS_RELEASE=$FAKE_DATA/os-release-alma9 run skup list --no-refresh assert_success assert_line --index 0 'Backend: dnf (AlmaLinux 9.8 (Olive Jaguar))' log_has 'dnf -q check-update --setopt=skip_if_unavailable=0' } @test "yum is used when dnf is missing" { use_fakes zypper yum rpm run skup list --no-refresh assert_success assert_line --index 0 'Backend: yum (Debian GNU/Linux 12 (bookworm))' log_has 'yum -q check-update --setopt=skip_if_unavailable=0' } @test "zypper comes last" { use_fakes zypper rpm export SKEPTICAL_UPDATER_OS_RELEASE=$FAKE_DATA/os-release-tumbleweed run skup list --no-refresh assert_success assert_line --index 0 'Backend: zypper (openSUSE Tumbleweed)' log_has 'zypper --non-interactive --no-refresh --xmlout dist-upgrade --dry-run' } @test "pman in PATH: label pman, the commands stay pacman" { use_fakes pman pacman export SKEPTICAL_UPDATER_OS_RELEASE=$FAKE_DATA/os-release-arch run skup list assert_success assert_line --index 0 'Backend: pman (Arch Linux)' log_matches '^pacman -Sy --dbpath /tmp/skeptical-updater-db\.[0-9]+\.[A-Za-z0-9]+ --logfile /dev/null$' log_matches '^pacman --dbpath /tmp/skeptical-updater-db\.[0-9]+\.[A-Za-z0-9]+ -Qu$' } @test "--backend overrides the detection" { use_fakes pacman apt run skup --backend=apt list --no-refresh assert_success assert_line --index 0 'Backend: apt (Debian GNU/Linux 12 (bookworm))' log_lacks '^pacman ' } @test "--backend=pman and --backend=yum are aliases of pacman and dnf" { use_fakes pacman apt dnf rpm run skup --backend=pman list --no-refresh assert_success assert_line --index 0 --partial 'Backend: pacman' run skup --backend=yum list --no-refresh assert_success assert_line --index 0 --partial 'Backend: dnf' } @test "the statefile backend column is the backend, not the label" { use_fakes pman pacman run skup trust su-dummy-c assert_success run cat "$STATE_FILE" assert_line --regexp "^pacman${T}su-dummy-c${T}user${T}${DATE_RE}\$" } @test "no supported package manager: exit 1" { use_fakes run skup list --no-refresh assert_failure 1 assert_output --partial 'no supported package manager found in PATH (pacman, apt-get, dnf/yum, zypper)' } @test "a forced backend whose tool is missing: exit 1" { use_fakes apt run skup --backend=zypper list --no-refresh assert_failure 1 assert_output --partial 'zypper backend: zypper not found in PATH' run skup --backend=pacman list --no-refresh assert_failure 1 assert_output --partial 'pacman backend: pacman not found in PATH' run skup --backend=dnf list --no-refresh assert_failure 1 assert_output --partial 'dnf backend: neither dnf nor yum found in PATH' } @test "the banner uses PRETTY_NAME, quoted or not" { printf "NAME=x\nPRETTY_NAME='Single Quoted 1.0'\n" >"$BATS_TEST_TMPDIR/osr" SKEPTICAL_UPDATER_OS_RELEASE=$BATS_TEST_TMPDIR/osr run skup list --no-refresh assert_line --index 0 'Backend: apt (Single Quoted 1.0)' printf 'PRETTY_NAME=Plain\n' >"$BATS_TEST_TMPDIR/osr" SKEPTICAL_UPDATER_OS_RELEASE=$BATS_TEST_TMPDIR/osr run skup list --no-refresh assert_line --index 0 'Backend: apt (Plain)' } @test "the banner without os-release shows just the backend" { SKEPTICAL_UPDATER_OS_RELEASE=$BATS_TEST_TMPDIR/missing run skup list --no-refresh assert_success assert_line --index 0 'Backend: apt' } @test "trusted needs no package manager at all" { use_fakes write_state "$HEADER" "apt${T}x${T}user${T}2026-10-09T09:40:12Z" run skup trusted assert_success assert_line "apt${T}x${T}user${T}2026-10-09T09:40:12Z" }