mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.7 KiB
138 lines
3.7 KiB
/*
|
|
* Squidex Headless CMS
|
|
*
|
|
* @license
|
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
|
|
*/
|
|
|
|
import { Locator, Page } from '@playwright/test';
|
|
import { escapeRegex } from '../utils';
|
|
import { Dropdown } from './dropdown';
|
|
|
|
export class AssetsPage {
|
|
constructor(private readonly page: Page) {}
|
|
|
|
public async goto(appName: string) {
|
|
await this.page.goto(`/app/${appName}/assets`);
|
|
}
|
|
|
|
public async uploadFile(file: { name: string; mimeType: string; buffer: Buffer }) {
|
|
const fileChooserPromise = this.page.waitForEvent('filechooser');
|
|
|
|
await this.page.getByText(/Drop files here to upload/).locator('..').click();
|
|
|
|
const fileChooser = await fileChooserPromise;
|
|
await fileChooser.setFiles(file);
|
|
}
|
|
|
|
public async openAssetFolderDialog() {
|
|
await this.page.getByLabel('Create Folder').click();
|
|
|
|
return new AssetFolderDialog(this.page, this.page.getByTestId('dialog'));
|
|
}
|
|
|
|
public async getAssetCard(name: string) {
|
|
const locator = this.page.locator('sqx-asset', { hasText: escapeRegex(name) });
|
|
|
|
return new AssetCard(this.page, locator);
|
|
}
|
|
|
|
public async getAssetFolderCard(name: string) {
|
|
const locator = this.page.locator('sqx-asset-folder', { hasText: escapeRegex(name) });
|
|
|
|
return new AssetFolderCard(this.page, locator);
|
|
}
|
|
}
|
|
|
|
export class AssetCard {
|
|
constructor(private readonly page: Page,
|
|
public readonly root: Locator,
|
|
) {
|
|
}
|
|
|
|
public async delete(button = /Yes/) {
|
|
await this.root.getByLabel('Delete').click();
|
|
await this.page.getByRole('button', { name: button }).click();
|
|
}
|
|
|
|
public async edit() {
|
|
await this.root.getByLabel('Edit').click();
|
|
|
|
return new AssetDialog(this.page, this.page.getByTestId('dialog'));
|
|
}
|
|
}
|
|
|
|
export class AssetFolderCard {
|
|
constructor(private readonly page: Page,
|
|
public readonly root: Locator,
|
|
) {
|
|
}
|
|
|
|
public async open() {
|
|
await this.root.dblclick();
|
|
}
|
|
|
|
public async rename() {
|
|
const dropdown = await this.openOptionsDropdown();
|
|
await dropdown.action('Rename');
|
|
|
|
return new AssetFolderDialog(this.page, this.page.getByTestId('dialog'));
|
|
}
|
|
|
|
public async openOptionsDropdown() {
|
|
await this.root.getByLabel('Options').click();
|
|
|
|
return new Dropdown(this.page);
|
|
}
|
|
}
|
|
|
|
export class AssetDialog {
|
|
constructor(private readonly page: Page,
|
|
public readonly root: Locator,
|
|
) {
|
|
}
|
|
|
|
public async enterName(name: string) {
|
|
await this.root.getByLabel('Name').fill(name);
|
|
}
|
|
|
|
public async enterMetadata(name: string, value: string) {
|
|
const rows = this.root.getByPlaceholder('Name');
|
|
await rows.first().waitFor({ state: 'attached' });
|
|
|
|
for (const row of await rows.all()) {
|
|
if (await row.inputValue() === name) {
|
|
await row.locator('../..').locator('input').nth(1).fill(value);
|
|
return;
|
|
}
|
|
}
|
|
|
|
throw new Error(`Cannot find row with name '${name}'`);
|
|
}
|
|
|
|
public async save() {
|
|
await this.root.getByRole('button', { name: 'Save' }).click();
|
|
await this.page.getByText('Asset has been updated.').waitFor({ state: 'visible' });
|
|
await this.root.getByLabel('Close').click();
|
|
|
|
}
|
|
}
|
|
|
|
export class AssetFolderDialog {
|
|
constructor(private readonly page: Page,
|
|
public readonly root: Locator,
|
|
) {
|
|
}
|
|
|
|
public async enterName(name: string) {
|
|
await this.root.getByLabel('Folder Name (required)').fill(name);
|
|
}
|
|
|
|
public async save() {
|
|
await this.root.getByRole('button', { name: 'Create' }).click();
|
|
}
|
|
|
|
public async rename() {
|
|
await this.root.getByRole('button', { name: 'Rename' }).click();
|
|
}
|
|
}
|