@@ -33,12 +33,27 @@ setup() {
3333 cat > " $bin_dir /gh" << 'GH '
3434#!/usr/bin/env bash
3535# Fake gh: log all args (including the multi-line --notes value) to
36- # a file the test can grep against. Always exits 0.
36+ # a file the test can grep against. Exit behaviour for `release view`
37+ # is driven by $GH_RELEASE_MODE so tests can exercise both the
38+ # create-or-update branches in update-release.sh:
39+ # (unset|existing) - all commands succeed (legacy / pre-existing Release)
40+ # missing - `release view` exits 1 (chained flow / 404 case)
41+ # error - `release view` exits 2 (non-404 error)
42+ # All other subcommands always exit 0 so tests can inspect the call log.
3743{
3844 printf 'GH_CALL: '
3945 printf '%s ' "$@"
4046 printf '\n'
4147} >> "$GH_LOG"
48+
49+ if [[ "${1:-}" == "release" && "${2:-}" == "view" ]]; then
50+ case "${GH_RELEASE_MODE:-existing}" in
51+ missing) exit 1 ;;
52+ error) exit 2 ;;
53+ *) exit 0 ;;
54+ esac
55+ fi
56+
4257exit 0
4358GH
4459 chmod +x " $bin_dir /gh"
@@ -54,6 +69,8 @@ teardown() {
5469 unset TARBALL_META_DIR
5570 unset GH_LOG
5671 unset GIT_TAG
72+ unset GH_RELEASE_MODE
73+ unset GITHUB_SHA
5774}
5875
5976write_meta_for () {
153170 # idempotency.
154171 grep -q " release upload v1.5.0 ${meta_dir} /nsec-tree-1.5.0.tgz --clobber" " $GH_LOG "
155172}
173+
174+ # ---------------------------------------------------------------------
175+ # Create-or-update branch coverage (see update-release.sh header).
176+ # The legacy tests above all run under the default $GH_RELEASE_MODE
177+ # (= existing), exercising the edit branch. The tests below force the
178+ # missing and error modes.
179+ # ---------------------------------------------------------------------
180+
181+ @test " update-release: creates a Release when none exists (chained flow)" {
182+ command -v jq > /dev/null 2>&1 || skip " jq not available"
183+
184+ write_package_json ' {"name":"nsec-tree","version":"1.5.0","files":["dist"]}'
185+ write_file " CHANGELOG.md" ' ## 1.5.0
186+
187+ - changes
188+ '
189+ write_meta_for " nsec-tree-1.5.0.tgz"
190+ export GIT_TAG=" v1.5.0"
191+ export GH_RELEASE_MODE=" missing"
192+ export GITHUB_SHA=" deadbeefcafef00d1234567890abcdef12345678"
193+
194+ run " $ACTION_ROOT /steps/update-release.sh"
195+ [ " $status " -eq 0 ]
196+
197+ # On the missing branch we must call `release create`, not `release edit`.
198+ grep -q " GH_CALL: release create v1.5.0" " $GH_LOG "
199+ ! grep -q " GH_CALL: release edit" " $GH_LOG "
200+
201+ # --target must be passed and equal $GITHUB_SHA. --notes contains
202+ # multi-line content so the whole call may span several log lines;
203+ # check for --target and the SHA individually rather than on one line.
204+ grep -q -- " --target" " $GH_LOG "
205+ grep -q " $GITHUB_SHA " " $GH_LOG "
206+
207+ # Asset upload still runs after create.
208+ grep -q " release upload v1.5.0" " $GH_LOG "
209+ }
210+
211+ @test " update-release: edits existing Release (legacy flow)" {
212+ command -v jq > /dev/null 2>&1 || skip " jq not available"
213+
214+ write_package_json ' {"name":"nsec-tree","version":"1.5.0","files":["dist"]}'
215+ write_file " CHANGELOG.md" ' ## 1.5.0
216+
217+ - changes
218+ '
219+ write_meta_for " nsec-tree-1.5.0.tgz"
220+ export GIT_TAG=" v1.5.0"
221+ export GH_RELEASE_MODE=" existing"
222+
223+ run " $ACTION_ROOT /steps/update-release.sh"
224+ [ " $status " -eq 0 ]
225+
226+ # On the existing branch we must call `release edit`, not `release create`.
227+ grep -q " GH_CALL: release edit v1.5.0" " $GH_LOG "
228+ ! grep -q " GH_CALL: release create" " $GH_LOG "
229+ }
230+
231+ @test " update-release: create omits --target when no SHA resolvable" {
232+ command -v jq > /dev/null 2>&1 || skip " jq not available"
233+
234+ write_package_json ' {"name":"nsec-tree","version":"1.5.0","files":["dist"]}'
235+ write_file " CHANGELOG.md" ' ## 1.5.0
236+
237+ - changes
238+ '
239+ write_meta_for " nsec-tree-1.5.0.tgz"
240+ export GIT_TAG=" v1.5.0"
241+ export GH_RELEASE_MODE=" missing"
242+ # GITHUB_SHA deliberately unset; fixture has no git repo so git
243+ # rev-parse HEAD also fails. Script should omit --target rather
244+ # than pass an empty string.
245+ unset GITHUB_SHA
246+
247+ run " $ACTION_ROOT /steps/update-release.sh"
248+ [ " $status " -eq 0 ]
249+
250+ grep -q " GH_CALL: release create v1.5.0" " $GH_LOG "
251+ # --target must NOT appear in any create call when no SHA is available.
252+ ! grep -qE " release create v1\.5\.0[^\n]*--target" " $GH_LOG "
253+ }
0 commit comments