diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 93efccf2e1..de825d4e01 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -446,12 +446,29 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile if: ${{ !cancelled() }} - - name: Docker build - run: docker compose build + - name: Start Docker Compose + run: docker compose up -d --build --renew-anon-volumes --force-recreate --remove-orphans --wait --wait-timeout 300 if: ${{ !cancelled() }} - name: Run e2e tests (api & cli) + env: + VITEST_DISABLE_DOCKER_SETUP: true run: pnpm test if: ${{ !cancelled() }} + - name: Run e2e tests (maintenance) + env: + VITEST_DISABLE_DOCKER_SETUP: true + run: pnpm test:maintenance + if: ${{ !cancelled() }} + - name: Capture Docker logs + if: always() + run: docker compose logs --no-color > docker-compose-logs.txt + working-directory: ./e2e + - name: Archive Docker logs + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + if: always() + with: + name: e2e-server-docker-logs-${{ matrix.runner }} + path: e2e/docker-compose-logs.txt e2e-tests-web: name: End-to-End Tests (Web) needs: pre-job @@ -501,9 +518,8 @@ jobs: if: ${{ !cancelled() }} - name: Run e2e tests (web) env: - CI: true PLAYWRIGHT_DISABLE_WEBSERVER: true - run: npx playwright test --project=web + run: pnpm test:web if: ${{ !cancelled() }} - name: Archive e2e test (web) results uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 @@ -513,9 +529,8 @@ jobs: path: e2e/playwright-report/ - name: Run ui tests (web) env: - CI: true PLAYWRIGHT_DISABLE_WEBSERVER: true - run: npx playwright test --project=ui + run: pnpm test:web:ui if: ${{ !cancelled() }} - name: Archive ui test (web) results uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 @@ -525,9 +540,8 @@ jobs: path: e2e/playwright-report/ - name: Run maintenance tests env: - CI: true PLAYWRIGHT_DISABLE_WEBSERVER: true - run: npx playwright test --project=maintenance + run: pnpm test:web:maintenance if: ${{ !cancelled() }} - name: Archive maintenance tests (web) results uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 @@ -543,7 +557,7 @@ jobs: uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 if: always() with: - name: docker-compose-logs-${{ matrix.runner }} + name: e2e-web-docker-logs-${{ matrix.runner }} path: e2e/docker-compose-logs.txt success-check-e2e: name: End-to-End Tests Success diff --git a/e2e/package.json b/e2e/package.json index df9687e0a2..cebd9fafc2 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -7,8 +7,13 @@ "scripts": { "test": "vitest --run", "test:watch": "vitest", - "test:web": "npx playwright test", - "start:web": "npx playwright test --ui", + "test:maintenance": "vitest --run --config vitest.maintenance.config.ts", + "test:web": "npx playwright test --project=web", + "test:web:maintenance": "npx playwright test --project=maintenance", + "test:web:ui": "npx playwright test --project=ui", + "start:web": "npx playwright test --ui --project=web", + "start:web:maintenance": "npx playwright test --ui --project=maintenance", + "start:web:ui": "npx playwright test --ui --project=ui", "format": "prettier --check .", "format:fix": "prettier --write .", "lint": "eslint \"src/**/*.ts\" --max-warnings 0", diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts index 6dd8c10d25..040546b7bb 100644 --- a/e2e/playwright.config.ts +++ b/e2e/playwright.config.ts @@ -48,7 +48,7 @@ const config: PlaywrightTestConfig = { { name: 'maintenance', use: { ...devices['Desktop Chrome'] }, - testDir: './src/specs/maintenance', + testDir: './src/specs/maintenance/web', workers: 1, }, ], diff --git a/e2e/src/specs/server/api/database-backups.e2e-spec.ts b/e2e/src/specs/maintenance/server/database-backups.e2e-spec.ts similarity index 100% rename from e2e/src/specs/server/api/database-backups.e2e-spec.ts rename to e2e/src/specs/maintenance/server/database-backups.e2e-spec.ts diff --git a/e2e/src/specs/server/api/maintenance.e2e-spec.ts b/e2e/src/specs/maintenance/server/maintenance.e2e-spec.ts similarity index 100% rename from e2e/src/specs/server/api/maintenance.e2e-spec.ts rename to e2e/src/specs/maintenance/server/maintenance.e2e-spec.ts diff --git a/e2e/src/specs/maintenance/database-backups.e2e-spec.ts b/e2e/src/specs/maintenance/web/database-backups.e2e-spec.ts similarity index 100% rename from e2e/src/specs/maintenance/database-backups.e2e-spec.ts rename to e2e/src/specs/maintenance/web/database-backups.e2e-spec.ts diff --git a/e2e/src/specs/maintenance/maintenance.e2e-spec.ts b/e2e/src/specs/maintenance/web/maintenance.e2e-spec.ts similarity index 100% rename from e2e/src/specs/maintenance/maintenance.e2e-spec.ts rename to e2e/src/specs/maintenance/web/maintenance.e2e-spec.ts diff --git a/e2e/vitest.config.ts b/e2e/vitest.config.ts index 953273a930..1312bf9b75 100644 --- a/e2e/vitest.config.ts +++ b/e2e/vitest.config.ts @@ -1,15 +1,20 @@ import { defineConfig } from 'vitest/config'; -// skip `docker compose up` if `make e2e` was already run +const skipDockerSetup = process.env.VITEST_DISABLE_DOCKER_SETUP === 'true'; + +// skip `docker compose up` if `make e2e` was already run or if VITEST_DISABLE_DOCKER_SETUP is set const globalSetup: string[] = []; -try { - await fetch('http://127.0.0.1:2285/api/server/ping'); -} catch { - globalSetup.push('src/docker-compose.ts'); +if (!skipDockerSetup) { + try { + await fetch('http://127.0.0.1:2285/api/server/ping'); + } catch { + globalSetup.push('src/docker-compose.ts'); + } } export default defineConfig({ test: { + retry: process.env.CI ? 4 : 0, include: ['src/specs/server/**/*.e2e-spec.ts'], globalSetup, testTimeout: 15_000, diff --git a/e2e/vitest.maintenance.config.ts b/e2e/vitest.maintenance.config.ts new file mode 100644 index 0000000000..6bb6721a6d --- /dev/null +++ b/e2e/vitest.maintenance.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from 'vitest/config'; + +const skipDockerSetup = process.env.VITEST_DISABLE_DOCKER_SETUP === 'true'; + +// skip `docker compose up` if `make e2e` was already run or if VITEST_DISABLE_DOCKER_SETUP is set +const globalSetup: string[] = []; +if (!skipDockerSetup) { + try { + await fetch('http://127.0.0.1:2285/api/server/ping'); + } catch { + globalSetup.push('src/docker-compose.ts'); + } +} + +export default defineConfig({ + test: { + retry: process.env.CI ? 4 : 0, + include: ['src/specs/maintenance/server/**/*.e2e-spec.ts'], + globalSetup, + testTimeout: 15_000, + pool: 'threads', + poolOptions: { + threads: { + singleThread: true, + }, + }, + }, +});