Skip to content

Commit c466146

Browse files
authored
Merge pull request #294 from impresscms-dev/test/add-bats-for-bin-scripts
test: add bats tests for each bin script
2 parents 8bbab5a + 365632d commit c466146

11 files changed

Lines changed: 452 additions & 0 deletions

.github/workflows/test.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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+
name: Run Bats Test Suite
16+
runs-on: ubuntu-latest
17+
steps:
18+
- name: Checkout Repository
19+
uses: actions/checkout@v6
20+
21+
- name: Install Bats
22+
uses: mig4/setup-bats@v1
23+
with:
24+
bats-version: 1.8.2
25+
26+
- name: Run Bats Tests
27+
run: bats tests

tests/01-setup.bats

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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 TEST_WORK_DIR="$TEST_TMP_DIR/workspace"
13+
export GITHUB_ENV="$TEST_TMP_DIR/github.env"
14+
mkdir -p "$RUNNER_TEMP" "$TEST_WORK_DIR"
15+
: > "$GITHUB_ENV"
16+
}
17+
18+
teardown() {
19+
teardown_test_tmp_dir
20+
}
21+
22+
@test "setup exports variables and falls back to engine php version" {
23+
run bash -c "cd \"$TEST_WORK_DIR\" && bash \"$BATS_TEST_DIRNAME/../bin/setup.sh\" \"clean/phpdoc-md\""
24+
[ "$status" -eq 0 ]
25+
26+
run grep -F "NEEDED_PHP_VERSION=8.1" "$GITHUB_ENV"
27+
[ "$status" -eq 0 ]
28+
29+
NEW_WIKI_PATH=$(grep '^NEW_WIKI_CHECKOUT_PATH=' "$GITHUB_ENV" | cut -d'=' -f2-)
30+
[ -d "$NEW_WIKI_PATH" ]
31+
}
32+
33+
@test "setup uses composer.json php constraint when present" {
34+
cat > "$TEST_WORK_DIR/composer.json" <<'EOF'
35+
{
36+
"require": {
37+
"php": "^8.2"
38+
}
39+
}
40+
EOF
41+
42+
run bash -c "cd \"$TEST_WORK_DIR\" && bash \"$BATS_TEST_DIRNAME/../bin/setup.sh\" \"clean/phpdoc-md\""
43+
[ "$status" -eq 0 ]
44+
45+
run grep -F "NEEDED_PHP_VERSION=8.2" "$GITHUB_ENV"
46+
[ "$status" -eq 0 ]
47+
}
48+
49+
@test "setup fails on unknown engine" {
50+
run bash -c "cd \"$TEST_WORK_DIR\" && bash \"$BATS_TEST_DIRNAME/../bin/setup.sh\" \"unknown/engine\""
51+
[ "$status" -eq 1 ]
52+
[[ "$output" == *"ERROR: unknown engine"* ]]
53+
}

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+
}

0 commit comments

Comments
 (0)