Skip to content

Commit 63f7c1b

Browse files
committed
test: add bats coverage for all bin scripts
1 parent 8bbab5a commit 63f7c1b

10 files changed

Lines changed: 370 additions & 0 deletions

.github/workflows/test.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: Tests and Checks
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
types:
8+
- opened
9+
- synchronize
10+
- reopened
11+
- ready_for_review
12+
13+
jobs:
14+
test:
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: Checkouting code...
18+
uses: actions/checkout@v6
19+
20+
- name: Setup BATS
21+
uses: mig4/setup-bats@v1
22+
with:
23+
bats-version: 1.8.2
24+
25+
- name: Test
26+
run: bats tests

tests/01-setup.bats

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
export RUNNER_TEMP="$TEST_TMP_DIR/runner-temp"
8+
export GITHUB_SHA="abcd1234"
9+
export GITHUB_RUN_ID="99"
10+
export GITHUB_RUN_ATTEMPT="3"
11+
export GITHUB_ACTION_PATH="$BATS_TEST_DIRNAME/.."
12+
export GITHUB_ENV="$TEST_TMP_DIR/github.env"
13+
mkdir -p "$RUNNER_TEMP"
14+
: > "$GITHUB_ENV"
15+
}
16+
17+
teardown() {
18+
teardown_test_tmp_dir
19+
}
20+
21+
@test "setup exports variables and selects engine php version" {
22+
run bash "$BATS_TEST_DIRNAME/../bin/setup.sh" "clean/phpdoc-md"
23+
[ "$status" -eq 0 ]
24+
25+
run grep -F "NEEDED_PHP_VERSION=8.1" "$GITHUB_ENV"
26+
[ "$status" -eq 0 ]
27+
28+
NEW_WIKI_PATH=$(grep '^NEW_WIKI_CHECKOUT_PATH=' "$GITHUB_ENV" | cut -d'=' -f2-)
29+
[ -d "$NEW_WIKI_PATH" ]
30+
}
31+
32+
@test "setup fails on unknown engine" {
33+
run bash "$BATS_TEST_DIRNAME/../bin/setup.sh" "unknown/engine"
34+
[ "$status" -eq 1 ]
35+
[[ "$output" == *"ERROR: unknown engine"* ]]
36+
}

tests/02-rename-index.bats

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
export NEW_WIKI_CHECKOUT_PATH="$TEST_TMP_DIR/new-wiki"
8+
mkdir -p "$NEW_WIKI_CHECKOUT_PATH"
9+
}
10+
11+
teardown() {
12+
teardown_test_tmp_dir
13+
}
14+
15+
@test "rename_index renames README.md for clean engine" {
16+
touch "$NEW_WIKI_CHECKOUT_PATH/README.md"
17+
18+
run bash "$BATS_TEST_DIRNAME/../bin/rename_index.sh" "clean/phpdoc-md"
19+
[ "$status" -eq 0 ]
20+
[ -f "$NEW_WIKI_CHECKOUT_PATH/Home.md" ]
21+
[ ! -f "$NEW_WIKI_CHECKOUT_PATH/README.md" ]
22+
}
23+
24+
@test "rename_index renames ApiIndex.md for evert engine" {
25+
touch "$NEW_WIKI_CHECKOUT_PATH/ApiIndex.md"
26+
27+
run bash "$BATS_TEST_DIRNAME/../bin/rename_index.sh" "evert/phpdoc-md"
28+
[ "$status" -eq 0 ]
29+
[ -f "$NEW_WIKI_CHECKOUT_PATH/Home.md" ]
30+
[ ! -f "$NEW_WIKI_CHECKOUT_PATH/ApiIndex.md" ]
31+
}

tests/03-get-mapped-branch.bats

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
setup_fake_bin_path
8+
9+
export TMP_BRANCH_MAP_FILE="$TEST_TMP_DIR/branches.yml"
10+
export GITHUB_REF_NAME="main"
11+
printf "main: wiki-main\n" > "$TMP_BRANCH_MAP_FILE"
12+
13+
cat > "$FAKE_BIN_DIR/yq" <<'EOF'
14+
#!/usr/bin/env bash
15+
if [ -n "$YQ_OUTPUT_OVERRIDE" ]; then
16+
echo "$YQ_OUTPUT_OVERRIDE"
17+
else
18+
echo "wiki-main"
19+
fi
20+
EOF
21+
chmod +x "$FAKE_BIN_DIR/yq"
22+
}
23+
24+
teardown() {
25+
teardown_test_tmp_dir
26+
}
27+
28+
@test "get-mapped-branch returns mapped branch when mapping exists" {
29+
run bash "$BATS_TEST_DIRNAME/../bin/get-mapped-branch.sh"
30+
[ "$status" -eq 0 ]
31+
[ "$output" = "wiki-main" ]
32+
}
33+
34+
@test "get-mapped-branch falls back to GITHUB_REF_NAME when map is null" {
35+
export YQ_OUTPUT_OVERRIDE="null"
36+
run bash "$BATS_TEST_DIRNAME/../bin/get-mapped-branch.sh"
37+
[ "$status" -eq 0 ]
38+
[ "$output" = "main" ]
39+
}

