Skip to content

feat: generic scope-aware module loader + provisioning handler refactor #106

feat: generic scope-aware module loader + provisioning handler refactor

feat: generic scope-aware module loader + provisioning handler refactor #106

Workflow file for this run

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