#!/usr/bin/env bats # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026 Bryan Joshua Pedini # --dry-run: mutating commands (upgrade, purge, hold/unhold, lock files, statefile writes) # are printed as "+ " instead of executed; read-only queries and (as root) the # metadata refresh still run. load test_helper setup() { common_setup; } APT_UPGRADE='apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold -o DPkg::Lock::Timeout=60 --with-new-pkgs upgrade' @test "apt: refresh runs, hold/upgrade/unhold are printed, nothing mutating is executed" { run skup --dry-run <<<$'2-\n' assert_success assert_line 'Refreshing package lists... done.' log_has 'apt-get update -qq -o APT::Update::Error-Mode=any' assert_line '+ apt-mark hold su-dummy-b' assert_line "+ $APT_UPGRADE" assert_line '+ apt-mark unhold su-dummy-b' assert_line 'Dry run: nothing was changed.' log_lacks '^apt-get -y' log_lacks '^apt-mark (un)?hold' run cat "$FAKE_DIR/holds" assert_output '' [[ ! -e $STATE ]] } @test "apt: a package the admin already held is not printed as held" { echo su-dummy-c >"$FAKE_DIR/holds" FAKE_APT_SIM=held run skup --dry-run --no-refresh <<<$'3-\n' assert_success refute_line --partial 'apt-mark hold' refute_line --partial 'apt-mark unhold' assert_line "+ $APT_UPGRADE" } @test "N+ prints the statefile changes and writes nothing; the rows still leave the list" { run skup --dry-run --no-refresh <<<$'1+\nl\nq' assert_success assert_line "+ mkdir -p -m 0755 $STATE" assert_line "+ $STATE_FILE add: apt su-dummy-a user" assert_line "+ $STATE_FILE add: apt su-dummy-b dep:su-dummy-a" assert_line '3 upgradable, 2 trusted (hidden, use --all to show), 1 to review:' [[ ! -e $STATE ]] } @test "Nx prints the purge commands and drops the row" { run skup --dry-run --no-refresh <<<$'3x\ny\nl\nq' assert_success assert_line '+ apt-get -y purge su-dummy-c' refute_output --partial 'autoremove' assert_line '2 upgradable, 0 trusted (hidden, use --all to show), 2 to review:' log_lacks '^apt-get -y' } @test "trust, untrust and refresh print their statefile changes and write nothing" { write_state "$HEADER" "apt${T}su-dummy-c${T}user${T}2026-01-01T00:00:00Z" before=$(cat "$STATE_FILE") run skup --dry-run trust su-dummy-a assert_success assert_line 'trusted su-dummy-a (+1 dependency: su-dummy-b)' assert_line "+ $STATE_FILE add: apt su-dummy-a user" assert_line "+ $STATE_FILE add: apt su-dummy-b dep:su-dummy-a" run skup --dry-run untrust su-dummy-c assert_success assert_line "+ $STATE_FILE remove: apt su-dummy-c user" write_state "$HEADER" "apt${T}su-dummy-w${T}user${T}2026-01-01T00:00:00Z" before=$(cat "$STATE_FILE") run skup --dry-run refresh assert_success assert_line "+ $STATE_FILE add: apt su-dummy-v dep:su-dummy-w" [[ $(cat "$STATE_FILE") == "$before" ]] } @test "pacman: -Su --ignore and -Rns are printed" { use_fakes pacman run skup --dry-run --no-refresh <<<$'3x\ny\n2-\n' assert_success assert_line '+ pacman -Rns --noconfirm -- su-dummy-c' assert_line '+ pacman -Su --noconfirm --ignore su-dummy-b' log_lacks '^pacman -(Su|Syu|Rns) ' } @test "dnf: upgrade --exclude and remove are printed" { use_fakes dnf rpm export FAKE_RPM_NO_D=1 run skup --dry-run --no-refresh <<<$'5x\ny\n4-\n' assert_success assert_line '+ dnf -y remove su-dummy-c' assert_line '+ dnf -y --setopt=skip_if_unavailable=0 --setopt=\*.metadata_expire=-1 upgrade --exclude=su-dummy-b' log_lacks '^dnf -y' } @test "zypper: the private-lock commands are printed, no lock file is written" { use_fakes zypper rpm export SKEPTICAL_UPDATER_OS_RELEASE=$FAKE_DATA/os-release-leap mkdir -p "$BATS_TEST_TMPDIR/etc" printf '[main]\nlocksfile.path = %s\n' "$BATS_TEST_TMPDIR/etc/locks" >"$BATS_TEST_TMPDIR/etc/zypp.conf" export ZYPP_CONF=$BATS_TEST_TMPDIR/etc/zypp.conf run skup --dry-run --no-refresh <<<$'2-\n' assert_success assert_line "+ # private $BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/zypp.conf: $BATS_TEST_TMPDIR/etc/zypp.conf with locksfile.path = $BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/locks (a copy of $BATS_TEST_TMPDIR/etc/locks)" assert_line "+ env ZYPP_CONF=$BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/zypp.conf zypper --non-interactive --quiet addlock su-dummy-b" assert_line "+ env ZYPP_CONF=$BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/zypp.conf zypper --non-interactive --no-refresh update" log_lacks 'addlock| update$' [[ ! -e $BATS_TEST_TMPDIR/etc/locks ]] run ls "$BATS_TEST_TMPDIR" refute_output --partial 'skeptical-updater.' } @test "as root the refresh really runs; as non-root it is printed" { run skup --dry-run list log_has 'apt-get update -qq -o APT::Update::Error-Mode=any' : >"$FAKE_LOG" SKEPTICAL_UPDATER_EUID=1000 run skup --dry-run list assert_success assert_line '+ apt-get update -qq -o APT::Update::Error-Mode=any' log_lacks '^apt-get update' }