feat: generic scope-aware module loader + provisioning handler refactor #106
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Tests | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| workflow_dispatch: {} | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| # --------------------------------------------------------------------------- | |
| # Build-once, test-many architecture (modeled after constructive-db). | |
| # | |
| # Phase 1 – build: single job installs deps + builds the monorepo once. | |
| # Phase 2 – fan-out: test jobs download the build artifact and run tests. | |
| # | |
| # Jobs that need PostgreSQL (pgpm-deploy, functions-test) spin up a | |
| # postgres-plus service container and bootstrap pgpm roles. | |
| # --------------------------------------------------------------------------- | |
| env: | |
| PGPM_VERSION: '4.7.4' | |
| jobs: | |
| # ========================================================================= | |
| # BUILD (single job — runs once, shared by all test jobs) | |
| # ========================================================================= | |
| build: | |
| if: github.event.pull_request.draft != true | |
| name: Build & Lint | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v6 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Generate function packages | |
| run: node --experimental-strip-types scripts/generate.ts | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Build | |
| run: pnpm build | |
| - name: Lint | |
| run: pnpm lint | |
| - name: Create build archive | |
| run: tar -czf /tmp/workspace.tar.gz --exclude='.git' --exclude='node_modules' . | |
| - name: Upload workspace | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: workspace-build | |
| path: /tmp/workspace.tar.gz | |
| retention-days: 1 | |
| # ========================================================================= | |
| # UNIT TESTS (no database needed) | |
| # ========================================================================= | |
| unit: | |
| needs: build | |
| name: Unit tests | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v6 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Run unit tests | |
| run: pnpm test:unit | |
| # ========================================================================= | |
| # INTEGRATION TESTS (no database needed) | |
| # ========================================================================= | |
| integration: | |
| needs: build | |
| name: Integration tests | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v6 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Run integration tests | |
| run: pnpm test:integration | |
| # ========================================================================= | |
| # TOOLKIT TESTS (no database needed) | |
| # ========================================================================= | |
| toolkit: | |
| needs: build | |
| name: Toolkit package tests | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v6 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Run toolkit tests | |
| run: | | |
| pnpm --filter @constructive-io/fn-generator test | |
| pnpm --filter @constructive-io/fn-client test | |
| pnpm --filter @constructive-io/fn-cli test | |
| # ========================================================================= | |
| # FN INIT E2E (no database needed) | |
| # ========================================================================= | |
| fn-init-e2e: | |
| needs: build | |
| name: fn init end-to-end | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v6 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Binary integration test | |
| run: pnpm exec jest tests/integration/fn-init.test.ts | |
| # ========================================================================= | |
| # PGPM DEPLOY TEST (needs PostgreSQL) | |
| # ========================================================================= | |
| pgpm-deploy: | |
| needs: build | |
| name: pgpm deploy test | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| env: | |
| PGHOST: localhost | |
| PGPORT: 5432 | |
| PGUSER: postgres | |
| PGPASSWORD: password | |
| services: | |
| pg_db: | |
| image: constructiveio/postgres-plus:18 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: password | |
| options: >- | |
| --health-cmd "pg_isready -U postgres" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v6 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Cache pgpm CLI | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.npm | |
| key: pgpm-${{ runner.os }}-${{ env.PGPM_VERSION }} | |
| - name: Install pgpm CLI | |
| run: npm install -g pgpm@${{ env.PGPM_VERSION }} | |
| - name: Seed pg users | |
| run: pgpm admin-users bootstrap --yes | |
| - name: Run pgpm full-cycle test (deploy/verify/revert/deploy) | |
| run: pgpm test-packages --full-cycle --exclude constructive-infra-services,constructive-infra-seed | |
| # ========================================================================= | |
| # FUNCTIONS-TEST (needs PostgreSQL + pgpm) | |
| # ========================================================================= | |
| functions-test: | |
| needs: build | |
| name: functions-test framework | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| env: | |
| PGHOST: localhost | |
| PGPORT: 5432 | |
| PGUSER: postgres | |
| PGPASSWORD: password | |
| services: | |
| pg_db: | |
| image: constructiveio/postgres-plus:18 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: password | |
| options: >- | |
| --health-cmd "pg_isready -U postgres" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v6 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Cache pgpm CLI | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.npm | |
| key: pgpm-${{ runner.os }}-${{ env.PGPM_VERSION }} | |
| - name: Install pgpm CLI | |
| run: npm install -g pgpm@${{ env.PGPM_VERSION }} | |
| - name: Seed pg users | |
| run: pgpm admin-users bootstrap --yes | |
| - name: Run functions-test suite | |
| run: pnpm --filter @constructive-io/functions-test exec jest --config jest.config.js --runInBand --verbose |