Skip to content

Commit 13e4022

Browse files
committed
chore: Adding some testing from external workflow run
1 parent 72eb28a commit 13e4022

11 files changed

Lines changed: 535 additions & 110 deletions

.github/scripts/release/check-release-exists.sh

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,50 +10,50 @@ set -euo pipefail
1010
# GITHUB_OUTPUT: Path to GitHub output file
1111

1212
function main {
13-
# Validate required environment variables
14-
: "${VERSION:?ERROR: VERSION is a required environment variable}"
15-
: "${GH_TOKEN:?ERROR: GH_TOKEN is a required environment variable}"
16-
: "${GITHUB_OUTPUT:?ERROR: GITHUB_OUTPUT is a required environment variable}"
17-
18-
printf 'Checking if release exists for tag: %s\n' "$VERSION"
19-
20-
# Check if release exists using gh CLI (only care about exit code)
21-
if ! gh release view "$VERSION" > /dev/null 2>&1; then
22-
{
23-
printf 'exists=false\n'
24-
printf 'is_draft=false\n'
25-
printf 'release_id=\n'
26-
} >>"$GITHUB_OUTPUT"
27-
printf 'Release not found for tag %s\n' "$VERSION"
28-
return 0
29-
fi
30-
31-
# Get release details
32-
local release_json
33-
release_json=$(gh release view "$VERSION" --json 'id,uploadUrl,isDraft')
34-
35-
local release_id
36-
local upload_url
37-
local is_draft
38-
39-
release_id=$(jq -r '.id' <<< "$release_json")
40-
upload_url=$(jq -r '.uploadUrl' <<< "$release_json")
41-
is_draft=$(jq -r '.isDraft' <<< "$release_json")
42-
43-
# Write to GitHub output
44-
{
45-
printf 'exists=true\n'
46-
printf 'release_id=%s\n' "$release_id"
47-
printf 'upload_url=%s\n' "$upload_url"
48-
printf 'is_draft=%s\n' "$is_draft"
49-
} >>"$GITHUB_OUTPUT"
50-
51-
echo "Found existing release:"
52-
printf ' Release ID: %s\n' "$release_id"
53-
printf ' Draft: %s\n' "$is_draft"
54-
printf ' Upload URL: %s\n' "${upload_url%\{*}"
55-
56-
return 0
13+
# Validate required environment variables
14+
: "${VERSION:?ERROR: VERSION is a required environment variable}"
15+
: "${GH_TOKEN:?ERROR: GH_TOKEN is a required environment variable}"
16+
: "${GITHUB_OUTPUT:?ERROR: GITHUB_OUTPUT is a required environment variable}"
17+
18+
printf 'Checking if release exists for tag: %s\n' "$VERSION"
19+
20+
# Check if release exists using gh CLI (only care about exit code)
21+
if ! gh release view "$VERSION" >/dev/null 2>&1; then
22+
{
23+
printf 'exists=false\n'
24+
printf 'is_draft=false\n'
25+
printf 'release_id=\n'
26+
} >>"$GITHUB_OUTPUT"
27+
printf 'Release not found for tag %s\n' "$VERSION"
28+
return 0
29+
fi
30+
31+
# Get release details
32+
local release_json
33+
release_json=$(gh release view "$VERSION" --json 'id,uploadUrl,isDraft')
34+
35+
local release_id
36+
local upload_url
37+
local is_draft
38+
39+
release_id=$(jq -r '.id' <<<"$release_json")
40+
upload_url=$(jq -r '.uploadUrl' <<<"$release_json")
41+
is_draft=$(jq -r '.isDraft' <<<"$release_json")
42+
43+
# Write to GitHub output
44+
{
45+
printf 'exists=true\n'
46+
printf 'release_id=%s\n' "$release_id"
47+
printf 'upload_url=%s\n' "$upload_url"
48+
printf 'is_draft=%s\n' "$is_draft"
49+
} >>"$GITHUB_OUTPUT"
50+
51+
echo "Found existing release:"
52+
printf ' Release ID: %s\n' "$release_id"
53+
printf ' Draft: %s\n' "$is_draft"
54+
printf ' Upload URL: %s\n' "${upload_url%\{*}"
55+
56+
return 0
5757
}
5858

