diff --git a/.github/docker-compose.yml b/.github/docker-compose.yml index 4482ab6222..8ecbc6406e 100644 --- a/.github/docker-compose.yml +++ b/.github/docker-compose.yml @@ -2,15 +2,21 @@ version: '3.9' services: mysql: - image: mysql:5.7-debian + image: mysql:5.7 environment: - MYSQL_DATABASE=n8n - MYSQL_ROOT_PASSWORD=password ports: - 3306:3306 + ulimits: + nproc: 65535 + nofile: + soft: 26677 + hard: 46677 postgres: image: postgres:11 + restart: always environment: - POSTGRES_DB=n8n - POSTGRES_USER=root diff --git a/.github/workflows/ci-postgres-mysql.yml b/.github/workflows/ci-postgres-mysql.yml index 3d21953466..2e8465351e 100644 --- a/.github/workflows/ci-postgres-mysql.yml +++ b/.github/workflows/ci-postgres-mysql.yml @@ -9,45 +9,99 @@ on: - packages/cli/src/databases/migrations/** jobs: - test: + build: + name: Install & Build runs-on: ubuntu-latest - - timeout-minutes: 60 - - env: - DB_MYSQLDB_PASSWORD: password - DB_POSTGRESDB_PASSWORD: password - steps: - uses: actions/checkout@v3.5.3 - - uses: pnpm/action-setup@v2.4.0 - - uses: actions/setup-node@v3.7.0 with: node-version: 18.x cache: 'pnpm' + - run: pnpm install --frozen-lockfile - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Build Backend + run: pnpm --filter @n8n/client-oauth2 --filter n8n-workflow --filter n8n-core --filter n8n build - - name: Start MySQL & Postgres - uses: isbang/compose-action@v1.3.2 + - name: Cache build artifacts + uses: actions/cache/save@v3.3.1 + with: + path: ./packages/**/dist + key: ${{ github.sha }}:db-tests + + mysql: + name: MySQL + runs-on: ubuntu-latest + needs: build + timeout-minutes: 20 + env: + DB_MYSQLDB_PASSWORD: password + steps: + - uses: actions/checkout@v3.5.3 + - uses: pnpm/action-setup@v2.4.0 + - uses: actions/setup-node@v3.7.0 + with: + node-version: 18.x + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + + - name: Restore cached build artifacts + uses: actions/cache/restore@v3.3.1 + with: + path: ./packages/**/dist + key: ${{ github.sha }}:db-tests + + - name: Start MySQL + uses: isbang/compose-action@v1.5.1 with: compose-file: ./.github/docker-compose.yml - - - name: Build Core, Workflow, and CLI - run: pnpm --filter @n8n/client-oauth2 --filter n8n-workflow --filter n8n-core --filter n8n build + services: | + mysql - name: Test MySQL working-directory: packages/cli - run: DB_TABLE_PREFIX=test_ pnpm test:mysql + run: DB_TABLE_PREFIX=test_ pnpm test:mysql --runInBand + + postgres: + name: Postgres + runs-on: ubuntu-latest + needs: build + timeout-minutes: 20 + env: + DB_POSTGRESDB_PASSWORD: password + steps: + - uses: actions/checkout@v3.5.3 + - uses: pnpm/action-setup@v2.4.0 + - uses: actions/setup-node@v3.7.0 + with: + node-version: 18.x + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + + - name: Restore cached build artifacts + uses: actions/cache/restore@v3.3.1 + with: + path: ./packages/**/dist + key: ${{ github.sha }}:db-tests + + - name: Start Postgres + uses: isbang/compose-action@v1.5.1 + with: + compose-file: ./.github/docker-compose.yml + services: | + postgres - name: Test Postgres working-directory: packages/cli - run: DB_POSTGRESDB_SCHEMA=alt_schema DB_TABLE_PREFIX=test_ pnpm test:postgres + run: DB_POSTGRESDB_SCHEMA=alt_schema DB_TABLE_PREFIX=test_ pnpm test:postgres --runInBand - - name: Notify Slack on master failure + notify-on-failure: + name: Notify Slack on failure + runs-on: ubuntu-latest + needs: [mysql, postgres] + steps: + - name: Notify Slack on failure uses: act10ns/slack@v2.0.0 if: failure() && github.ref == 'refs/heads/master' with: diff --git a/jest.config.js b/jest.config.js index 7752aecad0..a4c416f152 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,6 @@ const { compilerOptions } = require('./tsconfig.json'); +/** @type {import('ts-jest').TsJestGlobalOptions} */ const tsJestOptions = { isolatedModules: true, tsconfig: { diff --git a/packages/cli/test/integration/credentials.test.ts b/packages/cli/test/integration/credentials.test.ts index 526d3bb28c..b62f0e9cab 100644 --- a/packages/cli/test/integration/credentials.test.ts +++ b/packages/cli/test/integration/credentials.test.ts @@ -124,12 +124,10 @@ describe('POST /credentials', () => { }); test('should fail with invalid inputs', async () => { - await Promise.all( - INVALID_PAYLOADS.map(async (invalidPayload) => { - const response = await authOwnerAgent.post('/credentials').send(invalidPayload); - expect(response.statusCode).toBe(400); - }), - ); + for (const invalidPayload of INVALID_PAYLOADS) { + const response = await authOwnerAgent.post('/credentials').send(invalidPayload); + expect(response.statusCode).toBe(400); + } }); test('should fail with missing encryption key', async () => { @@ -370,18 +368,16 @@ describe('PATCH /credentials/:id', () => { test('should fail with invalid inputs', async () => { const savedCredential = await saveCredential(randomCredentialPayload(), { user: owner }); - await Promise.all( - INVALID_PAYLOADS.map(async (invalidPayload) => { - const response = await authOwnerAgent - .patch(`/credentials/${savedCredential.id}`) - .send(invalidPayload); + for (const invalidPayload of INVALID_PAYLOADS) { + const response = await authOwnerAgent + .patch(`/credentials/${savedCredential.id}`) + .send(invalidPayload); - if (response.statusCode === 500) { - console.log(response.statusCode, response.body); - } - expect(response.statusCode).toBe(400); - }), - ); + if (response.statusCode === 500) { + console.log(response.statusCode, response.body); + } + expect(response.statusCode).toBe(400); + } }); test('should fail if cred not found', async () => {