/
basuev
/
gverse
Обзор
Документация
Войти
/
basuev
/
gverse
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/e2e.sh
253 строки
9 KB
basuev
initial commit: gverse v0.1.0
27 май 2026, 08:52
27 май 2026, 08:52
98b24dd
Код
Авторство
О чём код?
#!/usr/bin/env bash set -u set -o pipefail GVERSE="${GVERSE:-gverse}" TS="$(date +%s)" SUFFIX="gverse-e2e-${TS}" PASS=0 FAIL=0 FAILED_STEPS=() SKIPPED=0 SKIPPED_STEPS=() OUT_DIR="$(mktemp -d)" trap 'rm -rf "$OUT_DIR"' EXIT red() { printf '\033[31m%s\033[0m' "$*"; } green() { printf '\033[32m%s\033[0m' "$*"; } yellow() { printf '\033[33m%s\033[0m' "$*"; } bold() { printf '\033[1m%s\033[0m' "$*"; } step() { local name="$1"; shift local out="$OUT_DIR/$(echo "$name" | tr ' /' '__').log" printf '%s ... ' "$(bold "$name")" if "$@" >"$out" 2>&1; then printf '%s\n' "$(green OK)" PASS=$((PASS+1)) return 0 else local code=$? printf '%s (exit %d)\n' "$(red FAIL)" "$code" sed 's/^/ /' "$out" | head -20 FAIL=$((FAIL+1)) FAILED_STEPS+=("$name") return 1 fi } step_capture() { local var="$1" name="$2"; shift 2 local out="$OUT_DIR/$(echo "$name" | tr ' /' '__').log" printf '%s ... ' "$(bold "$name")" if "$@" >"$out" 2>&1; then printf '%s\n' "$(green OK)" PASS=$((PASS+1)) printf -v "$var" '%s' "$(cat "$out")" return 0 else local code=$? printf '%s (exit %d)\n' "$(red FAIL)" "$code" sed 's/^/ /' "$out" | head -20 FAIL=$((FAIL+1)) FAILED_STEPS+=("$name") return 1 fi } skip() { local name="$1" reason="$2" printf '%s ... %s (%s)\n' "$(bold "$name")" "$(yellow SKIP)" "$reason" SKIPPED=$((SKIPPED+1)) SKIPPED_STEPS+=("$name: $reason") } assert_contains() { local label="$1" haystack="$2" needle="$3" printf '%s ... ' "$(bold "assert: $label")" if echo "$haystack" | grep -q -- "$needle"; then printf '%s\n' "$(green OK)" PASS=$((PASS+1)) else printf '%s\n' "$(red FAIL)" echo " expected to find: $needle" echo " in:" echo "$haystack" | sed 's/^/ /' | head -20 FAIL=$((FAIL+1)) FAILED_STEPS+=("assert: $label") fi } section() { printf '\n%s\n' "$(bold "== $1 ==")" } # --- auth --- section "auth" step "auth status" "$GVERSE" auth status step_capture WHOAMI "auth whoami (json)" "$GVERSE" --json auth whoami USERNAME="$(echo "$WHOAMI" | sed -n 's/.*"login":[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)" if [ -z "$USERNAME" ]; then echo "$(red FATAL): could not determine username from whoami output" echo "$WHOAMI" | head -20 exit 1 fi echo " resolved username: $(bold "$USERNAME")" REPO_NAME="$SUFFIX" REPO="$USERNAME/$REPO_NAME" # --- users --- section "users" step "users view self" "$GVERSE" users view "$USERNAME" step "users search self" "$GVERSE" users search "$USERNAME" --limit 5 # --- emails --- section "emails" step "emails list" "$GVERSE" emails list # --- repo create --- section "repos: create + view + edit" step "repos create" "$GVERSE" repos create "$REPO_NAME" --description "gverse e2e test" --auto-init step "repos view" "$GVERSE" repos view "$REPO" step "repos languages" "$GVERSE" repos languages "$REPO" step "repos edit description" "$GVERSE" repos edit "$REPO" --description "gverse e2e test (edited)" step "repos list (own)" "$GVERSE" repos list --limit 5 # --- branches / commits / refs / trees --- section "branches / commits / refs / trees" step_capture BRANCHES "branches list" "$GVERSE" --json branches list "$REPO" step_capture COMMITS "commits list" "$GVERSE" --json commits list "$REPO" --limit 5 # Pull a commit sha + tree sha FIRST_SHA="$(echo "$COMMITS" | sed -n 's/.*"sha":[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)" if [ -n "$FIRST_SHA" ]; then step "commits view" "$GVERSE" commits view "$REPO" "$FIRST_SHA" step_capture COMMIT_VIEW "commits view (json)" "$GVERSE" --json commits view "$REPO" "$FIRST_SHA" TREE_SHA="$(echo "$COMMIT_VIEW" | sed -n 's/.*"tree":[[:space:]]*{[^}]*"sha":[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)" if [ -n "$TREE_SHA" ]; then step "trees get" "$GVERSE" trees get "$REPO" "$TREE_SHA" else skip "trees get" "no tree sha in commit response" fi else skip "commits view" "no commit sha found" skip "trees get" "no commit sha found" fi BRANCH="$(echo "$BRANCHES" | sed -n 's/.*"name":[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)" if [ -n "$BRANCH" ]; then step "refs get" "$GVERSE" refs get "$REPO" "heads/$BRANCH" step "refs matching" "$GVERSE" refs matching "$REPO" "heads/" else skip "refs get" "no branch found" skip "refs matching" "no branch found" fi # --- contents --- section "contents: put / get / delete" CONTENT="hello gverse $TS" step "contents put new file" "$GVERSE" contents put "$REPO" "e2e.txt" --message "add e2e.txt" --content "$CONTENT" step_capture GET_JSON "contents get (raw json)" "$GVERSE" --json contents get "$REPO" "e2e.txt" FILE_SHA="$(echo "$GET_JSON" | sed -n 's/.*"sha":[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)" step_capture GET_DECODED "contents get --decode" "$GVERSE" contents get "$REPO" "e2e.txt" --decode assert_contains "decoded content matches" "$GET_DECODED" "$CONTENT" if [ -n "$FILE_SHA" ]; then step "contents delete" "$GVERSE" contents delete "$REPO" "e2e.txt" --message "remove e2e.txt" --sha "$FILE_SHA" --yes else skip "contents delete" "no sha returned from get" fi # --- stars --- section "stars" step "stars add" "$GVERSE" stars add "$REPO" step "stars check" "$GVERSE" stars check "$REPO" step "stars list" "$GVERSE" stars list --limit 5 step "stars remove" "$GVERSE" stars remove "$REPO" --yes # --- webhooks --- section "webhooks" step_capture HOOK_JSON "webhooks create" "$GVERSE" --json webhooks create "$REPO" \ --url "https://example.com/hook-$TS" \ --events "push,pull_request" \ --active HOOK_ID="$(echo "$HOOK_JSON" | sed -n 's/.*"id":[[:space:]]*\([0-9]*\).*/\1/p' | head -1)" step "webhooks list" "$GVERSE" webhooks list "$REPO" if [ -n "$HOOK_ID" ]; then step "webhooks view" "$GVERSE" webhooks view "$REPO" "$HOOK_ID" step "webhooks delete" "$GVERSE" webhooks delete "$REPO" "$HOOK_ID" --yes else skip "webhooks view" "no hook id returned" skip "webhooks delete" "no hook id returned" fi # --- releases --- section "releases" TAG="v0.0.1-e2e-$TS" step_capture REL_JSON "releases create" "$GVERSE" --json releases create "$REPO" \ --tag-name "$TAG" \ --name "e2e release $TS" \ --body "auto-generated by e2e.sh" REL_ID="$(echo "$REL_JSON" | sed -n 's/.*"id":[[:space:]]*\([0-9]*\).*/\1/p' | head -1)" step "releases list" "$GVERSE" releases list "$REPO" step "releases view-tag" "$GVERSE" releases view-tag "$REPO" "$TAG" if [ -n "$REL_ID" ]; then step "releases view" "$GVERSE" releases view "$REPO" "$REL_ID" # asset upload ASSET_FILE="$OUT_DIR/asset.txt" echo "asset payload $TS" >"$ASSET_FILE" step_capture UP_JSON "releases asset upload" "$GVERSE" --json releases asset upload "$REPO" "$REL_ID" "$ASSET_FILE" ASSET_ID="$(echo "$UP_JSON" | sed -n 's/.*"id":[[:space:]]*\([0-9]*\).*/\1/p' | head -1)" step "releases asset list" "$GVERSE" releases asset list "$REPO" "$REL_ID" if [ -n "$ASSET_ID" ]; then step "releases asset delete" "$GVERSE" releases asset delete "$REPO" "$REL_ID" "$ASSET_ID" --yes else skip "releases asset delete" "no asset id returned" fi step "releases delete" "$GVERSE" releases delete "$REPO" "$REL_ID" --yes else skip "releases view" "no release id returned" skip "releases asset upload" "no release id returned" skip "releases asset list" "no release id returned" skip "releases asset delete" "no release id returned" skip "releases delete" "no release id returned" fi # --- issues (read only) --- section "issues (read)" step "issues list" "$GVERSE" issues list "$REPO" # --- pulls (read only) --- section "pulls (read)" step "pulls list" "$GVERSE" pulls list "$REPO" # --- output format sanity --- section "format flags" step "table output is non-empty" bash -c "'$GVERSE' repos view '$REPO' | grep -q ." step "json output parses" bash -c "'$GVERSE' --json repos view '$REPO' | python3 -c 'import sys, json; json.load(sys.stdin)'" # --- cleanup: delete repo --- section "cleanup" step "repos delete" "$GVERSE" repos delete "$REPO" --yes # --- summary --- printf '\n%s\n' "$(bold '== summary ==')" printf ' passed: %s\n' "$(green "$PASS")" printf ' failed: %s\n' "$(red "$FAIL")" printf ' skipped: %s\n' "$(yellow "$SKIPPED")" if [ "$FAIL" -gt 0 ]; then echo echo " failed steps:" for s in "${FAILED_STEPS[@]}"; do echo " - $s"; done fi if [ "$SKIPPED" -gt 0 ]; then echo echo " skipped steps:" for s in "${SKIPPED_STEPS[@]}"; do echo " - $s"; done fi exit "$FAIL"