tests/04-configure-git.bats

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
export OLD_WIKI_CHECKOUT_PATH="$TEST_TMP_DIR/old-wiki"
8+
mkdir -p "$OLD_WIKI_CHECKOUT_PATH"
9+
git init "$OLD_WIKI_CHECKOUT_PATH" > /dev/null
10+
}
11+
12+
teardown() {
13+
teardown_test_tmp_dir
14+
}
15+
16+
@test "configure_git sets git identity and defaults" {
17+
run bash "$BATS_TEST_DIRNAME/../bin/configure_git.sh" "impressbot" "bot@example.com"
18+
[ "$status" -eq 0 ]
19+
20+
run git -C "$OLD_WIKI_CHECKOUT_PATH" config user.name
21+
[ "$status" -eq 0 ]
22+
[ "$output" = "impressbot" ]
23+
24+
run git -C "$OLD_WIKI_CHECKOUT_PATH" config user.email
25+
[ "$status" -eq 0 ]
26+
[ "$output" = "bot@example.com" ]
27+
}
28+
29+
@test "configure_git fails when wiki_github_update_user is empty" {
30+
run bash "$BATS_TEST_DIRNAME/../bin/configure_git.sh" "" "bot@example.com"
31+
[ "$status" -eq 3 ]
32+
[[ "$output" == *"ERROR: 'wiki_github_update_user' not set"* ]]
33+
}

tests/05-cloning.bats

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
setup_fake_bin_path
8+
9+
export GITHUB_REPOSITORY="impresscms-dev/phpdocs-wiki-update-action"
10+
export OLD_WIKI_CHECKOUT_PATH="$TEST_TMP_DIR/old-wiki"
11+
export GIT_CLONE_URL_FILE="$TEST_TMP_DIR/clone-url.txt"
12+
13+
cat > "$FAKE_BIN_DIR/git" <<'EOF'
14+
#!/usr/bin/env bash
15+
if [ "$1" = "clone" ]; then
16+
echo "$3" > "$GIT_CLONE_URL_FILE"
17+
if [ -z "$SKIP_CLONE_DIR_CREATE" ]; then
18+
mkdir -p "$4"
19+
fi
20+
exit 0
21+
fi
22+
exit 1
23+
EOF
24+
chmod +x "$FAKE_BIN_DIR/git"
25+
}
26+
27+
teardown() {
28+
teardown_test_tmp_dir
29+
}
30+
31+
@test "cloning uses wiki clone URL and creates checkout folder" {
32+
run bash "$BATS_TEST_DIRNAME/../bin/cloning.sh" "my-token" "my-user"
33+
[ "$status" -eq 0 ]
34+
[ -d "$OLD_WIKI_CHECKOUT_PATH" ]
35+
36+
run cat "$GIT_CLONE_URL_FILE"
37+
[ "$status" -eq 0 ]
38+
[ "$output" = "https://my-user:my-token@github.com/impresscms-dev/phpdocs-wiki-update-action.wiki.git" ]
39+
}
40+
41+
@test "cloning fails when wiki directory was not created" {
42+
export SKIP_CLONE_DIR_CREATE="1"
43+
run bash "$BATS_TEST_DIRNAME/../bin/cloning.sh" "my-token" "my-user"
44+
[ "$status" -eq 1 ]
45+
[[ "$output" == *"ERROR: wiki directory not created."* ]]
46+
}

tests/06-checkout.bats

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
setup_fake_bin_path
8+
9+
export OLD_WIKI_CHECKOUT_PATH="$TEST_TMP_DIR/old-wiki"
10+
export ACTION_BIN_PATH="$TEST_TMP_DIR/action-bin"
11+
export GIT_CALLS_FILE="$TEST_TMP_DIR/git-calls.log"
12+
mkdir -p "$OLD_WIKI_CHECKOUT_PATH" "$ACTION_BIN_PATH"
13+
: > "$GIT_CALLS_FILE"
14+
15+
cat > "$ACTION_BIN_PATH/get-mapped-branch.sh" <<'EOF'
16+
#!/usr/bin/env bash
17+
echo "wiki-main"
18+
EOF
19+
chmod +x "$ACTION_BIN_PATH/get-mapped-branch.sh"
20+
21+
cat > "$FAKE_BIN_DIR/git" <<'EOF'
22+
#!/usr/bin/env bash
23+
echo "$*" >> "$GIT_CALLS_FILE"
24+
case "$1" in
25+
ls-remote)
26+
exit "${GIT_LS_REMOTE_EXIT_CODE:-1}"
27+
;;
28+
show-ref)
29+
exit "${GIT_SHOW_REF_EXIT_CODE:-1}"
30+
;;
31+
*)
32+
exit 0
33+
;;
34+
esac
35+
EOF
36+
chmod +x "$FAKE_BIN_DIR/git"
37+
}
38+
39+
teardown() {
40+
teardown_test_tmp_dir
41+
}
42+
43+
@test "checkout takes existing-branch path when remote or local checks fail" {
44+
export GIT_LS_REMOTE_EXIT_CODE="1"
45+
export GIT_SHOW_REF_EXIT_CODE="1"
46+
47+
run bash "$BATS_TEST_DIRNAME/../bin/checkout.sh"
48+
[ "$status" -eq 0 ]
49+
[[ "$output" == *"Remote 'wiki-main' found."* ]]
50+
51+
run grep -F "checkout wiki-main" "$GIT_CALLS_FILE"
52+
[ "$status" -eq 0 ]
53+
}
54+
55+
@test "checkout creates and pushes branch when both checks succeed" {
56+
export GIT_LS_REMOTE_EXIT_CODE="0"
57+
export GIT_SHOW_REF_EXIT_CODE="0"
58+
59+
run bash "$BATS_TEST_DIRNAME/../bin/checkout.sh"
60+
[ "$status" -eq 0 ]
61+
[[ "$output" == *"Remote 'wiki-main' not found. Creating."* ]]
62+
63+
run grep -F "checkout -b wiki-main" "$GIT_CALLS_FILE"
64+
[ "$status" -eq 0 ]
65+
66+
run grep -F "push --set-upstream origin wiki-main" "$GIT_CALLS_FILE"
67+
[ "$status" -eq 0 ]
68+
}

