mirror of
https://github.com/n8n-io/n8n.git
synced 2026-05-29 15:57:00 +02:00
88 lines
2.7 KiB
TypeScript
88 lines
2.7 KiB
TypeScript
import type { Locator } from '@playwright/test';
|
|
|
|
import { BasePage } from './BasePage';
|
|
|
|
export class SettingsUsersPage extends BasePage {
|
|
async goto(): Promise<void> {
|
|
await this.page.goto('/settings/users');
|
|
}
|
|
|
|
getSearchInput(): Locator {
|
|
return this.page.getByTestId('users-list-search');
|
|
}
|
|
|
|
getRow(email: string): Locator {
|
|
return this.page.getByRole('row', { name: email });
|
|
}
|
|
|
|
getAccountType(email: string) {
|
|
return this.getRow(email).getByTestId('user-role-dropdown');
|
|
}
|
|
|
|
clickAccountType(email: string) {
|
|
return this.getRow(email).getByTestId('user-role-dropdown').getByRole('button').click();
|
|
}
|
|
|
|
async search(email: string) {
|
|
const searchInput = this.getSearchInput();
|
|
await searchInput.click();
|
|
await searchInput.fill(email);
|
|
}
|
|
|
|
async transferData(emailOrName: string) {
|
|
await this.page
|
|
.getByRole('radio', {
|
|
name: 'Transfer their workflows and credentials to another user or project',
|
|
})
|
|
// This doesn't work without force: true
|
|
// eslint-disable-next-line playwright/no-force-option
|
|
.click({ force: true });
|
|
|
|
await this.page.getByPlaceholder('Select project or user').click();
|
|
const projectSharingInfo = this.page.getByTestId('project-sharing-info');
|
|
// Try to find by email or name (personal projects now show "Personal space" instead of email)
|
|
const byEmail = projectSharingInfo.filter({ hasText: emailOrName });
|
|
if ((await byEmail.count()) > 0) {
|
|
await byEmail.click();
|
|
} else {
|
|
// For personal projects, try matching by name part of email
|
|
const namePart = emailOrName.split('@')[0].replace(/[.-]/g, ' ');
|
|
await projectSharingInfo
|
|
.filter({ hasText: new RegExp(namePart, 'i') })
|
|
.first()
|
|
.click();
|
|
}
|
|
await this.page.getByRole('button', { name: 'Delete' }).click();
|
|
}
|
|
|
|
async deleteData() {
|
|
await this.page
|
|
.getByRole('radio', {
|
|
name: 'Delete their workflows and credentials',
|
|
})
|
|
// This doesn't work without force: true
|
|
// eslint-disable-next-line playwright/no-force-option
|
|
.check({ force: true });
|
|
await this.page.getByPlaceholder('delete all data').fill('delete all data');
|
|
await this.page.getByRole('button', { name: 'Delete' }).click();
|
|
}
|
|
|
|
async selectAccountType(email: string, type: 'Admin' | 'Member') {
|
|
await this.clickAccountType(email);
|
|
await this.page
|
|
.getByRole('menu')
|
|
.filter({ visible: true })
|
|
.getByRole('menuitem', { name: new RegExp(`^${type}\\b`) })
|
|
.click();
|
|
}
|
|
|
|
async openActions(email: string) {
|
|
await this.getRow(email).getByTestId('action-toggle').getByRole('button').click();
|
|
}
|
|
|
|
async clickDeleteUser(email: string) {
|
|
await this.openActions(email);
|
|
await this.page.getByTestId('action-delete').filter({ visible: true }).click();
|
|
}
|
|
}
|