diff --git a/tests/playwright/pages/Account/AppStore.ts b/tests/playwright/pages/Account/AppStore.ts index c617df54a5..0ac3ff39d2 100644 --- a/tests/playwright/pages/Account/AppStore.ts +++ b/tests/playwright/pages/Account/AppStore.ts @@ -11,13 +11,11 @@ export class AccountAppStorePage extends BasePage { } async goto() { - await this.rootPage.goto('/#/account/apps', { waitUntil: 'networkidle' }); - } - - async waitUntilContentLoads() { - return this.rootPage.waitForResponse( - resp => resp.url().includes('api/v1/db/meta/plugins') && resp.status() === 200 - ); + await this.waitForResponse({ + uiAction: () => this.rootPage.goto('/#/account/apps', { waitUntil: 'networkidle' }), + httpMethodsToMatch: ['GET'], + requestUrlPathToMatch: 'api/v1/db/meta/plugins', + }); } get() { diff --git a/tests/playwright/pages/Account/ChangePassword.ts b/tests/playwright/pages/Account/ChangePassword.ts index 9e9795d5a7..af414c4c25 100644 --- a/tests/playwright/pages/Account/ChangePassword.ts +++ b/tests/playwright/pages/Account/ChangePassword.ts @@ -25,6 +25,14 @@ export class ChangePasswordPage extends BasePage { const newPassword = this.get().locator('input[data-testid="nc-user-settings-form__new-password"]'); const confirmPassword = this.get().locator('input[data-testid="nc-user-settings-form__new-password-repeat"]'); + await currentPassword.waitFor({ state: 'visible' }); + await newPassword.waitFor({ state: 'visible' }); + await confirmPassword.waitFor({ state: 'visible' }); + + // in-spite of the waitFor above, the input fields are not always ready to be filled + // this is a workaround + await this.rootPage.waitForTimeout(500); + await currentPassword.fill(oldPass); await newPassword.fill(newPass); await confirmPassword.fill(repeatPass); diff --git a/tests/playwright/pages/Account/Settings.ts b/tests/playwright/pages/Account/Settings.ts index fa5fbcd1f6..07bdd37d7a 100644 --- a/tests/playwright/pages/Account/Settings.ts +++ b/tests/playwright/pages/Account/Settings.ts @@ -11,11 +11,12 @@ export class AccountSettingsPage extends BasePage { } async goto() { - await this.rootPage.goto('/#/account/users/settings', { waitUntil: 'networkidle' }); - } - - async waitUntilContentLoads() { - return this.rootPage.waitForResponse(resp => resp.url().includes('api/v1/app-settings') && resp.status() === 200); + // await this.rootPage.goto('/#/account/users/settings', { waitUntil: 'networkidle' }); + await this.waitForResponse({ + uiAction: () => this.rootPage.goto('/#/account/users/settings', { waitUntil: 'networkidle' }), + httpMethodsToMatch: ['GET'], + requestUrlPathToMatch: `api/v1/app-settings`, + }); } get() { diff --git a/tests/playwright/pages/Dashboard/Grid/Column/index.ts b/tests/playwright/pages/Dashboard/Grid/Column/index.ts index 54448d6f3b..3e188aed76 100644 --- a/tests/playwright/pages/Dashboard/Grid/Column/index.ts +++ b/tests/playwright/pages/Dashboard/Grid/Column/index.ts @@ -252,7 +252,7 @@ export class ColumnPageObject extends BasePage { async delete({ title }: { title: string }) { await this.getColumnHeader(title).locator('div.ant-dropdown-trigger').locator('.nc-ui-dt-dropdown').click(); // await this.rootPage.locator('li[role="menuitem"]:has-text("Delete")').waitFor(); - await this.rootPage.locator('li[role="menuitem"]:has-text("Delete")').click(); + await this.rootPage.locator('li[role="menuitem"]:has-text("Delete"):visible').click(); await this.rootPage.locator('button:has-text("Delete")').click(); diff --git a/tests/playwright/pages/Dashboard/Grid/index.ts b/tests/playwright/pages/Dashboard/Grid/index.ts index e184a2f739..60bc2e3e3a 100644 --- a/tests/playwright/pages/Dashboard/Grid/index.ts +++ b/tests/playwright/pages/Dashboard/Grid/index.ts @@ -72,10 +72,12 @@ export class GridPage extends BasePage { networkValidation?: boolean; } = {}) { const rowValue = value ?? `Row ${index}`; + // wait for render to complete before count + if (index !== 0) await this.get().locator('.nc-grid-row').nth(0).waitFor({ state: 'attached' }); const rowCount = await this.get().locator('.nc-grid-row').count(); await this.get().locator('.nc-grid-add-new-cell').click(); - await expect(this.get().locator('.nc-grid-row')).toHaveCount(rowCount + 1); + await expect(await this.get().locator('.nc-grid-row')).toHaveCount(rowCount + 1); await this._fillRow({ index, columnHeader, value: rowValue }); diff --git a/tests/playwright/pages/Dashboard/TreeView.ts b/tests/playwright/pages/Dashboard/TreeView.ts index 75c02c04f3..804cc1d2fe 100644 --- a/tests/playwright/pages/Dashboard/TreeView.ts +++ b/tests/playwright/pages/Dashboard/TreeView.ts @@ -82,7 +82,7 @@ export class TreeViewPage extends BasePage { await this.dashboard.waitForTabRender({ title, mode }); } else { await this.get().locator(`.nc-project-tree-tbl-${title}`).click(); - await this.rootPage.waitForTimeout(3000); + await this.rootPage.waitForTimeout(1000); } } diff --git a/tests/playwright/pages/Dashboard/ViewSidebar/index.ts b/tests/playwright/pages/Dashboard/ViewSidebar/index.ts index 4cc1f9e445..161149f456 100644 --- a/tests/playwright/pages/Dashboard/ViewSidebar/index.ts +++ b/tests/playwright/pages/Dashboard/ViewSidebar/index.ts @@ -46,6 +46,7 @@ export class ViewSidebarPage extends BasePage { private async createView({ title, locator }: { title: string; locator: Locator }) { await locator.click(); + await this.rootPage.locator('input[id="form_item_title"]:visible').waitFor({ state: 'visible' }); await this.rootPage.locator('input[id="form_item_title"]:visible').fill(title); const submitAction = () => this.rootPage.locator('.ant-modal-content').locator('button:has-text("Submit"):visible').click(); diff --git a/tests/playwright/pages/Dashboard/WebhookForm/index.ts b/tests/playwright/pages/Dashboard/WebhookForm/index.ts index 3a203fe1b6..e69da5eca6 100644 --- a/tests/playwright/pages/Dashboard/WebhookForm/index.ts +++ b/tests/playwright/pages/Dashboard/WebhookForm/index.ts @@ -68,25 +68,16 @@ export class WebhookFormPage extends BasePage { await this.get().locator(`.nc-check-box-hook-condition`).click(); const modal = await this.get().locator(`.menu-filter-dropdown`).last(); - // todo: All delays are for api calls that filter does, which rerenders - await this.rootPage.waitForTimeout(1000); - await modal.locator(`button:has-text("Add Filter")`).click(); - await this.rootPage.waitForTimeout(1500); - await modal.locator('.nc-filter-field-select').click(); const modalField = await this.dashboard.rootPage.locator('.nc-dropdown-toolbar-field-list:visible'); await modalField.locator(`.ant-select-item:has-text("${column}")`).click(); - await this.rootPage.waitForTimeout(1500); - await modal.locator('.nc-filter-operation-select').click(); const modalOp = await this.dashboard.rootPage.locator('.nc-dropdown-filter-comp-op:visible'); await modalOp.locator(`.ant-select-item:has-text("${operator}")`).click(); - await this.rootPage.waitForTimeout(1500); - if (operator != 'is null' && operator != 'is not null') { await modal.locator('.nc-filter-value-select > input').fill(value); } diff --git a/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts b/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts index 89bc0ea572..9f53ab1881 100644 --- a/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts +++ b/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts @@ -56,7 +56,7 @@ export class ToolbarFilterPage extends BasePage { }) { if (!openModal) await this.get().locator(`button:has-text("Add Filter")`).first().click(); - const selectedField = await this.rootPage.locator('.nc-filter-field-select').textContent(); + const selectedField = await getTextExcludeIconText(await this.rootPage.locator('.nc-filter-field-select')); if (selectedField !== title) { await this.rootPage.locator('.nc-filter-field-select').last().click(); await this.rootPage @@ -65,7 +65,7 @@ export class ToolbarFilterPage extends BasePage { .click(); } - const selectedOpType = await this.rootPage.locator('.nc-filter-operation-select').textContent(); + const selectedOpType = await getTextExcludeIconText(await this.rootPage.locator('.nc-filter-operation-select')); if (selectedOpType !== operation) { await this.rootPage.locator('.nc-filter-operation-select').click(); // first() : filter list has >, >= @@ -78,7 +78,9 @@ export class ToolbarFilterPage extends BasePage { // subtype for date if (dataType === UITypes.Date && subOperation) { - const selectedSubType = await this.rootPage.locator('.nc-filter-sub_operation-select').textContent(); + const selectedSubType = await getTextExcludeIconText( + await this.rootPage.locator('.nc-filter-sub_operation-select') + ); if (selectedSubType !== subOperation) { await this.rootPage.locator('.nc-filter-sub_operation-select').click(); // first() : filter list has >, >= @@ -197,6 +199,18 @@ export class ToolbarFilterPage extends BasePage { await this.toolbar.clickFilter(); } + async remove({ networkValidation = true }: { networkValidation?: boolean } = {}) { + if (networkValidation) { + await this.waitForResponse({ + uiAction: () => this.get().locator('.nc-filter-item-remove-btn').click(), + httpMethodsToMatch: ['DELETE'], + requestUrlPathToMatch: '/api/v1/db/meta/filters/', + }); + } else { + await this.get().locator('.nc-filter-item-remove-btn').click(); + } + } + async columnOperatorList(param: { columnTitle: string }) { await this.get().locator(`button:has-text("Add Filter")`).first().click(); diff --git a/tests/playwright/pages/Dashboard/index.ts b/tests/playwright/pages/Dashboard/index.ts index e0a8e098ed..31ff8a9fa7 100644 --- a/tests/playwright/pages/Dashboard/index.ts +++ b/tests/playwright/pages/Dashboard/index.ts @@ -212,4 +212,15 @@ export class DashboardPage extends BasePage { async waitForLoaderToDisappear() { await this.rootPage.locator('[data-testid="nc-loading"]').waitFor({ state: 'hidden' }); } + + async closeAllTabs() { + await this.tabBar.locator(`.ant-tabs-tab`).waitFor({ state: 'visible' }); + const tab = await this.tabBar.locator(`.ant-tabs-tab`); + const tabCount = await tab.count(); + + for (let i = 0; i < tabCount; i++) { + await tab.nth(i).locator('button.ant-tabs-tab-remove').click(); + await tab.nth(i).waitFor({ state: 'detached' }); + } + } } diff --git a/tests/playwright/playwright.config.ts b/tests/playwright/playwright.config.ts index 8fd59e91b5..52b9567659 100644 --- a/tests/playwright/playwright.config.ts +++ b/tests/playwright/playwright.config.ts @@ -11,7 +11,7 @@ require('dotenv').config(); * See https://playwright.dev/docs/test-configuration. */ const config: PlaywrightTestConfig = { - testDir: process.env.PW_QUICK_TEST ? './quickTests' : './tests', + testDir: process.env.PW_QUICK_TEST ? './quickTests' : './tests/db', /* Maximum time one test can run for. */ timeout: process.env.CI ? 140 * 1000 : 100 * 1000, expect: { diff --git a/tests/playwright/quickTests/quickTests.spec.ts b/tests/playwright/quickTests/quickTests.spec.ts index ef9069ce0e..417d2162fe 100644 --- a/tests/playwright/quickTests/quickTests.spec.ts +++ b/tests/playwright/quickTests/quickTests.spec.ts @@ -4,6 +4,7 @@ import { LoginPage } from '../pages/LoginPage'; import { ProjectsPage } from '../pages/ProjectsPage'; import { quickVerify } from './commonTest'; import { NcContext } from '../setup'; +import { getDefaultPwd } from '../tests/utils/general'; test.describe('Quick tests', () => { let dashboard: DashboardPage; @@ -12,7 +13,7 @@ test.describe('Quick tests', () => { const loginPage = new LoginPage(page); await loginPage.goto(); await loginPage.fillEmail({ email: 'user@nocodb.com', withoutPrefix: true }); - await loginPage.fillPassword('Password123.'); + await loginPage.fillPassword(getDefaultPwd()); await loginPage.submit(); const projectsPage = new ProjectsPage(page); diff --git a/tests/playwright/scripts/docker-compose-playwright-pg.yml b/tests/playwright/scripts/docker-compose-playwright-pg.yml index 046efbb48a..7eb08c02d4 100644 --- a/tests/playwright/scripts/docker-compose-playwright-pg.yml +++ b/tests/playwright/scripts/docker-compose-playwright-pg.yml @@ -1,4 +1,4 @@ -version: "2.1" +version: "2.2" services: pg147: diff --git a/tests/playwright/tests/01-webhook.spec.ts b/tests/playwright/tests/db/01-webhook.spec.ts similarity index 97% rename from tests/playwright/tests/01-webhook.spec.ts rename to tests/playwright/tests/db/01-webhook.spec.ts index 325bde44bb..cf0dce6e4d 100644 --- a/tests/playwright/tests/01-webhook.spec.ts +++ b/tests/playwright/tests/db/01-webhook.spec.ts @@ -1,11 +1,11 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import makeServer from '../setup/server'; -import { WebhookFormPage } from '../pages/Dashboard/WebhookForm'; -import { isSubset } from './utils/general'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import makeServer from '../../setup/server'; +import { WebhookFormPage } from '../../pages/Dashboard/WebhookForm'; +import { isSubset } from '../utils/general'; import { Api, UITypes } from 'nocodb-sdk'; -import { isMysql, isPg, isSqlite } from '../setup/db'; +import { isMysql, isPg, isSqlite } from '../../setup/db'; const hookPath = 'http://localhost:9090/hook'; let api: Api; @@ -427,8 +427,8 @@ test.describe.serial('Webhook', () => { async function verifyBulkOperationTrigger(rsp, type) { for (let i = 0; i < rsp.length; i++) { expect(rsp[i].type).toBe(type); - expect(rsp[i].data.table_name).toBe('numberBased'); - expect(rsp[i].data.view_name).toBe('numberBased'); + expect(rsp[i].data.table_name).toBe('Test'); + expect(rsp[i].data.view_name).toBe('Test'); // only for insert, rows inserted will not be returned in response. just count if (type === 'records.after.bulkInsert') { @@ -476,8 +476,8 @@ test.describe.serial('Webhook', () => { try { project = await api.project.read(context.project.id); table = await api.base.tableCreate(context.project.id, project.bases?.[0].id, { - table_name: 'numberBased', - title: 'numberBased', + table_name: 'Test', + title: 'Test', columns: columns, }); } catch (e) { @@ -485,7 +485,7 @@ test.describe.serial('Webhook', () => { } await page.reload(); - await dashboard.treeView.openTable({ title: 'numberBased' }); + await dashboard.treeView.openTable({ title: 'Test' }); // create after insert webhook await webhook.create({ @@ -508,7 +508,6 @@ test.describe.serial('Webhook', () => { })); await api.dbTableRow.bulkCreate('noco', context.project.id, table.id, rowAttributesForInsert); await page.reload(); - // 50 records inserted, we expect 2 webhook responses let rsp = await getWebhookResponses({ request, count: 1 }); await verifyBulkOperationTrigger(rsp, 'records.after.bulkInsert'); diff --git a/tests/playwright/tests/accountLicense.spec.ts b/tests/playwright/tests/db/accountLicense.spec.ts similarity index 75% rename from tests/playwright/tests/accountLicense.spec.ts rename to tests/playwright/tests/db/accountLicense.spec.ts index 64e4af62d7..ec3ab37502 100644 --- a/tests/playwright/tests/accountLicense.spec.ts +++ b/tests/playwright/tests/db/accountLicense.spec.ts @@ -1,8 +1,8 @@ import { test } from '@playwright/test'; -import { AccountPage } from '../pages/Account'; -import setup from '../setup'; -import { AccountLicensePage } from '../pages/Account/License'; -import { DashboardPage } from '../pages/Dashboard'; +import { AccountPage } from '../../pages/Account'; +import setup from '../../setup'; +import { AccountLicensePage } from '../../pages/Account/License'; +import { DashboardPage } from '../../pages/Dashboard'; test.describe('Enterprise License', () => { // @ts-ignore @@ -11,7 +11,7 @@ test.describe('Enterprise License', () => { let accountLicensePage: AccountLicensePage, accountPage: AccountPage, context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); accountPage = new AccountPage(page); accountLicensePage = new AccountLicensePage(accountPage); dashboard = new DashboardPage(page, context.project); diff --git a/tests/playwright/tests/accountTokenManagement.spec.ts b/tests/playwright/tests/db/accountTokenManagement.spec.ts similarity index 74% rename from tests/playwright/tests/accountTokenManagement.spec.ts rename to tests/playwright/tests/db/accountTokenManagement.spec.ts index 7093318b92..10de551fd9 100644 --- a/tests/playwright/tests/accountTokenManagement.spec.ts +++ b/tests/playwright/tests/db/accountTokenManagement.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { AccountPage } from '../pages/Account'; -import { AccountTokenPage } from '../pages/Account/Token'; -import setup from '../setup'; +import { AccountPage } from '../../pages/Account'; +import { AccountTokenPage } from '../../pages/Account/Token'; +import setup from '../../setup'; test.describe('User roles', () => { let accountTokenPage: AccountTokenPage; @@ -10,7 +10,7 @@ test.describe('User roles', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); accountPage = new AccountPage(page); accountTokenPage = new AccountTokenPage(accountPage); }); diff --git a/tests/playwright/tests/accountUserManagement.spec.ts b/tests/playwright/tests/db/accountUserManagement.spec.ts similarity index 83% rename from tests/playwright/tests/accountUserManagement.spec.ts rename to tests/playwright/tests/db/accountUserManagement.spec.ts index 285a818749..45b4a3c3da 100644 --- a/tests/playwright/tests/accountUserManagement.spec.ts +++ b/tests/playwright/tests/db/accountUserManagement.spec.ts @@ -1,9 +1,10 @@ import { test } from '@playwright/test'; -import { AccountPage } from '../pages/Account'; -import { AccountUsersPage } from '../pages/Account/Users'; -import { ProjectsPage } from '../pages/ProjectsPage'; -import { SignupPage } from '../pages/SignupPage'; -import setup from '../setup'; +import { AccountPage } from '../../pages/Account'; +import { AccountUsersPage } from '../../pages/Account/Users'; +import { ProjectsPage } from '../../pages/ProjectsPage'; +import { SignupPage } from '../../pages/SignupPage'; +import setup from '../../setup'; +import { getDefaultPwd } from '../utils/general'; const roleDb = [ { email: 'creator@nocodb.com', role: 'Organization Level Creator', url: '' }, @@ -19,7 +20,7 @@ test.describe('User roles', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); accountPage = new AccountPage(page); accountUsersPage = new AccountUsersPage(accountPage); @@ -68,7 +69,7 @@ test.describe('User roles', () => { await signupPage.signUp({ email: roleDb[roleIdx].email, - password: 'Password123.', + password: getDefaultPwd(), }); await projectsPage.checkProjectCreateButton({ diff --git a/tests/playwright/tests/accountUserSettings.spec.ts b/tests/playwright/tests/db/accountUserSettings.spec.ts similarity index 79% rename from tests/playwright/tests/accountUserSettings.spec.ts rename to tests/playwright/tests/db/accountUserSettings.spec.ts index e8034e5448..dd4904cd66 100644 --- a/tests/playwright/tests/accountUserSettings.spec.ts +++ b/tests/playwright/tests/db/accountUserSettings.spec.ts @@ -1,8 +1,9 @@ import { test } from '@playwright/test'; -import { AccountPage } from '../pages/Account'; -import { AccountSettingsPage } from '../pages/Account/Settings'; -import { SignupPage } from '../pages/SignupPage'; -import setup from '../setup'; +import { AccountPage } from '../../pages/Account'; +import { AccountSettingsPage } from '../../pages/Account/Settings'; +import { SignupPage } from '../../pages/SignupPage'; +import setup from '../../setup'; +import { getDefaultPwd } from '../utils/general'; test.describe('App settings', () => { let accountSettingsPage: AccountSettingsPage; @@ -11,7 +12,7 @@ test.describe('App settings', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); accountPage = new AccountPage(page); accountSettingsPage = accountPage.settings; }); @@ -24,8 +25,6 @@ test.describe('App settings', () => { // todo: remove after route navigation issue resolved await accountSettingsPage.rootPage.reload({ waitUntil: 'networkidle' }); - await accountSettingsPage.waitUntilContentLoads(); - // enable invite only signup if (!(await accountSettingsPage.getInviteOnlyCheckboxValue())) { await accountSettingsPage.toggleInviteOnlyCheckbox(); @@ -39,7 +38,7 @@ test.describe('App settings', () => { await signupPage.signUp({ email: 'test-user-1@nocodb.com', - password: 'Password123.', + password: getDefaultPwd(), expectedError: 'Not allowed to signup, contact super admin.', }); @@ -47,8 +46,6 @@ test.describe('App settings', () => { await accountSettingsPage.goto(); - await accountSettingsPage.waitUntilContentLoads(); - await accountSettingsPage.checkInviteOnlySignupCheckbox(true); await accountSettingsPage.toggleInviteOnlyCheckbox(); await accountSettingsPage.checkInviteOnlySignupCheckbox(false); @@ -59,7 +56,7 @@ test.describe('App settings', () => { await signupPage.signUp({ email: 'test-user-1@nocodb.com', - password: 'Password123.', + password: getDefaultPwd(), }); }); }); diff --git a/tests/playwright/tests/authChangePassword.spec.ts b/tests/playwright/tests/db/authChangePassword.spec.ts similarity index 78% rename from tests/playwright/tests/authChangePassword.spec.ts rename to tests/playwright/tests/db/authChangePassword.spec.ts index da947665aa..82ec5be74f 100644 --- a/tests/playwright/tests/authChangePassword.spec.ts +++ b/tests/playwright/tests/db/authChangePassword.spec.ts @@ -1,11 +1,12 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { LoginPage } from '../pages/LoginPage'; -import { SettingsPage, SettingTab } from '../pages/Dashboard/Settings'; -import { SignupPage } from '../pages/SignupPage'; -import { ProjectsPage } from '../pages/ProjectsPage'; -import { AccountPage } from '../pages/Account'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { LoginPage } from '../../pages/LoginPage'; +import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; +import { SignupPage } from '../../pages/SignupPage'; +import { ProjectsPage } from '../../pages/ProjectsPage'; +import { AccountPage } from '../../pages/Account'; +import { getDefaultPwd } from '../utils/general'; test.describe('Auth', () => { let context: any; @@ -16,7 +17,7 @@ test.describe('Auth', () => { let accountPage: AccountPage; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); signupPage = new SignupPage(page); projectsPage = new ProjectsPage(page); @@ -41,7 +42,7 @@ test.describe('Auth', () => { await dashboard.rootPage.goto(url); await signupPage.signUp({ email: 'user-1@nocodb.com', - password: 'Password123.', + password: getDefaultPwd(), }); await projectsPage.openPasswordChangeModal(); @@ -56,7 +57,7 @@ test.describe('Auth', () => { // New pass and repeat pass mismatch await accountPage.users.changePasswordPage.changePassword({ - oldPass: 'Password123.', + oldPass: getDefaultPwd(), newPass: '123456789', repeatPass: '987654321', networkValidation: false, @@ -65,7 +66,7 @@ test.describe('Auth', () => { // All good await accountPage.users.changePasswordPage.changePassword({ - oldPass: 'Password123.', + oldPass: getDefaultPwd(), newPass: 'NewPasswordConfigured', repeatPass: 'NewPasswordConfigured', networkValidation: true, diff --git a/tests/playwright/tests/baseShare.spec.ts b/tests/playwright/tests/db/baseShare.spec.ts similarity index 87% rename from tests/playwright/tests/baseShare.spec.ts rename to tests/playwright/tests/db/baseShare.spec.ts index 656ef5846e..e9d83a5be1 100644 --- a/tests/playwright/tests/baseShare.spec.ts +++ b/tests/playwright/tests/db/baseShare.spec.ts @@ -1,9 +1,10 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; -import { LoginPage } from '../pages/LoginPage'; -import { ProjectsPage } from '../pages/ProjectsPage'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import { LoginPage } from '../../pages/LoginPage'; +import { ProjectsPage } from '../../pages/ProjectsPage'; +import { getDefaultPwd } from '../utils/general'; test.describe('Shared base', () => { let dashboard: DashboardPage; @@ -47,7 +48,7 @@ test.describe('Shared base', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); projectPage = new ProjectsPage(page); toolbar = dashboard.grid.toolbar; @@ -77,7 +78,7 @@ test.describe('Shared base', () => { await loginPage.signIn({ email: 'user@nocodb.com', - password: 'Password123.', + password: getDefaultPwd(), withoutPrefix: true, }); diff --git a/tests/playwright/tests/cellSelection.spec.ts b/tests/playwright/tests/db/cellSelection.spec.ts similarity index 73% rename from tests/playwright/tests/cellSelection.spec.ts rename to tests/playwright/tests/db/cellSelection.spec.ts index f15c6fb277..5b59c533aa 100644 --- a/tests/playwright/tests/cellSelection.spec.ts +++ b/tests/playwright/tests/db/cellSelection.spec.ts @@ -1,109 +1,98 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { GridPage } from '../pages/Dashboard/Grid'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import setup from '../../setup'; test.describe('Verify cell selection', () => { let dashboard: DashboardPage, grid: GridPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; + await dashboard.closeAllTabs(); }); - test('#1 when range is selected, it has correct number of selected cells', async () => { + test('Suite-1', async () => { + // #1 when range is selected, it has correct number of selected cells await dashboard.treeView.openTable({ title: 'Customer' }); await grid.selectRange({ start: { index: 0, columnHeader: 'FirstName' }, end: { index: 2, columnHeader: 'Email' }, }); - expect(await grid.selectedCount()).toBe(9); - }); + await dashboard.closeAllTabs(); - test('#2 when copied with clipboard, it copies correct text', async () => { + // #2 when copied with clipboard, it copies correct text await dashboard.treeView.openTable({ title: 'Customer' }); await grid.selectRange({ start: { index: 0, columnHeader: 'FirstName' }, end: { index: 1, columnHeader: 'LastName' }, }); - expect(await grid.copyWithKeyboard()).toBe('MARY \t SMITH\n' + ' PATRICIA \t JOHNSON\n'); - }); + await dashboard.closeAllTabs(); - test('#3 when copied with mouse, it copies correct text', async () => { + // #3 when copied with mouse, it copies correct text await dashboard.treeView.openTable({ title: 'Customer' }); await grid.selectRange({ start: { index: 0, columnHeader: 'FirstName' }, end: { index: 1, columnHeader: 'LastName' }, }); - expect(await grid.copyWithMouse({ index: 0, columnHeader: 'FirstName' })).toBe( 'MARY \t SMITH\n' + ' PATRICIA \t JOHNSON\n' ); + await dashboard.closeAllTabs(); }); - // FIXME: this is edge case, better be moved to integration tests - test('#4 when cell inside selection range is clicked, it clears previous selection', async () => { + test('Suite-2', async ({ page }) => { + // #4 when cell inside selection range is clicked, it clears previous selection await dashboard.treeView.openTable({ title: 'Country' }); await grid.selectRange({ start: { index: 0, columnHeader: 'Country' }, end: { index: 2, columnHeader: 'City List' }, }); - expect(await grid.selectedCount()).toBe(9); - await grid.cell.get({ index: 0, columnHeader: 'Country' }).click(); - expect(await grid.selectedCount()).toBe(1); expect(await grid.cell.verifyCellActiveSelected({ index: 0, columnHeader: 'Country' })); - }); + await dashboard.closeAllTabs(); - // FIXME: this is edge case, better be moved to integration tests - test('#5 when cell outside selection range is clicked, it clears previous selection', async () => { + // #5 when cell outside selection range is clicked, it clears previous selection await dashboard.treeView.openTable({ title: 'Country' }); await grid.selectRange({ start: { index: 0, columnHeader: 'Country' }, end: { index: 2, columnHeader: 'City List' }, }); - expect(await grid.selectedCount()).toBe(9); - await grid.cell.get({ index: 5, columnHeader: 'Country' }).click(); - expect(await grid.selectedCount()).toBe(1); expect(await grid.cell.verifyCellActiveSelected({ index: 5, columnHeader: 'Country' })); - }); + await dashboard.closeAllTabs(); - // FIXME: this is edge case, better be moved to integration tests - test('#6 when selection ends on locked field, it still works as expected', async () => { + // #6 when selection ends on locked field, it still works as expected await dashboard.treeView.openTable({ title: 'Country' }); await dashboard.grid.toolbar.fields.toggleShowSystemFields(); await grid.selectRange({ start: { index: 2, columnHeader: 'City List' }, end: { index: 0, columnHeader: 'Country' }, }); - expect(await grid.selectedCount()).toBe(12); - await grid.cell.get({ index: 1, columnHeader: 'Country' }).click(); - expect(await grid.selectedCount()).toBe(1); expect(await grid.cell.verifyCellActiveSelected({ index: 1, columnHeader: 'Country' })); - }); + await dashboard.grid.toolbar.fields.toggleShowSystemFields(); + await dashboard.closeAllTabs(); - // FIXME: this is edge case, better be moved to integration tests - test('#7 when navigated with keyboard, only active cell is affected', async ({ page }) => { + // #7 when navigated with keyboard, only active cell is affected await dashboard.treeView.openTable({ title: 'Country' }); await grid.selectRange({ start: { index: 0, columnHeader: 'Country' }, end: { index: 2, columnHeader: 'City List' }, }); - await page.keyboard.press('ArrowRight'); expect(await grid.selectedCount()).toBe(1); expect(await grid.cell.verifyCellActiveSelected({ index: 0, columnHeader: 'LastUpdate' })); + await dashboard.closeAllTabs(); }); }); diff --git a/tests/playwright/tests/columnAttachments.spec.ts b/tests/playwright/tests/db/columnAttachments.spec.ts similarity index 95% rename from tests/playwright/tests/columnAttachments.spec.ts rename to tests/playwright/tests/db/columnAttachments.spec.ts index a9858f07e2..7593457cde 100644 --- a/tests/playwright/tests/columnAttachments.spec.ts +++ b/tests/playwright/tests/db/columnAttachments.spec.ts @@ -1,16 +1,16 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { SharedFormPage } from '../pages/SharedForm'; -import setup from '../setup'; -import { AccountPage } from '../pages/Account'; -import { AccountLicensePage } from '../pages/Account/License'; +import { DashboardPage } from '../../pages/Dashboard'; +import { SharedFormPage } from '../../pages/SharedForm'; +import setup from '../../setup'; +import { AccountPage } from '../../pages/Account'; +import { AccountLicensePage } from '../../pages/Account/License'; test.describe('Attachment column', () => { let dashboard: DashboardPage; let accountLicensePage: AccountLicensePage, accountPage: AccountPage, context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); accountPage = new AccountPage(page); accountLicensePage = new AccountLicensePage(accountPage); diff --git a/tests/playwright/tests/columnBarcode.spec.ts b/tests/playwright/tests/db/columnBarcode.spec.ts similarity index 98% rename from tests/playwright/tests/columnBarcode.spec.ts rename to tests/playwright/tests/db/columnBarcode.spec.ts index 52cc5e5be2..783ce1eae5 100644 --- a/tests/playwright/tests/columnBarcode.spec.ts +++ b/tests/playwright/tests/db/columnBarcode.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { GridPage } from '../pages/Dashboard/Grid'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { GridPage } from '../../pages/Dashboard/Grid'; interface ExpectedBarcodeData { referencedValue: string; @@ -14,7 +14,7 @@ test.describe('Virtual Columns', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; }); diff --git a/tests/playwright/tests/columnCheckbox.spec.ts b/tests/playwright/tests/db/columnCheckbox.spec.ts similarity index 72% rename from tests/playwright/tests/columnCheckbox.spec.ts rename to tests/playwright/tests/db/columnCheckbox.spec.ts index 9615550b31..b0e1d94c50 100644 --- a/tests/playwright/tests/columnCheckbox.spec.ts +++ b/tests/playwright/tests/db/columnCheckbox.spec.ts @@ -1,7 +1,10 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import { UITypes } from 'nocodb-sdk'; +import { Api } from 'nocodb-sdk'; +let api: Api; test.describe('Checkbox - cell, filter, sort', () => { let dashboard: DashboardPage, toolbar: ToolbarPage; @@ -37,23 +40,61 @@ test.describe('Checkbox - cell, filter, sort', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; + + api = new Api({ + baseURL: `http://localhost:8080/`, + headers: { + 'xc-auth': context.token, + }, + }); + + const columns = [ + { + column_name: 'Id', + title: 'Id', + uidt: UITypes.ID, + }, + { + column_name: 'Title', + title: 'Title', + uidt: UITypes.SingleLineText, + }, + ]; + + try { + const project = await api.project.read(context.project.id); + const table = await api.base.tableCreate(context.project.id, project.bases?.[0].id, { + table_name: 'Sheet-1', + title: 'Sheet-1', + columns: columns, + }); + + const rowAttributes = []; + for (let i = 0; i < 6; i++) { + const row = { + Id: i + 1, + Title: `1${String.fromCharCode(97 + i)}`, + }; + rowAttributes.push(row); + } + + await api.dbTableRow.bulkCreate('noco', context.project.id, table.id, rowAttributes); + } catch (e) { + console.error(e); + } + + // page reload + await page.reload(); }); test('Checkbox', async () => { // close 'Team & Auth' tab await dashboard.closeTab({ title: 'Team & Auth' }); - await dashboard.treeView.createTable({ title: 'Sheet1' }); - - await dashboard.grid.addNewRow({ index: 0, value: '1a' }); - await dashboard.grid.addNewRow({ index: 1, value: '1b' }); - await dashboard.grid.addNewRow({ index: 2, value: '1c' }); - await dashboard.grid.addNewRow({ index: 3, value: '1d' }); - await dashboard.grid.addNewRow({ index: 4, value: '1e' }); - await dashboard.grid.addNewRow({ index: 5, value: '1f' }); + await dashboard.treeView.openTable({ title: 'Sheet-1' }); // Create Checkbox column await dashboard.grid.column.create({ diff --git a/tests/playwright/tests/columnDateTime.spec.ts b/tests/playwright/tests/db/columnDateTime.spec.ts similarity index 94% rename from tests/playwright/tests/columnDateTime.spec.ts rename to tests/playwright/tests/db/columnDateTime.spec.ts index c5349a9a98..7647dea6b3 100644 --- a/tests/playwright/tests/columnDateTime.spec.ts +++ b/tests/playwright/tests/db/columnDateTime.spec.ts @@ -1,6 +1,6 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; const dateTimeData = [ { @@ -61,7 +61,7 @@ test.describe('DateTime Column', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/columnDuration.spec.ts b/tests/playwright/tests/db/columnDuration.spec.ts similarity index 95% rename from tests/playwright/tests/columnDuration.spec.ts rename to tests/playwright/tests/db/columnDuration.spec.ts index 82b28267eb..6998c55062 100644 --- a/tests/playwright/tests/columnDuration.spec.ts +++ b/tests/playwright/tests/db/columnDuration.spec.ts @@ -1,6 +1,6 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; // Storing one additional dummy value "10" at end of every input array // this will trigger update to previously committed data @@ -45,7 +45,7 @@ test.describe.skip('Duration column', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/columnFormula.spec.ts b/tests/playwright/tests/db/columnFormula.spec.ts similarity index 96% rename from tests/playwright/tests/columnFormula.spec.ts rename to tests/playwright/tests/db/columnFormula.spec.ts index a285e6a9da..4aabefe37e 100644 --- a/tests/playwright/tests/columnFormula.spec.ts +++ b/tests/playwright/tests/db/columnFormula.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup, { NcContext } from '../setup'; -import { isPg, isSqlite } from '../setup/db'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup, { NcContext } from '../../setup'; +import { isPg, isSqlite } from '../../setup/db'; // Add formula to be verified here & store expected results for 5 rows // Column data from City table (Sakila DB) @@ -141,7 +141,7 @@ test.describe('Virtual Columns', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/columnGeoData.spec.ts b/tests/playwright/tests/db/columnGeoData.spec.ts similarity index 89% rename from tests/playwright/tests/columnGeoData.spec.ts rename to tests/playwright/tests/db/columnGeoData.spec.ts index 290269b6b3..29e35ce5e7 100644 --- a/tests/playwright/tests/columnGeoData.spec.ts +++ b/tests/playwright/tests/db/columnGeoData.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { GridPage } from '../pages/Dashboard/Grid'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { GridPage } from '../../pages/Dashboard/Grid'; test.describe('Geo Data column', () => { let dashboard: DashboardPage; @@ -9,7 +9,7 @@ test.describe('Geo Data column', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; }); diff --git a/tests/playwright/tests/columnLinkToAnotherRecord.spec.ts b/tests/playwright/tests/db/columnLinkToAnotherRecord.spec.ts similarity index 98% rename from tests/playwright/tests/columnLinkToAnotherRecord.spec.ts rename to tests/playwright/tests/db/columnLinkToAnotherRecord.spec.ts index dd74bf0fd4..1be725e05d 100644 --- a/tests/playwright/tests/columnLinkToAnotherRecord.spec.ts +++ b/tests/playwright/tests/db/columnLinkToAnotherRecord.spec.ts @@ -1,6 +1,6 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; test.describe('LTAR create & update', () => { let dashboard: DashboardPage; @@ -10,7 +10,7 @@ test.describe('LTAR create & update', () => { test.setTimeout(150000); test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/columnLookupRollup.spec.ts b/tests/playwright/tests/db/columnLookupRollup.spec.ts similarity index 90% rename from tests/playwright/tests/columnLookupRollup.spec.ts rename to tests/playwright/tests/db/columnLookupRollup.spec.ts index 710a298db6..236b94d5ed 100644 --- a/tests/playwright/tests/columnLookupRollup.spec.ts +++ b/tests/playwright/tests/db/columnLookupRollup.spec.ts @@ -1,13 +1,13 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; test.describe('Virtual columns', () => { let dashboard: DashboardPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/columnMenuOperations.spec.ts b/tests/playwright/tests/db/columnMenuOperations.spec.ts similarity index 95% rename from tests/playwright/tests/columnMenuOperations.spec.ts rename to tests/playwright/tests/db/columnMenuOperations.spec.ts index 429d9cf5d7..f80b3fc482 100644 --- a/tests/playwright/tests/columnMenuOperations.spec.ts +++ b/tests/playwright/tests/db/columnMenuOperations.spec.ts @@ -1,6 +1,6 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; const columns = [ { @@ -43,7 +43,7 @@ test.describe('Column menu operations', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/columnMultiSelect.spec.ts b/tests/playwright/tests/db/columnMultiSelect.spec.ts similarity index 97% rename from tests/playwright/tests/columnMultiSelect.spec.ts rename to tests/playwright/tests/db/columnMultiSelect.spec.ts index 54b9a4a273..029830a155 100644 --- a/tests/playwright/tests/columnMultiSelect.spec.ts +++ b/tests/playwright/tests/db/columnMultiSelect.spec.ts @@ -1,15 +1,15 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { GridPage } from '../pages/Dashboard/Grid'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; test.describe('Multi select', () => { let dashboard: DashboardPage, grid: GridPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; diff --git a/tests/playwright/tests/columnQrCode.spec.ts b/tests/playwright/tests/db/columnQrCode.spec.ts similarity index 99% rename from tests/playwright/tests/columnQrCode.spec.ts rename to tests/playwright/tests/db/columnQrCode.spec.ts index dac1d4b3e8..603601c686 100644 --- a/tests/playwright/tests/columnQrCode.spec.ts +++ b/tests/playwright/tests/db/columnQrCode.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { GridPage } from '../pages/Dashboard/Grid'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { GridPage } from '../../pages/Dashboard/Grid'; type ExpectedQrCodeData = { referencedValue: string; @@ -14,7 +14,7 @@ test.describe('Virtual Columns', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; }); diff --git a/tests/playwright/tests/columnRating.spec.ts b/tests/playwright/tests/db/columnRating.spec.ts similarity index 94% rename from tests/playwright/tests/columnRating.spec.ts rename to tests/playwright/tests/db/columnRating.spec.ts index 9eff749818..d11916fdee 100644 --- a/tests/playwright/tests/columnRating.spec.ts +++ b/tests/playwright/tests/db/columnRating.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; test.describe('Rating - cell, filter, sort', () => { let dashboard: DashboardPage, toolbar: ToolbarPage; @@ -37,7 +37,7 @@ test.describe('Rating - cell, filter, sort', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; }); diff --git a/tests/playwright/tests/columnRelationalExtendedTests.spec.ts b/tests/playwright/tests/db/columnRelationalExtendedTests.spec.ts similarity index 94% rename from tests/playwright/tests/columnRelationalExtendedTests.spec.ts rename to tests/playwright/tests/db/columnRelationalExtendedTests.spec.ts index 8ea6fa67d9..eecae61ed4 100644 --- a/tests/playwright/tests/columnRelationalExtendedTests.spec.ts +++ b/tests/playwright/tests/db/columnRelationalExtendedTests.spec.ts @@ -1,14 +1,14 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { isPg } from '../setup/db'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { isPg } from '../../setup/db'; test.describe('Relational Columns', () => { let dashboard: DashboardPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/columnSingleSelect.spec.ts b/tests/playwright/tests/db/columnSingleSelect.spec.ts similarity index 96% rename from tests/playwright/tests/columnSingleSelect.spec.ts rename to tests/playwright/tests/db/columnSingleSelect.spec.ts index b987827b39..9e5302f5fc 100644 --- a/tests/playwright/tests/columnSingleSelect.spec.ts +++ b/tests/playwright/tests/db/columnSingleSelect.spec.ts @@ -1,15 +1,15 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { GridPage } from '../pages/Dashboard/Grid'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; test.describe('Single select', () => { let dashboard: DashboardPage, grid: GridPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; diff --git a/tests/playwright/tests/erd.spec.ts b/tests/playwright/tests/db/erd.spec.ts similarity index 96% rename from tests/playwright/tests/erd.spec.ts rename to tests/playwright/tests/db/erd.spec.ts index 4d4a5af20f..0000b64df1 100644 --- a/tests/playwright/tests/erd.spec.ts +++ b/tests/playwright/tests/db/erd.spec.ts @@ -5,13 +5,13 @@ import { pgSakilaSqlViews, pgSakilaTables, sqliteSakilaSqlViews, -} from './utils/sakila'; -import { DashboardPage } from '../pages/Dashboard'; -import { SettingsSubTab, SettingTab } from '../pages/Dashboard/Settings'; -import setup from '../setup'; -import { isMysql, isPg, isSqlite } from '../setup/db'; -import { SettingsErdPage } from '../pages/Dashboard/Settings/Erd'; -import { defaultBaseName } from '../constants'; +} from '../utils/sakila'; +import { DashboardPage } from '../../pages/Dashboard'; +import { SettingsSubTab, SettingTab } from '../../pages/Dashboard/Settings'; +import setup from '../../setup'; +import { isMysql, isPg, isSqlite } from '../../setup/db'; +import { SettingsErdPage } from '../../pages/Dashboard/Settings/Erd'; +import { defaultBaseName } from '../../constants'; test.describe('Erd', () => { let dashboard: DashboardPage; @@ -21,7 +21,7 @@ test.describe('Erd', () => { test.slow(); test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); if (isPg(context)) { diff --git a/tests/playwright/tests/expandedFormUrl.spec.ts b/tests/playwright/tests/db/expandedFormUrl.spec.ts similarity index 94% rename from tests/playwright/tests/expandedFormUrl.spec.ts rename to tests/playwright/tests/db/expandedFormUrl.spec.ts index 8c260f201f..78b7b28bf0 100644 --- a/tests/playwright/tests/expandedFormUrl.spec.ts +++ b/tests/playwright/tests/db/expandedFormUrl.spec.ts @@ -1,16 +1,16 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { GalleryPage } from '../pages/Dashboard/Gallery'; -import { GridPage } from '../pages/Dashboard/Grid'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import { GalleryPage } from '../../pages/Dashboard/Gallery'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; test.describe('Expanded form URL', () => { let dashboard: DashboardPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/filters.spec.ts b/tests/playwright/tests/db/filters.spec.ts similarity index 95% rename from tests/playwright/tests/filters.spec.ts rename to tests/playwright/tests/db/filters.spec.ts index f3a16de396..48a91be267 100644 --- a/tests/playwright/tests/filters.spec.ts +++ b/tests/playwright/tests/db/filters.spec.ts @@ -1,10 +1,10 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; import { UITypes } from 'nocodb-sdk'; import { Api } from 'nocodb-sdk'; -import { rowMixedValue } from '../setup/xcdb-records'; +import { rowMixedValue } from '../../setup/xcdb-records'; import dayjs from 'dayjs'; let dashboard: DashboardPage, toolbar: ToolbarPage; @@ -89,7 +89,6 @@ async function verifyFilter(param: { return; } - await toolbar.clickFilter(); await toolbar.filter.add({ title: param.column, operation: param.opType, @@ -97,16 +96,13 @@ async function verifyFilter(param: { value: param.value, locallySaved: false, dataType: param?.dataType, + openModal: true, }); - await toolbar.clickFilter(); // verify filtered rows await validateRowArray({ rowCount: param.result.rowCount, }); - - // Reset filter - await toolbar.filter.reset(); } // Number based filters @@ -206,6 +202,8 @@ test.describe('Filter Tests: Numerical', () => { }, ]; + await toolbar.clickFilter(); + await toolbar.filter.clickAddFilter(); for (let i = 0; i < filterList.length; i++) { await verifyFilter({ column: dataType, @@ -218,7 +216,7 @@ test.describe('Filter Tests: Numerical', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; @@ -305,6 +303,8 @@ test.describe('Filter Tests: Numerical', () => { } catch (e) { console.error(e); } + + await page.reload(); }); test('Filter: Number', async () => { @@ -327,7 +327,7 @@ test.describe('Filter Tests: Numerical', () => { await numBasedFilterTest('Rating', '3', '2'); }); - test('Filter: Duration', async () => { + test.skip('Filter: Duration', async () => { await numBasedFilterTest('Duration', '00:01', '01:03'); }); @@ -405,6 +405,8 @@ test.describe('Filter Tests: Text based', () => { }, ]; + await toolbar.clickFilter(); + await toolbar.filter.clickAddFilter(); for (let i = 0; i < filterList.length; i++) { await verifyFilter({ column: dataType, @@ -416,7 +418,7 @@ test.describe('Filter Tests: Text based', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; @@ -485,6 +487,7 @@ test.describe('Filter Tests: Text based', () => { } catch (e) { console.error(e); } + await page.reload(); }); test('Filter: Single Line Text', async () => { @@ -577,6 +580,8 @@ test.describe('Filter Tests: Select based', () => { }, ]; + await toolbar.clickFilter(); + await toolbar.filter.clickAddFilter(); for (let i = 0; i < filterList.length; i++) { await verifyFilter({ column: dataType, @@ -587,8 +592,9 @@ test.describe('Filter Tests: Select based', () => { }); } } + test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; @@ -641,14 +647,16 @@ test.describe('Filter Tests: Select based', () => { } catch (e) { console.error(e); } + await page.reload(); }); test('Filter: Single Select', async () => { - await selectBasedFilterTest('SingleSelect', 'jan', 'jan,feb,mar', ''); + // hack. jan inserted twice as in filter, toggling operation is not clearing value + await selectBasedFilterTest('SingleSelect', 'jan', 'jan,jan,feb,mar', ''); }); test('Filter: Multi Select', async () => { - await selectBasedFilterTest('MultiSelect', '', 'jan,feb,mar', 'jan,feb,mar'); + await selectBasedFilterTest('MultiSelect', '', 'jan,jan,feb,mar', 'jan,feb,mar'); }); }); @@ -933,7 +941,7 @@ test.describe('Filter Tests: Date based', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; @@ -978,6 +986,7 @@ test.describe('Filter Tests: Date based', () => { } catch (e) { console.error(e); } + await page.reload(); }); test('Date : filters-1', async () => { @@ -1018,6 +1027,8 @@ test.describe('Filter Tests: AddOn', () => { }, ]; + await toolbar.clickFilter(); + await toolbar.filter.clickAddFilter(); for (let i = 0; i < filterList.length; i++) { await verifyFilter({ column: dataType, @@ -1029,7 +1040,7 @@ test.describe('Filter Tests: AddOn', () => { } } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; @@ -1080,6 +1091,7 @@ test.describe('Filter Tests: AddOn', () => { } catch (e) { console.error(e); } + await page.reload(); }); test('Filter: Checkbox', async () => { @@ -1108,6 +1120,8 @@ test.describe('Filter Tests: Link to another record, Lookup, Rollup', () => { { op: 'is not blank', value: null, rowCount: 109 }, ]; + await toolbar.clickFilter(); + await toolbar.filter.clickAddFilter(); for (let i = 0; i < filterList.length; i++) { await verifyFilter({ column: 'City List', @@ -1144,6 +1158,8 @@ test.describe('Filter Tests: Link to another record, Lookup, Rollup', () => { { op: 'is not blank', value: null, rowCount: 599 }, ]; + await toolbar.clickFilter(); + await toolbar.filter.clickAddFilter(); for (let i = 0; i < filterList.length; i++) { await verifyFilter({ column: 'Lookup', @@ -1181,6 +1197,8 @@ test.describe('Filter Tests: Link to another record, Lookup, Rollup', () => { { op: 'is not blank', value: null, rowCount: 598 }, ]; + await toolbar.clickFilter(); + await toolbar.filter.clickAddFilter(); for (let i = 0; i < filterList.length; i++) { await verifyFilter({ column: 'Lookup', @@ -1193,7 +1211,7 @@ test.describe('Filter Tests: Link to another record, Lookup, Rollup', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; @@ -1237,7 +1255,7 @@ test.describe('Filter Tests: Toggle button', () => { */ test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; }); diff --git a/tests/playwright/tests/findRowByScanner.spec.ts b/tests/playwright/tests/db/findRowByScanner.spec.ts similarity index 80% rename from tests/playwright/tests/findRowByScanner.spec.ts rename to tests/playwright/tests/db/findRowByScanner.spec.ts index 3d1c6d73cc..167412c99e 100644 --- a/tests/playwright/tests/findRowByScanner.spec.ts +++ b/tests/playwright/tests/db/findRowByScanner.spec.ts @@ -1,8 +1,8 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; -import { FormPage } from '../pages/Dashboard/Form'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import { FormPage } from '../../pages/Dashboard/Form'; +import setup from '../../setup'; // Skip for now as it is not working in CI atm test.describe.skip('Find row by scanner', () => { diff --git a/tests/playwright/tests/import.spec.ts b/tests/playwright/tests/db/import.spec.ts similarity index 86% rename from tests/playwright/tests/import.spec.ts rename to tests/playwright/tests/db/import.spec.ts index c47e4d3783..9a8167d004 100644 --- a/tests/playwright/tests/import.spec.ts +++ b/tests/playwright/tests/db/import.spec.ts @@ -1,9 +1,9 @@ import { test } from '@playwright/test'; -import { airtableApiBase, airtableApiKey } from '../constants'; -import { DashboardPage } from '../pages/Dashboard'; -import { quickVerify } from '../quickTests/commonTest'; -import setup from '../setup'; -import { isPg, isSqlite } from '../setup/db'; +import { airtableApiBase, airtableApiKey } from '../../constants'; +import { DashboardPage } from '../../pages/Dashboard'; +import { quickVerify } from '../../quickTests/commonTest'; +import setup from '../../setup'; +import { isPg, isSqlite } from '../../setup/db'; test.describe('Import', () => { let dashboard: DashboardPage; diff --git a/tests/playwright/tests/keyboardShortcuts.spec.ts b/tests/playwright/tests/db/keyboardShortcuts.spec.ts similarity index 98% rename from tests/playwright/tests/keyboardShortcuts.spec.ts rename to tests/playwright/tests/db/keyboardShortcuts.spec.ts index 2c027f542d..1e73cb5243 100644 --- a/tests/playwright/tests/keyboardShortcuts.spec.ts +++ b/tests/playwright/tests/db/keyboardShortcuts.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { GridPage } from '../pages/Dashboard/Grid'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import setup from '../../setup'; import { Api, UITypes } from 'nocodb-sdk'; let api: Api; @@ -11,7 +11,7 @@ test.describe('Verify shortcuts', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; }); diff --git a/tests/playwright/tests/language.spec.ts b/tests/playwright/tests/db/language.spec.ts similarity index 80% rename from tests/playwright/tests/language.spec.ts rename to tests/playwright/tests/db/language.spec.ts index c3d2453546..d78b049e16 100644 --- a/tests/playwright/tests/language.spec.ts +++ b/tests/playwright/tests/db/language.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { ProjectsPage } from '../pages/ProjectsPage'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { ProjectsPage } from '../../pages/ProjectsPage'; +import setup from '../../setup'; const langMenu = [ 'help-translate', @@ -47,7 +47,7 @@ test.describe('Common', () => { let projectsPage: ProjectsPage; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); projectsPage = new ProjectsPage(page); }); @@ -58,7 +58,7 @@ test.describe('Common', () => { // Index is the order in which menu options appear for (let i = 1; i < langMenu.length; i++) { // scripts/playwright/tests/language.spec.ts - const json = require(`../../../packages/nc-gui/lang/${langMenu[i]}`); + const json = require(`../../../../packages/nc-gui/lang/${langMenu[i]}`); await projectsPage.openLanguageMenu(); await projectsPage.selectLanguage({ index: i }); await projectsPage.verifyLanguage({ json }); diff --git a/tests/playwright/tests/megaTable.spec.ts b/tests/playwright/tests/db/megaTable.spec.ts similarity index 99% rename from tests/playwright/tests/megaTable.spec.ts rename to tests/playwright/tests/db/megaTable.spec.ts index ffa3976579..b47c09ecf2 100644 --- a/tests/playwright/tests/megaTable.spec.ts +++ b/tests/playwright/tests/db/megaTable.spec.ts @@ -1,5 +1,5 @@ import { test } from '@playwright/test'; -import setup from '../setup'; +import setup from '../../setup'; import { UITypes } from 'nocodb-sdk'; import { Api } from 'nocodb-sdk'; let api: Api; diff --git a/tests/playwright/tests/metaSync.spec.ts b/tests/playwright/tests/db/metaSync.spec.ts similarity index 97% rename from tests/playwright/tests/metaSync.spec.ts rename to tests/playwright/tests/db/metaSync.spec.ts index 77e927acb3..a0f3f9ee55 100644 --- a/tests/playwright/tests/metaSync.spec.ts +++ b/tests/playwright/tests/db/metaSync.spec.ts @@ -1,8 +1,8 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { SettingsPage, SettingTab } from '../pages/Dashboard/Settings'; -import setup, { NcContext } from '../setup'; -import { isMysql, isPg, isSqlite, mysqlExec, pgExec, sqliteExec } from '../setup/db'; +import { DashboardPage } from '../../pages/Dashboard'; +import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; +import setup, { NcContext } from '../../setup'; +import { isMysql, isPg, isSqlite, mysqlExec, pgExec, sqliteExec } from '../../setup/db'; test.describe('Meta sync', () => { let dashboard: DashboardPage; @@ -11,7 +11,7 @@ test.describe('Meta sync', () => { let dbExec; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); settings = dashboard.settings; diff --git a/tests/playwright/tests/mobileMode.spec.ts b/tests/playwright/tests/db/mobileMode.spec.ts similarity index 88% rename from tests/playwright/tests/mobileMode.spec.ts rename to tests/playwright/tests/db/mobileMode.spec.ts index 899363c236..997c3b958a 100644 --- a/tests/playwright/tests/mobileMode.spec.ts +++ b/tests/playwright/tests/db/mobileMode.spec.ts @@ -1,8 +1,8 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; -import { FormPage } from '../pages/Dashboard/Form'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import { FormPage } from '../../pages/Dashboard/Form'; +import setup from '../../setup'; test.describe('Mobile Mode', () => { let dashboard: DashboardPage; @@ -11,7 +11,7 @@ test.describe('Mobile Mode', () => { let form: FormPage; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); form = dashboard.form; toolbar = dashboard.grid.toolbar; diff --git a/tests/playwright/tests/pagination.spec.ts b/tests/playwright/tests/db/pagination.spec.ts similarity index 83% rename from tests/playwright/tests/pagination.spec.ts rename to tests/playwright/tests/db/pagination.spec.ts index 52040b7975..45b7040c88 100644 --- a/tests/playwright/tests/pagination.spec.ts +++ b/tests/playwright/tests/db/pagination.spec.ts @@ -1,13 +1,13 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; test.describe('Grid pagination', () => { let dashboard: DashboardPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/projectOperations.spec.ts b/tests/playwright/tests/db/projectOperations.spec.ts similarity index 88% rename from tests/playwright/tests/projectOperations.spec.ts rename to tests/playwright/tests/db/projectOperations.spec.ts index 2684b90ac9..a8ebc03b57 100644 --- a/tests/playwright/tests/projectOperations.spec.ts +++ b/tests/playwright/tests/db/projectOperations.spec.ts @@ -1,8 +1,8 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; -import { ProjectsPage } from '../pages/ProjectsPage'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import { ProjectsPage } from '../../pages/ProjectsPage'; import { Api } from 'nocodb-sdk'; test.describe('Project operations', () => { diff --git a/tests/playwright/tests/rolesCreate.spec.ts b/tests/playwright/tests/db/rolesCreate.spec.ts similarity index 89% rename from tests/playwright/tests/rolesCreate.spec.ts rename to tests/playwright/tests/db/rolesCreate.spec.ts index 79aa72649e..9b6c244e1e 100644 --- a/tests/playwright/tests/rolesCreate.spec.ts +++ b/tests/playwright/tests/db/rolesCreate.spec.ts @@ -1,9 +1,10 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { SettingsPage, SettingTab } from '../pages/Dashboard/Settings'; -import { SignupPage } from '../pages/SignupPage'; -import { ProjectsPage } from '../pages/ProjectsPage'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; +import { SignupPage } from '../../pages/SignupPage'; +import { ProjectsPage } from '../../pages/ProjectsPage'; +import { getDefaultPwd } from '../utils/general'; const roleDb = [ { email: 'creator@nocodb.com', role: 'creator', url: '' }, @@ -20,7 +21,7 @@ test.describe('User roles', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); settings = dashboard.settings; signupPage = new SignupPage(page); @@ -110,7 +111,7 @@ test.describe('User roles', () => { await dashboard.rootPage.goto(roleDb[roleIdx].url); await signupPage.signUp({ email: roleDb[roleIdx].email, - password: 'Password123.', + password: getDefaultPwd(), }); await projectsPage.openProject({ diff --git a/tests/playwright/tests/rolesPreview.spec.ts b/tests/playwright/tests/db/rolesPreview.spec.ts similarity index 91% rename from tests/playwright/tests/rolesPreview.spec.ts rename to tests/playwright/tests/db/rolesPreview.spec.ts index eaca9f9fea..16a9349767 100644 --- a/tests/playwright/tests/rolesPreview.spec.ts +++ b/tests/playwright/tests/db/rolesPreview.spec.ts @@ -1,8 +1,8 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; -import { SettingsPage, SettingTab } from '../pages/Dashboard/Settings'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; const roles = ['Editor', 'Commenter', 'Viewer']; @@ -16,7 +16,7 @@ test.describe('Preview Mode', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; settings = dashboard.settings; diff --git a/tests/playwright/tests/rolesSuperUser.spec.ts b/tests/playwright/tests/db/rolesSuperUser.spec.ts similarity index 92% rename from tests/playwright/tests/rolesSuperUser.spec.ts rename to tests/playwright/tests/db/rolesSuperUser.spec.ts index 80dcf58c06..f5fd01aeab 100644 --- a/tests/playwright/tests/rolesSuperUser.spec.ts +++ b/tests/playwright/tests/db/rolesSuperUser.spec.ts @@ -1,13 +1,13 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; test.describe('Super user', () => { let dashboard: DashboardPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/swagger.spec.ts b/tests/playwright/tests/db/swagger.spec.ts similarity index 90% rename from tests/playwright/tests/swagger.spec.ts rename to tests/playwright/tests/db/swagger.spec.ts index 9033784985..05b51f7568 100644 --- a/tests/playwright/tests/swagger.spec.ts +++ b/tests/playwright/tests/db/swagger.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { GridPage } from '../pages/Dashboard/Grid'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import setup from '../../setup'; test.describe('Table Column Operations', () => { let grid: GridPage, dashboard: DashboardPage; diff --git a/tests/playwright/tests/tableColumnOperation.spec.ts b/tests/playwright/tests/db/tableColumnOperation.spec.ts similarity index 91% rename from tests/playwright/tests/tableColumnOperation.spec.ts rename to tests/playwright/tests/db/tableColumnOperation.spec.ts index 6c921d3b6b..39fdc99de5 100644 --- a/tests/playwright/tests/tableColumnOperation.spec.ts +++ b/tests/playwright/tests/db/tableColumnOperation.spec.ts @@ -1,14 +1,14 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { GridPage } from '../pages/Dashboard/Grid'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import setup from '../../setup'; test.describe('Table Column Operations', () => { let grid: GridPage, dashboard: DashboardPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: true }); dashboard = new DashboardPage(page, context.project); grid = dashboard.grid; diff --git a/tests/playwright/tests/tableOperations.spec.ts b/tests/playwright/tests/db/tableOperations.spec.ts similarity index 89% rename from tests/playwright/tests/tableOperations.spec.ts rename to tests/playwright/tests/db/tableOperations.spec.ts index 9a2d56ebea..2751ffc5cb 100644 --- a/tests/playwright/tests/tableOperations.spec.ts +++ b/tests/playwright/tests/db/tableOperations.spec.ts @@ -1,14 +1,14 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { SettingsPage, SettingTab } from '../pages/Dashboard/Settings'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; +import setup from '../../setup'; test.describe('Table Operations', () => { let dashboard: DashboardPage, settings: SettingsPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); settings = dashboard.settings; }); diff --git a/tests/playwright/tests/toolbarOperations.spec.ts b/tests/playwright/tests/db/toolbarOperations.spec.ts similarity index 92% rename from tests/playwright/tests/toolbarOperations.spec.ts rename to tests/playwright/tests/db/toolbarOperations.spec.ts index 654aab5e1b..8ad08d58e1 100644 --- a/tests/playwright/tests/toolbarOperations.spec.ts +++ b/tests/playwright/tests/db/toolbarOperations.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import setup from '../../setup'; test.describe('Toolbar operations (GRID)', () => { let dashboard: DashboardPage, toolbar: ToolbarPage; @@ -16,7 +16,7 @@ test.describe('Toolbar operations (GRID)', () => { } test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; }); diff --git a/tests/playwright/tests/undo-redo.spec.ts b/tests/playwright/tests/db/undo-redo.spec.ts similarity index 98% rename from tests/playwright/tests/undo-redo.spec.ts rename to tests/playwright/tests/db/undo-redo.spec.ts index e8484ed2b9..e55a27cf3e 100644 --- a/tests/playwright/tests/undo-redo.spec.ts +++ b/tests/playwright/tests/db/undo-redo.spec.ts @@ -1,10 +1,10 @@ import { expect, Page, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; import { Api, UITypes } from 'nocodb-sdk'; -import { rowMixedValue } from '../setup/xcdb-records'; -import { GridPage } from '../pages/Dashboard/Grid'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { rowMixedValue } from '../../setup/xcdb-records'; +import { GridPage } from '../../pages/Dashboard/Grid'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; let dashboard: DashboardPage, grid: GridPage, diff --git a/tests/playwright/tests/viewForm.spec.ts b/tests/playwright/tests/db/viewForm.spec.ts similarity index 92% rename from tests/playwright/tests/viewForm.spec.ts rename to tests/playwright/tests/db/viewForm.spec.ts index 1685f7c886..558905dde0 100644 --- a/tests/playwright/tests/viewForm.spec.ts +++ b/tests/playwright/tests/db/viewForm.spec.ts @@ -1,10 +1,10 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { FormPage } from '../pages/Dashboard/Form'; -import { SharedFormPage } from '../pages/SharedForm'; -import { AccountPage } from '../pages/Account'; -import { AccountAppStorePage } from '../pages/Account/AppStore'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { FormPage } from '../../pages/Dashboard/Form'; +import { SharedFormPage } from '../../pages/SharedForm'; +import { AccountPage } from '../../pages/Account'; +import { AccountAppStorePage } from '../../pages/Account/AppStore'; // todo: Move most of the ui actions to page object and await on the api response test.describe('Form view', () => { @@ -15,7 +15,7 @@ test.describe('Form view', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); form = dashboard.form; accountPage = new AccountPage(page); @@ -177,8 +177,6 @@ test.describe('Form view', () => { // activate SMTP plugin await accountAppStorePage.goto(); - await accountAppStorePage.rootPage.reload({ waitUntil: 'networkidle' }); - await accountAppStorePage.waitUntilContentLoads(); // install SMTP await accountAppStorePage.install({ name: 'SMTP' }); @@ -205,8 +203,6 @@ test.describe('Form view', () => { // Uninstall SMTP await accountAppStorePage.goto(); - await accountAppStorePage.rootPage.reload({ waitUntil: 'networkidle' }); - await accountAppStorePage.waitUntilContentLoads(); await accountAppStorePage.uninstall({ name: 'SMTP' }); await dashboard.verifyToast({ diff --git a/tests/playwright/tests/viewFormShareSurvey.spec.ts b/tests/playwright/tests/db/viewFormShareSurvey.spec.ts similarity index 91% rename from tests/playwright/tests/viewFormShareSurvey.spec.ts rename to tests/playwright/tests/db/viewFormShareSurvey.spec.ts index 11f1ced4ca..b05528155d 100644 --- a/tests/playwright/tests/viewFormShareSurvey.spec.ts +++ b/tests/playwright/tests/db/viewFormShareSurvey.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { SurveyFormPage } from '../pages/Dashboard/SurveyForm'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { SurveyFormPage } from '../../pages/Dashboard/SurveyForm'; +import setup from '../../setup'; test.describe('Share form', () => { let dashboard: DashboardPage; @@ -9,7 +9,7 @@ test.describe('Share form', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/viewGridShare.spec.ts b/tests/playwright/tests/db/viewGridShare.spec.ts similarity index 98% rename from tests/playwright/tests/viewGridShare.spec.ts rename to tests/playwright/tests/db/viewGridShare.spec.ts index ec932816e1..6464426587 100644 --- a/tests/playwright/tests/viewGridShare.spec.ts +++ b/tests/playwright/tests/db/viewGridShare.spec.ts @@ -1,7 +1,7 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { isMysql, isPg, isSqlite } from '../setup/db'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { isMysql, isPg, isSqlite } from '../../setup/db'; test.describe('Shared view', () => { let dashboard: DashboardPage; @@ -10,7 +10,7 @@ test.describe('Shared view', () => { let sharedLink: string; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/viewKanban.spec.ts b/tests/playwright/tests/db/viewKanban.spec.ts similarity index 97% rename from tests/playwright/tests/viewKanban.spec.ts rename to tests/playwright/tests/db/viewKanban.spec.ts index 568d8db418..6231f9636e 100644 --- a/tests/playwright/tests/viewKanban.spec.ts +++ b/tests/playwright/tests/db/viewKanban.spec.ts @@ -1,9 +1,9 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; -import setup from '../setup'; -import { isPg, isSqlite } from '../setup/db'; +import setup from '../../setup'; +import { isPg, isSqlite } from '../../setup/db'; const filmRatings = ['G', 'PG', 'PG-13', 'R', 'NC-17']; @@ -12,7 +12,7 @@ test.describe('View', () => { let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); toolbar = toolbar = dashboard.kanban.toolbar; diff --git a/tests/playwright/tests/viewMap.spec.ts b/tests/playwright/tests/db/viewMap.spec.ts similarity index 91% rename from tests/playwright/tests/viewMap.spec.ts rename to tests/playwright/tests/db/viewMap.spec.ts index 48612c2668..d2ca547f17 100644 --- a/tests/playwright/tests/viewMap.spec.ts +++ b/tests/playwright/tests/db/viewMap.spec.ts @@ -1,8 +1,8 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; +import { DashboardPage } from '../../pages/Dashboard'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; -import setup from '../setup'; +import setup from '../../setup'; test.describe('Map View', () => { let dashboard: DashboardPage, toolbar: ToolbarPage; @@ -15,7 +15,7 @@ test.describe('Map View', () => { const longitudeInShortDecimalLength = '30.5234'; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.map.toolbar; diff --git a/tests/playwright/tests/viewMenu.spec.ts b/tests/playwright/tests/db/viewMenu.spec.ts similarity index 92% rename from tests/playwright/tests/viewMenu.spec.ts rename to tests/playwright/tests/db/viewMenu.spec.ts index 39ac76bd33..5a9f93471e 100644 --- a/tests/playwright/tests/viewMenu.spec.ts +++ b/tests/playwright/tests/db/viewMenu.spec.ts @@ -1,14 +1,14 @@ import { test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; -import { isPg } from '../setup/db'; +import { DashboardPage } from '../../pages/Dashboard'; +import setup from '../../setup'; +import { isPg } from '../../setup/db'; test.describe('Grid view locked', () => { let dashboard: DashboardPage; let context: any; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); }); diff --git a/tests/playwright/tests/views.spec.ts b/tests/playwright/tests/db/views.spec.ts similarity index 95% rename from tests/playwright/tests/views.spec.ts rename to tests/playwright/tests/db/views.spec.ts index b00f98848c..2ee1add7b9 100644 --- a/tests/playwright/tests/views.spec.ts +++ b/tests/playwright/tests/db/views.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import { ToolbarPage } from '../pages/Dashboard/common/Toolbar'; -import setup from '../setup'; +import { DashboardPage } from '../../pages/Dashboard'; +import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; +import setup from '../../setup'; test.describe('Views CRUD Operations', () => { let dashboard: DashboardPage; @@ -9,7 +9,7 @@ test.describe('Views CRUD Operations', () => { let toolbar: ToolbarPage; test.beforeEach(async ({ page }) => { - context = await setup({ page }); + context = await setup({ page, isEmptyProject: false }); dashboard = new DashboardPage(page, context.project); toolbar = dashboard.grid.toolbar; }); diff --git a/tests/playwright/tests/utils/general.ts b/tests/playwright/tests/utils/general.ts index 2bb3bdf035..56a9e1a2b3 100644 --- a/tests/playwright/tests/utils/general.ts +++ b/tests/playwright/tests/utils/general.ts @@ -19,6 +19,14 @@ async function getTextExcludeIconText(selector) { return text.trim(); } +async function getIconText(selector) { + // List of icons + const icons = await selector.locator('.material-symbols-outlined'); + + await icons.nth(0).waitFor(); + return await icons.nth(0).textContent(); +} + function isSubset(obj, potentialSubset) { for (const prop in potentialSubset) { // eslint-disable-next-line no-prototype-builtins @@ -38,4 +46,8 @@ function isSubset(obj, potentialSubset) { return true; } -export { getTextExcludeIconText, isSubset }; +function getDefaultPwd() { + return 'Password123.'; +} + +export { getTextExcludeIconText, isSubset, getIconText, getDefaultPwd };