Files
kaidi/scripts/test-gitea-publish-fixture.sh
T
2026-08-19 08:27:08 +08:00

115 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
WORK=$(mktemp -d)
trap 'rm -rf "$WORK"' EXIT
fail() {
printf 'Gitea publish fixture failed: %s\n' "$1" >&2
exit 1
}
VERSION=1.2.3-preview.1
TAG=v$VERSION
TOKEN=fixture-release-token
RELEASE_DIR=$WORK/release
MOCK_BIN=$WORK/bin
mkdir -p "$RELEASE_DIR" "$MOCK_BIN"
for name in \
"kaidi-finance-$VERSION.tar.gz" \
backend-sbom.cdx.json \
frontend-sbom.cdx.json \
release-manifest.json \
release-manifest.sig \
release-public.pem \
install.sh \
purge.sh \
bootstrap-checksums.txt \
SHA256SUMS; do
printf 'fixture asset %s\n' "$name" > "$RELEASE_DIR/$name"
done
printf '%s\n' '{"releaseNotes":"Fixture release notes"}' > "$RELEASE_DIR/release-manifest.json"
cat > "$MOCK_BIN/curl" <<'SH'
#!/usr/bin/env bash
set -Eeuo pipefail
method=GET
output=
form=
url=
header_file=
printf '%s\n' "$*" >> "$MOCK_CURL_LOG"
while [ "$#" -gt 0 ]; do
case "$1" in
--request) shift; method=$1 ;;
--output) shift; output=$1 ;;
--form) shift; form=$1; method=POST ;;
--header)
shift
case "$1" in @*) header_file=${1#@} ;; esac
;;
https://*) url=$1 ;;
esac
shift
done
[ -r "$header_file" ] || exit 90
grep -Fqx "Authorization: token $MOCK_GITEA_TOKEN" "$header_file" || exit 91
case "$method:$url" in
GET:*/releases/tags/*)
printf '{"message":"not found"}\n' > "$output"
printf '404'
;;
POST:*/releases)
printf '{"id":7,"draft":true,"prerelease":false}\n' > "$output"
printf '201'
;;
POST:*/releases/7/assets*)
path=${form#attachment=@}
path=${path%%;type=*}
name=$(basename "$path")
size=$(wc -c < "$path" | tr -d '[:space:]')
jq -cn --arg name "$name" --argjson size "$size" '{name:$name,size:$size}' >> "$MOCK_ASSET_LOG"
printf '{"name":"%s","size":%s}\n' "$name" "$size" > "$output"
printf '201'
;;
GET:*/releases/7)
jq -s '{id:7,draft:true,prerelease:false,assets:.}' "$MOCK_ASSET_LOG" > "$output"
printf '200'
;;
PATCH:*/releases/7)
jq -s '{id:7,draft:false,prerelease:false,assets:.}' "$MOCK_ASSET_LOG" > "$output"
printf '200'
;;
*)
printf 'unexpected mock request: %s %s\n' "$method" "$url" >&2
exit 92
;;
esac
SH
chmod 0755 "$MOCK_BIN/curl"
: > "$WORK/curl.log"
: > "$WORK/assets.jsonl"
PATH="$MOCK_BIN:$PATH" \
MOCK_CURL_LOG="$WORK/curl.log" \
MOCK_ASSET_LOG="$WORK/assets.jsonl" \
MOCK_GITEA_TOKEN="$TOKEN" \
GITEA_SERVER_URL=https://gitea.fixture.invalid \
GITEA_REPOSITORY=ERP-Team/kaidi \
GITEA_REF_NAME="$TAG" \
GITEA_SHA=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
GITEA_TOKEN="$TOKEN" \
KAIDI_RELEASE_DIR="$RELEASE_DIR" \
"$ROOT/scripts/publish-gitea-release.sh" > "$WORK/publish.log"
grep -Fqx "Published Gitea release $TAG with ten verified assets" "$WORK/publish.log" \
|| fail 'publish script did not report success'
[ "$(wc -l < "$WORK/assets.jsonl" | tr -d '[:space:]')" -eq 10 ] \
|| fail 'publish script did not upload exactly ten assets'
! grep -Fq "$TOKEN" "$WORK/curl.log" \
|| fail 'Gitea write token leaked into curl process arguments'
printf 'Gitea draft, ten-asset verification, and publication fixture passed\n'