tests/07-commit-and-push.bats

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
setup_fake_bin_path
8+
9+
export NEW_WIKI_CHECKOUT_PATH="$TEST_TMP_DIR/new-wiki"
10+
export GIT_CALLS_FILE="$TEST_TMP_DIR/git-calls.log"
11+
mkdir -p "$NEW_WIKI_CHECKOUT_PATH"
12+
: > "$GIT_CALLS_FILE"
13+
14+
cat > "$FAKE_BIN_DIR/git" <<'EOF'
15+
#!/usr/bin/env bash
16+
echo "$*" >> "$GIT_CALLS_FILE"
17+
case "$1" in
18+
pull)
19+
exit "${GIT_PULL_EXIT_CODE:-0}"
20+
;;
21+
push)
22+
exit "${GIT_PUSH_EXIT_CODE:-0}"
23+
;;
24+
*)
25+
exit 0
26+
;;
27+
esac
28+
EOF
29+
chmod +x "$FAKE_BIN_DIR/git"
30+
}
31+
32+
teardown() {
33+
teardown_test_tmp_dir
34+
}
35+
36+
@test "commit_and_push continues when pull fails and still pushes" {
37+
export GIT_PULL_EXIT_CODE="1"
38+
39+
run bash "$BATS_TEST_DIRNAME/../bin/commit_and_push.sh" "Update wiki docs"
40+
[ "$status" -eq 0 ]
41+
42+
run grep -F "pull -s recursive -X ours" "$GIT_CALLS_FILE"
43+
[ "$status" -eq 0 ]
44+
45+
run grep -F "push" "$GIT_CALLS_FILE"
46+
[ "$status" -eq 0 ]
47+
}
48+
49+
@test "commit_and_push fails when push fails" {
50+
export GIT_PUSH_EXIT_CODE="1"
51+
52+
run bash "$BATS_TEST_DIRNAME/../bin/commit_and_push.sh" "Update wiki docs"
53+
[ "$status" -eq 1 ]
54+
}

tests/08-clear-tmp-data.bats

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/usr/bin/env bats
2+
3+
load "$BATS_TEST_DIRNAME/helpers.bash"
4+
5+
setup() {
6+
setup_test_tmp_dir
7+
export OLD_WIKI_CHECKOUT_PATH="$TEST_TMP_DIR/old-wiki"
8+
export NEW_WIKI_CHECKOUT_PATH="$TEST_TMP_DIR/new-wiki"
9+
export TMP_BRANCH_MAP_FILE="$TEST_TMP_DIR/branches-map.yml"
10+
mkdir -p "$OLD_WIKI_CHECKOUT_PATH" "$NEW_WIKI_CHECKOUT_PATH"
11+
printf "main: master\n" > "$TMP_BRANCH_MAP_FILE"
12+
}
13+
14+
teardown() {
15+
teardown_test_tmp_dir
16+
}
17+
18+
@test "clear_tmp_data removes temp files and directories" {
19+
run bash "$BATS_TEST_DIRNAME/../bin/clear_tmp_data.sh"
20+
[ "$status" -eq 0 ]
21+
[ ! -e "$OLD_WIKI_CHECKOUT_PATH" ]
22+
[ ! -e "$NEW_WIKI_CHECKOUT_PATH" ]
23+
[ ! -e "$TMP_BRANCH_MAP_FILE" ]
24+
}

tests/helpers.bash

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
setup_test_tmp_dir() {
2+
TEST_TMP_DIR="$(mktemp -d)"
3+
}
4+
5+
teardown_test_tmp_dir() {
6+
rm -rf "$TEST_TMP_DIR"
7+
}
8+
9+
setup_fake_bin_path() {
10+
FAKE_BIN_DIR="$TEST_TMP_DIR/fake-bin"
11+
mkdir -p "$FAKE_BIN_DIR"
12+
export PATH="$FAKE_BIN_DIR:$PATH"
13+
}

0 commit comments

Comments
 (0)