const TEST_RESULTS_DIR = "../test-results/server"; export const E2E_GLOBAL_CHANGE_PATHS = Object.freeze([ ".github/workflows/ci.yml", ".github/workflows/e2e.yml", ".github/workflows/e2e-runner.yml", "Dockerfile", "docker-compose*.yml", "docker/**", ]); const SHARED_DB_AND_HELPER_PATHS = Object.freeze([ "server/src/db/schema/**", "scripts/e2e/**", "scripts/db/**", ]); const SHARED_AUTH_TYPE_PATHS = Object.freeze(["packages/types/src/auth.ts", "packages/types/src/permissions.ts"]); const SHARED_TYPES_PATHS = Object.freeze(["packages/types/src/**"]); export const E2E_SUITES = Object.freeze({ "guard-mechanics": { id: "guard-mechanics", name: "Guard Mechanics", timeout: 30, lane: "smoke", description: "Guard mechanics suite - verifies @Public/@RequirePermission wiring without a real DB", vitestTarget: "test/guard-mechanics.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/guard-mechanics-e2e-junit.xml`, prepareDedicatedDatabase: false, useDedicatedDatabase: false, changedPaths: [ "server/src/common/guards/**", "server/src/common/decorators/**", "server/src/common/types/**", "server/src/modules/auth/**", "server/src/modules/user/**", "server/src/modules/role/**", "server/src/**", "server/test/guard-mechanics.e2e-spec.ts", "server/test/e2e/**", ...SHARED_AUTH_TYPE_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "scanner-scenarios": { id: "scanner-scenarios", name: "Scanner Scenarios", timeout: 45, lane: "full", description: "Scanner scenario matrix", vitestTarget: "test/scanner-scenarios.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/scanner-scenarios-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/scanner/**", "server/test/scanner-scenarios.e2e-spec.ts", "server/test/e2e/scanner/**", ".github/workflows/e2e-runner.yml", ...SHARED_DB_AND_HELPER_PATHS, ], }, "scanner-file-operations": { id: "scanner-file-operations", name: "Scanner File Operations", timeout: 60, lane: "full", description: "Scanner file operation matrix", vitestTarget: "test/scanner-file-operations.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/scanner-file-operations-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/scanner/**", "server/test/scanner-file-operations.e2e-spec.ts", "server/test/e2e/scanner/**", ".github/workflows/e2e-runner.yml", ...SHARED_DB_AND_HELPER_PATHS, ], }, "auth-session-security": { id: "auth-session-security", name: "Auth Session Security", timeout: 50, lane: "full", description: "Auth session security suite", vitestTarget: "test/auth-session-security.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/auth-session-security-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/auth/**", "server/src/modules/user/**", "server/src/modules/role/**", "server/src/common/guards/**", "server/src/common/decorators/**", "server/src/common/types/**", "server/test/auth-session-security.e2e-spec.ts", "server/test/e2e/app-harness.ts", ".github/workflows/e2e-runner.yml", ...SHARED_AUTH_TYPE_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "auth-recovery-oidc-logout": { id: "auth-recovery-oidc-logout", name: "Auth Recovery OIDC Logout", timeout: 50, lane: "full", description: "Auth recovery and OIDC logout suite", vitestTarget: "test/auth-recovery-oidc-logout.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/auth-recovery-oidc-logout-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/auth/**", "server/src/modules/user/**", "server/src/modules/email/**", "server/src/modules/metadata/**", "server/test/auth-recovery-oidc-logout.e2e-spec.ts", "server/test/e2e/app-harness.ts", ".github/workflows/e2e-runner.yml", "packages/types/src/auth.ts", ...SHARED_DB_AND_HELPER_PATHS, ], }, "book-bucket-ingest-finalize": { id: "book-bucket-ingest-finalize", name: "Book Bucket Ingest Finalize", timeout: 45, lane: "full", description: "Book Bucket ingest and finalize suite", vitestTarget: "test/book-bucket-ingest-finalize.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/book-bucket-ingest-finalize-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/book-bucket/**", "server/src/modules/upload/**", "server/src/modules/metadata/**", "server/test/book-bucket-ingest-finalize.e2e-spec.ts", "server/test/e2e/book-bucket/**", ...SHARED_DB_AND_HELPER_PATHS, ], }, "metadata-write": { id: "metadata-write", name: "Metadata Write", timeout: 60, lane: "full", description: "Metadata write operations suite", vitestTarget: "test/metadata-write.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/metadata-write-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/book/**", "server/src/modules/library/**", "server/src/modules/file-write/**", "server/src/modules/metadata/**", "server/src/modules/app-settings/**", "server/test/metadata-write.e2e-spec.ts", "server/test/e2e/metadata-write/**", "packages/types/src/file-write.ts", ...SHARED_DB_AND_HELPER_PATHS, ], }, "metadata-lock": { id: "metadata-lock", name: "Metadata Lock", timeout: 60, lane: "full", description: "Metadata lock end-to-end suite", vitestTarget: "test/metadata-lock.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/metadata-lock-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/book/**", "server/src/modules/book-metadata-lock/**", "server/src/modules/book-metadata-fetch/**", "server/src/modules/metadata-fetch/**", "server/src/modules/metadata-preferences/**", "server/src/modules/cover/**", "server/src/modules/scanner/**", "server/src/modules/library/**", "server/src/modules/auth/**", "server/src/modules/app-settings/**", "server/test/metadata-lock.e2e-spec.ts", "server/test/e2e/metadata-lock/**", ".github/workflows/e2e-runner.yml", ...SHARED_TYPES_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "migration-booklore": { id: "migration-booklore", name: "Migration Booklore", timeout: 70, lane: "full", description: "Booklore migration end-to-end suite", vitestTarget: "test/migration-booklore.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/migration-booklore-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/migration/**", "server/test/migration-booklore.e2e-spec.ts", "server/test/e2e/migration-booklore/**", ".github/workflows/e2e-runner.yml", ...SHARED_DB_AND_HELPER_PATHS, ], }, "authorization-matrix": { id: "authorization-matrix", name: "Authorization Matrix", timeout: 60, lane: "full", description: "Authorization matrix suite", vitestTarget: "test/authorization-matrix.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/authorization-matrix-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/**", "server/test/authorization-matrix.e2e-spec.ts", "server/test/e2e/authorization-matrix/**", ".github/workflows/e2e-runner.yml", ...SHARED_TYPES_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "book-api-contract": { id: "book-api-contract", name: "Book API Contract", timeout: 60, lane: "full", description: "Book API contract suite", vitestTarget: "test/book-api-contract.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/book-api-contract-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/book/**", "server/src/modules/library/**", "server/src/modules/collection/**", "server/src/modules/auth/**", "server/src/modules/user/**", "server/test/book-api-contract.e2e-spec.ts", "server/test/e2e/book-api-contract/**", ...SHARED_TYPES_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "app-settings-oidc-contract": { id: "app-settings-oidc-contract", name: "App Settings OIDC Contract", timeout: 60, lane: "full", description: "App settings OIDC contract suite", vitestTarget: "test/app-settings-oidc-contract.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/app-settings-oidc-contract-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/app-settings/**", "server/src/modules/auth/**", "server/src/modules/user/**", "server/src/modules/metadata/**", "server/test/app-settings-oidc-contract.e2e-spec.ts", "server/test/e2e/app-settings/**", ...SHARED_TYPES_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "library-admin-workflows": { id: "library-admin-workflows", name: "Library Admin Workflows", timeout: 60, lane: "full", description: "Library admin workflows suite", vitestTarget: "test/library-admin-workflows.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/library-admin-workflows-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/library/**", "server/src/modules/auth/**", "server/src/modules/user/**", "server/src/modules/role/**", "server/test/library-admin-workflows.e2e-spec.ts", "server/test/e2e/library/**", ...SHARED_TYPES_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "reader-format-delivery": { id: "reader-format-delivery", name: "Reader Format Delivery", timeout: 60, lane: "full", description: "Reader format delivery suite", vitestTarget: "test/reader-format-delivery.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/reader-format-delivery-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/book/**", "server/src/modules/library/**", "server/src/modules/reader-preferences/**", "server/src/modules/annotation/**", "server/src/modules/bookmark/**", "server/test/reader-format-delivery.e2e-spec.ts", "server/test/e2e/reader-format-delivery/**", "packages/types/src/reader-settings.ts", ...SHARED_DB_AND_HELPER_PATHS, ], }, "opds-auth-catalog": { id: "opds-auth-catalog", name: "OPDS Auth Catalog", timeout: 45, lane: "full", description: "OPDS auth and catalog suite", vitestTarget: "test/opds-auth-catalog.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/opds-auth-catalog-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/opds/**", "server/src/modules/book/**", "server/src/modules/library/**", "server/src/modules/collection/**", "server/src/modules/lens/**", "server/src/modules/user/**", "server/src/modules/auth/**", "server/src/modules/app-settings/**", "server/test/opds-auth-catalog.e2e-spec.ts", "server/test/e2e/opds/**", "server/test/e2e/**", ".github/workflows/e2e-runner.yml", ...SHARED_TYPES_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "email-lifecycle": { id: "email-lifecycle", name: "Email Lifecycle", timeout: 45, lane: "full", description: "Email lifecycle suite", vitestTarget: "test/email-lifecycle.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/email-lifecycle-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/email/**", "server/src/modules/book/**", "server/src/modules/library/**", "server/src/modules/auth/**", "server/src/modules/cover/**", "server/src/modules/scanner/**", "server/src/modules/seed/**", "server/test/email-lifecycle.e2e-spec.ts", "server/test/e2e/email/**", "server/test/e2e/**", "client/src/features/email/**", "client/src/router/index.ts", "client/src/features/settings/SettingsHeader.vue", "client/src/views/HomeView.vue", "client/src/views/CollectionView.vue", "client/src/views/LensView.vue", "client/src/features/book/components/BookCoverCard.vue", "client/src/features/book/components/BookListRow.vue", ...SHARED_TYPES_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, "reader-state-isolation": { id: "reader-state-isolation", name: "Reader State Isolation", timeout: 45, lane: "full", description: "Reader state isolation suite", vitestTarget: "test/reader-state-isolation.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/reader-state-isolation-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/bookmark/**", "server/src/modules/annotation/**", "server/src/modules/reader-preferences/**", "server/src/modules/reading-session/**", "server/src/modules/book/**", "server/src/modules/library/**", "server/src/modules/scanner/**", "server/src/modules/user-book-status/**", "server/src/scripts/db-prepare-e2e.ts", "server/test/reader-state-isolation.e2e-spec.ts", "server/test/e2e/reader-state-isolation/**", "packages/types/src/reader-settings.ts", ...SHARED_DB_AND_HELPER_PATHS, ], }, "users-admin-lifecycle": { id: "users-admin-lifecycle", name: "Users Admin Lifecycle", timeout: 50, lane: "full", description: "Users admin lifecycle suite", vitestTarget: "test/users-admin-lifecycle.e2e-spec.ts", junitOutput: `${TEST_RESULTS_DIR}/users-admin-lifecycle-e2e-junit.xml`, prepareDedicatedDatabase: true, useDedicatedDatabase: true, changedPaths: [ "server/src/modules/user/**", "server/src/modules/auth/**", "server/src/common/guards/**", "server/src/common/decorators/**", "server/src/common/types/**", "server/test/users-admin-lifecycle.e2e-spec.ts", "server/test/e2e/users-admin-lifecycle/**", ".github/workflows/e2e-runner.yml", ...SHARED_AUTH_TYPE_PATHS, ...SHARED_DB_AND_HELPER_PATHS, ], }, }); export function listE2ESuites() { return Object.values(E2E_SUITES); } export function getE2ESuite(suiteId) { return E2E_SUITES[suiteId] ?? null; }