Files
2026-10-10 10:37:53 +02:00

123 lines
4.8 KiB
Bash

#!/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 "+ <cmd>" 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'
}