mirror-rcaloras-bash-preexec/test/release-script.bats
Ryan Caloras 3281b825cb Add release automation script
Add script/release to update the version, run tests, create and push
the release commit and tag, and draft GitHub release notes.

Usage:
  script/release --dry-run 0.7.0
  script/release 0.7.0
  script/release 0.7.0 "Teal Otter"
2026-08-22 22:46:31 -04:00

69 lines
2.2 KiB
Bash

#!/usr/bin/env bats
setup() {
release_script="$BATS_TEST_DIRNAME/../script/release"
}
make_release_repo() {
release_repo="$BATS_TEST_TMPDIR/release-repo"
release_origin="$BATS_TEST_TMPDIR/release-origin.git"
fake_bin="$BATS_TEST_TMPDIR/bin"
mkdir -p "$release_repo/script" "$fake_bin"
cp "$release_script" "$release_repo/script/release"
printf '%s\n' '# V0.6.0' > "$release_repo/bash-preexec.sh"
git init -q "$release_repo"
git -C "$release_repo" symbolic-ref HEAD refs/heads/master
git -C "$release_repo" config user.name 'Release Test'
git -C "$release_repo" config user.email 'release-test@example.com'
git -C "$release_repo" add bash-preexec.sh script/release
git -C "$release_repo" commit -qm 'Initial commit'
git init -q --bare "$release_origin"
git -C "$release_repo" remote add origin "$release_origin"
git -C "$release_repo" push -qu origin master
printf '%s\n' \
'#!/bin/sh' \
'if [ "$1" = release ] && [ "$2" = view ]; then exit 1; fi' \
'if [ "$1" = release ] && [ "$2" = list ]; then printf "%s\\n" "Black Toad"; exit 0; fi' \
'exit 2' > "$fake_bin/gh"
printf '%s\n' '#!/bin/sh' 'exit 0' > "$fake_bin/bats"
chmod +x "$fake_bin/gh" "$fake_bin/bats"
}
@test "release script has valid Bash syntax" {
run bash -n "$release_script"
[ "$status" -eq 0 ]
}
@test "release script documents its command-line interface" {
run "$release_script" --help
[ "$status" -eq 0 ]
[[ "$output" == *'Usage: script/release'* ]]
[[ "$output" == *'--dry-run'* ]]
}
@test "release script rejects an invalid version" {
run "$release_script" not-a-version
[ "$status" -eq 1 ]
[[ "$output" == *'version must look like'* ]]
}
@test "release dry run validates a unique title without changing the repository" {
make_release_repo
cd "$release_repo"
run env PATH="$fake_bin:$PATH" script/release --dry-run 0.7.0 "Teal Otter"
[ "$status" -eq 0 ]
[[ "$output" == *'Version: 0.6.0 -> 0.7.0'* ]]
[[ "$output" == *'Title: Teal Otter'* ]]
[[ "$output" == *'Dry run complete'* ]]
[ "$(sed -n 's/^# V//p' bash-preexec.sh)" = '0.6.0' ]
[ -z "$(git status --porcelain)" ]
}