From b4b311b8a79aa2b9363c0d67c28274ed22a7fd10 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Mon, 7 Nov 2022 19:38:43 +0100 Subject: [PATCH 01/23] fix(nc-gui): ref access in auth middleware --- packages/nc-gui/middleware/auth.global.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nc-gui/middleware/auth.global.ts b/packages/nc-gui/middleware/auth.global.ts index 9f1160f09e..10c3a565cc 100644 --- a/packages/nc-gui/middleware/auth.global.ts +++ b/packages/nc-gui/middleware/auth.global.ts @@ -37,7 +37,7 @@ export default defineNuxtRouteMiddleware(async (to, from) => { const { allRoles } = useRoles() /** if user isn't signed in and google auth is enabled, try to check if sign-in data is present */ - if (!state.signedIn && state.appInfo.value.googleAuthEnabled) await tryGoogleAuth(api, state.signIn) + if (!state.signedIn.value && state.appInfo.value.googleAuthEnabled) await tryGoogleAuth(api, state.signIn) /** if public allow all visitors */ if (to.meta.public) return From 5176047fe3a7682b6717f1321b30b35561cd4d45 Mon Sep 17 00:00:00 2001 From: Vijay Kumar Rathore Date: Tue, 8 Nov 2022 18:33:32 +0530 Subject: [PATCH 02/23] fix column validations Signed-off-by: Vijay Kumar Rathore --- .../db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts index 07e9d93363..f2c7ba99c2 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts @@ -2236,11 +2236,13 @@ class BaseModelSqlv2 { for (let i = 0; i < this.model.columns.length; ++i) { const column = this.model.columns[i]; // skip validation if `validate` is undefined or false - if (!column?.meta?.validate) continue; + if (!column?.meta?.validate && !column?.validate) continue; const validate = column.getValidators(); const cn = column.column_name; + const columnTitle = column.title; if (!validate) continue; + const { func, msg } = validate; for (let j = 0; j < func.length; ++j) { const fn = @@ -2249,17 +2251,17 @@ class BaseModelSqlv2 { ? customValidators[func[j]] : Validator[func[j]] : func[j]; + const columnValue = columns?.[cn] || columns?.[columnTitle]; const arg = - typeof func[j] === 'string' ? columns[cn] + '' : columns[cn]; + typeof func[j] === 'string' ? columnValue + '' : columnValue; if ( - columns[cn] !== null && - columns[cn] !== undefined && - columns[cn] !== '' && - cn in columns && + ![null, undefined, ''].includes(columnValue) && !(fn.constructor.name === 'AsyncFunction' ? await fn(arg) : fn(arg)) ) { NcError.badRequest( - msg[j].replace(/\{VALUE}/g, columns[cn]).replace(/\{cn}/g, cn) + msg[j] + .replace(/\{VALUE}/g, columnValue) + .replace(/\{cn}/g, columnTitle) ); } } From 1865054898589feb5f3655f2ba83c93ff1a6c137 Mon Sep 17 00:00:00 2001 From: Vijay Kumar Rathore Date: Tue, 8 Nov 2022 18:37:38 +0530 Subject: [PATCH 03/23] reset validation if no validation for the column Signed-off-by: Vijay Kumar Rathore --- packages/nc-gui/composables/useColumnCreateStore.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/nc-gui/composables/useColumnCreateStore.ts b/packages/nc-gui/composables/useColumnCreateStore.ts index addb21c1d5..9816b4e183 100644 --- a/packages/nc-gui/composables/useColumnCreateStore.ts +++ b/packages/nc-gui/composables/useColumnCreateStore.ts @@ -193,6 +193,10 @@ const [useProvideColumnCreateStore, useColumnCreateStore] = createInjectionState formState.value.table_name = meta.value?.table_name // formState.value.title = formState.value.column_name if (column.value) { + // reset column validation if column is not to be validated + if (!columnToValidate.includes(formState.value.uidt)) { + formState.value.validate = '' + } await $api.dbTableColumn.update(column.value?.id as string, formState.value) // Column updated message.success(t('msg.success.columnUpdated')) From 18758cb829c90ba8b7400b366f0cd96ecf9e8056 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Thu, 10 Nov 2022 19:13:03 +0800 Subject: [PATCH 04/23] feat(nocodb): write temp file to os.tmpdir() instead of process.cwd --- packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts | 3 ++- packages/nocodb/src/lib/plugins/gcs/Gcs.ts | 3 ++- packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts | 3 ++- packages/nocodb/src/lib/plugins/mino/Minio.ts | 3 ++- packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts | 3 ++- packages/nocodb/src/lib/plugins/s3/S3.ts | 3 ++- .../nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts | 3 ++- packages/nocodb/src/lib/plugins/spaces/Spaces.ts | 3 ++- packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts | 3 ++- packages/nocodb/src/lib/plugins/vultr/Vultr.ts | 3 ++- 10 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts b/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts index ad6ab55f7f..c74ae89c24 100644 --- a/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts +++ b/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -119,7 +120,7 @@ export default class Backblaze implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/gcs/Gcs.ts b/packages/nocodb/src/lib/plugins/gcs/Gcs.ts index 7a696e84d9..e32bbc9a50 100644 --- a/packages/nocodb/src/lib/plugins/gcs/Gcs.ts +++ b/packages/nocodb/src/lib/plugins/gcs/Gcs.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import { Storage, StorageOptions } from '@google-cloud/storage'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -85,7 +86,7 @@ export default class Gcs implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts b/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts index a2d6b5a1b9..e2ca8f5e16 100644 --- a/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts +++ b/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -109,7 +110,7 @@ export default class LinodeObjectStorage implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/mino/Minio.ts b/packages/nocodb/src/lib/plugins/mino/Minio.ts index 101547a0c5..54139b6c39 100644 --- a/packages/nocodb/src/lib/plugins/mino/Minio.ts +++ b/packages/nocodb/src/lib/plugins/mino/Minio.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import { Client as MinioClient } from 'minio'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -73,7 +74,7 @@ export default class Minio implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts b/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts index fc075b40a7..634255e5a8 100644 --- a/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts +++ b/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -109,7 +110,7 @@ export default class OvhCloud implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/s3/S3.ts b/packages/nocodb/src/lib/plugins/s3/S3.ts index 3d6a44721d..72f20dbab9 100644 --- a/packages/nocodb/src/lib/plugins/s3/S3.ts +++ b/packages/nocodb/src/lib/plugins/s3/S3.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -112,7 +113,7 @@ export default class S3 implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts b/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts index 4b21d5c1c3..28df116bf0 100644 --- a/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts +++ b/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts @@ -1,5 +1,6 @@ import path from 'path'; import fs from 'fs'; +import os from 'os'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import AWS from 'aws-sdk'; import request from 'request'; @@ -29,7 +30,7 @@ export default class ScalewayObjectStorage implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/spaces/Spaces.ts b/packages/nocodb/src/lib/plugins/spaces/Spaces.ts index 025a859029..0d78cc038e 100644 --- a/packages/nocodb/src/lib/plugins/spaces/Spaces.ts +++ b/packages/nocodb/src/lib/plugins/spaces/Spaces.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -117,7 +118,7 @@ export default class Spaces implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts b/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts index cda09a9be7..cf63a7d1eb 100644 --- a/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts +++ b/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -107,7 +108,7 @@ export default class UpoCloud implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/vultr/Vultr.ts b/packages/nocodb/src/lib/plugins/vultr/Vultr.ts index 8729703161..146397d526 100644 --- a/packages/nocodb/src/lib/plugins/vultr/Vultr.ts +++ b/packages/nocodb/src/lib/plugins/vultr/Vultr.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; @@ -109,7 +110,7 @@ export default class Vultr implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(process.cwd(), 'temp.txt'); + const tempFile = path.join(os.tmpdir(), 'temp.txt'); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { From 1e1baaf6421348a07acb9e6353982668a2feced9 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Thu, 10 Nov 2022 19:28:57 +0530 Subject: [PATCH 05/23] fix(test): Maximum timeout for each instance is 30 minutes and imrpoved quick test CI configuration --- .../workflows/playwright-test-workflow.yml | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/playwright-test-workflow.yml b/.github/workflows/playwright-test-workflow.yml index f2b8b92fca..d4cddeae65 100644 --- a/.github/workflows/playwright-test-workflow.yml +++ b/.github/workflows/playwright-test-workflow.yml @@ -14,6 +14,7 @@ on: jobs: playwright: runs-on: ubuntu-20.04 + timeout-minutes: 20 steps: # Reference: https://github.com/pierotofy/set-swap-space/blob/master/action.yml - name: Set 5gb swap @@ -102,17 +103,28 @@ jobs: run: | kill -9 $(lsof -t -i:8080) npm run watch:run:playwright:pg:cyquick & - cd ../nc-gui/tests/playwright - npm run test:quick - name: Run quick server and tests (sqlite) if: ${{ inputs.db == 'sqlite' && inputs.shard == '2' }} working-directory: ./packages/nocodb run: | kill -9 $(lsof -t -i:8080) npm run watch:run:playwright:quick & - cd ../nc-gui/tests/playwright - npm run test:quick - + - name: Wait for backend & run quick tests + if: ${{ inputs.db == 'sqlite' }} + working-directory: ./packages/nc-gui/tests/playwright + run: | + while ! curl --output /dev/null --silent --head --fail http://localhost:8080; do + printf '.' + sleep 2 + done + PLAYWRIGHT_HTML_REPORT=playwright-report-quick npm run test:quick + - uses: actions/upload-artifact@v3 + if: ${{ inputs.db == 'sqlite' }} + with: + name: playwright-report-quick-${{ inputs.shard }} + path: ./packages/nc-gui/tests/playwright/playwright-report-quick/ + retention-days: 2 + - uses: actions/upload-artifact@v3 if: always() with: From f21220ac0db609b231c4dc783851415c7388233e Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Thu, 10 Nov 2022 19:31:56 +0530 Subject: [PATCH 06/23] fix(test): Dummy commit --- packages/nc-gui/tests/playwright/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/nc-gui/tests/playwright/README.md b/packages/nc-gui/tests/playwright/README.md index 898578e204..44c8b71d20 100644 --- a/packages/nc-gui/tests/playwright/README.md +++ b/packages/nc-gui/tests/playwright/README.md @@ -77,3 +77,4 @@ Page objects should be in `packages/nc-gui/tests/playwright/pages` folder. ### Verify if tests are not flaky Add `.only` to the added test and run `npm run test:repeat`. This will run the test multiple times and should show if the test is flaky. + From badc15e5f936032fbf5783b5e790da852cb67915 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 11 Nov 2022 11:43:21 +0530 Subject: [PATCH 07/23] fix(test): Added github artifact for quick tests and potential fix for playwright node module GH CI cache issue --- .github/workflows/playwright-test-workflow.yml | 18 +++++++++++++----- packages/nc-gui/tests/playwright/.gitignore | 1 + packages/nocodb/package.json | 3 +-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/playwright-test-workflow.yml b/.github/workflows/playwright-test-workflow.yml index d4cddeae65..ea5b388c40 100644 --- a/.github/workflows/playwright-test-workflow.yml +++ b/.github/workflows/playwright-test-workflow.yml @@ -70,14 +70,16 @@ jobs: run: npm run ci:run - name: Run backend working-directory: ./packages/nocodb - run: npm run ci:run & + run: | + npm install + npm run watch:run:playwright & > ${{ inputs.db }}_${{ inputs.shard }}_test_backend.log - name: Cache playwright npm modules uses: actions/cache@v3 id: playwright-cache with: path: | - **/playwright/node_modules - key: cache-nc-playwright-${{ hashFiles('**/playwright/package-lock.json') }} + **/nocodb/packages/nc-gui/tests/playwright/node_modules + key: cache-nc-playwright-${{ hashFiles('**/nocodb/packages/nc-gui/tests/playwright/package-lock.json') }} - name: Install dependencies if: steps.playwright-cache.outputs.cache-hit != 'true' working-directory: ./packages/nc-gui/tests/playwright @@ -108,7 +110,7 @@ jobs: working-directory: ./packages/nocodb run: | kill -9 $(lsof -t -i:8080) - npm run watch:run:playwright:quick & + npm run watch:run:playwright:quick & > quick_${{ inputs.shard }}_test_backend.log - name: Wait for backend & run quick tests if: ${{ inputs.db == 'sqlite' }} working-directory: ./packages/nc-gui/tests/playwright @@ -118,6 +120,12 @@ jobs: sleep 2 done PLAYWRIGHT_HTML_REPORT=playwright-report-quick npm run test:quick + - uses: actions/upload-artifact@v3 + if: ${{ inputs.db == 'sqlite' }} + with: + name: quick-backend-log-${{ inputs.shard }} + path: ./packages/nocodb/quick_${{ inputs.shard }}_test_backend.log + retention-days: 2 - uses: actions/upload-artifact@v3 if: ${{ inputs.db == 'sqlite' }} with: @@ -135,5 +143,5 @@ jobs: if: always() with: name: backend-logs-${{ inputs.db }}-${{ inputs.shard }} - path: ./packages/nocodb/mysql_test_backend.log + path: ./packages/nocodb/${{ inputs.db }}_${{ inputs.shard }}_test_backend.log retention-days: 2 \ No newline at end of file diff --git a/packages/nc-gui/tests/playwright/.gitignore b/packages/nc-gui/tests/playwright/.gitignore index 6f9fb63fd1..63c301ee05 100644 --- a/packages/nc-gui/tests/playwright/.gitignore +++ b/packages/nc-gui/tests/playwright/.gitignore @@ -2,6 +2,7 @@ node_modules/ /test-results/ /playwright-report/ /playwright-report copy/ +/playwright-report-quick/ /playwright/.cache/ .env output diff --git a/packages/nocodb/package.json b/packages/nocodb/package.json index 07535cceaf..7e7c1bda8d 100644 --- a/packages/nocodb/package.json +++ b/packages/nocodb/package.json @@ -46,8 +46,7 @@ "watch:run:pg": "cross-env NC_DISABLE_TELE=true EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/dockerRunPG --log-error --project tsconfig.json\"", "run": "ts-node src/run/docker", "watch:try": "nodemon -e ts,js -w ./src -x \"ts-node src/run/try --log-error --project tsconfig.json\"", - "example:docker": "ts-node src/run/docker.ts", - "ci:run": "npm install; npm run watch:run:playwright > mysql_test_backend.log" + "example:docker": "ts-node src/run/docker.ts" }, "engines": { "node": ">=8.9" From b859125903439c452bfc0470862cf27b279e0c31 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 11 Nov 2022 12:04:43 +0530 Subject: [PATCH 08/23] fix(test): Fixed issue with test backend log --- .github/workflows/playwright-test-workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/playwright-test-workflow.yml b/.github/workflows/playwright-test-workflow.yml index ea5b388c40..0b25826d55 100644 --- a/.github/workflows/playwright-test-workflow.yml +++ b/.github/workflows/playwright-test-workflow.yml @@ -72,7 +72,7 @@ jobs: working-directory: ./packages/nocodb run: | npm install - npm run watch:run:playwright & > ${{ inputs.db }}_${{ inputs.shard }}_test_backend.log + npm run watch:run:playwright > ${{ inputs.db }}_${{ inputs.shard }}_test_backend.log & - name: Cache playwright npm modules uses: actions/cache@v3 id: playwright-cache @@ -110,7 +110,7 @@ jobs: working-directory: ./packages/nocodb run: | kill -9 $(lsof -t -i:8080) - npm run watch:run:playwright:quick & > quick_${{ inputs.shard }}_test_backend.log + npm run watch:run:playwright:quick > quick_${{ inputs.shard }}_test_backend.log & - name: Wait for backend & run quick tests if: ${{ inputs.db == 'sqlite' }} working-directory: ./packages/nc-gui/tests/playwright From 6ff37a84a98c3a2c90d0c6a95ffcbc311e6e78f3 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Fri, 11 Nov 2022 16:22:26 +0800 Subject: [PATCH 09/23] feat(nocodb): move generate temp file path logic to a function --- packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts | 9 +++++---- packages/nocodb/src/lib/plugins/gcs/Gcs.ts | 9 +++++---- .../nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts | 9 +++++---- packages/nocodb/src/lib/plugins/mino/Minio.ts | 9 +++++---- packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts | 9 +++++---- packages/nocodb/src/lib/plugins/s3/S3.ts | 9 +++++---- .../src/lib/plugins/scaleway/ScalewayObjectStorage.ts | 9 +++++---- packages/nocodb/src/lib/plugins/spaces/Spaces.ts | 9 +++++---- packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts | 9 +++++---- packages/nocodb/src/lib/plugins/vultr/Vultr.ts | 9 +++++---- packages/nocodb/src/lib/utils/pluginUtils.ts | 6 ++++++ 11 files changed, 56 insertions(+), 40 deletions(-) diff --git a/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts b/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts index c74ae89c24..7db4f1f7e7 100644 --- a/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts +++ b/packages/nocodb/src/lib/plugins/backblaze/Backblaze.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class Backblaze implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -120,7 +121,7 @@ export default class Backblaze implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/gcs/Gcs.ts b/packages/nocodb/src/lib/plugins/gcs/Gcs.ts index e32bbc9a50..8e7521cfc5 100644 --- a/packages/nocodb/src/lib/plugins/gcs/Gcs.ts +++ b/packages/nocodb/src/lib/plugins/gcs/Gcs.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import { Storage, StorageOptions } from '@google-cloud/storage'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class Gcs implements IStorageAdapterV2 { private storageClient: Storage; @@ -86,7 +87,7 @@ export default class Gcs implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts b/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts index e2ca8f5e16..c920eff6cf 100644 --- a/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts +++ b/packages/nocodb/src/lib/plugins/linode/LinodeObjectStorage.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class LinodeObjectStorage implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -110,7 +111,7 @@ export default class LinodeObjectStorage implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/mino/Minio.ts b/packages/nocodb/src/lib/plugins/mino/Minio.ts index 54139b6c39..ef20217604 100644 --- a/packages/nocodb/src/lib/plugins/mino/Minio.ts +++ b/packages/nocodb/src/lib/plugins/mino/Minio.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import { Client as MinioClient } from 'minio'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class Minio implements IStorageAdapterV2 { private minioClient: MinioClient; @@ -74,7 +75,7 @@ export default class Minio implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts b/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts index 634255e5a8..b2e6ed9162 100644 --- a/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts +++ b/packages/nocodb/src/lib/plugins/ovhCloud/OvhCloud.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class OvhCloud implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -110,7 +111,7 @@ export default class OvhCloud implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/s3/S3.ts b/packages/nocodb/src/lib/plugins/s3/S3.ts index 72f20dbab9..d1211ff7a1 100644 --- a/packages/nocodb/src/lib/plugins/s3/S3.ts +++ b/packages/nocodb/src/lib/plugins/s3/S3.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class S3 implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -113,7 +114,7 @@ export default class S3 implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts b/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts index 28df116bf0..66034e020e 100644 --- a/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts +++ b/packages/nocodb/src/lib/plugins/scaleway/ScalewayObjectStorage.ts @@ -1,10 +1,11 @@ -import path from 'path'; import fs from 'fs'; -import os from 'os'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import AWS from 'aws-sdk'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class ScalewayObjectStorage implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -30,7 +31,7 @@ export default class ScalewayObjectStorage implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/spaces/Spaces.ts b/packages/nocodb/src/lib/plugins/spaces/Spaces.ts index 0d78cc038e..4880b79cb7 100644 --- a/packages/nocodb/src/lib/plugins/spaces/Spaces.ts +++ b/packages/nocodb/src/lib/plugins/spaces/Spaces.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class Spaces implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -118,7 +119,7 @@ export default class Spaces implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts b/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts index cf63a7d1eb..f549634973 100644 --- a/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts +++ b/packages/nocodb/src/lib/plugins/upcloud/UpoCloud.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class UpoCloud implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -108,7 +109,7 @@ export default class UpoCloud implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/plugins/vultr/Vultr.ts b/packages/nocodb/src/lib/plugins/vultr/Vultr.ts index 146397d526..2a18f0aeb4 100644 --- a/packages/nocodb/src/lib/plugins/vultr/Vultr.ts +++ b/packages/nocodb/src/lib/plugins/vultr/Vultr.ts @@ -1,10 +1,11 @@ import fs from 'fs'; -import path from 'path'; -import os from 'os'; import AWS from 'aws-sdk'; import { IStorageAdapterV2, XcFile } from 'nc-plugin'; import request from 'request'; -import { waitForStreamClose } from '../../utils/pluginUtils'; +import { + waitForStreamClose, + generateTempFilePath, +} from '../../utils/pluginUtils'; export default class Vultr implements IStorageAdapterV2 { private s3Client: AWS.S3; @@ -110,7 +111,7 @@ export default class Vultr implements IStorageAdapterV2 { public async test(): Promise { try { - const tempFile = path.join(os.tmpdir(), 'temp.txt'); + const tempFile = generateTempFilePath(); const createStream = fs.createWriteStream(tempFile); await waitForStreamClose(createStream); await this.fileCreate('nc-test-file.txt', { diff --git a/packages/nocodb/src/lib/utils/pluginUtils.ts b/packages/nocodb/src/lib/utils/pluginUtils.ts index e329b628e7..1772657869 100644 --- a/packages/nocodb/src/lib/utils/pluginUtils.ts +++ b/packages/nocodb/src/lib/utils/pluginUtils.ts @@ -1,4 +1,10 @@ import fs from 'fs'; +import path from 'path'; +import os from 'os'; + +export function generateTempFilePath() { + return path.join(os.tmpdir(), 'temp.txt'); +} export async function waitForStreamClose( stream: fs.WriteStream From 29a890ab9ab39fae331230eac62d32c8da41f20a Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 11 Nov 2022 13:57:18 +0530 Subject: [PATCH 10/23] fix(test): Potential fix for the issue with GI CI action action --- .github/workflows/playwright-test-workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/playwright-test-workflow.yml b/.github/workflows/playwright-test-workflow.yml index 0b25826d55..c77bc876d9 100644 --- a/.github/workflows/playwright-test-workflow.yml +++ b/.github/workflows/playwright-test-workflow.yml @@ -78,8 +78,8 @@ jobs: id: playwright-cache with: path: | - **/nocodb/packages/nc-gui/tests/playwright/node_modules - key: cache-nc-playwright-${{ hashFiles('**/nocodb/packages/nc-gui/tests/playwright/package-lock.json') }} + **/packages/nc-gui/tests/playwright/node_modules + key: cache-nc-playwright-${{ hashFiles('**/packages/nc-gui/tests/playwright/package-lock.json') }} - name: Install dependencies if: steps.playwright-cache.outputs.cache-hit != 'true' working-directory: ./packages/nc-gui/tests/playwright From 5548d3f238fca2e00e10c67405f2ae1a2f9ecd09 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 11 Nov 2022 14:13:51 +0530 Subject: [PATCH 11/23] fix(test): Removed dummy commit --- packages/nc-gui/tests/playwright/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nc-gui/tests/playwright/README.md b/packages/nc-gui/tests/playwright/README.md index 44c8b71d20..898578e204 100644 --- a/packages/nc-gui/tests/playwright/README.md +++ b/packages/nc-gui/tests/playwright/README.md @@ -77,4 +77,3 @@ Page objects should be in `packages/nc-gui/tests/playwright/pages` folder. ### Verify if tests are not flaky Add `.only` to the added test and run `npm run test:repeat`. This will run the test multiple times and should show if the test is flaky. - From 6e6a84cbb30d4d982dd6f6b440ead44e364710da Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 11 Nov 2022 14:53:31 +0530 Subject: [PATCH 12/23] fix(test): Made timeout of CI action 30 minutes --- .github/workflows/playwright-test-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/playwright-test-workflow.yml b/.github/workflows/playwright-test-workflow.yml index c77bc876d9..c9508fd34a 100644 --- a/.github/workflows/playwright-test-workflow.yml +++ b/.github/workflows/playwright-test-workflow.yml @@ -14,7 +14,7 @@ on: jobs: playwright: runs-on: ubuntu-20.04 - timeout-minutes: 20 + timeout-minutes: 30 steps: # Reference: https://github.com/pierotofy/set-swap-space/blob/master/action.yml - name: Set 5gb swap From 017eb90d919bf50c27fd88ea60b97edd9a181710 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 11 Nov 2022 15:54:45 +0530 Subject: [PATCH 13/23] fix(test): Fixed quick pg config --- packages/nocodb/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nocodb/package.json b/packages/nocodb/package.json index 7e7c1bda8d..c08b2de5cb 100644 --- a/packages/nocodb/package.json +++ b/packages/nocodb/package.json @@ -38,7 +38,7 @@ "watch:run": "cross-env NC_DISABLE_TELE1=true EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/docker --log-error --project tsconfig.json\"", "watch:run:playwright": "rm -f ./test_noco.db; cross-env DATABASE_URL=sqlite:./test_noco.db PLAYWRIGHT_TEST=true NC_DISABLE_TELE=true EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/testDocker --log-error --project tsconfig.json\"", "watch:run:playwright:quick": "rm -f ./test_noco.db; cp ../../scripts/cypress/fixtures/quickTest/noco_0_91_7.db ./test_noco.db; cross-env DATABASE_URL=sqlite:./test_noco.db NC_DISABLE_TELE=true EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/docker --log-error --project tsconfig.json\"", - "watch:run:playwright:pg:cyquick": "rm -f ./test_noco.db; cp ../../scripts/cypress/fixtures/quickTest/noco_0_91_7.db ./test_noco.db; cross-env EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/dockerRunPG_CyQuick.ts --log-error --project tsconfig.json\"", + "watch:run:playwright:pg:cyquick": "rm -f ./test_noco.db; cp ../../scripts/cypress/fixtures/quickTest/noco_0_91_7.db ./test_noco.db; cross-env NC_DISABLE_TELE=true EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/dockerRunPG_CyQuick.ts --log-error --project tsconfig.json\"", "watch:run:cypress": "cross-env EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/docker --log-error --project tsconfig.json\"", "watch:run:cypress:pg": "cross-env EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/dockerRunPG --log-error --project tsconfig.json\"", "watch:run:cypress:pg:cyquick": "cross-env EE=true nodemon -e ts,js -w ./src -x \"ts-node src/run/dockerRunPG_CyQuick.ts --log-error --project tsconfig.json\"", From a666d7b2f53d874687e4a25dac26bc1479c37cfb Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 11 Nov 2022 16:49:47 +0530 Subject: [PATCH 14/23] fix(test): Improved playwright README --- packages/nc-gui/tests/playwright/README.md | 41 ++++++++++++++++------ 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/nc-gui/tests/playwright/README.md b/packages/nc-gui/tests/playwright/README.md index 898578e204..6a2585b9d0 100644 --- a/packages/nc-gui/tests/playwright/README.md +++ b/packages/nc-gui/tests/playwright/README.md @@ -14,7 +14,7 @@ npx playwright install chromium --with-deps Start the backend test server (in `packages/nocodb` folder): ```bash -npm run watch:run:playwright:quick +npm run watch:run:playwright ``` Start the frontend test server (in `packages/nc-gui` folder): @@ -29,10 +29,33 @@ NUXT_PAGE_TRANSITION_DISABLE=true npm run dev For selecting db type, rename `.env.example` to `.env` and set `E2E_DEV_DB_TYPE` to `sqlite`(default), `mysql` or `pg`. +headless mode(without opening browser): + ```bash npm run test ``` +with browser: + +```bash +npm run test:debug +``` + +
+
+ +For setting up mysql: + +```bash +docker-compose -f ./packages/nc-gui/tests/playwright/scripts/docker-compose-mysql-playwright.yml up -d +``` + +For setting up postgres: + +```bash +docker-compose -f ./packages/nc-gui/tests/playwright/scripts/docker-compose-playwright-pg.yml +``` + ### Running individual tests Add `.only` to the test you want to run: @@ -55,25 +78,23 @@ In Webstorm, you can use the `test-debug` run action to run the tests. Add `.only` to the test you want to run. This will open the test in a chromium session and you can also add break points. -i.e `test.only('should login', async ({ page }) => {` - ### VSCode -In VSCode, use this [https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chromium](extension). +In VSCode, use this [extension](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright). It will have run button beside each test in the file. -### Page Objects +## Page Objects -Page object is a class which has methods to interact with a page/component. Methods should be thin and should not do a whole lot. They should also be reusable. +- Page object is a class which has methods to interact with a page/component. Methods should be thin and should not do a whole lot. They should also be reusable. -All the action methods i.e click of a page object is also responsible for waiting till the action is completed. This can be done by waiting on an API call or some ui change. +- All the action methods i.e click of a page object is also responsible for waiting till the action is completed. This can be done by waiting on an API call or some ui change. -Do not add any logic to the tests. Instead, create a page object for the page you are testing. +- Do not add any logic to the tests. Instead, create a page object for the page you are testing. All the selection, UI actions and assertions should be in the page object. Page objects should be in `packages/nc-gui/tests/playwright/pages` folder. -### Verify if tests are not flaky +## Verify if tests are not flaky -Add `.only` to the added test and run `npm run test:repeat`. This will run the test multiple times and should show if the test is flaky. +Add `.only` to the added tests and run `npm run test:repeat`. This will run the test multiple times and should show if the test is flaky. From 25d420a3312b2e8339a64dbb725f801d861963f1 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Sat, 12 Nov 2022 12:36:44 +0530 Subject: [PATCH 15/23] fix(test): Changed tpo data-testid from data-nc --- .../nc-gui/components/cell/MultiSelect.vue | 2 +- .../nc-gui/components/cell/SingleSelect.vue | 2 +- .../components/cell/attachment/index.vue | 2 +- .../nc-gui/components/dashboard/TreeView.vue | 8 +-- .../dashboard/settings/AuditTab.vue | 2 +- .../components/dashboard/settings/Modal.vue | 4 +- .../nc-gui/components/dlg/TableCreate.vue | 2 +- .../components/general/TruncateText.vue | 2 +- .../nc-gui/components/smartsheet/Form.vue | 46 ++++++------ .../nc-gui/components/smartsheet/Gallery.vue | 4 +- .../nc-gui/components/smartsheet/Grid.vue | 22 +++--- .../nc-gui/components/smartsheet/Kanban.vue | 2 +- .../components/smartsheet/Pagination.vue | 2 +- .../smartsheet/column/EditOrAdd.vue | 2 +- .../smartsheet/column/SelectOptions.vue | 6 +- .../smartsheet/expanded-form/index.vue | 2 +- .../smartsheet/sidebar/RenameableMenuItem.vue | 8 +-- .../smartsheet/toolbar/ColumnFilterMenu.vue | 2 +- .../smartsheet/toolbar/FieldsMenu.vue | 4 +- .../smartsheet/toolbar/ShareView.vue | 26 +++---- .../smartsheet/toolbar/SortListMenu.vue | 2 +- .../smartsheet/toolbar/ViewActions.vue | 2 +- .../tabs/auth/user-management/ShareBase.vue | 2 +- .../components/ListChildItems.vue | 13 ++-- packages/nc-gui/layouts/base.vue | 8 +-- packages/nc-gui/layouts/shared-view.vue | 2 +- .../pages/[projectType]/[projectId]/index.vue | 4 +- .../[projectType]/[projectId]/index/index.vue | 6 +- .../form/[viewId]/index/index.vue | 6 +- .../form/[viewId]/index/survey.vue | 43 ++++------- packages/nc-gui/pages/index/index/index.vue | 6 +- packages/nc-gui/pages/index/index/user.vue | 12 ++-- packages/nc-gui/pages/signin.vue | 15 ++-- packages/nc-gui/tests/playwright/package.json | 1 + .../pages/Dashboard/ExpandedForm/index.ts | 8 +-- .../playwright/pages/Dashboard/Form/index.ts | 72 ++++++++++--------- .../pages/Dashboard/Gallery/index.ts | 2 +- .../Dashboard/Grid/Column/LTAR/ChildList.ts | 10 ++- .../Grid/Column/SelectOptionColumn.ts | 14 ++-- .../pages/Dashboard/Grid/Column/index.ts | 2 +- .../playwright/pages/Dashboard/Grid/index.ts | 36 +++++----- .../pages/Dashboard/Kanban/index.ts | 4 +- .../pages/Dashboard/Settings/Acl.ts | 2 +- .../pages/Dashboard/Settings/AppStore.ts | 2 +- .../pages/Dashboard/Settings/Audit.ts | 2 +- .../pages/Dashboard/Settings/Erd.ts | 2 +- .../pages/Dashboard/Settings/Metadata.ts | 2 +- .../pages/Dashboard/Settings/Miscellaneous.ts | 2 +- .../pages/Dashboard/Settings/Teams.ts | 4 +- .../pages/Dashboard/Settings/index.ts | 2 +- .../pages/Dashboard/SurveyForm/index.ts | 26 +++---- .../playwright/pages/Dashboard/TreeView.ts | 6 +- .../pages/Dashboard/ViewSidebar/index.ts | 26 ++++--- .../Dashboard/common/Cell/AttachmentCell.ts | 4 +- .../Dashboard/common/Cell/SelectOptionCell.ts | 5 +- .../pages/Dashboard/common/Cell/index.ts | 4 +- .../Dashboard/common/ProjectMenu/index.ts | 4 +- .../Dashboard/common/Toolbar/Actions/index.ts | 2 +- .../pages/Dashboard/common/Toolbar/Fields.ts | 8 +-- .../pages/Dashboard/common/Toolbar/Filter.ts | 4 +- .../Dashboard/common/Toolbar/ShareView.ts | 14 ++-- .../pages/Dashboard/common/Toolbar/Sort.ts | 4 +- .../tests/playwright/pages/Dashboard/index.ts | 33 ++++----- .../tests/playwright/pages/LoginPage/index.ts | 8 +-- .../playwright/pages/ProjectsPage/index.ts | 6 +- .../playwright/pages/SharedForm/index.ts | 2 +- .../nc-gui/tests/playwright/setup/index.ts | 4 +- .../tests/authChangePassword.spec.ts | 2 +- 68 files changed, 300 insertions(+), 300 deletions(-) diff --git a/packages/nc-gui/components/cell/MultiSelect.vue b/packages/nc-gui/components/cell/MultiSelect.vue index 2bffd5ff04..0da8f1f871 100644 --- a/packages/nc-gui/components/cell/MultiSelect.vue +++ b/packages/nc-gui/components/cell/MultiSelect.vue @@ -155,7 +155,7 @@ watch(isOpen, (n, _o) => { v-for="op of options" :key="op.id" :value="op.title" - :data-nc="`select-option-${column.title}-${rowIndex}`" + :data-testid="`select-option-${column.title}-${rowIndex}`" @click.stop > diff --git a/packages/nc-gui/components/cell/SingleSelect.vue b/packages/nc-gui/components/cell/SingleSelect.vue index 53e7579a31..cb9258505c 100644 --- a/packages/nc-gui/components/cell/SingleSelect.vue +++ b/packages/nc-gui/components/cell/SingleSelect.vue @@ -86,7 +86,7 @@ watch(isOpen, (n, _o) => { v-for="op of options" :key="op.title" :value="op.title" - :data-nc="`select-option-${column.title}-${rowIndex}`" + :data-testid="`select-option-${column.title}-${rowIndex}`" @click.stop > diff --git a/packages/nc-gui/components/cell/attachment/index.vue b/packages/nc-gui/components/cell/attachment/index.vue index 0541f60272..f4be61efd5 100644 --- a/packages/nc-gui/components/cell/attachment/index.vue +++ b/packages/nc-gui/components/cell/attachment/index.vue @@ -161,7 +161,7 @@ watch( v-if="!isReadonly" :class="{ 'mx-auto px-4': !visibleItems.length }" class="group cursor-pointer flex gap-1 items-center active:(ring ring-accent ring-opacity-100) rounded border-1 p-1 shadow-sm hover:(bg-primary bg-opacity-10) dark:(!bg-slate-500)" - data-nc="attachment-cell-file-picker-button" + data-testid="attachment-cell-file-picker-button" @click.stop="open" > diff --git a/packages/nc-gui/components/dashboard/TreeView.vue b/packages/nc-gui/components/dashboard/TreeView.vue index f57eaabfc4..1d6d5ea031 100644 --- a/packages/nc-gui/components/dashboard/TreeView.vue +++ b/packages/nc-gui/components/dashboard/TreeView.vue @@ -331,13 +331,13 @@ const onSearchCloseIconClick = () => { class="nc-tree-item text-sm cursor-pointer group" :data-order="table.order" :data-id="table.id" - :data-nc="`tree-view-table-${table.title}`" + :data-testid="`tree-view-table-${table.title}`" @click="addTableTab(table)" >
-
+
{