mirror of
https://github.com/RayLabsHQ/gitea-mirror.git
synced 2026-03-14 06:23:01 +03:00
* feat: add E2E testing infrastructure with fake GitHub, Playwright, and CI workflow - Add fake GitHub API server (tests/e2e/fake-github-server.ts) with management API for seeding test data - Add Playwright E2E test suite covering full mirror workflow: service health checks, user registration, config, sync, verify - Add Docker Compose for E2E Gitea instance - Add orchestrator script (run-e2e.sh) with cleanup - Add GitHub Actions workflow (e2e-tests.yml) with Gitea service container - Make GITHUB_API_URL configurable via env var for testing - Add npm scripts: test:e2e, test:e2e:ci, test:e2e:keep, test:e2e:cleanup * feat: add real git repos + backup config testing to E2E suite - Create programmatic test git repos (create-test-repos.ts) with real commits, branches (main, develop, feature/*), and tags (v1.0.0, v1.1.0) - Add git-server container to docker-compose serving bare repos via dumb HTTP protocol so Gitea can actually clone them - Update fake GitHub server to emit reachable clone_url fields pointing to the git-server container (configurable via GIT_SERVER_URL env var) - Add management endpoint POST /___mgmt/set-clone-url for runtime config - Update E2E spec with real mirroring verification: * Verify repos appear in Gitea with actual content * Check branches, tags, commits, file content * Verify 4/4 repos mirrored successfully - Add backup configuration test suite: * Enable/disable backupBeforeSync config * Toggle blockSyncOnBackupFailure * Trigger re-sync with backup enabled and verify activities * Verify config persistence across changes - Update CI workflow to use docker compose (not service containers) matching the local run-e2e.sh approach - Update cleanup.sh for git-repos directory and git-server port - All 22 tests passing with real git content verification * refactor: split E2E tests into focused files + add force-push tests Split the monolithic e2e.spec.ts (1335 lines) into 5 focused spec files and a shared helpers module: helpers.ts — constants, GiteaAPI, auth, saveConfig, utilities 01-health.spec.ts — service health checks (4 tests) 02-mirror-workflow.spec.ts — full first-mirror journey (8 tests) 03-backup.spec.ts — backup config toggling (6 tests) 04-force-push.spec.ts — force-push simulation & backup verification (9 tests) 05-sync-verification.spec.ts — dynamic repos, content integrity, reset (5 tests) The force-push tests are the critical addition: F0: Record original state (commit SHAs, file content) F1: Rewrite source repo history (simulate force-push) F2: Sync to Gitea WITHOUT backup F3: Verify data loss — LICENSE file gone, README overwritten F4: Restore source, re-mirror to clean state F5: Enable backup, force-push again, sync through app F6: Verify Gitea reflects the force-push F7: Verify backup system was invoked (snapshot activities logged) F8: Restore source repo for subsequent tests Also added to helpers.ts: - GiteaAPI.getBranch(), .getCommit(), .triggerMirrorSync() - getRepositoryIds(), triggerMirrorJobs(), triggerSyncRepo() All 32 tests passing. * Try to fix actions * Try to fix the other action * Add debug info to check why e2e action is failing * More debug info * Even more debug info * E2E fix attempt #1 * E2E fix attempt #2 * more debug again * E2E fix attempt #3 * E2E fix attempt #4 * Remove a bunch of debug info * Hopefully fix backup bug * Force backups to succeed
142 lines
6.6 KiB
Bash
Executable File
142 lines
6.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ────────────────────────────────────────────────────────────────────────────────
|
|
# E2E Cleanup Script
|
|
# Removes all temporary data from previous E2E test runs.
|
|
#
|
|
# Usage:
|
|
# ./tests/e2e/cleanup.sh # cleanup everything
|
|
# ./tests/e2e/cleanup.sh --soft # keep container images, only remove volumes/data
|
|
# ────────────────────────────────────────────────────────────────────────────────
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.e2e.yml"
|
|
|
|
SOFT_CLEAN=false
|
|
if [[ "${1:-}" == "--soft" ]]; then
|
|
SOFT_CLEAN=true
|
|
fi
|
|
|
|
# Detect container runtime (podman or docker)
|
|
if command -v podman-compose &>/dev/null; then
|
|
COMPOSE_CMD="podman-compose"
|
|
CONTAINER_CMD="podman"
|
|
elif command -v docker-compose &>/dev/null; then
|
|
COMPOSE_CMD="docker-compose"
|
|
CONTAINER_CMD="docker"
|
|
elif command -v docker &>/dev/null && docker compose version &>/dev/null 2>&1; then
|
|
COMPOSE_CMD="docker compose"
|
|
CONTAINER_CMD="docker"
|
|
else
|
|
echo "[cleanup] WARNING: No container compose tool found. Skipping container cleanup."
|
|
COMPOSE_CMD=""
|
|
CONTAINER_CMD=""
|
|
fi
|
|
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
|
echo "║ E2E Test Cleanup ║"
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# ── 1. Stop and remove containers ─────────────────────────────────────────────
|
|
if [[ -n "$COMPOSE_CMD" ]] && [[ -f "$COMPOSE_FILE" ]]; then
|
|
echo "[cleanup] Stopping E2E containers..."
|
|
$COMPOSE_CMD -f "$COMPOSE_FILE" down --volumes --remove-orphans 2>/dev/null || true
|
|
echo "[cleanup] ✓ Containers stopped and removed"
|
|
else
|
|
echo "[cleanup] ⊘ No compose file or runtime found, skipping container teardown"
|
|
fi
|
|
|
|
# ── 2. Remove named volumes created by E2E compose ───────────────────────────
|
|
if [[ -n "$CONTAINER_CMD" ]]; then
|
|
for vol in e2e-gitea-data; do
|
|
full_vol_name="e2e_${vol}"
|
|
# Try both with and without the project prefix
|
|
for candidate in "$vol" "$full_vol_name" "tests_e2e_${vol}"; do
|
|
if $CONTAINER_CMD volume inspect "$candidate" &>/dev/null 2>&1; then
|
|
echo "[cleanup] Removing volume: $candidate"
|
|
$CONTAINER_CMD volume rm -f "$candidate" 2>/dev/null || true
|
|
fi
|
|
done
|
|
done
|
|
echo "[cleanup] ✓ Named volumes cleaned"
|
|
fi
|
|
|
|
# ── 3. Kill leftover background processes from previous runs ──────────────────
|
|
echo "[cleanup] Checking for leftover processes..."
|
|
|
|
# Kill fake GitHub server
|
|
if pgrep -f "fake-github-server" &>/dev/null; then
|
|
echo "[cleanup] Killing leftover fake-github-server process(es)..."
|
|
pkill -f "fake-github-server" 2>/dev/null || true
|
|
fi
|
|
|
|
# Kill any stray node/tsx processes on our E2E ports (including git-server on 4590)
|
|
for port in 4580 4590 4321 3333; do
|
|
pid=$(lsof -ti :"$port" 2>/dev/null || true)
|
|
if [[ -n "$pid" ]]; then
|
|
echo "[cleanup] Killing process on port $port (PID: $pid)..."
|
|
kill -9 $pid 2>/dev/null || true
|
|
fi
|
|
done
|
|
|
|
echo "[cleanup] ✓ Leftover processes cleaned"
|
|
|
|
# ── 4. Remove E2E database and data files ─────────────────────────────────────
|
|
echo "[cleanup] Removing E2E data files..."
|
|
|
|
# Remove test databases
|
|
rm -f "$PROJECT_ROOT/gitea-mirror.db" 2>/dev/null || true
|
|
rm -f "$PROJECT_ROOT/data/gitea-mirror.db" 2>/dev/null || true
|
|
rm -f "$PROJECT_ROOT/e2e-gitea-mirror.db" 2>/dev/null || true
|
|
|
|
# Remove test backup data
|
|
rm -rf "$PROJECT_ROOT/data/repo-backups"* 2>/dev/null || true
|
|
|
|
# Remove programmatically created test git repositories
|
|
if [[ -d "$SCRIPT_DIR/git-repos" ]]; then
|
|
echo "[cleanup] Removing test git repos..."
|
|
rm -rf "$SCRIPT_DIR/git-repos" 2>/dev/null || true
|
|
echo "[cleanup] ✓ Test git repos removed"
|
|
fi
|
|
|
|
# Remove Playwright state/artifacts from previous runs
|
|
rm -rf "$SCRIPT_DIR/test-results" 2>/dev/null || true
|
|
rm -rf "$SCRIPT_DIR/playwright-report" 2>/dev/null || true
|
|
rm -rf "$SCRIPT_DIR/.auth" 2>/dev/null || true
|
|
rm -f "$SCRIPT_DIR/e2e-storage-state.json" 2>/dev/null || true
|
|
|
|
# Remove any PID files we might have created
|
|
rm -f "$SCRIPT_DIR/.fake-github.pid" 2>/dev/null || true
|
|
rm -f "$SCRIPT_DIR/.app.pid" 2>/dev/null || true
|
|
|
|
echo "[cleanup] ✓ Data files cleaned"
|
|
|
|
# ── 5. Remove temp directories ────────────────────────────────────────────────
|
|
echo "[cleanup] Removing temp directories..."
|
|
rm -rf /tmp/gitea-mirror-backup-* 2>/dev/null || true
|
|
rm -rf /tmp/e2e-gitea-mirror-* 2>/dev/null || true
|
|
echo "[cleanup] ✓ Temp directories cleaned"
|
|
|
|
# ── 6. Optionally remove container images ─────────────────────────────────────
|
|
if [[ "$SOFT_CLEAN" == false ]] && [[ -n "$CONTAINER_CMD" ]]; then
|
|
echo "[cleanup] Pruning dangling images..."
|
|
$CONTAINER_CMD image prune -f 2>/dev/null || true
|
|
echo "[cleanup] ✓ Dangling images pruned"
|
|
else
|
|
echo "[cleanup] ⊘ Skipping image cleanup (soft mode)"
|
|
fi
|
|
|
|
# ── 7. Remove node_modules/.cache artifacts from E2E ──────────────────────────
|
|
if [[ -d "$PROJECT_ROOT/node_modules/.cache/playwright" ]]; then
|
|
echo "[cleanup] Removing Playwright cache..."
|
|
rm -rf "$PROJECT_ROOT/node_modules/.cache/playwright" 2>/dev/null || true
|
|
echo "[cleanup] ✓ Playwright cache removed"
|
|
fi
|
|
|
|
echo ""
|
|
echo "═══════════════════════════════════════════════════════════════"
|
|
echo " ✅ E2E cleanup complete"
|
|
echo "═══════════════════════════════════════════════════════════════"
|