universo-platform-2d
198 строк · 4.9 Кб
1import type { Locator, Page } from '@playwright/test';2import { expect } from '@playwright/test';3
4export const getPropertyValueLocator = (page: Page, property: string) => {5return page.locator(6`[data-testid="doc-property-name"]:has-text("${property}") + *`7);8};9
10export const ensurePagePropertiesVisible = async (page: Page) => {11if (12await page13.getByRole('button', {14name: 'Add property',15})16.isVisible()17) {18return;19}20await page.getByTestId('page-info-collapse').click();21};22
23export const clickPropertyValue = async (page: Page, property: string) => {24await getPropertyValueLocator(page, property).click();25};26
27export const openTagsEditor = async (page: Page) => {28await clickPropertyValue(page, 'tags');29await expect(page.getByTestId('tags-editor-popup')).toBeVisible();30};31
32export const closeTagsEditor = async (page: Page) => {33await page.keyboard.press('Escape');34await expect(page.getByTestId('tags-editor-popup')).not.toBeVisible();35};36
37export const clickTagFromSelector = async (page: Page, name: string) => {38// assume that the tags editor is already open39await page40.locator(`[data-testid="tag-selector-item"][data-tag-value="${name}"]`)41.click();42};43
44export const removeSelectedTag = async (page: Page, name: string) => {45await page46.locator(47`[data-testid="tags-editor-popup"] [data-testid="inline-tags-list"] [data-tag-value="${name}"] [data-testid="remove-tag-button"]`48)49.click();50};51
52export const filterTags = async (page: Page, filter: string) => {53await page54.locator(55'[data-testid="tags-editor-popup"] [data-testid="inline-tags-list"] input'56)57.fill(filter);58};59
60export const searchAndCreateTag = async (page: Page, name: string) => {61await filterTags(page, name);62await page63.locator(64'[data-testid="tags-editor-popup"] [data-testid="tag-selector-item"]:has-text("Create ")'65)66.click();67};68
69export const expectTagsVisible = async (70root: Locator | Page,71tags: string[]72) => {73const tagListPanel = root74.getByTestId('property-tags-value')75.getByTestId('inline-tags-list');76
77expect(await tagListPanel.locator('[data-tag-value]').count()).toBe(78tags.length79);80
81for (const tag of tags) {82await expect(83tagListPanel.locator(`[data-tag-value="${tag}"]`)84).toBeVisible();85}86};87
88export const clickAddPropertyButton = async (root: Locator | Page) => {89await root90.getByRole('button', {91name: 'Add property',92})93.click();94};95
96export const ensureAddPropertyButtonVisible = async (97page: Page,98root: Locator | Page99) => {100if (101await root102.getByRole('button', {103name: 'Add property',104})105.isVisible()106) {107return;108}109await togglePropertyListVisibility(page);110await page.waitForTimeout(500);111await expect(112root.getByRole('button', { name: 'Add property' })113).toBeVisible();114};115
116export const togglePropertyListVisibility = async (page: Page) => {117await page.getByTestId('property-collapsible-button').click();118};119
120export const addCustomProperty = async (121page: Page,122root: Locator | Page,123type: string124) => {125ensureAddPropertyButtonVisible(page, root);126await clickAddPropertyButton(root);127await page128.locator(129`[data-testid="${'create-property-menu-item'}"][data-property-type="${type}"]`130)131.click();132if (await page.getByTestId('edit-property-menu-item').isVisible()) {133// is edit property menu opened, close it134await page.keyboard.press('Escape');135}136await page.waitForTimeout(500);137};138
139export const expectPropertyOrdering = async (140page: Page,141properties: string[]142) => {143for (let i = 0; i < properties.length; i++) {144await expect(145page.locator(`[data-testid="page-property-row-name"])`).nth(i)146).toHaveText(properties[i]);147}148};149
150export const openWorkspaceProperties = async (page: Page) => {151await page.getByTestId('slider-bar-workspace-setting-button').click();152await page153.locator('[data-testid="workspace-list-item"] .setting-name')154.click();155await page.getByTestId('workspace-list-item-properties').click();156};157
158export const selectVisibilitySelector = async (159page: Page,160name: string,161option: string162) => {163await page164.getByRole('menu')165.locator(166`[data-testid="page-properties-settings-menu-item"]:has-text("${name}")`167)168.getByRole('button')169.click();170
171await page172.getByRole('menu')173.last()174.getByRole('menuitem', {175name: option,176exact: true,177})178.click();179
180await page.waitForTimeout(500);181
182await page.keyboard.press('Escape');183
184await page.waitForTimeout(500);185};186
187export const changePropertyVisibility = async (188page: Page,189name: string,190option: string191) => {192await page193.locator(`[data-testid="doc-property-name"]:has-text("${name}")`)194.click();195await page.locator(`[data-property-visibility="${option}"]`).click();196await page.keyboard.press('Escape');197await page.waitForTimeout(500);198};199