|
|
|
import { test } from '@playwright/test';
|
|
|
|
import { DashboardPage } from '../pages/Dashboard';
|
|
|
|
import setup from '../setup';
|
|
|
|
import { SettingsPage, SettingsSubTab, SettingTab } from '../pages/Dashboard/Settings';
|
|
|
|
import { SignupPage } from '../pages/SignupPage';
|
|
|
|
import { ProjectsPage } from '../pages/ProjectsPage';
|
|
|
|
|
|
|
|
const roleDb = [
|
|
|
|
{ email: 'creator@nocodb.com', role: 'creator', url: '' },
|
|
|
|
{ email: 'editor@nocodb.com', role: 'editor', url: '' },
|
|
|
|
{ email: 'commenter@nocodb.com', role: 'commenter', url: '' },
|
|
|
|
{ email: 'viewer@nocodb.com', role: 'viewer', url: '' },
|
|
|
|
];
|
|
|
|
|
|
|
|
test.describe('User roles', () => {
|
|
|
|
let dashboard: DashboardPage;
|
|
|
|
let settings: SettingsPage;
|
|
|
|
let signupPage: SignupPage;
|
|
|
|
let projectsPage: ProjectsPage;
|
|
|
|
let context: any;
|
|
|
|
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
|
|
context = await setup({ page });
|
|
|
|
dashboard = new DashboardPage(page, context.project);
|
|
|
|
settings = dashboard.settings;
|
|
|
|
signupPage = new SignupPage(page);
|
|
|
|
projectsPage = new ProjectsPage(page);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('Create role', async () => {
|
|
|
|
test.slow();
|
|
|
|
|
|
|
|
// close 'Team & Auth' tab
|
|
|
|
await dashboard.closeTab({ title: 'Team & Auth' });
|
|
|
|
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' });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|