diff --git a/lib/helpers/ContentRenderUiHelper.ts b/lib/helpers/ContentRenderUiHelper.ts index e52f01d..3bcd97b 100644 --- a/lib/helpers/ContentRenderUiHelper.ts +++ b/lib/helpers/ContentRenderUiHelper.ts @@ -4,10 +4,12 @@ import {umbracoConfig} from "../../umbraco.config"; export class ContentRenderUiHelper extends UiBaseLocators { private readonly contentRenderValue: Locator; + private readonly dataSourceRenderValue: Locator; constructor(page: Page) { super(page); this.contentRenderValue = page.getByTestId('content-render-value'); + this.dataSourceRenderValue = page.getByTestId('data-source-render-value'); } async navigateToRenderedContentPage(contentURL: string) { @@ -30,4 +32,8 @@ export class ContentRenderUiHelper extends UiBaseLocators { async doesContentRenderValueHaveLink(linkSrc: string) { return await expect(this.contentRenderValue.locator('a')).toHaveAttribute('href', linkSrc); } + + async doesDataSourceRenderValueHaveText(text: string) { + return await expect(this.dataSourceRenderValue).toHaveText(text); + } } \ No newline at end of file diff --git a/lib/helpers/ContentUiHelper.ts b/lib/helpers/ContentUiHelper.ts index 2f965ce..818b157 100644 --- a/lib/helpers/ContentUiHelper.ts +++ b/lib/helpers/ContentUiHelper.ts @@ -173,6 +173,8 @@ export class ContentUiHelper extends UiBaseLocators { private readonly refListBlock: Locator; private readonly propertyActionMenu: Locator; private readonly listViewCustomRows: Locator; + private readonly collectionMenu: Locator; + private readonly entityPickerTree: Locator; constructor(page: Page) { super(page); @@ -356,6 +358,9 @@ export class ContentUiHelper extends UiBaseLocators { this.propertyActionMenu = page.locator('#property-action-popover umb-popover-layout'); // List view custom this.listViewCustomRows = page.locator('table tbody tr'); + // Entity Data Picker + this.collectionMenu = page.locator('umb-collection-menu'); + this.entityPickerTree = page.locator('umb-tree[alias="Umb.Tree.EntityDataPicker"]'); } async enterContentName(name: string) { @@ -1769,4 +1774,24 @@ export class ContentUiHelper extends UiBaseLocators { await expect(this.nextBtn).toBeVisible(); await this.nextBtn.click(); } + + // Entity Data Picker + async chooseCollectionMenuItemWithName(name: string) { + await this.clickChooseButton(); + await this.collectionMenu.locator('umb-collection-menu-item', {hasText: name}).click(); + await this.clickChooseContainerButton(); + } + + async chooseTreeMenuItemWithName(name: string, parentNames: string[] = []) { + await this.clickChooseButton(); + for (const itemName of parentNames) { + await this.entityPickerTree.locator('umb-tree-item').getByLabel('Expand child items for ' + itemName).click(); + } + await this.container.getByLabel(name).click(); + await this.clickChooseContainerButton(); + } + + async isChooseButtonVisible(isVisible: boolean = true) { + await expect(this.chooseBtn).toBeVisible({visible: isVisible}); + } } \ No newline at end of file diff --git a/lib/helpers/DataTypeApiHelper.ts b/lib/helpers/DataTypeApiHelper.ts index 54dd934..c837eca 100644 --- a/lib/helpers/DataTypeApiHelper.ts +++ b/lib/helpers/DataTypeApiHelper.ts @@ -29,7 +29,7 @@ import { NumericDataTypeBuilder, TagsDataTypeBuilder, MultiNodeTreePickerDataTypeBuilder, - DateTimeWithTimeZonePickerDataTypeBuilder + DateTimeWithTimeZonePickerDataTypeBuilder, EntityDataPickerDataTypeBuilder } from "@umbraco/json-models-builders"; export class DataTypeApiHelper { @@ -1939,4 +1939,29 @@ export class DataTypeApiHelper { const existingZones = timeZonesData.value.timeZones; return timeZones.every(timeZone => existingZones.includes(timeZone)); } + + // Entity Data Picker + async createEntityDataPickerDataType(name: string, dataSource: string) { + await this.ensureNameNotExists(name); + + const dataType = new EntityDataPickerDataTypeBuilder() + .withName(name) + .withDataSource(dataSource) + .build(); + + return await this.save(dataType); + } + + async createEntityDataPickerDataTypeWithMinAndMaxValues(name: string, dataSource: string, min: number, max: number) { + await this.ensureNameNotExists(name); + + const dataType = new EntityDataPickerDataTypeBuilder() + .withName(name) + .withDataSource(dataSource) + .withMinValue(min) + .withMaxValue(max) + .build(); + + return await this.save(dataType); + } } \ No newline at end of file diff --git a/lib/helpers/DataTypeUiHelper.ts b/lib/helpers/DataTypeUiHelper.ts index e2069c5..62f1b69 100644 --- a/lib/helpers/DataTypeUiHelper.ts +++ b/lib/helpers/DataTypeUiHelper.ts @@ -139,6 +139,7 @@ export class DataTypeUiHelper extends UiBaseLocators { private readonly propertyCrops: Locator; private readonly addTimeZoneBtn: Locator; private readonly timeZoneDropDown: Locator; + private readonly dataSourceChooseBtn: Locator; constructor(page: Page) { super(page); @@ -317,6 +318,9 @@ export class DataTypeUiHelper extends UiBaseLocators { // Date Time with Time Zone Picker this.addTimeZoneBtn = page.locator('#add-time-zone [name="icon-add"] svg'); this.timeZoneDropDown = page.locator('umb-input-time-zone-picker uui-combobox'); + + // Entity Picker Source + this.dataSourceChooseBtn = page.locator('[label="Data Source"]').locator(this.chooseBtn); } async clickActionsMenuForDataType(name: string) { @@ -1277,4 +1281,9 @@ export class DataTypeUiHelper extends UiBaseLocators { await this.addTimeZoneBtn.click(); } } + + async clickChooseDataSourceButton(){ + await expect(this.dataSourceChooseBtn).toBeVisible(); + await this.dataSourceChooseBtn.click(); + } } \ No newline at end of file diff --git a/lib/helpers/TemplateApiHelper.ts b/lib/helpers/TemplateApiHelper.ts index 1e3d855..6e31da1 100644 --- a/lib/helpers/TemplateApiHelper.ts +++ b/lib/helpers/TemplateApiHelper.ts @@ -306,4 +306,10 @@ export class TemplateApiHelper { '\n