diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml new file mode 100644 index 0000000..6b95472 --- /dev/null +++ b/.gitea/workflows/ci.yaml @@ -0,0 +1,17 @@ +name: CI + +on: + push: + branches: + - develop + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install jq + run: sudo apt-get update && sudo apt-get install -y jq + - name: Run shell tests + run: bash tests/entrypoint.sh diff --git a/tests/entrypoint.sh b/tests/entrypoint.sh new file mode 100644 index 0000000..e58a4df --- /dev/null +++ b/tests/entrypoint.sh @@ -0,0 +1,117 @@ +#!/bin/bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +TMP_DIR="$(mktemp -d)" +trap 'rm -rf "${TMP_DIR}"' EXIT + +assert_contains() { + local needle="$1" + local haystack="$2" + + if ! grep -Fq "$needle" <<<"$haystack"; then + printf 'Expected output to contain: %s\n' "$needle" >&2 + exit 1 + fi +} + +write_mock_curl() { + cat > "${TMP_DIR}/curl" <<'EOF' +#!/bin/sh +method=GET +out_file= +headers_file= +url= +while [ "$#" -gt 0 ]; do + case "$1" in + -X) + method=$2 + shift 2 + ;; + -D) + headers_file=$2 + shift 2 + ;; + -o) + out_file=$2 + shift 2 + ;; + -w) + shift 2 + ;; + -H|-sS) + shift 1 + ;; + *) + url=$1 + shift + ;; + esac +done + +status='HTTP/1.1 200 OK' +code='200' +body='[]' + +case "$url" in + *'/api/v1/packages/test-owner?type=nuget&page=1&limit=100') + body='[{"name":"pkg-a","version":"1.0.0","created_at":"2023-01-01T00:00:00Z"},{"name":"pkg-a","version":"1.1.0","created_at":"2023-02-01T00:00:00Z"},{"name":"pkg-b","version":"0.1.0","created_at":"2023-03-01T00:00:00Z"}]' + ;; + *'/api/v1/packages/test-owner/nuget/pkg-a/1.0.0') + if [ "$method" = "DELETE" ]; then + status='HTTP/1.1 204 No Content' + code='204' + body='' + fi + ;; +esac + +printf '%s' "$body" > "$out_file" +{ + printf '%s\n' "$status" + printf 'X-Request-Id: req-123\n' +} > "$headers_file" + +if [ "$method" = "DELETE" ] && [ -n "${MOCK_DELETE_FILE:-}" ]; then + printf '%s %s\n' "$method" "$url" >> "$MOCK_DELETE_FILE" +fi + +printf '%s' "$code" +EOF + chmod +x "${TMP_DIR}/curl" +} + +run_entrypoint() { + PATH="${TMP_DIR}:$PATH" \ + GITEA_SERVER_URL="https://gitea.example.com" \ + GITEA_REPOSITORY="test-owner/test-repo" \ + env "$@" "${ROOT_DIR}/entrypoint.sh" 2>&1 +} + +write_mock_curl + +output="$(run_entrypoint INPUT_RUNNER_TOKEN=abc INPUT_KEEP_VERSIONS=1 INPUT_DRY_RUN=true)" +assert_contains "Using token from inputs.RUNNER_TOKEN" "$output" +assert_contains "keep_versions=1" "$output" +assert_contains "dry_run=true" "$output" +assert_contains "request_id=req-123" "$output" +assert_contains "[DRY-RUN] Would delete package pkg-a version 1.0.0" "$output" + +output="$(run_entrypoint GITEA_TOKEN=secret INPUT_KEEP_VERSIONS=1 INPUT_DRY_RUN=true)" +assert_contains "Using token from secrets.GITEA_TOKEN" "$output" + +if run_entrypoint INPUT_KEEP_VERSIONS=-1 >/dev/null 2>&1; then + printf 'Expected invalid keep_versions to fail\n' >&2 + exit 1 +fi + +if run_entrypoint >/dev/null 2>&1; then + printf 'Expected missing token to fail\n' >&2 + exit 1 +fi + +delete_log="${TMP_DIR}/delete.log" +output="$(MOCK_DELETE_FILE="$delete_log" run_entrypoint INPUT_RUNNER_TOKEN=abc INPUT_KEEP_VERSIONS=1 INPUT_DRY_RUN=false)" +assert_contains "Deleted package pkg-a version 1.0.0 -> 204 No Content" "$output" +assert_contains "Summary: packages=2 versions=3 kept=2 candidates=1 deleted=1 skipped=0 errors=0 dry_run=false" "$output" +assert_contains "DELETE https://gitea.example.com/api/v1/packages/test-owner/nuget/pkg-a/1.0.0" "$(cat "$delete_log")"