From 27eba3255f9640187aa5b3afd2472ad86b3799e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Thu, 28 Sep 2023 13:03:32 +0200 Subject: [PATCH] ci: Refactor DB tests (no-changelog) --- .github/docker-compose.yml | 8 +- .github/workflows/ci-postgres-mysql.yml | 86 +++++++++++++++---- jest.config.js | 1 + .../cli/test/integration/credentials.test.ts | 32 +++---- 4 files changed, 92 insertions(+), 35 deletions(-) diff --git a/.github/docker-compose.yml b/.github/docker-compose.yml index 4482ab62222f8..8ecbc6406e881 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 3d2195346616f..2e8465351e3bc 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 + 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: Build Backend + run: pnpm --filter @n8n/client-oauth2 --filter n8n-workflow --filter n8n-core --filter n8n build - timeout-minutes: 60 + - 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 - 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: Restore cached build artifacts + uses: actions/cache/restore@v3.3.1 + with: + path: ./packages/**/dist + key: ${{ github.sha }}:db-tests - - name: Start MySQL & Postgres - uses: isbang/compose-action@v1.3.2 + - 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 7752aecad088b..a4c416f152d18 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 526d3bb28c77b..b62f0e9cab8c3 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); - - if (response.statusCode === 500) { - console.log(response.statusCode, response.body); - } - expect(response.statusCode).toBe(400); - }), - ); + 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); + } }); test('should fail if cred not found', async () => {