From 2b2009376d9fbe0ca7fd04519050bfd30b4b100b Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sat, 12 Nov 2022 21:49:53 +0530 Subject: [PATCH] test(playwrite): add tests Signed-off-by: Pranav C --- .../playwright/pages/Account/AppStore.ts | 0 .../playwright/pages/Account/PasswordReset.ts | 0 .../playwright/pages/Account/Settings.ts | 0 .../tests/playwright/pages/Account/Token.ts | 131 ++++++++++++++++ .../tests/playwright/pages/Account/Users.ts | 135 +++++++++++++++++ .../tests/playwright/pages/Account/index.ts | 48 ++++++ .../tests/accountTokenManagement.spec.ts | 139 +++++++++++++++++ .../tests/accountUserManagement.spec.ts | 140 ++++++++++++++++++ .../tests/accountUserSettings.spec.ts | 137 +++++++++++++++++ 9 files changed, 730 insertions(+) create mode 100644 packages/nc-gui/tests/playwright/pages/Account/AppStore.ts create mode 100644 packages/nc-gui/tests/playwright/pages/Account/PasswordReset.ts create mode 100644 packages/nc-gui/tests/playwright/pages/Account/Settings.ts create mode 100644 packages/nc-gui/tests/playwright/pages/Account/Token.ts create mode 100644 packages/nc-gui/tests/playwright/pages/Account/Users.ts create mode 100644 packages/nc-gui/tests/playwright/pages/Account/index.ts create mode 100644 packages/nc-gui/tests/playwright/tests/accountTokenManagement.spec.ts create mode 100644 packages/nc-gui/tests/playwright/tests/accountUserManagement.spec.ts create mode 100644 packages/nc-gui/tests/playwright/tests/accountUserSettings.spec.ts diff --git a/packages/nc-gui/tests/playwright/pages/Account/AppStore.ts b/packages/nc-gui/tests/playwright/pages/Account/AppStore.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/nc-gui/tests/playwright/pages/Account/PasswordReset.ts b/packages/nc-gui/tests/playwright/pages/Account/PasswordReset.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/nc-gui/tests/playwright/pages/Account/Settings.ts b/packages/nc-gui/tests/playwright/pages/Account/Settings.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/nc-gui/tests/playwright/pages/Account/Token.ts b/packages/nc-gui/tests/playwright/pages/Account/Token.ts new file mode 100644 index 0000000000..1f108fcf05 --- /dev/null +++ b/packages/nc-gui/tests/playwright/pages/Account/Token.ts @@ -0,0 +1,131 @@ +import { Locator } from '@playwright/test'; +import BasePage from '../Base'; +import { AccountPage } from './index'; + +export class AccountTokenPage extends BasePage { + readonly createBtn: Locator; + readonly createModal: Locator; + private accountPage: AccountPage; + + constructor(accountPage: AccountPage) { + super(accountPage.rootPage); + this.accountPage = accountPage; + this.createBtn = this.get().locator(`[data-cy="nc-token-create"]`); + this.createModal = accountPage.rootPage.locator(`.nc-modal-generate-token`); + } + + async goto() { + await this.rootPage.goto('/?dummy=users#/account/tokens'); + } + + get() { + return this.accountPage.get().locator(`[data-cy="nc-token-list"]`); + } + + async createToken({ description }: { description:string }) { + + await this.createBtn.click(); + await this.createModal.locator(`input[placeholder="Description"]`).fill(description); + await this.createModal.locator(`[data-cy="nc-token-modal-save"]`).click(); + await this.verifyToast({ message: 'Token generated successfully' }); + + // return await this.inviteTeamModal.locator(`.ant-alert-message`).innerText(); + } + // + // prefixEmail(email: string) { + // const parallelId = process.env.TEST_PARALLEL_INDEX ?? '0'; + // return `nc_test_${parallelId}_${email}`; + // } + // + // async closeInvite() { + // // two btn-icon-only in invite modal: close & copy url + // await this.inviteTeamModal.locator(`button.ant-btn-icon-only:visible`).first().click(); + // } + // + // getUserRow({ email: _email }: { email: string }) { + // const email = this.prefixEmail(_email); + // return this.get().locator(`tr:has-text("${email}")`); + // } + // + // async updateRole({ email: _email, role }: { email: string; role: string }) { + // const email = this.prefixEmail(_email); + // const userRow = this.getUserRow({ email }); + // await userRow.locator(`.nc-user-roles`).click(); + // await this.rootPage.locator(`.nc-role-option:has-text("${role}")`).click(); + // await this.verifyToast({ message: 'Successfully updated the user details' }); + // } + + /* + getSharedBaseSubModal() { + return this.rootPage.locator(`[data-nc="nc-share-base-sub-modal"]`); + } + + async invite({ email, role }: { email: string; role: string }) { + email = this.prefixEmail(email); + + await this.inviteTeamBtn.click(); + await this.inviteTeamModal.locator(`input[placeholder="E-mail"]`).fill(email); + await this.inviteTeamModal.locator(`.nc-user-roles`).click(); + const userRoleModal = this.rootPage.locator(`.nc-dropdown-user-role`); + await userRoleModal.locator(`.nc-role-option:has-text("${role}")`).click(); + await this.inviteTeamModal.locator(`button:has-text("Invite")`).click(); + await this.verifyToast({ message: 'Successfully updated the user details' }); + + return await this.inviteTeamModal.locator(`.ant-alert-message`).innerText(); + } + + async closeInvite() { + // two btn-icon-only in invite modal: close & copy url + await this.inviteTeamModal.locator(`button.ant-btn-icon-only:visible`).first().click(); + } + + async inviteMore() { + await this.inviteTeamModal.locator(`button:has-text("Invite More")`).click(); + } + + async toggleSharedBase({ toggle }: { toggle: boolean }) { + const toggleBtn = await this.getSharedBaseSubModal().locator(`.nc-disable-shared-base`); + const toggleBtnText = await toggleBtn.first().innerText(); + + const disabledBase = toggleBtnText.includes('Disable'); + + if (disabledBase) { + if (toggle) { + // if share base was disabled && request was to enable + await toggleBtn.click(); + const modal = await this.rootPage.locator(`.nc-dropdown-shared-base-toggle`); + await modal.locator(`.ant-dropdown-menu-title-content`).click(); + } + } else { + if (!toggle) { + // if share base was enabled && request was to disable + await toggleBtn.click(); + const modal = await this.rootPage.locator(`.nc-dropdown-shared-base-toggle`); + await modal.locator(`.ant-dropdown-menu-title-content`).click(); + } + } + } + + async getSharedBaseUrl() { + const url = await this.getSharedBaseSubModal().locator(`.nc-url:visible`).innerText(); + return url; + } + + async sharedBaseActions({ action }: { action: string }) { + const actionMenu = ['reload', 'copy url', 'open tab', 'copy embed code']; + const index = actionMenu.indexOf(action); + + await this.getSharedBaseSubModal().locator(`button.ant-btn-icon-only`).nth(index).click(); + } + + async sharedBaseRole({ role }: { role: string }) { + // editor | viewer + // await this.getSharedBaseSubModal() + // .locator(`.nc-shared-base-role`) + // .waitFor(); + await this.getSharedBaseSubModal().locator(`.nc-shared-base-role:visible`).click(); + const userRoleModal = await this.rootPage.locator(`.nc-dropdown-share-base-role:visible`); + await userRoleModal.locator(`.ant-select-item-option-content:has-text("${role}"):visible`).click(); + } + */ +} diff --git a/packages/nc-gui/tests/playwright/pages/Account/Users.ts b/packages/nc-gui/tests/playwright/pages/Account/Users.ts new file mode 100644 index 0000000000..d46f5a4624 --- /dev/null +++ b/packages/nc-gui/tests/playwright/pages/Account/Users.ts @@ -0,0 +1,135 @@ +import { Locator } from '@playwright/test'; +import BasePage from '../Base'; +import { AccountPage } from './index'; + +export class AccountUsersPage extends BasePage { + readonly inviteTeamBtn: Locator; + readonly inviteTeamModal: Locator; + private accountPage: AccountPage; + + constructor(accountPage: AccountPage) { + super(accountPage.rootPage); + this.accountPage = accountPage; + this.inviteTeamBtn = this.get().locator(`[data-cy="nc-super-user-invite"]`); + this.inviteTeamModal = accountPage.rootPage.locator(`.nc-modal-invite-user`); + } + + async goto() { + await this.rootPage.goto('/?dummy=users#/account/users/list'); + } + + get() { + return this.accountPage.get().locator(`[data-cy="nc-super-user-list"]`); + } + + async invite({ email: _email, role }: { email: string; role: string }) { + const email = this.prefixEmail(_email); + + await this.inviteTeamBtn.click(); + await this.inviteTeamModal.locator(`input[placeholder="E-mail"]`).fill(email); + await this.inviteTeamModal.locator(`.nc-user-roles`).click(); + const userRoleModal = this.rootPage.locator(`.nc-dropdown-user-role`); + await userRoleModal.locator(`.nc-role-option:has-text("${role}")`).click(); + await this.inviteTeamModal.locator(`button:has-text("Invite")`).click(); + await this.verifyToast({ message: 'Successfully added user' }); + + return await this.inviteTeamModal.locator(`.ant-alert-message`).innerText(); + } + + prefixEmail(email: string) { + const parallelId = process.env.TEST_PARALLEL_INDEX ?? '0'; + return `nc_test_${parallelId}_${email}`; + } + + async closeInvite() { + // two btn-icon-only in invite modal: close & copy url + await this.inviteTeamModal.locator(`button.ant-btn-icon-only:visible`).first().click(); + } + + getUserRow({ email: _email }: { email: string }) { + const email = this.prefixEmail(_email); + return this.get().locator(`tr:has-text("${email}")`); + } + + async updateRole({ email: _email, role }: { email: string; role: string }) { + const email = this.prefixEmail(_email); + const userRow = this.getUserRow({ email }); + await userRow.locator(`.nc-user-roles`).click(); + await this.rootPage.locator(`.nc-role-option:has-text("${role}")`).click(); + await this.verifyToast({ message: 'Successfully updated the user details' }); + } + + /* + getSharedBaseSubModal() { + return this.rootPage.locator(`[data-nc="nc-share-base-sub-modal"]`); + } + + async invite({ email, role }: { email: string; role: string }) { + email = this.prefixEmail(email); + + await this.inviteTeamBtn.click(); + await this.inviteTeamModal.locator(`input[placeholder="E-mail"]`).fill(email); + await this.inviteTeamModal.locator(`.nc-user-roles`).click(); + const userRoleModal = this.rootPage.locator(`.nc-dropdown-user-role`); + await userRoleModal.locator(`.nc-role-option:has-text("${role}")`).click(); + await this.inviteTeamModal.locator(`button:has-text("Invite")`).click(); + await this.verifyToast({ message: 'Successfully updated the user details' }); + + return await this.inviteTeamModal.locator(`.ant-alert-message`).innerText(); + } + + async closeInvite() { + // two btn-icon-only in invite modal: close & copy url + await this.inviteTeamModal.locator(`button.ant-btn-icon-only:visible`).first().click(); + } + + async inviteMore() { + await this.inviteTeamModal.locator(`button:has-text("Invite More")`).click(); + } + + async toggleSharedBase({ toggle }: { toggle: boolean }) { + const toggleBtn = await this.getSharedBaseSubModal().locator(`.nc-disable-shared-base`); + const toggleBtnText = await toggleBtn.first().innerText(); + + const disabledBase = toggleBtnText.includes('Disable'); + + if (disabledBase) { + if (toggle) { + // if share base was disabled && request was to enable + await toggleBtn.click(); + const modal = await this.rootPage.locator(`.nc-dropdown-shared-base-toggle`); + await modal.locator(`.ant-dropdown-menu-title-content`).click(); + } + } else { + if (!toggle) { + // if share base was enabled && request was to disable + await toggleBtn.click(); + const modal = await this.rootPage.locator(`.nc-dropdown-shared-base-toggle`); + await modal.locator(`.ant-dropdown-menu-title-content`).click(); + } + } + } + + async getSharedBaseUrl() { + const url = await this.getSharedBaseSubModal().locator(`.nc-url:visible`).innerText(); + return url; + } + + async sharedBaseActions({ action }: { action: string }) { + const actionMenu = ['reload', 'copy url', 'open tab', 'copy embed code']; + const index = actionMenu.indexOf(action); + + await this.getSharedBaseSubModal().locator(`button.ant-btn-icon-only`).nth(index).click(); + } + + async sharedBaseRole({ role }: { role: string }) { + // editor | viewer + // await this.getSharedBaseSubModal() + // .locator(`.nc-shared-base-role`) + // .waitFor(); + await this.getSharedBaseSubModal().locator(`.nc-shared-base-role:visible`).click(); + const userRoleModal = await this.rootPage.locator(`.nc-dropdown-share-base-role:visible`); + await userRoleModal.locator(`.ant-select-item-option-content:has-text("${role}"):visible`).click(); + } + */ +} diff --git a/packages/nc-gui/tests/playwright/pages/Account/index.ts b/packages/nc-gui/tests/playwright/pages/Account/index.ts new file mode 100644 index 0000000000..1c20b75ad6 --- /dev/null +++ b/packages/nc-gui/tests/playwright/pages/Account/index.ts @@ -0,0 +1,48 @@ +import { Page } from '@playwright/test' +import BasePage from '../Base'; + +export enum SettingTab { + TeamAuth = 'teamAndAuth', + AppStore = 'appStore', + ProjectMetadata = 'projMetaData', + Audit = 'audit', +} + +export enum SettingsSubTab { + ERD = 'erd', + Miscellaneous = 'misc', + ACL = 'acl', +} + +export class AccountPage extends BasePage { + // private readonly dashboard: DashboardPage; + // readonly audit: AuditSettingsPage; + // readonly appStore: AppStoreSettingsPage; + // readonly metaData: MetaDataPage; + // readonly miscellaneous: MiscSettingsPage; + // readonly erd: SettingsErdPage; + // readonly teams: TeamsPage; + // readonly acl: AclPage; + + constructor(page: Page) { + super(page); + } + + get() { + return this.rootPage.locator('body'); + } + + // async selectTab({ tab, subTab }: { tab: SettingTab; subTab?: SettingsSubTab }) { + // await this.get().locator(`li[data-menu-id="${tab}"]`).click(); + // if (subTab) await this.get().locator(`li[data-menu-id="${subTab}"]`).click(); + // } + // + // async selectSubTab({ subTab }: { subTab: SettingsSubTab }) { + // await this.get().locator(`li[data-menu-id="${subTab}"]`).click(); + // } + // + // async close() { + // await this.get().locator('[data-nc="settings-modal-close-button"]').click(); + // await this.get().waitFor({ state: 'hidden' }); + // } +} diff --git a/packages/nc-gui/tests/playwright/tests/accountTokenManagement.spec.ts b/packages/nc-gui/tests/playwright/tests/accountTokenManagement.spec.ts new file mode 100644 index 0000000000..fa57a250f4 --- /dev/null +++ b/packages/nc-gui/tests/playwright/tests/accountTokenManagement.spec.ts @@ -0,0 +1,139 @@ +import { test } from '@playwright/test' +import { AccountPage } from '../pages/Account' +import { AccountTokenPage } from '../pages/Account/Token' +import { AccountUsersPage } from '../pages/Account/Users' +import setup from '../setup' + +const roleDb = [ + { email: 'creator@nocodb.com', role: 'Organization level creator', url: '' }, + { email: 'viewer@nocodb.com', role: 'Organization level viewer', url: '' }, +] + +test.describe('User roles', () => { + // let dashboard: DashboardPage; + // let settings: SettingsPage; + // let signupPage: SignupPage; + let accountTokenPage: AccountTokenPage + let accountPage: AccountPage + let context: any + + test.beforeEach(async ({ page }) => { + context = await setup({ page }) + accountPage = new AccountPage(page) + accountTokenPage = new AccountTokenPage(accountPage) + }) + + test('Invite user', async () => { + test.slow() + + await accountTokenPage.goto() + + await accountTokenPage.createToken({description: 'test token'}) + + // for (let i = 0; i < roleDb.length; i++) { + // roleDb[i].url = await accountTokenPage.invite({ + // email: roleDb[i].email, + // role: roleDb[i].role, + // }); + // await accountTokenPage.closeInvite(); + // } + // for (let i = 0; i < roleDb.length; i++) { + // await accountTokenPage.getUserRow({ + // email: roleDb[i].email, + // }) + // } + + // close 'Team & Auth' tab + // await dashboard.gotoSettings(); + // await settings.selectTab({ tab: SettingTab.TeamAuth }); + // for (let i = 0; i < roleDb.length; i++) { + // roleDb[i].url = await settings.teams.invite({ + // email: roleDb[i].email, + // role: roleDb[i].role, + // }); + // await settings.teams.closeInvite(); + // } + // await settings.close(); + // + // // configure access control + // await dashboard.gotoSettings(); + // await settings.selectTab({ + // tab: SettingTab.ProjectMetadata, + // subTab: SettingsSubTab.ACL, + // }); + // await settings.acl.toggle({ table: 'Language', role: 'editor' }); + // await settings.acl.toggle({ table: 'Language', role: 'commenter' }); + // await settings.acl.toggle({ table: 'Language', role: 'viewer' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'editor' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'commenter' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'viewer' }); + // await settings.acl.save(); + // await settings.close(); + // + // // Role test + // for (let i = 0; i < roleDb.length; i++) { + // await roleTest(i); + // } + }) + // + // async function roleTest(roleIdx: number) { + // await roleSignup(roleIdx); + // await dashboard.validateProjectMenu({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.treeView.openTable({ title: 'Country' }); + // + // await dashboard.viewSidebar.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.toolbar.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.treeView.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.openExpandedRow({ index: 0 }); + // await dashboard.expandedForm.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // // Access control validation + // await dashboard.treeView.verifyTable({ + // title: 'Language', + // exists: roleDb[roleIdx].role === 'creator' ? true : false, + // }); + // await dashboard.treeView.verifyTable({ + // title: 'CustomerList', + // exists: roleDb[roleIdx].role === 'creator' ? true : false, + // }); + // } + // + // async function roleSignup(roleIdx: number) { + // await dashboard.signOut(); + // + // await dashboard.rootPage.goto(roleDb[roleIdx].url); + // await signupPage.signUp({ + // email: roleDb[roleIdx].email, + // password: 'Password123.', + // }); + // + // await projectsPage.openProject({ + // title: context.project.title, + // waitForAuthTab: roleDb[roleIdx].role === 'creator', + // withoutPrefix: true, + // }); + // + // // close 'Team & Auth' tab + // if (roleDb[roleIdx].role === 'creator') { + // await dashboard.closeTab({ title: 'Team & Auth' }); + // } + // } +}) diff --git a/packages/nc-gui/tests/playwright/tests/accountUserManagement.spec.ts b/packages/nc-gui/tests/playwright/tests/accountUserManagement.spec.ts new file mode 100644 index 0000000000..e6e9147edf --- /dev/null +++ b/packages/nc-gui/tests/playwright/tests/accountUserManagement.spec.ts @@ -0,0 +1,140 @@ +import { test } from '@playwright/test' +import { AccountPage } from '../pages/Account' +import { AccountUsersPage } from '../pages/Account/Users' +import { DashboardPage } from '../pages/Dashboard' +import setup from '../setup' +import { SettingsPage, SettingsSubTab, SettingTab } from '../pages/Dashboard/Settings' +import { SignupPage } from '../pages/SignupPage' + +const roleDb = [ + { email: 'creator@nocodb.com', role: 'Organization level creator', url: '' }, + { email: 'viewer@nocodb.com', role: 'Organization level viewer', url: '' }, +] + +test.describe('User roles', () => { + // let dashboard: DashboardPage; + // let settings: SettingsPage; + // let signupPage: SignupPage; + let accountUsersPage: AccountUsersPage + let accountPage: AccountPage + let context: any + + test.beforeEach(async ({ page }) => { + context = await setup({ page }) + accountPage = new AccountPage(page) + accountUsersPage = new AccountUsersPage(accountPage) + }) + + test.only('Invite user', async () => { + test.slow() + + await accountUsersPage.goto() + + for (let i = 0; i < roleDb.length; i++) { + roleDb[i].url = await accountUsersPage.invite({ + email: roleDb[i].email, + role: roleDb[i].role, + }); + await accountUsersPage.closeInvite(); + } + for (let i = 0; i < roleDb.length; i++) { + await accountUsersPage.updateRole({ + email: roleDb[i].email, + role: 'Organization level viewer', + }) + } + + // close 'Team & Auth' tab + // await dashboard.gotoSettings(); + // await settings.selectTab({ tab: SettingTab.TeamAuth }); + // for (let i = 0; i < roleDb.length; i++) { + // roleDb[i].url = await settings.teams.invite({ + // email: roleDb[i].email, + // role: roleDb[i].role, + // }); + // await settings.teams.closeInvite(); + // } + // await settings.close(); + // + // // configure access control + // await dashboard.gotoSettings(); + // await settings.selectTab({ + // tab: SettingTab.ProjectMetadata, + // subTab: SettingsSubTab.ACL, + // }); + // await settings.acl.toggle({ table: 'Language', role: 'editor' }); + // await settings.acl.toggle({ table: 'Language', role: 'commenter' }); + // await settings.acl.toggle({ table: 'Language', role: 'viewer' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'editor' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'commenter' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'viewer' }); + // await settings.acl.save(); + // await settings.close(); + // + // // Role test + // for (let i = 0; i < roleDb.length; i++) { + // await roleTest(i); + // } + }) + // + // async function roleTest(roleIdx: number) { + // await roleSignup(roleIdx); + // await dashboard.validateProjectMenu({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.treeView.openTable({ title: 'Country' }); + // + // await dashboard.viewSidebar.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.toolbar.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.treeView.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.openExpandedRow({ index: 0 }); + // await dashboard.expandedForm.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // // Access control validation + // await dashboard.treeView.verifyTable({ + // title: 'Language', + // exists: roleDb[roleIdx].role === 'creator' ? true : false, + // }); + // await dashboard.treeView.verifyTable({ + // title: 'CustomerList', + // exists: roleDb[roleIdx].role === 'creator' ? true : false, + // }); + // } + // + // async function roleSignup(roleIdx: number) { + // await dashboard.signOut(); + // + // await dashboard.rootPage.goto(roleDb[roleIdx].url); + // await signupPage.signUp({ + // email: roleDb[roleIdx].email, + // password: 'Password123.', + // }); + // + // await projectsPage.openProject({ + // title: context.project.title, + // waitForAuthTab: roleDb[roleIdx].role === 'creator', + // withoutPrefix: true, + // }); + // + // // close 'Team & Auth' tab + // if (roleDb[roleIdx].role === 'creator') { + // await dashboard.closeTab({ title: 'Team & Auth' }); + // } + // } +}) diff --git a/packages/nc-gui/tests/playwright/tests/accountUserSettings.spec.ts b/packages/nc-gui/tests/playwright/tests/accountUserSettings.spec.ts new file mode 100644 index 0000000000..a278b7993f --- /dev/null +++ b/packages/nc-gui/tests/playwright/tests/accountUserSettings.spec.ts @@ -0,0 +1,137 @@ +import { test } from '@playwright/test' +import { AccountPage } from '../pages/Account' +import { AccountUsersPage } from '../pages/Account/Users' +import setup from '../setup' + +const roleDb = [ + { email: 'creator@nocodb.com', role: 'Organization level creator', url: '' }, + { email: 'viewer@nocodb.com', role: 'Organization level viewer', url: '' }, +] + +test.describe('User roles', () => { + // let dashboard: DashboardPage; + // let settings: SettingsPage; + // let signupPage: SignupPage; + let accountUsersPage: AccountUsersPage + let accountPage: AccountPage + let context: any + + test.beforeEach(async ({ page }) => { + context = await setup({ page }) + accountPage = new AccountPage(page) + accountUsersPage = new AccountUsersPage(accountPage) + }) + + test('Invite user', async () => { + test.slow() + + await accountUsersPage.goto() + + for (let i = 0; i < roleDb.length; i++) { + roleDb[i].url = await accountUsersPage.invite({ + email: roleDb[i].email, + role: roleDb[i].role, + }); + await accountUsersPage.closeInvite(); + } + for (let i = 0; i < roleDb.length; i++) { + await accountUsersPage.getUserRow({ + email: roleDb[i].email, + + }) + } + + // close 'Team & Auth' tab + // await dashboard.gotoSettings(); + // await settings.selectTab({ tab: SettingTab.TeamAuth }); + // for (let i = 0; i < roleDb.length; i++) { + // roleDb[i].url = await settings.teams.invite({ + // email: roleDb[i].email, + // role: roleDb[i].role, + // }); + // await settings.teams.closeInvite(); + // } + // await settings.close(); + // + // // configure access control + // await dashboard.gotoSettings(); + // await settings.selectTab({ + // tab: SettingTab.ProjectMetadata, + // subTab: SettingsSubTab.ACL, + // }); + // await settings.acl.toggle({ table: 'Language', role: 'editor' }); + // await settings.acl.toggle({ table: 'Language', role: 'commenter' }); + // await settings.acl.toggle({ table: 'Language', role: 'viewer' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'editor' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'commenter' }); + // await settings.acl.toggle({ table: 'CustomerList', role: 'viewer' }); + // await settings.acl.save(); + // await settings.close(); + // + // // Role test + // for (let i = 0; i < roleDb.length; i++) { + // await roleTest(i); + // } + }) + // + // async function roleTest(roleIdx: number) { + // await roleSignup(roleIdx); + // await dashboard.validateProjectMenu({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.treeView.openTable({ title: 'Country' }); + // + // await dashboard.viewSidebar.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.toolbar.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.treeView.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // await dashboard.grid.openExpandedRow({ index: 0 }); + // await dashboard.expandedForm.validateRoleAccess({ + // role: roleDb[roleIdx].role, + // }); + // + // // Access control validation + // await dashboard.treeView.verifyTable({ + // title: 'Language', + // exists: roleDb[roleIdx].role === 'creator' ? true : false, + // }); + // await dashboard.treeView.verifyTable({ + // title: 'CustomerList', + // exists: roleDb[roleIdx].role === 'creator' ? true : false, + // }); + // } + // + // async function roleSignup(roleIdx: number) { + // await dashboard.signOut(); + // + // await dashboard.rootPage.goto(roleDb[roleIdx].url); + // await signupPage.signUp({ + // email: roleDb[roleIdx].email, + // password: 'Password123.', + // }); + // + // await projectsPage.openProject({ + // title: context.project.title, + // waitForAuthTab: roleDb[roleIdx].role === 'creator', + // withoutPrefix: true, + // }); + // + // // close 'Team & Auth' tab + // if (roleDb[roleIdx].role === 'creator') { + // await dashboard.closeTab({ title: 'Team & Auth' }); + // } + // } +})