5959
main "$@"

.github/scripts/release/enforce-commit-sha.sh

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@ set -euo pipefail
1212
# REF=abc123... enforce-commit-sha.sh
1313

1414
function main {
15-
local ref="${1:-${REF:-}}"
15+
local ref="${1:-${REF:-}}"
1616

17-
if [[ -z "$ref" ]]; then
18-
echo "ERROR: No ref provided. Pass as argument or set REF env var." >&2
19-
exit 1
20-
fi
17+
if [[ -z "$ref" ]]; then
18+
echo "ERROR: No ref provided. Pass as argument or set REF env var." >&2
19+
exit 1
20+
fi
2121

22-
if [[ ! "$ref" =~ ^[0-9a-f]{40}$ ]]; then
23-
echo "ERROR: target_commitish must be a full 40-character commit SHA, got: '$ref'" >&2
24-
echo "This prevents new commits from being pulled into the release between draft creation and publishing." >&2
25-
echo "When creating the draft release, select a specific commit instead of a branch name." >&2
26-
exit 1
27-
fi
22+
if [[ ! "$ref" =~ ^[0-9a-f]{40}$ ]]; then
23+
echo "ERROR: target_commitish must be a full 40-character commit SHA, got: '$ref'" >&2
24+
echo "This prevents new commits from being pulled into the release between draft creation and publishing." >&2
25+
echo "When creating the draft release, select a specific commit instead of a branch name." >&2
26+
exit 1
27+
fi
2828

29-
printf 'Valid commit SHA: %s\n' "$ref"
29+
printf 'Valid commit SHA: %s\n' "$ref"
3030

31-
return 0
31+
return 0
3232
}
3333

3434
main "$@"

.github/scripts/release/resolve-version-ref.sh

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,36 @@ set -euo pipefail
1212
# GITHUB_OUTPUT: Path to GitHub output file
1313

1414
function main {
15-
: "${INPUT_VERSION:?ERROR: INPUT_VERSION is a required environment variable}"
16-
: "${GH_TOKEN:?ERROR: GH_TOKEN is a required environment variable}"
17-
: "${GITHUB_OUTPUT:?ERROR: GITHUB_OUTPUT is a required environment variable}"
18-
19-
local version="$INPUT_VERSION"
20-
21-
# Look up the release to get target_commitish
22-
local release_json
23-
if ! release_json=$(gh release view "$version" --json 'isDraft,targetCommitish' 2>/dev/null); then
24-
echo "ERROR: No release found for version $version" >&2
25-
exit 1
26-
fi
27-
28-
local is_draft
29-
is_draft=$(jq -r '.isDraft' <<<"$release_json")
30-
if [[ "$is_draft" != "true" ]]; then
31-
echo "ERROR: Release $version is already published. Cannot rebuild a published release." >&2
32-
exit 1
33-
fi
34-
35-
local ref
36-
ref=$(jq -r '.targetCommitish' <<<"$release_json")
37-
38-
{
39-
printf 'version=%s\n' "$version"
40-
printf 'ref=%s\n' "$ref"
41-
} >>"$GITHUB_OUTPUT"
42-
echo "Resolved version: $version, ref: $ref"
43-
44-
return 0
15+
: "${INPUT_VERSION:?ERROR: INPUT_VERSION is a required environment variable}"
16+
: "${GH_TOKEN:?ERROR: GH_TOKEN is a required environment variable}"
17+
: "${GITHUB_OUTPUT:?ERROR: GITHUB_OUTPUT is a required environment variable}"
18+
19+
local version="$INPUT_VERSION"
20+
21+
# Look up the release to get target_commitish
22+
local release_json
23+
if ! release_json=$(gh release view "$version" --json 'isDraft,targetCommitish' 2>/dev/null); then
24+
echo "ERROR: No release found for version $version" >&2
25+
exit 1
26+
fi
27+
28+
local is_draft
29+
is_draft=$(jq -r '.isDraft' <<<"$release_json")
30+
if [[ "$is_draft" != "true" ]]; then
31+
echo "ERROR: Release $version is already published. Cannot rebuild a published release." >&2
32+
exit 1
33+
fi
34+
35+
local ref
36+
ref=$(jq -r '.targetCommitish' <<<"$release_json")
37+
38+
{
39+
printf 'version=%s\n' "$version"
40+
printf 'ref=%s\n' "$ref"
41+
} >>"$GITHUB_OUTPUT"
42+
echo "Resolved version: $version, ref: $ref"
43+
44+
return 0
4545
}
4646

