🏡 index : quine-global-labs/mirror-rcaloras-bash-preexec.git

#!/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)" ]
}