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
124 lines
4.4 KiB
JSON
124 lines
4.4 KiB
JSON
{
|
|
"name": "gitea-mirror",
|
|
"type": "module",
|
|
"version": "3.9.6",
|
|
"engines": {
|
|
"bun": ">=1.2.9"
|
|
},
|
|
"scripts": {
|
|
"setup": "bun install && bun run manage-db init",
|
|
"dev": "bunx --bun astro dev",
|
|
"dev:clean": "bun run cleanup-db && bun run manage-db init && bunx --bun astro dev",
|
|
"build": "bunx --bun astro build",
|
|
"cleanup-db": "rm -f gitea-mirror.db data/gitea-mirror.db",
|
|
"manage-db": "bun scripts/manage-db.ts",
|
|
"init-db": "bun scripts/manage-db.ts init",
|
|
"check-db": "bun scripts/manage-db.ts check",
|
|
"fix-db": "bun scripts/manage-db.ts fix",
|
|
"reset-users": "bun scripts/manage-db.ts reset-users",
|
|
"reset-password": "bun scripts/manage-db.ts reset-password",
|
|
"db:generate": "bun drizzle-kit generate",
|
|
"db:migrate": "bun drizzle-kit migrate",
|
|
"db:push": "bun drizzle-kit push",
|
|
"db:pull": "bun drizzle-kit pull",
|
|
"db:check": "bun drizzle-kit check",
|
|
"db:studio": "bun drizzle-kit studio",
|
|
"startup-recovery": "bun scripts/startup-recovery.ts",
|
|
"startup-recovery-force": "bun scripts/startup-recovery.ts --force",
|
|
"startup-env-config": "bun scripts/startup-env-config.ts",
|
|
"test-recovery": "bun scripts/test-recovery.ts",
|
|
"test-recovery-cleanup": "bun scripts/test-recovery.ts --cleanup",
|
|
"test-shutdown": "bun scripts/test-graceful-shutdown.ts",
|
|
"test-shutdown-cleanup": "bun scripts/test-graceful-shutdown.ts --cleanup",
|
|
"preview": "bunx --bun astro preview",
|
|
"start": "bun dist/server/entry.mjs",
|
|
"start:fresh": "bun run cleanup-db && bun run manage-db init && bun dist/server/entry.mjs",
|
|
"test": "bun test",
|
|
"test:watch": "bun test --watch",
|
|
"test:coverage": "bun test --coverage",
|
|
"test:e2e": "bash tests/e2e/run-e2e.sh",
|
|
"test:e2e:ci": "bash tests/e2e/run-e2e.sh --ci",
|
|
"test:e2e:keep": "bash tests/e2e/run-e2e.sh --keep",
|
|
"test:e2e:cleanup": "bash tests/e2e/cleanup.sh",
|
|
"astro": "bunx --bun astro"
|
|
},
|
|
"overrides": {
|
|
"@esbuild-kit/esm-loader": "npm:tsx@^4.21.0",
|
|
"devalue": "^5.5.0"
|
|
},
|
|
"dependencies": {
|
|
"@astrojs/check": "^0.9.6",
|
|
"@astrojs/mdx": "4.3.13",
|
|
"@astrojs/node": "9.5.4",
|
|
"@astrojs/react": "^4.4.2",
|
|
"@better-auth/sso": "1.4.19",
|
|
"@octokit/plugin-throttling": "^11.0.3",
|
|
"@octokit/rest": "^22.0.1",
|
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
"@radix-ui/react-avatar": "^1.1.11",
|
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
"@radix-ui/react-collapsible": "^1.1.12",
|
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-hover-card": "^1.1.15",
|
|
"@radix-ui/react-label": "^2.1.8",
|
|
"@radix-ui/react-popover": "^1.1.15",
|
|
"@radix-ui/react-progress": "^1.1.8",
|
|
"@radix-ui/react-radio-group": "^1.3.8",
|
|
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
"@radix-ui/react-select": "^2.2.6",
|
|
"@radix-ui/react-separator": "^1.1.8",
|
|
"@radix-ui/react-slot": "^1.2.4",
|
|
"@radix-ui/react-switch": "^1.2.6",
|
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
"@tailwindcss/vite": "^4.2.1",
|
|
"@tanstack/react-virtual": "^3.13.19",
|
|
"@types/canvas-confetti": "^1.9.0",
|
|
"@types/react": "^19.2.14",
|
|
"@types/react-dom": "^19.2.3",
|
|
"astro": "^5.18.0",
|
|
"bcryptjs": "^3.0.3",
|
|
"better-auth": "1.4.19",
|
|
"buffer": "^6.0.3",
|
|
"canvas-confetti": "^1.9.4",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.1.1",
|
|
"dotenv": "^17.3.1",
|
|
"drizzle-orm": "^0.45.1",
|
|
"fuse.js": "^7.1.0",
|
|
"jsonwebtoken": "^9.0.3",
|
|
"lucide-react": "^0.575.0",
|
|
"nanoid": "^3.3.11",
|
|
"next-themes": "^0.4.6",
|
|
"react": "^19.2.4",
|
|
"react-dom": "^19.2.4",
|
|
"react-icons": "^5.5.0",
|
|
"sonner": "^2.0.7",
|
|
"tailwind-merge": "^3.5.0",
|
|
"tailwindcss": "^4.2.1",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^5.9.3",
|
|
"uuid": "^13.0.0",
|
|
"vaul": "^1.1.2",
|
|
"zod": "^4.3.6"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.58.2",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/bcryptjs": "^3.0.0",
|
|
"@types/bun": "^1.3.9",
|
|
"@types/jsonwebtoken": "^9.0.10",
|
|
"@types/node": "^25.3.2",
|
|
"@types/uuid": "^11.0.0",
|
|
"@vitejs/plugin-react": "^5.1.4",
|
|
"drizzle-kit": "^0.31.9",
|
|
"jsdom": "^28.1.0",
|
|
"tsx": "^4.21.0",
|
|
"vitest": "^4.0.18"
|
|
},
|
|
"packageManager": "bun@1.3.3"
|
|
}
|