mirror of https://github.com/nocodb/nocodb
Pranav C
2 years ago
9 changed files with 730 additions and 0 deletions
@ -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(); |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
@ -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(); |
||||||
|
} |
||||||
|
*/ |
||||||
|
} |
@ -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' });
|
||||||
|
// }
|
||||||
|
} |
@ -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' });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}) |
@ -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' });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}) |
@ -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' });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}) |
Loading…
Reference in new issue