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