4747
main "$@"
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/env bats
2+
3+
setup() {
4+
SCRIPT="${BATS_TEST_DIRNAME}/../check-release-exists.sh"
5+
STUB_DIR="$(mktemp -d)"
6+
cp "${BATS_TEST_DIRNAME}/helpers/gh-stub.sh" "${STUB_DIR}/gh"
7+
chmod +x "${STUB_DIR}/gh"
8+
export PATH="${STUB_DIR}:${PATH}"
9+
10+
GITHUB_OUTPUT="$(mktemp)"
11+
export GITHUB_OUTPUT
12+
export GH_TOKEN=fake
13+
export VERSION=v1.0.0
14+
}
15+
16+
teardown() {
17+
rm -rf "$STUB_DIR"
18+
rm -f "$GITHUB_OUTPUT"
19+
}
20+
21+
@test "writes exists=false and exits 0 when no release found" {
22+
export GH_STUB_RESPONSE=""
23+
export GH_STUB_EXIT=1
24+
25+
run "$SCRIPT"
26+
[ "$status" -eq 0 ]
27+
grep -q "^exists=false$" "$GITHUB_OUTPUT"
28+
grep -q "^is_draft=false$" "$GITHUB_OUTPUT"
29+
grep -q "^release_id=$" "$GITHUB_OUTPUT"
30+
}
31+
32+
@test "reports draft release" {
33+
export GH_STUB_RESPONSE='{"id":123,"uploadUrl":"https://uploads/repos/o/r/releases/123/assets{?name,label}","isDraft":true}'
34+
35+
run "$SCRIPT"
36+
[ "$status" -eq 0 ]
37+
grep -q "^exists=true$" "$GITHUB_OUTPUT"
38+
grep -q "^release_id=123$" "$GITHUB_OUTPUT"
39+
grep -q "^is_draft=true$" "$GITHUB_OUTPUT"
40+
}
41+
42+
@test "reports non-draft (published) release" {
43+
export GH_STUB_RESPONSE='{"id":456,"uploadUrl":"https://uploads/repos/o/r/releases/456/assets{?name,label}","isDraft":false}'
44+
45+
run "$SCRIPT"
46+
[ "$status" -eq 0 ]
47+
grep -q "^exists=true$" "$GITHUB_OUTPUT"
48+
grep -q "^release_id=456$" "$GITHUB_OUTPUT"
49+
grep -q "^is_draft=false$" "$GITHUB_OUTPUT"
50+
}
51+
52+
@test "fails when VERSION missing" {
53+
unset VERSION
54+
run "$SCRIPT"
55+
[ "$status" -ne 0 ]
56+
[[ "$output" == *"VERSION"* ]]
57+
}
58+
59+
@test "fails when GH_TOKEN missing" {
60+
unset GH_TOKEN
61+
run "$SCRIPT"
62+
[ "$status" -ne 0 ]
63+
[[ "$output" == *"GH_TOKEN"* ]]
64+
}
65+
66+
@test "fails when GITHUB_OUTPUT missing" {
67+
unset GITHUB_OUTPUT
68+
run "$SCRIPT"
69+
[ "$status" -ne 0 ]
70+
[[ "$output" == *"GITHUB_OUTPUT"* ]]
71+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/env bats
2+
3+
setup() {
4+
SCRIPT="${BATS_TEST_DIRNAME}/../enforce-commit-sha.sh"
5+
VALID_SHA="a1b2c3d4e5f6789012345678901234567890abcd"
6+
}
7+
8+
@test "accepts a valid 40-char lowercase hex SHA (arg)" {
9+
run "$SCRIPT" "$VALID_SHA"
10+
[ "$status" -eq 0 ]
11+
}
12+
13+
@test "accepts a valid SHA via REF env var" {
14+
REF="$VALID_SHA" run "$SCRIPT"
15+
[ "$status" -eq 0 ]
16+
}
17+
18+
@test "rejects empty ref" {
19+
run "$SCRIPT" ""
20+
[ "$status" -ne 0 ]
21+
}
22+
23+
@test "rejects when neither arg nor REF is set" {
24+
run "$SCRIPT"
25+
[ "$status" -ne 0 ]
26+
}
27+
28+
@test "rejects branch name" {
29+
run "$SCRIPT" "main"
30+
[ "$status" -ne 0 ]
31+
}
32+
33+
@test "rejects tag-style ref" {
34+
run "$SCRIPT" "v1.2.3"
35+
[ "$status" -ne 0 ]
36+
}
37+
38+
@test "rejects short SHA (7 chars)" {
39+
run "$SCRIPT" "a1b2c3d"
40+
[ "$status" -ne 0 ]
41+
}
42+
43+
@test "rejects 39-char SHA" {
44+
run "$SCRIPT" "${VALID_SHA:0:39}"
45+
[ "$status" -ne 0 ]
46+
}
47+
48+
@test "rejects 41-char SHA" {
49+
run "$SCRIPT" "${VALID_SHA}e"
50+
[ "$status" -ne 0 ]
51+
}
52+
53+
@test "rejects uppercase hex" {
54+
run "$SCRIPT" "A1B2C3D4E5F6789012345678901234567890ABCD"
55+
[ "$status" -ne 0 ]
56+
}
57+
58+
@test "rejects mixed case" {
59+
run "$SCRIPT" "A1b2c3d4e5f6789012345678901234567890abcd"
60+
[ "$status" -ne 0 ]
61+
}
62+
63+
@test "rejects non-hex chars" {
64+
run "$SCRIPT" "g1b2c3d4e5f6789012345678901234567890abcd"
65+
[ "$status" -ne 0 ]
66+
}
67+
68+
@test "rejects refs/heads/main" {
69+
run "$SCRIPT" "refs/heads/main"
70+
[ "$status" -ne 0 ]
71+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/usr/bin/env bash
2+
# Test stub for the `gh` CLI.
3+
#
4+
# Behavior is driven by env vars set per-test:
5+
# GH_STUB_RESPONSE - string written to stdout (default: empty)
6+
# GH_STUB_EXIT - exit code (default: 0)
7+
# GH_STUB_LOG - if set, append invocation args to this file
8+
#
9+
# Install by prepending a directory containing this file (named `gh`) to PATH.
10+
11+
set -euo pipefail
12+
13+
if [[ -n "${GH_STUB_LOG:-}" ]]; then
14+
printf '%s\n' "$*" >>"$GH_STUB_LOG"
15+
fi
16+
17+
if [[ -n "${GH_STUB_RESPONSE:-}" ]]; then
18+
printf '%s' "$GH_STUB_RESPONSE"
19+
fi
20+
21+
exit "${GH_STUB_EXIT:-0}"

0 commit comments

Comments
 (0)