From c81e9decb824df15a7fc720da92b58f53375644e Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Thu, 23 Feb 2023 09:08:46 +0100 Subject: [PATCH 1/9] V11/feature/block grid editor content tests area (#13867) * Added test for testing the area of the blockGridDataType * Bumped version of playwright, builders and the helpers * Added additional test timeout * Added additional timeout since some test can be slow and timeout * Added additional mediaLibrary to the path * Changed so we now use slow which increases the test timeout by three times * Changed to slow instead of setting timeout --- .../package-lock.json | 62 +- .../Umbraco.Tests.AcceptanceTest/package.json | 6 +- .../blockGridEditorAreasContent.spec.ts | 1054 +++++++++++++++++ .../BlockGridEditorDataTypeBlocks.spec.ts | 4 +- .../blockListEditorDataType.spec.ts | 10 +- .../DefaultConfig/Media/mediaFiles.spec.ts | 16 +- 6 files changed, 1104 insertions(+), 48 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 8fd22e6b0c..ac838508c1 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -7,8 +7,8 @@ "name": "acceptancetest", "hasInstallScript": true, "dependencies": { - "@umbraco/json-models-builders": "^1.0.3", - "@umbraco/playwright-testhelpers": "^1.0.21", + "@umbraco/json-models-builders": "^1.0.5", + "@umbraco/playwright-testhelpers": "^1.0.22", "camelize": "^1.0.0", "dotenv": "^16.0.2", "faker": "^4.1.0", @@ -17,7 +17,7 @@ "xhr2": "^0.2.1" }, "devDependencies": { - "@playwright/test": "^1.19.2", + "@playwright/test": "^1.29", "del": "^6.0.0", "ncp": "^2.0.0", "prompt": "^1.2.0", @@ -86,13 +86,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.26.0.tgz", - "integrity": "sha512-D24pu1k/gQw3Lhbpc38G5bXlBjGDrH5A52MsrH12wz6ohGDeQ+aZg/JFSEsT/B3G8zlJe/EU4EkJK74hpqsjEg==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.30.0.tgz", + "integrity": "sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.26.0" + "playwright-core": "1.30.0" }, "bin": { "playwright": "cli.js" @@ -129,20 +129,20 @@ "dev": true }, "node_modules/@umbraco/json-models-builders": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-1.0.3.tgz", - "integrity": "sha512-NNBIP9ZXXZvxanmG5OvE+Ppc2ObSLLUyBbwZiPtwerFxdlnYuUYA6qCq6mj7vx3na6MOQTPZMAiNFEaM0V9xFw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-1.0.5.tgz", + "integrity": "sha512-14xowT8oiW9+DQVOoundRPvcvnNrU0Ey+06G/q/iZyUnqaNRu/i5nUqcbUZGdv6VBCdxaxq2H3WwtSET3gtneA==", "dependencies": { "camelize": "^1.0.0", "faker": "^4.1.0" } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-1.0.21.tgz", - "integrity": "sha512-JfE1MvKc7LEVayF9AX4Ctmx8c6+M+m6+mV7g7QSOYPO7ky/PSlzVvI9S9S7vcpuwLB2Vp4NE9PcXaXUGEvNCnw==", + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-1.0.22.tgz", + "integrity": "sha512-hFqqQvEIylagfqFyhQ2rSyYlUP+xpWA5lkhJjkpb2qpxkIISxjwC/FYJTJGvcoBHuUaZrjsSv4lM2aJy2ZWHMA==", "dependencies": { - "@umbraco/json-models-builders": "^1.0.2", + "@umbraco/json-models-builders": "^1.0.5", "camelize": "^1.0.0", "faker": "^4.1.0", "form-data": "^4.0.0", @@ -725,9 +725,9 @@ } }, "node_modules/playwright-core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.26.0.tgz", - "integrity": "sha512-p8huU8eU4gD3VkJd3DA1nA7R3XA6rFvFL+1RYS96cSljCF2yJE9CWEHTPF4LqX8KN9MoWCrAfVKP5381X3CZqg==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.30.0.tgz", + "integrity": "sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==", "dev": true, "bin": { "playwright": "cli.js" @@ -1018,13 +1018,13 @@ } }, "@playwright/test": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.26.0.tgz", - "integrity": "sha512-D24pu1k/gQw3Lhbpc38G5bXlBjGDrH5A52MsrH12wz6ohGDeQ+aZg/JFSEsT/B3G8zlJe/EU4EkJK74hpqsjEg==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.30.0.tgz", + "integrity": "sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==", "dev": true, "requires": { "@types/node": "*", - "playwright-core": "1.26.0" + "playwright-core": "1.30.0" } }, "@sideway/address": { @@ -1055,20 +1055,20 @@ "dev": true }, "@umbraco/json-models-builders": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-1.0.3.tgz", - "integrity": "sha512-NNBIP9ZXXZvxanmG5OvE+Ppc2ObSLLUyBbwZiPtwerFxdlnYuUYA6qCq6mj7vx3na6MOQTPZMAiNFEaM0V9xFw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-1.0.5.tgz", + "integrity": "sha512-14xowT8oiW9+DQVOoundRPvcvnNrU0Ey+06G/q/iZyUnqaNRu/i5nUqcbUZGdv6VBCdxaxq2H3WwtSET3gtneA==", "requires": { "camelize": "^1.0.0", "faker": "^4.1.0" } }, "@umbraco/playwright-testhelpers": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-1.0.21.tgz", - "integrity": "sha512-JfE1MvKc7LEVayF9AX4Ctmx8c6+M+m6+mV7g7QSOYPO7ky/PSlzVvI9S9S7vcpuwLB2Vp4NE9PcXaXUGEvNCnw==", + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-1.0.22.tgz", + "integrity": "sha512-hFqqQvEIylagfqFyhQ2rSyYlUP+xpWA5lkhJjkpb2qpxkIISxjwC/FYJTJGvcoBHuUaZrjsSv4lM2aJy2ZWHMA==", "requires": { - "@umbraco/json-models-builders": "^1.0.2", + "@umbraco/json-models-builders": "^1.0.5", "camelize": "^1.0.0", "faker": "^4.1.0", "form-data": "^4.0.0", @@ -1503,9 +1503,9 @@ "dev": true }, "playwright-core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.26.0.tgz", - "integrity": "sha512-p8huU8eU4gD3VkJd3DA1nA7R3XA6rFvFL+1RYS96cSljCF2yJE9CWEHTPF4LqX8KN9MoWCrAfVKP5381X3CZqg==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.30.0.tgz", + "integrity": "sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==", "dev": true }, "prompt": { diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index abc16a6865..617da342ce 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -10,7 +10,7 @@ "createTest": "node createTest.js" }, "devDependencies": { - "@playwright/test": "^1.19.2", + "@playwright/test": "^1.29", "typescript": "^4.8.3", "tslib": "^2.4.0", "del": "^6.0.0", @@ -19,8 +19,8 @@ "wait-on": "^6.0.1" }, "dependencies": { - "@umbraco/json-models-builders": "^1.0.3", - "@umbraco/playwright-testhelpers": "^1.0.21", + "@umbraco/json-models-builders": "^1.0.5", + "@umbraco/playwright-testhelpers": "^1.0.22", "camelize": "^1.0.0", "faker": "^4.1.0", "form-data": "^4.0.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts new file mode 100644 index 0000000000..fac41edba8 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts @@ -0,0 +1,1054 @@ +import {AliasHelper, ConstantHelper, test} from "@umbraco/playwright-testhelpers"; +import {ContentBuilder} from "@umbraco/json-models-builders"; +import {BlockGridDataTypeBuilder} from "@umbraco/json-models-builders/dist/lib/builders/dataTypes"; +import {expect} from "@playwright/test"; + +test.describe('BlockGridEditorAreasContent', () => { + const documentName = 'DocumentTest'; + const blockGridName = 'BlockGridTest'; + const elementTitleName = 'ElementTitle'; + const titleText = 'ElementTitle'; + const titleArea = 'AreaTitle'; + const elementBodyName = 'ElementBody'; + const bodyText = 'Lorem ipsum dolor sit amet'; + + const elementBodyAlias = AliasHelper.toAlias(elementBodyName); + const documentAlias = AliasHelper.toAlias(documentName); + const blockGridAlias = AliasHelper.toAlias(blockGridName); + const elementTitleAlias = AliasHelper.toAlias(elementTitleName); + + async function createContentWithABlockInAnotherBlock(umbracoApi,elementParent, elementChild, dataType?, document?) { + + if (dataType == null) { + dataType = await umbracoApi.dataTypes.createBlockGridDataTypeWithArea(umbracoApi, elementParent, elementChild, blockGridName, titleArea); + } + if (document == null) { + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, elementParent, dataType); + } + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementChild.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementChild['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(elementParent.groups[0].properties[0].alias, titleText) + .withContentTypeKey(elementParent['key']) + .done() + .addLayout() + .withContentUdi(elementParent['key']) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementChild['key']) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + return await umbracoApi.content.save(rootContentNode); + } + + test.beforeEach(async ({page, umbracoApi, umbracoUi}, testInfo) => { + await umbracoApi.report.report(testInfo); + await umbracoApi.login(); + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementTitleName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + }); + + test.afterEach(async ({page, umbracoApi, umbracoUi}) => { + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementTitleName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + }); + + test.describe('Areas test', () => { + test('can add an area from a block grid editor to content', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataType = await umbracoApi.dataTypes.createBlockGridDataTypeWithArea(umbracoApi, element, elementBody, blockGridName, titleArea); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Adds a body to the area + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-area-alias="' + titleArea + '"]').click(); + await page.locator('[name="infiniteEditorForm"]').locator('[data-element="editor-container"]').getByRole('button', {name: elementBodyName}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill(bodyText); + await page.locator('[label="Create"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the body element is under the first element + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-content-element-type-key="' + elementBody['key'] + '"]')).toBeVisible(); + // Checks if the value inside of body is correct + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-content-element-type-key="' + elementBody['key'] + '"]').click(); + await expect(page.locator('[id="sub-view-0"]').locator('[id="title"]')).toHaveValue(bodyText); + }); + + test('can update an area in a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const newBodyText = 'Ipsum'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + await createContentWithABlockInAnotherBlock(umbracoApi, element, elementBody); + + await umbracoUi.navigateToContent(blockGridName); + + // Updates ElementBody with new text + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-content-element-type-key="' + elementBody['key'] + '"]').click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill(newBodyText); + await page.getByRole('button', {name: 'Submit'}).click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the value inside of body has changed to the correct text + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-content-element-type-key="' + elementBody['key'] + '"]').click(); + await expect(page.locator('[id="sub-view-0"]').locator('[id="title"]')).toHaveValue(newBodyText); + }); + + test('can delete an area from a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + await createContentWithABlockInAnotherBlock(umbracoApi, element, elementBody); + + await umbracoUi.navigateToContent(blockGridName); + + // Deletes the element in the area + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-content-element-type-key="' + elementBody['key'] + '"]').getByTitle("Delete").click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey('actions_delete')); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the element was removed from the area + await expect(await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-content-element-type-key="' + elementBody['key'] + '"]')).not.toBeVisible(); + }); + + test('can add multiple areas to a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const areaAlias = "AreaBody"; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias(titleArea) + .done() + .addArea() + .withAlias(areaAlias) + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createContentWithABlockInAnotherBlock(umbracoApi, element, elementBody, dataType); + + await umbracoUi.navigateToContent(blockGridName); + + // Adds another body to the area + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-area-alias="' + areaAlias + '"]').click(); + await page.locator('[name="infiniteEditorForm"]').locator('[data-element="editor-container"]').getByRole('button', {name: 'body'}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill(bodyText); + await page.locator('[label="Create"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if both elements exist in the area + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"] >> umb-block-grid-entries')).toHaveCount(2); + }); + }); + + test.describe('Grid Columns for Areas', () => { + test('can see updated grid columns in areas for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const areaGridColumns = 6; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withAreaGridColumns(areaGridColumns) + .addArea() + .withColumnSpan(areaGridColumns) + .withAlias(titleArea) + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the area in content has the value that is defined in the block grid editor + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-alias="' + titleArea + '"]')).toHaveAttribute('data-area-col-span', '6'); + }); + + test('can add two different blocks in a area with different grid columns', async ({page, umbracoApi, umbracoUi}) => { + const secondArea = 'AreaFour'; + const columnSpanEight = "8"; + const columnSpanFour = "4"; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias(titleArea) + .withColumnSpan(columnSpanEight) + .done() + .addArea() + .withAlias(secondArea) + .withColumnSpan(columnSpanFour) + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key']) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementBody['key']) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Adds a block to the area with a different column span + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-alias="' + secondArea + '"]').getByRole('button', {name: 'Add content'}).click(); + await page.locator('[name="infiniteEditorForm"]').locator('[data-element="editor-container"]').getByRole('button', {name: elementBodyName}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill('BodyTwoText'); + await page.locator('[label="Create"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if there are two block in the ElementTitle Area + await expect(page.locator('[data-content-element-type-alias="'+elementTitleAlias+'"]').locator('umb-block-grid-entries')).toHaveCount(2); + // Checks if there are two blocks with different column spans + await expect(page.locator('[data-content-element-type-alias="' + elementTitleAlias + '"]').locator('umb-block-grid-entries').locator('[data-col-span="' + columnSpanEight + '"]')).toBeVisible(); + await expect(page.locator('[data-content-element-type-alias="' + elementTitleAlias + '"]').locator('umb-block-grid-entries').locator('[data-col-span="' + columnSpanFour + '"]')).toBeVisible(); + }); + + test('can add a block with a different row span for an area in block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .withRowMaxSpan(3) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias(titleArea) + .withRowSpan(3) + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, false); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if the button has the correct row span + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-row-span="3"]').getByRole('button', {name: 'Add content'})).toBeVisible(); + + // Adds a block to the area + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-alias="' + titleArea + '"]').getByRole('button', {name: 'Add content'}).click(); + await page.locator('[name="infiniteEditorForm"]').locator('[data-element="editor-container"]').getByRole('button', {name: elementBodyName}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill(bodyText); + await page.locator('[label="Create"]').click(); + // Drags the block so it gets a row span of 3 + const dragFrom = await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]').getByTitle('Drag to scale'); + const dragTo = await page.locator('[data-element="property-' + blockGridAlias + '"]').getByRole('button', {name: 'Clipboard'}); + await umbracoUi.dragAndDrop(dragFrom, dragTo, 0, 0, 10); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the row span of the block has changed from 1 to 3 + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]')).toHaveAttribute('data-row-span', '3'); + }); + }); + + test.describe('Create Button Label', () => { + test('can add a create button label for an area in block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const newButtonLabel = 'NewAreaBlock'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withCreateLabel(newButtonLabel) + .withAlias(titleArea) + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, false); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + const createButtonLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[create-label="' + newButtonLabel + '"]'); + // Check if the area has the correct create button label + await expect(createButtonLocator).toBeVisible(); + // Checks if the button is clickable + await createButtonLocator.click(); + }); + }); + + test.describe('Number of blocks', () => { + test('can add a minimum number of blocks for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withMinAllowed(2) + .withAlias(titleArea) + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createContentWithABlockInAnotherBlock(umbracoApi, element, elementBody, dataType); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if a validation error is visible + await expect(page.locator('[key="validation_entriesShort"]')).toBeVisible(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + // Checks if an error has been thrown with the property not being valid + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]', {hasText: 'This property is invalid'})).toBeVisible(); + // Adds an element to an area + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-alias="' + titleArea + '"]').getByRole('button', {name: 'Add content'}).click(); + await page.locator('[name="infiniteEditorForm"]').locator('[data-element="editor-container"]').getByRole('button', {name: elementBodyName}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill('Test'); + await page.locator('[label="Create"]').click(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if there are two blocks in the area + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"] >> umb-block-grid-entry')).toHaveCount(2); + }); + + test('can add a maximum number of blocks for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const bodyTextTwo = 'AnotherBody'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withMaxAllowed(1) + .withAlias(titleArea) + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyTextTwo) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key']) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'], 0) + .done() + .addItems() + .withContentUdi(elementBody['key'], 1) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if a validation error is visible + await expect(page.locator('[key="validation_entriesExceed"]')).toBeVisible(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + // Checks if an error has been thrown with the property not being valid + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]', {hasText: 'This property is invalid'})).toBeVisible(); + // Removes an element from a area + const BodyTwoUdi = rootContentNode.variants[0].properties[0].value.contentData[1].udi; + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-element-udi="' + BodyTwoUdi + '"]').getByTitle("Delete").click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey('actions_delete')); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if there only is one block in the area + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"] >> umb-block-grid-entry')).toHaveCount(1); + }); + }); + + test.describe('Allowed Block Types', () => { + test('can add allowed block types for an area to a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias(titleArea) + .addSpecifiedAllowance() + .withElementTypeKey(elementBody['key']) + .done() + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key']) + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Adds a ElementBody + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-alias="' + titleArea + '"]').click(); + // Since the ElementBody is added as the only Specified Allowance for the area of the Element, then we should be instantly directed to it, instead of having to pick it. + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill(bodyText); + await page.locator('[label="Create"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + }); + + test('can add allowed block types with a min amount in a area for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias(titleArea) + .addSpecifiedAllowance() + .withElementTypeKey(elementBody['key']) + .withMinAllowed(2) + .done() + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createContentWithABlockInAnotherBlock(umbracoApi, element, elementBody, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if a validation error is visible + await expect(page.locator('[key="blockEditor_areaValidationEntriesShort"]')).toBeVisible(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + // Checks if an error has been thrown with the property not being valid + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]', {hasText: 'This property is invalid'})).toBeVisible(); + // Adds an element to an area + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-alias="' + titleArea + '"]').locator('.umb-block-grid__block--last-inline-create-button').click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill('Test'); + await page.locator('[label="Create"]').click(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if there are two blocks in the area + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"] >> umb-block-grid-entry')).toHaveCount(2); + }); + + test('can add allowed block types with a max amount in a area for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias(titleArea) + .addSpecifiedAllowance() + .withElementTypeKey(elementBody['key']) + .withMaxAllowed(2) + .done() + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, "BodyTwo") + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, "BodyThree") + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key']) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'], 0) + .done() + .addItems() + .withContentUdi(elementBody['key'], 1) + .done() + .addItems() + .withContentUdi(elementBody['key'], 2) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if a validation error is visible + await expect(page.locator('[key="blockEditor_areaValidationEntriesExceed"]')).toBeVisible(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + // Checks if an error has been thrown with the property not being valid + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]', {hasText: 'This property is invalid'})).toBeVisible(); + // Removes an element from a area + const BodyThreeUdi = rootContentNode.variants[0].properties[0].value.contentData[2].udi; + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-element-udi="' + BodyThreeUdi + '"]').getByTitle("Delete").click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey('actions_delete')); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if there are two blocks in the area + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"] >> umb-block-grid-entry')).toHaveCount(2); + }); + + test('can add two different blocks with different min and max', async ({page, umbracoApi, umbracoUi}) => { + const elementFooterName = 'ElementFooter'; + const elementFooterAlias = AliasHelper.toAlias(elementFooterName); + + await umbracoApi.documentTypes.ensureNameNotExists(elementFooterName); + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + const elementTitle = await umbracoApi.documentTypes.createDefaultElementType(elementFooterName, elementFooterAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementTitle['key']) + .done() + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias(titleArea) + .addSpecifiedAllowance() + .withElementTypeKey(elementBody['key']) + .withMinAllowed(1) + .withMaxAllowed(1) + .done() + .addSpecifiedAllowance() + .withElementTypeKey(elementTitle['key']) + .withMinAllowed(1) + .withMaxAllowed(1) + .done() + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, "AnotherBodyText") + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key']) + .addAreas() + .withKey(dataType.preValues[0].value[2].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'], 0) + .done() + .addItems() + .withContentUdi(elementBody['key'], 1) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if there is validation error for both blocks + await expect(page.locator('[key="blockEditor_areaValidationEntriesExceed"]', {hasText: elementBodyName})).toBeVisible(); + await expect(page.locator('[key="blockEditor_areaValidationEntriesShort"]', {hasText: elementFooterName})).toBeVisible(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + // Checks if an error has been thrown with the property not being valid + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]', {hasText: 'This property is invalid'})).toBeVisible(); + // Removes an ElementBody from a area + const BodyTwoUdi = rootContentNode.variants[0].properties[0].value.contentData[1].udi; + await page.locator('[data-content-element-type-key="' + element['key'] + '"] >> [data-element-udi="' + BodyTwoUdi + '"]').getByTitle("Delete").click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey('actions_delete')); + // Checks if the validation error for ElementBody is removed + await expect(page.locator('[key="blockEditor_areaValidationEntriesExceed"]', {hasText: elementBodyName})).not.toBeVisible(); + // Adds an ElementFooter to the area + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-area-alias="' + titleArea + '"]').locator('.umb-block-grid__block--last-inline-create-button').click(); + await page.locator('[name="infiniteEditorForm"]').locator('[data-element="editor-container"]').getByRole('button', {name: elementFooterName}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill('TitleTest'); + await page.locator('[label="Create"]').click(); + // Checks if the validation error for ElementTitle is removed + await expect(page.locator('[key="blockEditor_areaValidationEntriesShort"]', {hasText: elementFooterName})).not.toBeVisible(); + // Tries to publish + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if there are two blocks in the area + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]')).toHaveCount(1); + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-content-element-type-alias="' + elementFooterAlias + '"]')).toHaveCount(1); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementFooterName); + }); + }); + + test.describe('Moving Areas', () => { + test('can move an element out of an area', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataType = await umbracoApi.dataTypes.createBlockGridDataTypeWithArea(umbracoApi, element, elementBody, blockGridName, titleArea); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key'], 0) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'], 0) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Drags and drops the ElementBody to another element + const dragFrom = await page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]'); + const dragTo = await page.locator('[key="blockEditor_addBlock"]'); + await umbracoUi.dragAndDrop(dragFrom, dragTo, 0, 0, 10); + + // Assert + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]').locator('umb-block-grid-entry')).toHaveCount(2); + }); + + test('can move an element from one area to another', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataType = await umbracoApi.dataTypes.createBlockGridDataTypeWithArea(umbracoApi, element, elementBody, blockGridName, titleArea); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, "AnotherOne") + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key'], 0) + .done() + .addLayout() + .withContentUdi(element['key'], 1) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'], 0) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + const ElementMoveFromUdi = rootContentNode.variants[0].properties[0].value.contentData[2].udi; + const ElementMoveToUdi = rootContentNode.variants[0].properties[0].value.contentData[1].udi; + + await umbracoUi.navigateToContent(blockGridName); + + // Drags and drops the ElementBody to another element + const dragFrom = await page.locator('[data-element-udi="' + ElementMoveFromUdi + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]'); + const dragTo = await page.locator('[data-element-udi="' + ElementMoveToUdi + '"]').locator('[data-area-alias="' + titleArea + '"]').getByRole('button', {name: 'Add content'}); + await umbracoUi.dragAndDrop(dragFrom, dragTo, 0, 0, 10); + + // Assert + // Expects the element MoveFrom to have 0 entries + await expect(page.locator('[data-element-udi="' + ElementMoveFromUdi + '"]').locator('umb-block-grid-entry')).toHaveCount(0); + // Expects the element MoveTo to have 1 entry + await expect(page.locator('[data-element-udi="' + ElementMoveToUdi + '"]').locator('umb-block-grid-entry')).toHaveCount(1); + }); + }); + + test.describe('Copy and Paste Blocks', () => { + test('can copy and paste an element in a area', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataType = await umbracoApi.dataTypes.createBlockGridDataTypeWithArea(umbracoApi, element, elementBody, blockGridName, titleArea); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, "AnotherOne") + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key'], 0) + .done() + .addLayout() + .withContentUdi(element['key'], 1) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'], 0) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + const blockParentUdi = rootContentNode.variants[0].properties[0].value.contentData[2].udi; + const blockToCopyTooUdi = rootContentNode.variants[0].properties[0].value.contentData[1].udi; + + await umbracoUi.navigateToContent(blockGridName); + + // Copies and pastes the block into another block + await page.locator('[data-element-udi="' + blockParentUdi + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]').getByRole('button', {name: 'Copy'}).click(); + await page.locator('[data-element-udi="' + blockToCopyTooUdi + '"]').locator('[data-area-alias="' + titleArea + '"]').click(); + await umbracoUi.clickDataElementByElementName('sub-view-clipboard'); + await page.locator('[data-element="editor-container"]').locator('umb-block-card', {hasText: elementBodyName}).click(); + + // Assert + // Checks if both blocks exist with a block inside of each + await expect(page.locator('[data-element-udi="' + blockParentUdi + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]')).toBeVisible(); + await expect(page.locator('[data-element-udi="' + blockToCopyTooUdi + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]')).toBeVisible(); + // Checks if the correct text is inside of the pasted block + await page.locator('[data-element-udi="' + blockToCopyTooUdi + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]').click(); + await expect(page.locator('[id="sub-view-0"]').locator('[id="title"]')).toHaveValue(bodyText); + }); + + test('can copy and paste a block with another block inside of it', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataType = await umbracoApi.dataTypes.createBlockGridDataTypeWithArea(umbracoApi, element, elementBody, blockGridName, titleArea); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .appendContentProperties(elementBody.groups[0].properties[0].alias, bodyText) + .withContentTypeKey(elementBody['key']) + .done() + .addBlockGridEntry() + .appendContentProperties(element.groups[0].properties[0].alias, titleText) + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key'], 0) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'], 0) + .done() + .done() + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + const blockParentUdi = rootContentNode.variants[0].properties[0].value.contentData[1].udi; + + await umbracoUi.navigateToContent(blockGridName); + + // Copies and pastes the block into another block + await page.locator('[data-element-udi="' + blockParentUdi + '"]').getByRole('button', {name: 'Copy'}).nth(1).click(); + await page.locator('[data-element="property-' + blockGridAlias + '"]').getByRole('button', {name: 'Clipboard'}).click(); + await page.locator('[data-element="editor-container"]').locator('umb-block-card', {hasText: elementTitleName}).click(); + + // Checks if the blocks were copied + await expect(page.locator('[data-content-element-type-alias="' + elementTitleAlias + '"]')).toHaveCount(2); + }); + }); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts index 36e7fd6d00..ebf5c1eed9 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts @@ -259,7 +259,9 @@ test.describe('BlockGridEditorDataTypeBlock', () => { await umbracoApi.documentTypes.ensureNameNotExists(elementNameThree); }); - test('can create a block grid datatype with multiple groups and multiple element in each group', async ({page, umbracoApi, umbracoUi}) => { + test('can create a block grid datatype with multiple groups and multiple element in each group', async ({page, umbracoApi, umbracoUi},testInfo) => { + await testInfo.slow(); + const GroupOne = 'GroupOne'; const elementNameFourth = 'FourthElement'; const elementFourthAlias = AliasHelper.toAlias(elementNameFourth); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockListEditor/blockListEditorDataType.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockListEditor/blockListEditorDataType.spec.ts index 0c2c7d9a8f..0ca492c30f 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockListEditor/blockListEditorDataType.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockListEditor/blockListEditorDataType.spec.ts @@ -4,7 +4,6 @@ import {MediaBuilder, MediaFileBuilder, StylesheetBuilder} from "@umbraco/json-m import {BlockListDataTypeBuilder} from "@umbraco/json-models-builders/dist/lib/builders/dataTypes"; test.describe('BlockListEditorDataType', () => { - const documentName = 'DocumentName' const blockListName = 'BlockListTest'; const elementName = 'TestElement'; @@ -13,13 +12,11 @@ test.describe('BlockListEditorDataType', () => { test.beforeEach(async ({page, umbracoApi, umbracoUi}, testInfo) => { await umbracoApi.report.report(testInfo); await umbracoApi.login(); - await umbracoApi.documentTypes.ensureNameNotExists(documentName); await umbracoApi.dataTypes.ensureNameNotExists(blockListName); await umbracoApi.documentTypes.ensureNameNotExists(elementName); }); test.afterEach(async({page, umbracoApi, umbracoUi}) => { - await umbracoApi.documentTypes.ensureNameNotExists(documentName); await umbracoApi.dataTypes.ensureNameNotExists(blockListName); await umbracoApi.documentTypes.ensureNameNotExists(elementName); }) @@ -152,7 +149,10 @@ test.describe('BlockListEditorDataType', () => { await expect(page.locator('[block-config-model="block"]')).toHaveCount(1); }); - test('can edit a block list editor', async ({page, umbracoApi, umbracoUi}) => { + test('can edit a block list editor', async ({page, umbracoApi, umbracoUi}, testInfo) => { + // We need to increase the timeout because the test is taking too long to end + await testInfo.slow() + const elementNameTwo = 'SecondElement'; const elementTwoAlias = AliasHelper.toAlias(elementNameTwo); const stylesheetName = 'TestStyleSheet'; @@ -160,7 +160,7 @@ test.describe('BlockListEditorDataType', () => { const imageName = "Umbraco"; const umbracoFileValue = {"src": "Umbraco.png"}; const fileName = "Umbraco.png"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "image/png"; await umbracoApi.documentTypes.ensureNameNotExists(elementNameTwo); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaFiles.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaFiles.spec.ts index 4805cc5af0..18eb51e9b6 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaFiles.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaFiles.spec.ts @@ -14,7 +14,7 @@ test.describe('media File Types', () => { test('create Article', async ({page, umbracoApi, umbracoUi}) => { const articleName = "Article"; const fileName = "Article.pdf"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "application/pdf"; await umbracoApi.media.ensureNameNotExists(articleName); @@ -32,7 +32,7 @@ test.describe('media File Types', () => { test('create Audio', async ({page, umbracoApi, umbracoUi}) => { const audioName = "Audio"; const fileName = "Audio.mp3"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "audio/mp3" await umbracoApi.media.ensureNameNotExists(audioName); @@ -50,7 +50,7 @@ test.describe('media File Types', () => { test('create File', async ({page, umbracoApi, umbracoUi}) => { const fileItemName = "File"; const fileName = "File.txt"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "*/*"; await umbracoApi.media.ensureNameNotExists(fileItemName); @@ -84,7 +84,7 @@ test.describe('media File Types', () => { const imageName = "Umbraco"; const umbracoFileValue = {"src": "Umbraco.png"}; const fileName = "Umbraco.png" - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "image/png"; await umbracoApi.media.ensureNameNotExists(imageName); @@ -102,7 +102,7 @@ test.describe('media File Types', () => { test('create VectorGraphics(SVG)', async ({page, umbracoApi, umbracoUi}) => { const vectorGraphicsName = 'VectorGraphics'; const fileName = "VectorGraphics.svg"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "image/svg+xml"; await umbracoApi.media.ensureNameNotExists(vectorGraphicsName); @@ -120,7 +120,7 @@ test.describe('media File Types', () => { test('create Video', async ({page, umbracoApi, umbracoUi}) => { const videoName = "Video"; const fileName = "Video.mp4"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "video/mp4"; await umbracoApi.media.ensureNameNotExists(videoName); @@ -367,7 +367,7 @@ test.describe('media File Types', () => { const fileItemNameOld = "File"; const fileItemNameNew = "UpdatedFile"; const fileName = "File.txt"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const mimeType = "*/*"; await umbracoApi.media.ensureNameNotExists(fileItemNameOld); @@ -389,7 +389,7 @@ test.describe('media File Types', () => { test('Update existing File with new File', async ({page, umbracoApi, umbracoUi}) => { const fileItemName = "File"; const fileName = "File.txt"; - const path = fileName; + const path = 'mediaLibrary/' + fileName; const fileNameNew = "UpdatedFile.txt" const pathNew = "./fixtures/mediaLibrary/" + fileNameNew; const mimeType = "*/*"; From d91ed4f568661e2f2856793f6ea1b642ee53541c Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 23 Feb 2023 10:54:20 +0100 Subject: [PATCH 2/9] Obsolete ctor (#13875) --- src/Umbraco.Core/Services/AuditService.cs | 28 ++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Services/AuditService.cs b/src/Umbraco.Core/Services/AuditService.cs index 046c5fff3d..1b059238a1 100644 --- a/src/Umbraco.Core/Services/AuditService.cs +++ b/src/Umbraco.Core/Services/AuditService.cs @@ -1,4 +1,6 @@ +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Querying; @@ -10,6 +12,8 @@ namespace Umbraco.Cms.Core.Services.Implement; public sealed class AuditService : RepositoryService, IAuditService { private readonly IAuditEntryRepository _auditEntryRepository; + private readonly IUserService _userService; + private readonly IEntityRepository _entityRepository; private readonly IAuditRepository _auditRepository; private readonly Lazy _isAvailable; @@ -18,14 +22,36 @@ public sealed class AuditService : RepositoryService, IAuditService ILoggerFactory loggerFactory, IEventMessagesFactory eventMessagesFactory, IAuditRepository auditRepository, - IAuditEntryRepository auditEntryRepository) + IAuditEntryRepository auditEntryRepository, + IUserService userService, + IEntityRepository entityRepository) : base(provider, loggerFactory, eventMessagesFactory) { _auditRepository = auditRepository; _auditEntryRepository = auditEntryRepository; + _userService = userService; + _entityRepository = entityRepository; _isAvailable = new Lazy(DetermineIsAvailable); } + [Obsolete("Use constructor that also takes IUserService & IEntityRepository instead, scheduled for removal in v13")] + public AuditService( + ICoreScopeProvider provider, + ILoggerFactory loggerFactory, + IEventMessagesFactory eventMessagesFactory, + IAuditRepository auditRepository, + IAuditEntryRepository auditEntryRepository) + : this( + provider, + loggerFactory, + eventMessagesFactory, + auditRepository, + auditEntryRepository, + StaticServiceProvider.Instance.GetRequiredService(), + StaticServiceProvider.Instance.GetRequiredService()) + { + } + public void Add(AuditType type, int userId, int objectId, string? entityType, string comment, string? parameters = null) { using (ICoreScope scope = ScopeProvider.CreateCoreScope()) From 9cfda6e05c8c0b35a358affd8f747d445332eb51 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:22:33 +0100 Subject: [PATCH 3/9] new up settings so they are no longer null (#13879) Co-authored-by: Zeegaan --- src/Umbraco.Core/Configuration/Models/SecuritySettings.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs b/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs index d002cc2111..5b36de1bfa 100644 --- a/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs +++ b/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs @@ -69,13 +69,13 @@ public class SecuritySettings /// Gets or sets a value for the user password settings. /// [Obsolete("This no longer works. You can now inject this by using IOptions instead, scheduled for removal in v13")] - public UserPasswordConfigurationSettings? UserPassword { get; set; } + public UserPasswordConfigurationSettings? UserPassword { get; set; } = new(); /// /// Gets or sets a value for the member password settings. /// [Obsolete("This no longer works. You can now inject this by using IOptions instead, scheduled for removal in v13")] - public MemberPasswordConfigurationSettings? MemberPassword { get; set; } + public MemberPasswordConfigurationSettings? MemberPassword { get; set; } = new(); /// /// Gets or sets a value indicating whether to bypass the two factor requirement in Umbraco when using external login From e3f5bf8cdff1fb3ae3eeaa19aaef71c20eaad17d Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:30:29 +0100 Subject: [PATCH 4/9] Added test for the settings section (#13878) --- .../Content/blockGridEditorSettings.spec.ts | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorSettings.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorSettings.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorSettings.spec.ts new file mode 100644 index 0000000000..358a979a43 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorSettings.spec.ts @@ -0,0 +1,155 @@ +import {AliasHelper, ConstantHelper, test} from "@umbraco/playwright-testhelpers"; +import {BlockGridDataTypeBuilder} from "@umbraco/json-models-builders/dist/lib/builders/dataTypes"; +import {expect} from "@playwright/test"; +import {ContentBuilder} from "@umbraco/json-models-builders"; + +test.describe('BlockGridEditorSettings', () => { + const documentName = 'DocumentTest'; + const blockGridName = 'BlockGridTest'; + const elementName = 'ElementTitle'; + + const documentAlias = AliasHelper.toAlias(documentName); + const blockGridAlias = AliasHelper.toAlias(blockGridName); + const elementAlias = AliasHelper.toAlias(elementName); + + test.beforeEach(async ({page, umbracoApi, umbracoUi}, testInfo) => { + await umbracoApi.report.report(testInfo); + await umbracoApi.login(); + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + }); + + test.afterEach(async ({page, umbracoApi, umbracoUi}) => { + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + }); + + test.describe('General', () => { + test('can see label in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const newLabel = "New Label"; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withLabel(newLabel + '{{}}') + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the element contains the correct label + await expect(page.locator('[data-content-element-type-alias="' + elementAlias + '"]')).toContainText(newLabel); + // Checks if the element is clickable + await page.locator('[data-content-element-type-alias="' + elementAlias + '"]').click(); + }); + }); + + test.describe('Permissions', () => { + test('can set allow in root to false for a element in a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withAllowAtRoot(false) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if adding a block is disabled + await expect(page.locator('[data-element="property-'+blockGridAlias+'"]').locator('umb-block-grid-root').locator('[disabled="disabled"]')).toBeDisabled(); + // Checks if the button is not clickable + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]').locator('[key="blockEditor_addBlock"]')).not.toBeEnabled(); + }); + + test('can set allow in areas to false for an element in a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const elementBodyName = 'BodyElement'; + const elementBodyAlias = AliasHelper.toAlias(elementBodyName); + + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .withAllowInAreas(false) + .done() + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias('titleArea') + .done() + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi,element,dataType,false); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the elementTitle is the only element selectable to be in a area + await expect(page.locator('[data-area-alias="titleArea"]').locator('[key="blockEditor_addThis"]')).toContainText('Add ' + elementName); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + }); + }); + + test.describe('Size options', () => { + test('can resize a block to another column span for an element in a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .addColumnSpanOptions(12) + .addColumnSpanOptions(6) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Drags the blocks from a columnSpan of 12 to 6 + const dragFrom = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: elementName}).locator('[title="Drag to scale"]'); + const dragTo = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: elementName}); + await umbracoUi.dragAndDrop(dragFrom,dragTo, 0, 0 ,10); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the block is resized to a column span of 6 + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"], [data-col-span="6"]', {hasText: elementName})).toBeVisible(); + }); + }); +}); \ No newline at end of file From 6128ad1bdebdcdf2fb6ea1bbcb2960ad037616c4 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:44:58 +0100 Subject: [PATCH 5/9] V11/feature/blockgrid editor content tests advanced (#13877) * Added test for the advanced section under the block grid editor in content * Bumped versions * Added fixture template and customView * Updated naming of tests --- .../fixtures/customViews/Image.html | 89 +++++ .../stylesheet/StylesheetBlockGrid.css | 51 +++ .../Content/blockGridEditorAdvanced.spec.ts | 355 ++++++++++++++++++ 3 files changed, 495 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/fixtures/customViews/Image.html create mode 100644 tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/StylesheetBlockGrid.css create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/fixtures/customViews/Image.html b/tests/Umbraco.Tests.AcceptanceTest/fixtures/customViews/Image.html new file mode 100644 index 0000000000..f8f57d7acc --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/fixtures/customViews/Image.html @@ -0,0 +1,89 @@ + + + + + \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/StylesheetBlockGrid.css b/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/StylesheetBlockGrid.css new file mode 100644 index 0000000000..b50d4c27a6 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/StylesheetBlockGrid.css @@ -0,0 +1,51 @@ +.umb-block-grid__layout-container { + position: relative; + display: grid; + grid-template-columns: repeat(var(--umb-block-grid--grid-columns, 1), minmax(0, 1fr)); + grid-auto-flow: row; + grid-auto-rows: minmax(50px, -webkit-min-content); + grid-auto-rows: minmax(50px, min-content); + + -moz-column-gap: var(--umb-block-grid--column-gap, 0); + + column-gap: var(--umb-block-grid--column-gap, 0); + row-gap: var(--umb-block-grid--row-gap, 0); +} +.umb-block-grid__layout-item { + position: relative; + /* For small devices we scale columnSpan by three, to make everything bigger than 1/3 take full width: */ + grid-column-end: span min(calc(var(--umb-block-grid--item-column-span, 1) * 3), var(--umb-block-grid--grid-columns)); + grid-row: span var(--umb-block-grid--item-row-span, 1); +} + + +.umb-block-grid__area-container, .umb-block-grid__block--view::part(area-container) { + position: relative; + display: grid; + grid-template-columns: repeat(var(--umb-block-grid--area-grid-columns, var(--umb-block-grid--grid-columns, 1)), minmax(0, 1fr)); + grid-auto-flow: row; + grid-auto-rows: minmax(50px, -webkit-min-content); + grid-auto-rows: minmax(50px, min-content); + + -moz-column-gap: var(--umb-block-grid--areas-column-gap, 0); + + column-gap: var(--umb-block-grid--areas-column-gap, 0); + row-gap: var(--umb-block-grid--areas-row-gap, 0); +} +.umb-block-grid__area { + position: relative; + height: 100%; + display: flex; + flex-direction: column; + /* For small devices we scale columnSpan by three, to make everything bigger than 1/3 take full width: */ + grid-column-end: span min(calc(var(--umb-block-grid--area-column-span, 1) * 3), var(--umb-block-grid--area-grid-columns)); + grid-row: span var(--umb-block-grid--area-row-span, 1); +} + +@media (min-width:1024px) { + .umb-block-grid__layout-item { + grid-column-end: span min(var(--umb-block-grid--item-column-span, 1), var(--umb-block-grid--grid-columns)); + } + .umb-block-grid__area { + grid-column-end: span min(var(--umb-block-grid--area-column-span, 1), var(--umb-block-grid--area-grid-columns)); + \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts new file mode 100644 index 0000000000..87b19b8776 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts @@ -0,0 +1,355 @@ +import {AliasHelper, ConstantHelper, test} from "@umbraco/playwright-testhelpers"; +import {BlockGridDataTypeBuilder} from "@umbraco/json-models-builders/dist/lib/builders/dataTypes"; +import {ContentBuilder, DocumentTypeBuilder} from "@umbraco/json-models-builders"; +import {expect} from "@playwright/test"; + +test.describe('BlockGridEditorAdvancedContent', () => { + const documentName = 'DocumentTest'; + const blockGridName = 'BlockGridTest'; + const elementName = 'ElementTitle'; + + const documentAlias = AliasHelper.toAlias(documentName); + const blockGridAlias = AliasHelper.toAlias(blockGridName); + const elementAlias = AliasHelper.toAlias(elementName); + + test.beforeEach(async ({page, umbracoApi, umbracoUi}, testInfo) => { + await umbracoApi.report.report(testInfo); + await umbracoApi.login(); + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + }); + + test.afterEach(async ({page, umbracoApi, umbracoUi}) => { + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + }); + + test.describe('Advanced', () => { + test('can see custom view in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + // CustomView + const customViewItemName = "Image"; + const customViewFileName = "Image.html"; + const customViewPath = 'customViews/' + customViewFileName; + const customViewMimeType = "text/html"; + // Image + const imageName = "Umbraco"; + const umbracoFileValue = {"src": "Umbraco.png"}; + const imageFileName = "Umbraco.png"; + const imagePath = 'mediaLibrary/' + imageFileName; + const imageMimeType = "image/png"; + + await umbracoApi.media.ensureNameNotExists(imageName); + await umbracoApi.media.ensureNameNotExists(customViewItemName); + + const imageData = await umbracoApi.media.createImageWithFile(imageName, umbracoFileValue, imageFileName, imagePath, imageMimeType); + + const customViewData = await umbracoApi.media.createFileWithFile(customViewItemName, customViewFileName, customViewPath, customViewMimeType); + const customViewMediaPath = customViewData.mediaLink; + + const element = new DocumentTypeBuilder() + .withName(elementName) + .withAlias(elementAlias) + .AsElementType() + .addGroup() + .withName('ImageGroup') + .withAlias('imageGroup') + .addImagePickerProperty() + .withLabel('Image') + .withAlias('image') + .done() + .done() + .build(); + await umbracoApi.documentTypes.save(element); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withView(customViewMediaPath) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .addImage() + .withMediaKey(imageData.key) + .done() + .done() + .addLayout() + .withContentUdi(element['key']) + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the block has the correct CustomView + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[view="' + customViewMediaPath + '"]')).toBeVisible(); + // Checks if the custom view updated the block by locating a name in the customView + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[view="' + customViewMediaPath + '"]').locator('[name="BlockGridCustomView"]')).toBeVisible(); + // Checks if the block is clickable + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').click(); + + // Clean + await umbracoApi.media.ensureNameNotExists(customViewItemName); + await umbracoApi.media.ensureNameNotExists(imageName); + }); + + test('can see custom stylesheet in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const stylesheetName = "StylesheetBlockGrid.css"; + const stylesheetPath = "stylesheet/" + stylesheetName; + const stylesheetMimeType = "text/css"; + + await umbracoApi.media.ensureNameNotExists(stylesheetName); + + const stylesheetData = await umbracoApi.media.createFileWithFile(stylesheetName, stylesheetName, stylesheetPath, stylesheetMimeType); + const stylesheetDataPath = stylesheetData.mediaLink; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withStylesheet(stylesheetDataPath) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the block has the correct template + await expect(page.locator('umb-block-grid-entry', {hasText: elementName}).locator('umb-block-grid-block')).toHaveAttribute('stylesheet', stylesheetDataPath); + + // Clean + await umbracoApi.media.ensureNameNotExists(stylesheetName); + }); + + test('can see changed overlay editor size in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const editorSize = 'large'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withEditorSize(editorSize) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Opens the content editor + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').click(); + + // Assert + // Checks if the editor contains the correct editor size + await expect(page.locator('.umb-editor--' + editorSize).locator('[id="sub-view-0"]')).toBeVisible(); + }); + + test('can use inline editing mode in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const newText = 'UpdatedText'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withInlineEditing(true) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Updates the block text by using the inline editing mode + await page.locator('[data-element="property-' + blockGridAlias + '"]').locator('[id="title"]').click(); + await page.locator('[data-element="property-' + blockGridAlias + '"]').locator('[id="title"]').fill(newText); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the value in the block was updated by using the inline editing mode + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]').locator('[id="title"]:visible')).toHaveValue(newText); + }); + + test('can hide content editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withForceHideContentEditorInOverlay(true) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Click the block + await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: elementName}).click(); + + // Assert + // Checks if the block is still clickable, if it's clickable that means the the content editor is hidden + await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: elementName}).click(); + }); + }); + + test.describe('Catalogue appearance', () => { + test('can see background color in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const elementTwoName = 'TheSecondElement'; + const elementTwoAlias = AliasHelper.toAlias(elementTwoName); + + const backgroundColor = 'rgb(244, 67, 54)'; + + await umbracoApi.documentTypes.ensureNameNotExists(elementTwoName); + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + const elementTwo = await umbracoApi.documentTypes.createDefaultElementType(elementTwoName, elementTwoAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withBackgroundColor(backgroundColor) + .done() + .addBlock() + .withContentElementTypeKey(elementTwo['key']) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Opens the content editor + await page.locator('[data-element="property-' + blockGridAlias + '"]').getByRole('button', {name: 'Add content'}).click(); + + // Assert + // Checks if the element has the set background color + await expect(page.locator('umb-block-card', {hasText: elementName}).locator('[style="background-color: ' + backgroundColor + '; background-image: none;"]')).toBeVisible(); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementTwoName); + }); + + test('can see icon color in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const elementTwoName = 'TheSecondElement'; + const elementTwoAlias = AliasHelper.toAlias(elementTwoName); + + const iconColor = 'rgb(25, 92, 201)'; + + await umbracoApi.documentTypes.ensureNameNotExists(elementTwoName); + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + const elementTwo = await umbracoApi.documentTypes.createDefaultElementType(elementTwoName, elementTwoAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withIconColor(iconColor) + .done() + .addBlock() + .withContentElementTypeKey(elementTwo['key']) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Opens the content editor + await page.locator('[data-element="property-' + blockGridAlias + '"]').getByRole('button', {name: 'Add content'}).click(); + + // Assert + // Checks if the element has the set icon color + await expect(page.locator('umb-block-card', {hasText: elementName}).locator('.umb-icon')).toHaveAttribute('style', 'color:' + iconColor); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementTwoName); + }); + + test('can see thumbnail in content for a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + // Thumbnail + const imageName = "Umbraco"; + const umbracoFileValue = {"src": "Umbraco.png"}; + const imageFileName = "Umbraco.png"; + const imagePath = 'mediaLibrary/' + imageFileName; + const imageMimeType = "image/png"; + + // ElementTwo + const elementTwoName = 'TheSecondElement'; + const elementTwoAlias = AliasHelper.toAlias(elementTwoName); + + await umbracoApi.media.ensureNameNotExists(imageName); + await umbracoApi.documentTypes.ensureNameNotExists(elementTwoName); + + const imageData = await umbracoApi.media.createImageWithFile(imageName, umbracoFileValue, imageFileName, imagePath, imageMimeType); + const imageDataPath = imageData.mediaLink; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + const elementTwo = await umbracoApi.documentTypes.createDefaultElementType(elementTwoName, elementTwoAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withThumbnail(imageDataPath) + .done() + .addBlock() + .withContentElementTypeKey(elementTwo['key']) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Opens the content editor + await page.locator('[data-element="property-' + blockGridAlias + '"]').getByRole('button', {name: 'Add content'}).click(); + + // Assert + // Checks if the element has the thumbnail + await expect(page.locator('umb-block-card', {hasText: elementName}).locator('.__showcase')).toHaveAttribute('style', 'background-image: url("' + imageDataPath + '?width=400");'); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementTwoName); + await umbracoApi.media.ensureNameNotExists(imageName); + }); + }); +}); \ No newline at end of file From 610a519045acfc056334f70a94358019809533e9 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Tue, 28 Feb 2023 08:06:43 +0100 Subject: [PATCH 6/9] Added test for testing the content editor with a block grid editor (#13887) --- .../Content/blockGridEditorContent.spec.ts | 617 ++++++++++++++++++ 1 file changed, 617 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts new file mode 100644 index 0000000000..0555157f2b --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts @@ -0,0 +1,617 @@ +import {AliasHelper, ConstantHelper, test} from "@umbraco/playwright-testhelpers"; +import {ContentBuilder, DocumentTypeBuilder, MediaBuilder, MediaFileBuilder} from "@umbraco/json-models-builders"; +import {BlockGridDataTypeBuilder} from "@umbraco/json-models-builders/dist/lib/builders/dataTypes"; +import {expect} from "@playwright/test"; + +test.describe('BlockGridEditorContent', () => { + const documentName = 'DocumentTest'; + const blockGridName = 'BlockGridTest'; + const elementName = 'ElementTest'; + + const documentAlias = AliasHelper.toAlias(documentName); + const blockGridAlias = AliasHelper.toAlias(blockGridName); + const elementAlias = AliasHelper.toAlias(elementName); + + test.beforeEach(async ({page, umbracoApi, umbracoUi}, testInfo) => { + await umbracoApi.report.report(testInfo); + await umbracoApi.login(); + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + }); + + test.afterEach(async ({page, umbracoApi, umbracoUi}) => { + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + }); + + test('can create content with a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, null, null); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Adds TestElement + await page.locator('[key="blockEditor_addThis"]', {hasText: elementName}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill('Hi there!'); + await page.locator('[label="Create"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the content was created + await expect(page.locator('.umb-block-grid__block--view')).toHaveCount(1); + await expect(page.locator('.umb-block-grid__block--view').first()).toHaveText(elementName); + }); + + test('can update content with a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const newContentValue = 'UpdatedTitle'; + const newSettingValue = 'UpdatedSetting'; + + const element = await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, null, null, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Updates the already created content text + await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: elementName}).click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill(newContentValue); + await umbracoUi.clickDataElementByElementName('sub-view-settings'); + // Adds text to the setting element + await page.locator('[id="sub-view-1"]').locator('[id="title"]').fill(newSettingValue); + await page.locator('[label="Submit"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the Content and Setting were updated after it was saved + await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: elementName}).click(); + await expect(page.locator('[id="sub-view-0"]').locator('[id="title"]')).toHaveValue(newContentValue); + await umbracoUi.clickDataElementByElementName('sub-view-settings'); + await expect(page.locator('[id="sub-view-1"]').locator('[id="title"]')).toHaveValue(newSettingValue); + }); + + test('can delete a block grid editor in content', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, null, null, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Deletes the block grid editor inside of the content + await page.getByTitle("Delete").click(); + + // Can't use our constant helper because the action for delete does not contain an s. The correct way is 'action-delete' + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey('actions_delete')); + + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the content is actually deleted + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: elementName})).not.toBeVisible(); + await expect(page.locator('.umb-block-grid__block--view')).toHaveCount(0); + }); + + test('can copy block grid content and paste it', async ({page, umbracoApi, umbracoUi}) => { + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, null, null, null); + + await umbracoUi.navigateToContent(blockGridName); + // Checks to make sure that there is only one item + await expect(page.locator('.umb-block-grid__block--view')).toHaveCount(1); + + // Copies the block grid content + await page.getByTitle("Copy").click(); + + await expect(page.locator('.alert-success', {hasText: 'Copied to clipboard'})).toBeVisible(); + // Pastes block grid content + await page.getByTitle("Clipboard").click(); + + await page.locator('umb-block-card', {hasText: elementName}).click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + // Checks if there now are two blocks + await expect(page.locator('.umb-block-grid__block')).toHaveCount(2); + // Checks if the text was copied to the pasted block + await page.locator('.umb-block-grid__block--view').nth(1).click(); + await expect(page.locator('[id="sub-view-0"] >> [name="textbox"]')).toHaveValue('aliasTest'); + }); + + test('can copy block grid content and paste it into another group with the same block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const blockGridTwoName = 'BlockGridTwo'; + const blockGridTwoAlias = AliasHelper.toAlias(blockGridTwoName); + + const groupOne = 'BlockGridGroupOne'; + const groupTwo = 'BlockGridGroupTwo'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataType = await umbracoApi.dataTypes.createDefaultBlockGrid(umbracoApi, blockGridName, element); + + const docType = new DocumentTypeBuilder() + .withName(documentName) + .withAlias(documentAlias) + .withAllowAsRoot(true) + .addGroup() + .withName(groupOne) + .addCustomProperty(dataType['id']) + .withLabel(blockGridName) + .withAlias(blockGridAlias) + .done() + .done() + .addGroup() + .withName(groupTwo) + .addCustomProperty(dataType['id']) + .withLabel(blockGridTwoName) + .withAlias(blockGridTwoAlias) + .done() + .done() + .build(); + await umbracoApi.documentTypes.save(docType); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, true); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks to make sure that there is only one item in the first group + await expect(page.locator('[data-element="group-a' + groupOne + '"] >> .umb-block-grid__block--view')).toHaveCount(1); + // Checks to make sure that there are no items in the second group + await expect(page.locator('[data-element="group-a' + groupTwo + '"] >> .umb-block-grid__block--view')).toHaveCount(0); + + // Copies block grid content from the first group + await page.locator('[title="Copy"]').click(); + await expect(page.locator('.alert-success', {hasText: 'Copied to clipboard'})).toBeVisible(); + // Pastes into the second group + await page.locator('[title="Clipboard"]').nth(1).click(); + await page.locator('umb-block-card', {hasText: elementName}).click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + await expect(page.locator('.alert-success', {hasText: 'Content Published'})).toBeVisible(); + + // Assert + // Checks if both groups has one item each + await expect(page.locator('[data-element="group-a' + groupOne + '"] >> .umb-block-grid__block--view')).toHaveCount(1); + await expect(page.locator('[data-element="group-a' + groupTwo + '"] >> .umb-block-grid__block--view')).toHaveCount(1); + // Opens the second group to see if the block grid item was copied with the correct text + await page.locator('[data-element="group-a' + groupTwo + '"] >> .umb-block-grid__block--view').click(); + await expect(page.locator('[id="sub-view-0"] >> [name="textbox"]')).toHaveValue('aliasTest'); + }); + + test.describe('Moving blocks', () => { + test('can move a block under another block', async ({page, umbracoApi, umbracoUi}) => { + const bottomBlock = "BottomBlock"; + const topBlock = "TopBlock"; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + // We give the dataType a label so we can differentiate between the top and bottom block in the content editor. + const dataType = await umbracoApi.dataTypes.createDefaultBlockGrid(umbracoApi, blockGridName, element, '{{' + element.groups[0].properties[0].alias + '}}'); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, bottomBlock) + .done() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, topBlock) + .done() + .addLayout() + .withContentUdi(element['key'], 0) + .done() + .addLayout() + .withContentUdi(element['key'], 1) + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Drag and Drop + const dragFromLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: bottomBlock}); + const dragToLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: topBlock}); + await umbracoUi.dragAndDrop(dragFromLocator, dragToLocator, 10, 0, 10); + + // Assert + // Checks if the BottomBlock is moved to be under TopBlock + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').nth(1)).toContainText(bottomBlock); + }); + + test('can move a block next to another block', async ({page, umbracoApi, umbracoUi}) => { + const leftBlock = "LeftBlock"; + const rightBlock = "RightBlock"; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withLabel('{{' + element.groups[0].properties[0].alias +'}}') + .withContentElementTypeKey(element['key']) + .addColumnSpanOptions(6) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, rightBlock) + .done() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, leftBlock) + .done() + .addLayout() + .withContentUdi(element['key'], 0) + .done() + .addLayout() + .withContentUdi(element['key'], 1) + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Drag and Drop + const dragFromLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: rightBlock}); + const dragToLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: leftBlock}); + await umbracoUi.dragAndDrop(dragFromLocator, dragToLocator, 0, 20, 10); + + // Assert + // Checks if the rightBlock is moved to the right side of the blocks + await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').nth(1)).toContainText(rightBlock); + }); + }); + + test('can create content with a image', async ({page, umbracoApi, umbracoUi}) => { + const imageName = "Umbraco"; + + await umbracoApi.media.ensureNameNotExists(imageName); + + const element = new DocumentTypeBuilder() + .withName(elementName) + .withAlias(elementAlias) + .AsElementType() + .addGroup() + .withName("ImageGroup") + .withAlias('imageGroup') + .addImagePickerProperty() + .withLabel("Image") + .withAlias("image") + .done() + .done() + .build(); + await umbracoApi.documentTypes.save(element); + + await umbracoApi.media.createDefaultImage(imageName); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, null); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .done() + .addLayout() + .withContentUdi(element['key']) + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Selects the created image for the block + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').click(); + await page.locator('[data-element="property-image"]').locator('[key="' + ConstantHelper.buttons.add + '"]').click(); + await page.locator('[data-element="media-grid"] >> [title="' + imageName + '"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.select)); + await page.locator('[label="Submit"]').click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.isSuccessNotificationVisible(); + // Checks if the image was added to the block + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').click(); + await expect(page.locator('.umb-media-card-grid__cell >> [title="' + imageName + '"]')).toBeVisible(); + // Clean + await umbracoApi.media.ensureNameNotExists(imageName); + }); + + test.describe('Amount', () => { + test('can set a minimum of required blocks in content with a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .withMin(2) + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, false); + + await umbracoUi.navigateToContent(blockGridName); + // Checks if there is validation for needing 2 entries or more + await expect(page.locator('[key="validation_entriesShort"]')).toContainText('Minimum 2 entries'); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + // Checks if a validation error is thrown when trying to save when there is not enough blocks + await expect(page.locator('.alert-error')).toBeVisible(); + + // Adds another block + await page.locator('[key="blockEditor_addThis"]', {hasText: elementName}).click(); + await page.locator('[label="Create"]').click(); + + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.getSuccessNotification(); + // Checks if there are two blocks in the area + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]').locator('umb-block-grid-entry')).toHaveCount(2); + + }); + + test('can set a maximum of required blocks in content with a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .withMax(2) + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.documentTypes.createDefaultDocumentWithBlockGridEditor(umbracoApi, element, dataType); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.save) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, "aliasTest") + .done() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, "aliasTestes") + .done() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, "aliasTester") + .done() + .addLayout() + .withContentUdi(element['key'], 0) + .done() + .addLayout() + .withContentUdi(element['key'], 1) + .done() + .addLayout() + .withContentUdi(element['key'], 2) + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if there is validation for needing 2 entries or less + await expect(page.locator('[key="validation_entriesExceed"]')).toContainText('Maximum 2 entries'); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + // Checks if a validation error is thrown when trying to save when there is too many blocks + await expect(page.locator('.alert-error')).toBeVisible(); + + // Deletes a block + await page.locator('[title="Delete"]').nth(2).click(); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey('actions_delete')); + + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + + // Assert + await umbracoUi.getSuccessNotification(); + // Checks if there are two blocks in the area + await expect(page.locator('[data-element="property-' + blockGridAlias + '"]').locator('umb-block-grid-entry')).toHaveCount(2); + }); + }); + + test.describe('Live editing mode', () => { + test('can use live editing mode in content with a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const newText = 'LiveUpdatedContent'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + // We use the a label so we can see if the block is live updated when content is being written to the element + .withLabel('{{' + element.groups[0].properties[0].alias + '}}') + .withContentElementTypeKey(element['key']) + .withEditorSize('small') + .done() + .withUseLiveEditing(true) + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, false); + + await umbracoUi.navigateToContent(blockGridName); + + // Checks if the block contains the correct text before being edited + await expect(page.locator('[data-content-element-type-alias="'+elementAlias +'"]')).toContainText('aliasTest'); + + // Updates the text without saving the changes. + await page.locator('[data-content-element-type-key="' + element['key'] + '"]').click(); + await page.locator('[id="sub-view-0"]').locator('[id="title"]').fill(newText); + + // Checks if the block is being live updated as the content is being updated. + await expect(page.locator('[data-content-element-type-alias="'+elementAlias +'"]')).toContainText(newText); + }); + }); + + test.describe('Editor width', () => { + test('can see updated editor width in a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const maxWidth = "40%"; + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .withMaxPropertyWidth(maxWidth) + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, false); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the max-width size is the same as defined in the block grid editor + await expect(page.locator('[data-element="property-' + blockGridAlias + '"] >> [style="max-width: ' + maxWidth + ';"]')).toBeVisible(); + }); + }); + + test.describe('Grid Columns', () => { + test('can see updated grid columns in content', async ({page, umbracoApi, umbracoUi}) => { + const gridColumns = 6; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .withGridColumns(gridColumns) + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, false); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the grid columns are the same as defined in the block grid editor + await expect(page.locator('[data-element="property-' + blockGridAlias + '"] >> [grid-columns="' + gridColumns + '"]')).toBeVisible(); + }); + }); + + test.describe('Layout Stylesheet', () => { + test('can use a layout stylesheet in content', async ({page, umbracoApi, umbracoUi}) => { + const stylesheetName = "StylesheetBlockGrid.css"; + const stylesheetPath = "stylesheet/" + stylesheetName; + const stylesheetMimeType = "text/css"; + + await umbracoApi.media.ensureNameNotExists(stylesheetName); + + const stylesheetData = await umbracoApi.media.createFileWithFile(stylesheetName, stylesheetName, stylesheetPath, stylesheetMimeType); + const stylesheetDataPath = stylesheetData.mediaLink; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .withLayoutStylesheet(stylesheetDataPath) + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); + + await umbracoUi.navigateToContent(blockGridName); + + // Assert + // Checks if the block has the correct template + await expect(page.locator('[data-element="property-'+blockGridAlias+'"]').locator('umb-block-grid-root')).toHaveAttribute('stylesheet', stylesheetDataPath); + + // Clean + await umbracoApi.media.ensureNameNotExists(stylesheetName); + }); + }); + + test.describe('Create Button Label', () => { + test('can see updated create button label in content', async ({page, umbracoApi, umbracoUi}) => { + const newButtonLabel = 'AddTestButton'; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementName, elementAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .withCreateLabel(newButtonLabel) + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, false); + + // Goes to the created Content + await umbracoUi.goToSection(ConstantHelper.sections.content); + await umbracoUi.refreshContentTree(); + await umbracoUi.clickDataElementByElementName('tree-item-' + blockGridName); + + // Assert + // Checks if the new button label is on the BlockGridEditor + await expect(page.locator('[data-element="property-' + blockGridAlias + '"] >> .umb-block-grid__actions')).toContainText(newButtonLabel); + // Checks if the button label can be clicked + await page.locator('[data-element="property-' + blockGridAlias + '"] >> .umb-block-grid__actions', {hasText: newButtonLabel}).click(); + }); + }); +}); \ No newline at end of file From 4719f4eb5a656acf95523ff1aabfb1de4e15b3f7 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Tue, 28 Feb 2023 08:16:31 +0100 Subject: [PATCH 7/9] V11/feature/block grid editor content tests rendering (#13885) * Added tests for testing if the rendering is working as intended for the block grid editor * Added Layout stylesheets for testing * We are now using the page.toHaveScreenshot() which checks if the test looks the same as the pngs. * Updated the toHaveScreenShot so they now take in a shorter name for the pngs * Updated the page.goto so they new go the to baseUrl based on the umbracoConfig * Added additional pngs for the Linux tests * Updated the pngs for linux yet again --- .../fixtures/stylesheet/Body.css | 7 + .../fixtures/stylesheet/Title.css | 8 + .../Content/blockGridEditorRendering.spec.ts | 792 ++++++++++++++++++ .../Block-grid-editor-chromium-linux.png | Bin 0 -> 7374 bytes .../Block-grid-editor-chromium-win32.png | Bin 0 -> 6357 bytes ...k-grid-editor-with-area-chromium-linux.png | Bin 0 -> 11209 bytes ...k-grid-editor-with-area-chromium-win32.png | Bin 0 -> 9188 bytes ...tor-with-area-with-area-chromium-linux.png | Bin 0 -> 14712 bytes ...tor-with-area-with-area-chromium-win32.png | Bin 0 -> 11792 bytes ...-with-custom-stylesheet-chromium-linux.png | Bin 0 -> 8430 bytes ...-with-custom-stylesheet-chromium-win32.png | Bin 0 -> 8131 bytes ...-grid-editor-with-image-chromium-linux.png | Bin 0 -> 106623 bytes ...-grid-editor-with-image-chromium-win32.png | Bin 0 -> 106623 bytes ...tor-with-multiple-areas-chromium-linux.png | Bin 0 -> 25743 bytes ...tor-with-multiple-areas-chromium-win32.png | Bin 0 -> 15723 bytes ...-two-custom-stylesheets-chromium-linux.png | Bin 0 -> 9671 bytes ...-two-custom-stylesheets-chromium-win32.png | Bin 0 -> 9657 bytes ...ditor-with-two-elements-chromium-linux.png | Bin 0 -> 9285 bytes ...ditor-with-two-elements-chromium-win32.png | Bin 0 -> 7262 bytes 19 files changed, 807 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Body.css create mode 100644 tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Title.css create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-chromium-win32.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-area-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-area-chromium-win32.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-area-with-area-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-area-with-area-chromium-win32.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-custom-stylesheet-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-custom-stylesheet-chromium-win32.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-image-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-image-chromium-win32.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-multiple-areas-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-multiple-areas-chromium-win32.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-custom-stylesheets-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-custom-stylesheets-chromium-win32.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-elements-chromium-linux.png create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-elements-chromium-win32.png diff --git a/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Body.css b/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Body.css new file mode 100644 index 0000000000..eadaa01275 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Body.css @@ -0,0 +1,7 @@ +.body{ + font-family: 'Lato'; + font-weight: 200; + font-size: 22px; + margin-top: 0.3em; + color: blue; +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Title.css b/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Title.css new file mode 100644 index 0000000000..eaeea812d5 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/fixtures/stylesheet/Title.css @@ -0,0 +1,8 @@ + +.title{ + font-family: 'Lato'; + font-weight: 300; + font-size: 34px; + margin-top: 0.5em; + color: red; +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts new file mode 100644 index 0000000000..d95d39ccaa --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts @@ -0,0 +1,792 @@ +import {AliasHelper, ConstantHelper, test} from "@umbraco/playwright-testhelpers"; +import {ContentBuilder, DocumentTypeBuilder, PartialViewBuilder,} from "@umbraco/json-models-builders"; +import {expect} from "@playwright/test"; +import {BlockGridDataTypeBuilder} from "@umbraco/json-models-builders/dist/lib/builders/dataTypes"; +import {umbracoConfig} from "@umbraco/playwright-testhelpers/dist/umbraco.config"; + +test.describe('BlockGridEditorRending', () => { + const documentName = 'DocumentTest'; + const blockGridName = 'BlockGridTest'; + const elementTitleName = 'ElementTitle'; + const contentText = "ContentTest"; + + const documentAlias = 'documentTest'; + const blockGridAlias = 'blockGridTest'; + const elementTitleAlias = "elementTitle"; + + const elementTitleLabel = 'Title'; + const elementTitleLabelAlias = AliasHelper.toAlias(elementTitleLabel); + + test.beforeEach(async ({page, umbracoApi, umbracoUi}, testInfo) => { + await umbracoApi.report.report(testInfo); + await umbracoApi.login(); + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementTitleName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + await umbracoApi.templates.ensureNameNotExists(documentName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementTitleAlias + '.cshtml') + }); + + test.afterEach(async ({page, umbracoApi, umbracoUi}) => { + await umbracoApi.documentTypes.ensureNameNotExists(documentName); + await umbracoApi.documentTypes.ensureNameNotExists(elementTitleName); + await umbracoApi.dataTypes.ensureNameNotExists(blockGridName); + await umbracoApi.templates.ensureNameNotExists(documentName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementTitleAlias + '.cshtml') + }); + + async function createElementWithRTE(umbracoApi, elementName, elementAlias, label, labelAlias){ + const element = new DocumentTypeBuilder() + .withName(elementName) + .withAlias(elementAlias) + .AsElementType() + .addGroup() + .withName('TestString') + .withAlias('testString') + .addRichTextProperty() + .withLabel(label) + .withAlias(labelAlias) + .done() + .done() + .build(); + return await umbracoApi.documentTypes.save(element); + } + + async function createDocumentWithTemplateAndDataType(umbracoApi, dataType){ + const docType = new DocumentTypeBuilder() + .withName(documentName) + .withAlias('documentTest') + .withDefaultTemplate('documentTest') + .withAllowAsRoot(true) + .addGroup() + .withName('BlockGridGroup') + .withAlias('blockGridGroup') + .addCustomProperty(dataType['id']) + .withLabel(blockGridName) + .withAlias(blockGridAlias) + .done() + .done() + .build(); + return await umbracoApi.documentTypes.save(docType); + } + + async function editDefaultTemplate(umbracoApi){ + await umbracoApi.templates.edit(documentName, '@using Umbraco.Cms.Web.Common.PublishedModels;\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\n' + + '@using ContentModels = Umbraco.Cms.Web.Common.PublishedModels;' + '\n' + + '@await Html.GetBlockGridHtmlAsync(Model.' + blockGridName + ')'); + } + + async function createPartialViewWithArea(umbracoApi, elementAlias, elementLabelAlias){ + const partialViewElementTitle = new PartialViewBuilder() + .withName(elementAlias) + .withContent('@using Umbraco.Extensions' + '\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage' + + '\n' + + '
' + '\n' + + '

@Model.Content.Value("' + elementLabelAlias + '")

' + '\n' + + '
@await Html.GetBlockGridItemAreasHtmlAsync(Model)
' + + '
') + .build(); + partialViewElementTitle.virtualPath = "/Views/Partials/blockgrid/Components/"; + return await umbracoApi.partialViews.save(partialViewElementTitle); + } + + async function createPartialViewWithBlock(umbracoApi,elementAlias, elementLabelAlias){ + const partialViewElementBody = new PartialViewBuilder() + .withName(elementAlias) + .withContent('@using Umbraco.Extensions' + '\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage' + + '\n' + + '
' + '\n' + + '

@Model.Content.Value("' + elementLabelAlias + '")

' + '\n' + + '
') + .build(); + partialViewElementBody.virtualPath = "/Views/Partials/blockgrid/Components/"; + await umbracoApi.partialViews.save(partialViewElementBody); + } + + test('can render content with a block grid editor', async ({page, umbracoApi, umbracoUi}) => { + const element = await createElementWithRTE(umbracoApi, elementTitleName, elementTitleAlias, elementTitleLabel, elementTitleLabelAlias); + + const dataType = await umbracoApi.dataTypes.createDefaultBlockGrid(umbracoApi, blockGridName, element); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + await createPartialViewWithBlock(umbracoApi, elementTitleAlias, elementTitleLabelAlias); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName('BlockGridContent') + .withSave(true) + .withPublish(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, contentText) + .done() + .addLayout() + .withContentUdi(element['key']) + .done() + .done() + .done() + .done() + .withTemplateAlias(documentName) + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor.png'); + }); + + test('can render content with a block grid editor with two elements', async ({page, umbracoApi, umbracoUi}) => { + // ElementBody + const elementBodyName = "ElementBody"; + const elementBodyAlias = AliasHelper.toAlias(elementBodyName); + const elementBodyLabel = 'Body'; + const elementBodyLabelAlias = AliasHelper.toAlias(elementBodyLabel); + + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + + const element = await createElementWithRTE(umbracoApi, elementTitleName, elementTitleAlias, elementTitleLabel, elementTitleLabelAlias); + const elementBody = await createElementWithRTE(umbracoApi, elementBodyName, elementBodyAlias, elementBodyLabel, elementBodyLabelAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .build(); + const dataType= await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + // Creates partial view for the ElementTitle + await createPartialViewWithBlock(umbracoApi, elementTitleAlias, elementTitleLabelAlias); + + // Creates partial view for the ElementBody + await createPartialViewWithBlock(umbracoApi, elementBodyAlias, elementBodyLabelAlias); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName('BlockGridContent') + .withSave(true) + .withPublish(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, contentText) + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'Lorem Ipsum') + .done() + .addLayout() + .withContentUdi(element['key']) + .done() + .addLayout() + .withContentUdi(elementBody['key']) + .done() + .done() + .done() + .done() + .withTemplateAlias(documentName) + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor-with-two-elements.png'); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + }); + + test.describe('Rendering areas', () => { + test('can render a block grid with an area', async ({page, umbracoApi, umbracoUi}) => { + // ElementBody + const elementBodyName = "ElementBody"; + const elementBodyAlias = AliasHelper.toAlias(elementBodyName); + const elementBodyLabel = 'Body'; + const elementBodyLabelAlias = AliasHelper.toAlias(elementBodyLabel); + + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + + const element = await createElementWithRTE(umbracoApi, elementTitleName, elementTitleAlias, elementTitleLabel, elementTitleLabelAlias); + const elementBody = await createElementWithRTE(umbracoApi, elementBodyName, elementBodyAlias, elementBodyLabel, elementBodyLabelAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias('titleArea') + .done() + .done() + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .build(); + const dataType= await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + // Creates partial view for the ElementTitle + await createPartialViewWithArea(umbracoApi, elementTitleAlias, elementTitleLabelAlias); + + // Creates partial view for the ElementBody + await createPartialViewWithBlock(umbracoApi, elementBodyAlias, elementBodyLabelAlias); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName('BlockGridContent') + .withSave(true) + .withPublish(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, contentText) + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'Lorem Ipsum') + .done() + .addLayout() + .withContentUdi(element['key']) + .addAreas() + .withKey(dataType.preValues[0].value[0].areas[0].key) + .addItems() + .withContentUdi(elementBody['key']) + .done() + .done() + .done() + .done() + .done() + .done() + .withTemplateAlias(documentName) + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor-with-area.png'); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + }) + + test('can render a block grid with multiple areas', async ({page, umbracoApi, umbracoUi}) => { + // ElementBody + const elementBodyName = "ElementBody"; + const elementBodyAlias = AliasHelper.toAlias(elementBodyName); + const elementBodyLabel = 'Body'; + const elementBodyLabelAlias = AliasHelper.toAlias(elementBodyLabel); + + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + + const element = await createElementWithRTE(umbracoApi, elementTitleName, elementTitleAlias, elementTitleLabel, elementTitleLabelAlias); + const elementBody = await createElementWithRTE(umbracoApi, elementBodyName, elementBodyAlias, elementBodyLabel, elementBodyLabelAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias('titleArea') + .done() + .done() + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + // Creates partial view for the ElementTitle + await createPartialViewWithArea(umbracoApi, elementTitleAlias, elementTitleLabelAlias); + + // Creates partial view for the ElementBody + await createPartialViewWithBlock(umbracoApi, elementBodyAlias, elementBodyLabelAlias); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName('BlockGridContent') + .withSave(true) + .withPublish(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, contentText) + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'Lorem ipsum') + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'dolor sit amet,') + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'consectetuer adipiscing elit,') + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.') + .done() + .addLayout() + .withContentUdi(element['key']) + .addAreas() + .withKey(dataType.preValues[0].value[0].areas[0].key) + .addItems() + .withContentUdi(elementBody['key'],0) + .done() + .addItems() + .withContentUdi(elementBody['key'],1) + .done() + .addItems() + .withContentUdi(elementBody['key'],2) + .done() + .addItems() + .withContentUdi(elementBody['key'],3) + .done() + .done() + .done() + .done() + .done() + .done() + .withTemplateAlias(documentName) + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor-with-multiple-areas.png'); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + }); + + test('can render a block grid with an area that has another area', async ({page, umbracoApi, umbracoUi}) => { + // ElementBody + const elementBodyName = "ElementBody"; + const elementBodyAlias = AliasHelper.toAlias(elementBodyName); + const elementBodyLabel = 'Body'; + const elementBodyLabelAlias = AliasHelper.toAlias(elementBodyLabel); + + // ElementFooter + const elementFooterName = "ElementFooter"; + const elementFooterAlias = AliasHelper.toAlias(elementFooterName); + const elementFooterLabel = 'Footer'; + const elementFooterLabelAlias = AliasHelper.toAlias(elementFooterLabel); + + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.documentTypes.ensureNameNotExists(elementFooterName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementFooterAlias + '.cshtml'); + + const element = await createElementWithRTE(umbracoApi, elementTitleName, elementTitleAlias, elementTitleLabel, elementTitleLabelAlias); + const elementBody = await createElementWithRTE(umbracoApi, elementBodyName, elementBodyAlias, elementBodyLabel, elementBodyLabelAlias); + const elementFooter = await createElementWithRTE(umbracoApi, elementFooterName, elementFooterAlias, elementFooterLabel, elementFooterLabelAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .addArea() + .withAlias('titleArea') + .done() + .done() + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .addArea() + .withAlias('bodyArea') + .done() + .done() + .addBlock() + .withContentElementTypeKey(elementFooter['key']) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + // Creates partial view for the ElementTitle + await createPartialViewWithArea(umbracoApi, elementTitleAlias, elementTitleLabelAlias); + + // Creates partial view for the ElementBody + await createPartialViewWithArea(umbracoApi, elementBodyAlias, elementBodyLabelAlias); + + // Creates partial view for the ElementFooter + await createPartialViewWithBlock(umbracoApi, elementFooterAlias, elementFooterLabelAlias); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName('BlockGridContent') + .withSave(true) + .withPublish(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, contentText) + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'Lorem ipsum') + .done() + .addBlockGridEntry() + .withContentTypeKey(elementFooter['key']) + .appendContentProperties(elementFooter.groups[0].properties[0].alias, 'dolor sit amet') + .done() + .addLayout() + .withContentUdi(element['key']) + .addAreas() + .withKey(dataType.preValues[0].value[0].areas[0].key) + .addItems() + .withContentUdi(elementBody['key']) + .addAreas() + .withKey(dataType.preValues[0].value[1].areas[0].key) + .addItems() + .withContentUdi(elementFooter['key']) + .done() + .done() + .done() + .done() + .done() + .done() + .done() + .done() + .withTemplateAlias(documentName) + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor-with-area-with-area.png'); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.documentTypes.ensureNameNotExists(elementFooterName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementFooterAlias + '.cshtml'); + }); + }); + + test.describe('Layout Stylesheet', () => { + test('can render a block with a custom layout stylesheet', async ({page, umbracoApi, umbracoUi}) => { + const stylesheetName = "Title.css"; + const stylesheetPath = "stylesheet/" + stylesheetName; + const stylesheetMimeType = "text/css"; + + await umbracoApi.media.ensureNameNotExists(stylesheetName); + + const stylesheetData = await umbracoApi.media.createFileWithFile(stylesheetName, stylesheetName, stylesheetPath, stylesheetMimeType); + const stylesheetDataPath = stylesheetData.mediaLink; + + const element = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .withStylesheet(stylesheetDataPath) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + const partialViewElement = new PartialViewBuilder() + .withName(elementTitleAlias) + .withContent('@using Umbraco.Extensions' + '\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage' + + '\n' + + '
' + '\n' + + '

@Model.Content.Value("' + elementTitleLabelAlias + '")

' + '\n' + + '
' + '\n' + + '') + .build(); + partialViewElement.virtualPath = "/Views/Partials/blockgrid/Components/"; + await umbracoApi.partialViews.save(partialViewElement); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName('BlockGridContent') + .withSave(true) + .withPublish(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .appendContentProperties(element.groups[0].properties[0].alias, contentText) + .done() + .addLayout() + .withContentUdi(element['key']) + .done() + .done() + .done() + .done() + .withTemplateAlias(documentName) + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor-with-custom-stylesheet.png'); + + // Clean + await umbracoApi.media.ensureNameNotExists(stylesheetName); + }); + + test('can render a block with another area where each block has a different custom layout stylesheet', async ({page, umbracoApi, umbracoUi}) => { + // TitleStylesheet + const stylesheetTitleName = "Title.css"; + const stylesheetTitlePath = "stylesheet/" + stylesheetTitleName; + const stylesheetMimeType = "text/css"; + // BodyStylesheet + const stylesheetBodyName = "Body.css"; + const stylesheetBodyPath = "stylesheet/" + stylesheetBodyName; + // ElementBody + const elementBodyName = "ElementBody"; + const elementBodyAlias = AliasHelper.toAlias(elementBodyName); + + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.media.ensureNameNotExists(stylesheetTitleName); + await umbracoApi.media.ensureNameNotExists(stylesheetBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + + const stylesheetTitleData = await umbracoApi.media.createFileWithFile(stylesheetTitleName, stylesheetTitleName, stylesheetTitlePath, stylesheetMimeType); + const stylesheetBodyData = await umbracoApi.media.createFileWithFile(stylesheetBodyName, stylesheetBodyName, stylesheetBodyPath, stylesheetMimeType); + const stylesheetTitleDataPath = stylesheetTitleData.mediaLink; + const stylesheetBodyDataPath = stylesheetBodyData.mediaLink; + + const elementTitle = await umbracoApi.documentTypes.createDefaultElementType(elementTitleName, elementTitleAlias); + const elementBody = await umbracoApi.documentTypes.createDefaultElementType(elementBodyName, elementBodyAlias); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(elementTitle['key']) + .withStylesheet(stylesheetTitleDataPath) + .addArea() + .withAlias('TitleArea') + .done() + .done() + .addBlock() + .withContentElementTypeKey(elementBody['key']) + .withStylesheet(stylesheetBodyDataPath) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + const partialViewElementTitle = new PartialViewBuilder() + .withName(elementTitleAlias) + .withContent('@using Umbraco.Extensions' + '\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage' + + '\n' + + '
' + '\n' + + '

@Model.Content.Value("' + elementTitleLabelAlias + '")

' + '\n' + + '
' + '\n' + + '' + + '
' + '\n' + + '@await Html.GetBlockGridItemAreasHtmlAsync(Model)'+ '\n' + + '
') + .build(); + partialViewElementTitle.virtualPath = "/Views/Partials/blockgrid/Components/"; + await umbracoApi.partialViews.save(partialViewElementTitle); + + const partialViewElementBody = new PartialViewBuilder() + .withName(elementBodyAlias) + .withContent('@using Umbraco.Extensions' + '\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage' + + '\n' + + '
' + '\n' + + '

@Model.Content.Value("' + elementTitleLabelAlias + '")

' + '\n' + + '
' + '\n' + + '') + .build(); + partialViewElementBody.virtualPath = "/Views/Partials/blockgrid/Components/"; + await umbracoApi.partialViews.save(partialViewElementBody); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName('BlockGridContent') + .withSave(true) + .withPublish(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(elementTitle['key']) + .appendContentProperties(elementTitle.groups[0].properties[0].alias, contentText) + .done() + .addBlockGridEntry() + .withContentTypeKey(elementBody['key']) + .appendContentProperties(elementBody.groups[0].properties[0].alias, 'Lorem Ipsum') + .done() + .addLayout() + .withContentUdi(elementTitle['key']) + .addAreas() + .withKey(dataType.preValues[0].value[0].areas[0].key) + .addItems() + .withContentUdi(elementBody['key']) + .done() + .done() + .done() + .done() + .done() + .done() + .withTemplateAlias(documentName) + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor-with-two-custom-stylesheets.png'); + + // Clean + await umbracoApi.documentTypes.ensureNameNotExists(elementBodyName); + await umbracoApi.media.ensureNameNotExists(stylesheetTitleName); + await umbracoApi.media.ensureNameNotExists(stylesheetBodyName); + await umbracoApi.partialViews.ensureNameNotExists('blockgrid/Components', elementBodyAlias + '.cshtml'); + }); + }); + + test.describe('Image', () => { + test('can render a block grid with an image', async ({page, umbracoApi, umbracoUi}) => { + // Image + const imageName = "Umbraco"; + const umbracoFileValue = {"src": "Umbraco.png"}; + const imageFileName = "Umbraco.png"; + const imagePath = 'mediaLibrary/' + imageFileName; + const imageMimeType = "image/png"; + + await umbracoApi.media.ensureNameNotExists(imageName); + + const imageData = await umbracoApi.media.createImageWithFile(imageName, umbracoFileValue, imageFileName, imagePath, imageMimeType); + + const element = new DocumentTypeBuilder() + .withName(elementTitleName) + .withAlias(elementTitleAlias) + .AsElementType() + .addGroup() + .withName('ImageGroup') + .withAlias('imageGroup') + .addImagePickerProperty() + .withLabel('Image') + .withAlias('image') + .done() + .done() + .build(); + await umbracoApi.documentTypes.save(element); + + const dataTypeBlockGrid = new BlockGridDataTypeBuilder() + .withName(blockGridName) + .addBlock() + .withContentElementTypeKey(element['key']) + .done() + .build(); + const dataType = await umbracoApi.dataTypes.save(dataTypeBlockGrid); + + await createDocumentWithTemplateAndDataType(umbracoApi, dataType); + + await editDefaultTemplate(umbracoApi); + + const partialViewImage = new PartialViewBuilder() + .withName(elementTitleAlias) + .withContent('@using Umbraco.Extensions' + '\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage' + '\n' + + '\n' + + '@{' + '\n' + + 'var typedMediaPickerSingle = Model.Content.Value("image");' + '\n' + + 'Umbraco' + '\n' + + '}') + .build(); + partialViewImage.virtualPath = "/Views/Partials/blockgrid/Components/"; + await umbracoApi.partialViews.save(partialViewImage); + + const rootContentNode = new ContentBuilder() + .withContentTypeAlias(documentAlias) + .withAction(ConstantHelper.actions.publish) + .addVariant() + .withName(blockGridName) + .withSave(true) + .addProperty() + .withAlias(blockGridAlias) + .addBlockGridValue() + .addBlockGridEntry() + .withContentTypeKey(element['key']) + .addImage() + .withMediaKey(imageData.key) + .done() + .done() + .addLayout() + .withContentUdi(element['key']) + .done() + .done() + .done() + .done() + .build(); + await umbracoApi.content.save(rootContentNode); + + // Assert + await page.goto(umbracoConfig.environment.baseUrl); + await expect(page).toHaveScreenshot('Block-grid-editor-with-image.png'); + + // Clean + await umbracoApi.media.ensureNameNotExists(imageName); + }); + }); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-chromium-linux.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..364e1ed8ec6f602499333a673e58dcb0e7cd3ae2 GIT binary patch literal 7374 zcmeI1X;f2Z8pq>qManqTGRTrqBYFk|71>GRxX}oNwp4*4i3=f)vZoNj7Po@v0CJHf zhQ-!Ob)=+#!muS!1|blVQe_V$YzcdS03l?X_j=CEhxssPPG>&MhkSb8_uTW|`@GNd ze}2z!*Af}{SR)!=ATPbKSJo%dpQzoqVn8@vWtwd3^!W? z6Ih7bxmSq`caXdiZzkadn&=Q%9p2g3*EcCzTZ{YH#{bAV?aGyX#>U2`NTi^z z&wp6KRx}J)ZvwY(Y^&cS4yzu@_4PqJ5LE-c$6Q<(%m}uN4|?T`*x9};q*}a?G;5nwo{53_Msvbe*QZI)b<=6BWN?vDeQFe+&CgxJKBp zFp`Solk$RcgX&^QAt6@P!f4MBGTHv<(X2BMJ|@M+Ix-!@+J!=)b?xlyUIMecyj&RB zY^dutjYu3bvqz%~)6&v(Ys1-i*C~>KE@6o10dfROLFDN;+Ey^n@GtwPg?E@sE>=XWv`8@r+nzHHufo(+YVwD z)0FDR6`}nVrGeG9aKv~#uMGF4wtDRfOHdm#Q<0#UM{$jP+_Pe4dPvHp3EI#MA&=CN zOVX^b;Gpv_FQkWPBu*Ue_;@g8<%Lh@4M%vJ>cHj)`Anu6v=f&CTs3jSR8XY+k^HL} zrqE8TlIxS=VMz;i)~=1EqME5}d0|)0)YQ~o?h$)?`%n=(sSiAQQh0y2^;v0I!|Fhn zWiOGgnN+G|9J=%9z5OYu<{_#GeKD$K_bF&(wo-rzwJ(x=`@nWjp-Lm8>k4`u!-dW$ z(_GsiSNGMvtIc1V5Wo~95xcYbNaFHSq(ww>27J4q z+T(EE_^vah7bBat;EEcW-W=Jfi{hX63(9FoP)P0?JWS7hlm5X;l&JU@Zx9-qp;8$QiELLAt6m#*x!&q)h?uBQ8>)PEu-=5V)giCrV;F- zZu-n7@n;?u4)OJ5K@p9tV zXL^3XL1UR%?G_aVi(tPqm9M<>^-2F}SgxS0jigpmWy1xDOWgiCY6M(SZf?wUGpCU5 zzno7cVc_Swiymxk1jQinj)?b#$XEMsaq1LTiog;ScbA9x(fIJ_=;-A&BFiSx4o^paT2dC7Lr82Z2PX7zG8qJofUlE=(O&#?SF1Fb;U;qHyzU)%?X| zRD75d#y*iL8 zLS)GAQfB+g_k$hcAbWwkJ#ICLPCBBr2E8sluq#s>$2BpcMwW$P|s4 zDXoN1bgjI&*w~DC|4wH<3$SbAa0Ja08gJT$R9BNRa)u!I`t?5)Yi7w5;D)3bsf~oj zr-0D-AKLvRAN3o>06x)gy`3h$%f`2#GD1I+3$R#@dcw|wj*S?s3Ja)<4J%4spYrnZ z0z%SE`ADBX&1h#Qsg~XrYmaAQ)~|(gG^;4V)|OK-;u~$a=&^Js2}nZ6{!DjB09=F< zmFCHE5fHe82nw6eFO3QA)ad;_^<5@pEfjSgZ zGgZQbP#_pI^|W^Bp5hzMHK6ZO$!NRrNLixZFy=0nI#>1Gj}^0Of!$ z6K(r5d7~{4DnmLSgXS=iidBzHO7=v=HJe4N=BlM?xj@j0)h@!44X6qYa10xG)M3YQ z=T`1r0HpMUgg|-9uFT{|hXbpE<&w^)H8*-naZss$`93qp(6$OvM>Ndn&c_b@H54)) zz4A^N)oM{AzHP8nS*)><7EtgPScF0VZF1A?Evck88;F`|KRJM&OJG%~DVjQ8BbCfW z&=a())tm#kp0Xe&=vA)df~d1>KvD8Udk!4^WYwU^3TNA}{7d3IrMLrbuPzghWIn(S%ppp0>9)C_xp8yb}!w3`U_QA18WSE@A(L=Y}c>o_W#8} zLBI4rI#21tqz}`-9I^G1&`UxuiC^<_s;?Y<<>)I%UpfE&6PBJ5dP?Xip{InN690q$ l0eYC~VXBAe|1nH8M)wVe9=G4+SHm9!acA(S%T8Xp{dZ98vylJ* literal 0 HcmV?d00001 diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-chromium-win32.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-chromium-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..5034356d48640c14428fb2e98767d916930868e6 GIT binary patch literal 6357 zcmeHL{Z~?V7{6Lu9J5?y%hE-io#u9y(y}DqaH-8&3peXnrb!+OmSrX6JD{giv1UbE z9Sy-ao!ap<4A>~&5b)H3Pn%_xn80_j8}m z=XuUO|0OwlQP`?5000*4*q)UO0B<2~=x?~U5u<0D@(>fk%+1aKB)XUv01(C7k+pSC zmC#{I$t^Ifs{dV-5|%`b`oI;w=1f~=M963L=SE}+kPd#<9m63=Y~Xu%7F7M?jd+#-sI%q^U_N5%H-x-{zHop3r>Ma# z`}YqyYXJ$pnz1of)Dus;$LAXcO1hf0J3;GD+LA^wn0%j3Jw_{k33&o;`{>!JQe~lT zZkq&6-kWa7nctg?NX zccupy^O%)zMu)6OXV5M@un>t;Uw0QDUN6W$(9Tx9rXE<=syeC^E}M-&BdnOo3^^&U@kMHMPS{Hu+h3>>C~_8a zR4lh_kN2dhA%}NoFZ1QA;LD{$v+HxNKQIOc#e~LTNmI6^FqM!A`=|qjMHHQ9280(} zv-fM7z}o6m(e%WSrX(@D{~}S`aMN3vK&KerN74a)As$z6hg?TKH$sIfNF3R|<=ex0 z`HPDFLwMVipCc)18MwiXiwE)ARXrlHbwJ_hGu)9W`SJ$~h^?+Ziz$Xwz3-9_{;<8p zB-EQM745@3W^LVOse8%v;fLOp+{>MUkGj}B0+&GEitB8+?V~zrW>t5yfXg-AK4E?@ zj$p2%)doED<)KJD)4bUL&{^%hxAJRyx~MT+U7eO7zea3Q^i(k2_wq|^OwSbKU1oAC zH>`s*q#Y|*uS%Qe+@OQ3lh4OszfTOg8n$xEE{J6LaW)!l+^vl_#*r)QPBhA&52U6V z^#j`DPr*@!8NaPhGrDdH#Q?Y-xF6q}P74&Pug>~Ukv+~has<=x)HR(E4UsM~k;{c>EM)b>+?rP4c2bo$n~qj|TOoadrd7 zfd>?Fv{55#D&M!!=bwYD3c`f{`08|p$o@>R?y5hf) z4NYhThx|iJM{*LyoqYKf0==y?Zv}IvVw@NFd01mru#L%QWHy_{#POePDUA>uiD}y_ zAI`SaEM6ALvy36sa_u~-{^X&4%cUQP{U-7+2?=(q2HxMN21!w*(u0hcO>|nKd_O-L zhotJ2rl6`IN~S7>SL6bMnWV1u|C-=Qly_H|uTqguXPL^cN>FU~{N)`n>KqQOF@^%W zEyp5aV|Z*o+(w7)8XmTKTnsA9!4XNJvf9YaL~&PD`DW3D?x5LjWsJ{hSykPjUKbc6 zric`M9v8^Ex)!}>5af^mwBLXrk@FP3xl8Q;{|5Q@pMTcL7gy+G3NRbu* Nc5EYONiq(e{u|q&L+=0p literal 0 HcmV?d00001 diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-area-chromium-linux.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-area-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..161e2705e81698b8ae25393aa4fac82b5bfe1603 GIT binary patch literal 11209 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ŵ(#9~X=2I9@vbZF?V>A<^5zeOB<&q>>>6bE?X|c4 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%0D!aqlo}!*h4=a9G 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 literal 0 HcmV?d00001 diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-image-chromium-linux.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-image-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..8217f96b6d6c052edaa56ebaccaa5a7c5fede262 GIT binary patch literal 106623 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 a&40!y_Bl_RcJgq6jPZ2!b6Mw<&;$U2OC{6* literal 0 HcmV?d00001 diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-image-chromium-win32.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-image-chromium-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..8217f96b6d6c052edaa56ebaccaa5a7c5fede262 GIT binary patch literal 106623 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 a&40!y_Bl_RcJgq6jPZ2!b6Mw<&;$U2OC{6* literal 0 HcmV?d00001 diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-multiple-areas-chromium-linux.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-multiple-areas-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..dad19a45ee89d0f32c4420c0692bba899e649aac GIT binary patch literal 25743 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 literal 0 HcmV?d00001 diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-custom-stylesheets-chromium-linux.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-custom-stylesheets-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..17cdeda521768f0f60b24595ad95f9c192e67f6a GIT binary patch literal 9671 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 CjQctO literal 0 HcmV?d00001 diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-elements-chromium-linux.png b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorRendering.spec.ts-snapshots/Block-grid-editor-with-two-elements-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd0b5d3c21f0f09d22e01b2436412f086bf3416 GIT binary patch literal 9285 zcmeHNXIztKzYfl}uD7pNLv|t=Aqb3X~r#zsD4?_l{yP`!L9fV?TzbkN5h< zxp=L}r#QN6mAl*Tx34+4<8s>}zxCSd?-@KeyVC*t=-uwS_HjRbU%%`6zWNh}x4+an zD^$>mxVUD=+LM>`zqps<=CID{YpwO3-<7;cWZ#oS9}Sl~_+PV+ilSAc2s?erWVnLe zT1;h^+YvkTZGat^7?it|qX<7?@=e$5gX<0r%o?y9b^reys{RXOAzzjlf4FyEFKT&y zM%;%t51(o3ufL89pBdR3CcK+sL0hbF9M&AFSrST2^b2GeD1EeZ_` z;Mm{a-+1QDar~(IT4++s?u~W$l~Fq-gUdhKnog8l4GHmXh*Jt%ndRZ4Wy{MVYONK4 zKwuvkj0-O3+O_`sYqjYf3g_XICkGA?3RpANCw1s` z6>s?@dfh+Mf^#t&?^4cjVdG5ePgJ=ka$0 z*Nn2VGNko)f4Z5doKJjpDh!=;*CS z`eSA$x{a#CXJ2;~c~I)tE0$Pf8Tvaym$=+S^SK^ef~K8qZPZG;K#+OZqd{00y+T5T z4SUF+qBoLF*Fb8f?-%A27vt|}?{C*r4{PC@ImW8=TLma}%G{^aMKDEv;F=$CVXoYIKR2?~=XUhT^de*Fw z<~j1__Y`0j>iPb!Um4{xDYNz=*syPbP32w+fKGEeq-7e!_Egtdk<}{mo=J~CBXWIbou6$8a7r=)XHUyK)TsiEl@0u5W4~ZGvReS3^rXd246sklAG2T4Ezz373ns`!Rb% zNXtx!{g`dfx=b+y^Tjl5*5cbd?h)r^CjG2gj~Mc#W5J2Y{0i;z2sT#(rpC zH)^59RRgh*FK~SN>#o5XMuoo}C^(I_rWzao325n)%jU4nUt8|I>k)74&0uYVF(xy+ zFrAfDF;_bMp@ld97iFjwL1)HzI%9>kQK%=d&IWDG!sBo4Jh)irLAcRyfy`T>!pLHq zLF5I+0_w&(x=CYdH~=KkUEDk7@YL;?eg4I}chxMtU;XwCG(^KX`OYStD&6gxwoV5m z5Y}~-3`2}`q)mfZTP0!|Bvm~JMU}=C& zBf7e~I|KsR?>~R&aV9UpJCi<(a0h9@2*CKhunO!tth0#PBbk$vyG^V1J? zXub@=jW3|LPx9NWj&3y_f6A3In1aP?gJl4=+zc9RaRx#2FBbhVyYN`i9gBdp;(N~E z>mG-lqN`+lXi4%}nEo&-64?S0*=jN0U#i!b+I8jS7GgInXb?FG08a_GgGug-+hcTy zZZ5sZHWgQmmvq=7XbR59TRP5{x0OPUovd{Sgz&3oW-=&NO$72*m9&c_Rs!ri#L3E% zN~PH5=YfMLwypxVwAGs>iS zt-n)o4$}ikN5V4lDP|eAfQrhbN%@-8-eAJml4PhgC80S%(`U5(;poW7X>@PIc+qHY zCAFfmlJatkk>|jR8|8!XrfAhSJMj4z==(LBZyO1cH>!m0glnSoFOF|!?GH}M9dGwQW}(ea*oy;Al#tGSxGSCT(Wc%rfHk8tWa8-O8F7?ZA1xzK12>r~`06 zj0ADa=Y(^$a+)_gJtZxm;!gu{4w8UkyUDdQn77T!Ci+RvAr2ZgsrNLqBK5LQ-F}@x z6{G-CF=F-vS%q}_GxtVL)|ZdwracpY#&X}--gx%ydC90ER!}%)eLOd$3OFe-k!7c0(?CRREEV|ImZj2jZp-EZU;Pq z8X-$Ilg9@Y+W}g)`^%fqyOs+C=lg57ndz?Gu=%uHwnAw~G-)}cFo56UIY9)oX3rH+ zc`TKP@w?!ThtToqCN&ADlClO)@?kZ=Oq8;opq9`rh zbU0890nNs(0bRhNnMnVZ3bYx6aWFzu?xSIsnI5&W_z*xW+mg=yhTwG9b>$<0@0H{X z71QQDhS~(@;CGf47BD^^9W@mu|IEvL4Xq&tl&b?|1BY&D;G zV+JMX;z)L}T(+c%xI`^{7%ys6DVMNKivcNl*Z;g83exFzE1eHj5_ZeAjVj3mmoRmo zj9`0F`Eceo8Wf-c)AwBkm7-LKVs9@&RhZJ@pH38%52fx6ANd_YEmgv>u`1!0py)B1 z`fGa_5N9~Ix)`WuVwFQKl6w9H@)g~u_&6P~CjV0QZ4}GF%Om6QviTms0i%F-Re<`n zPSI0`)N!bKrrodnLn3UH@y0{RSEawm z;s?9Cx}I??mOP&@%EBA1OdIH`SpzR)htv9&y-9s9x8awI3JU>4BkdrcksuLvC?x4H zpiU?}XDU?Ebc@AHFbN84HwasCoK~Rp@Y9iL{$&mjU*jOK{9vAQ0@kL(6PWtC>8={_ zTp%zqY;iOXKlBa)=4`Xcmofi`x(MeS9?pyiI2E_+ZdBZuLgiYAy`vjL1mSMN{`CMxR2t_^5 zraPs2eUC{F!T#jFr2Lgnaqh3}2F8GngrI&;>o+iHWcrVwyL_xQkLrBt&Y)nMCkI}3 z@cAi5f>5=Ii3xe$w**T|OHu^TGYc;iYwiF6rO`~J8oGoI+~B*%DhDl1Fr$C4f(+3g z-RZa~2DZ+cxoWXGvN$uEAY|+-d;QF-#jzW-V&{nk`wTT?r}o7=Kv?8~==S#Zf&qcT zDI|?etui+7oDr3jf+} z=ael`32NHE(CTB6fKAc!IulU4A~geroMJ$-2LeYPn6y%)?O37(&(%5-el)GNgVEbQcHoQioxaAx1~kP$2@VqeN9K}T{f-VOB6 zWk~!6h$9{(i;=|?*N*&g%dwG_X~?AC7>>>(~lJSrsjqX+)#8} ziUm?;^WGy*fu_0yMoB?B=r;@rNSHDUP*E2=#sBHn!Bn854e?8SPO3;G0%M0akYTKW zSXIFc$QT3$99)Ke*=~C&BjW9&bF3FPHl_J?Pr3Y ze6IdB^O>`7HsekWHqyyp{4B4CJ^=GASL*_^jf_%0Rm;1jQanxP( z_oYYS_n)-{`5a}_s?Doaw+gz?ckEfk?<#&*@wq3OaOus0xkgUfo+$XN3z3mkQ5Is89(i~lP~YJ;1^{l( zM-F^`D(j9;6?Dnv7(z0LRDT*F`7EN^eXrf^{X1=gq{xQm_ z{YF6%xnCcQ`jnP`%(!6*%;qZy=xB>(VDEjiX>1KV0^$z?D=Z`@!FCJGuGk3JSjd)J zfE~;}S+N%;c3S~k3)#ENW&_NAwI&B98~*TbMSDDL6XM!2EMoYQM4rk3xpJ?v*BIi> z5pI}w*-rPtUS}m%BAYUfP&M{aCVB^>^_f3xb2{GeXCTWiQQ^x1#rvbtnR5c>LO%mD z1y;w$GP!b61?8f1Ho4#xHvN%0Up%%jmf6#Vy?U;nQG zp451DlPgnb`u(L@PacQ(?u}l@&S!p~Kjn@jGjUkbqIv$q9`4Q7legl+S(sEFj+U$` z2v`1si^E-V|RIzHFj8>K-ACMI?+Snx3nA!6$?;8j7ddugmD^&@N0%bd^F} z6d`LQF=$d1lPaJWV>x4>)&tu>@0N$!Vv-7q1OD<t*O>tz(9{gJ#)x z4}=2ct7a}}!^bDR0u2!D7QD&89nzak1ICmoV_eMPT$c&f?CN|@DlP;wx<#!C(59eg z4Xgh);pD}oxeTee1ogz~iufrWFy#`Tql_$h|WX2WHI_-b63pi>5MK>Pl5zri(&ZC^Y2nD#xZrQ{SD) zvls;y1?1pmpa9G+@t4=`g6F3FH~eBm`2}F~{zMJefo5h>p9PP;6DpJtNZ6(^)SZ;Wm ztH07I-PtU`^k-b5>}8O9 z3!4a-zYF_7LUqpKU2zH=);Cu1h1w#nd{^Wk|87P$=yfYL+NtkM>&Pi8N0T~LKv37u)$Hp?6LO8X`ZZjP(&ffj9T?P;fj zC+Np|5bM;<-1@dQS^p`~@%YvUz4y&SLaeY)EY_Xnpg8oU2V5|ZeXU+x0%j2J%-xe;aX{Rx7;GpM;N4zgCjPS(qbv1+OY_|@{ub?qx3 z8xDsVx0{P(_v4V=i4AH)v)6^wxkfLw>$>BN(Naj1u~IcAG$f`gyDlN1JoaQ(#PbEc zBVyURaOeO)db^pTtd=PB;9!E;O{6qkYti%5EQhoOYUyfT)-8FN{R+p0lG1W!We^=| zz+oRP_Qdd%JmbgI?-!ltJrG9OCttoSlFgs5iS`Yxn^We$6ib)ti)D7f2cF=3+vn4y z!vU+|^=8#)cUH$0f()WseU5WQ&%U0or$wtqrLw7DFM6R*ETK$gFOwh$40#Z%)va1t zcL>?S>V(46V=goFM#ONFh$Y7AhagO!qND{`p}{|*>96<=yDB^aVf{U07KlSPZ3Rj~qP&Kbp%G4s1$*M+0fU0fb8Kj-}sy4zqJ-xPYiL1)6&PriyW!{1~2F z6#wgzlVrb)SnuHq^!`xi=Ulw3R{yK}sWnX2FulL89cwmOv&ouG|4X01S~=Fru~v?? za{hBS(TWmQl(3?N6(y`FVeL!&tlv=o7Y7G~ Date: Tue, 28 Feb 2023 09:57:17 +0100 Subject: [PATCH 8/9] Updated to use latest c# language version instead of csharp 8, when build views (#13894) --- .../ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs b/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs index 4f2a421981..0dac2084bd 100644 --- a/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs +++ b/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs @@ -195,8 +195,7 @@ internal class CompilationOptionsProvider if (string.IsNullOrEmpty(dependencyContextOptions.LanguageVersion)) { - // If the user does not specify a LanguageVersion, assume CSharp 8.0. This matches the language version Razor 3.0 targets by default. - parseOptions = parseOptions.WithLanguageVersion(LanguageVersion.CSharp8); + parseOptions = parseOptions.WithLanguageVersion(LanguageVersion.Latest); } else if (LanguageVersionFacts.TryParse(dependencyContextOptions.LanguageVersion, out var languageVersion)) { From 922c79ae86ec5531212ca702ca89c7070b0622a5 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 1 Mar 2023 08:52:26 +0100 Subject: [PATCH 9/9] V11/bugfix/fixed flaky test (#13893) * Moved deleteAllMedia to afterEach, the reason for that is that we delete all the media in each test. * Added additional timeout and a WaitForTimeout(), the reason for the WaitForTimeout is because it can take a second for the modelsbuilder to update the view. * Added more timeout for the isSuccessNotificationVisible. Updated the helper ensureNameNotExists so they actually delete the partialViews * Updated the locators for deleting the UK language. Added an expect for checking if the UK language is visible in the UI * Updated the position where the dragAndDrop drops to * Changed the trace so we only save the trace on the first retry, it saves a lot of time when the tests are running, since we dont need to save the trace and then delete the trace after each successful test * Updated locators. Added an expect so the test waits until the / is visible in the URL before going further into the test * Changed back to retain on failure on the pipelines, the reason for that is if a test only fails once, then we wont see what the actual error was in the test when looking on the pipeline. * Added an expect so we wait until the page is loaded for packages * Updated the dragAndDrop so they hopefully work. * Changed values for dragAndDrop * Updated the dragAndDrop values * Bumped playwright version --- .../package-lock.json | 55 ++++++++++++++----- .../Umbraco.Tests.AcceptanceTest/package.json | 2 +- .../playwright.config.ts | 1 + .../blockGridEditorAreasContent.spec.ts | 2 +- .../Content/blockGridEditorContent.spec.ts | 4 +- .../BlockGridEditorDataTypeBlocks.spec.ts | 29 +++++----- .../DefaultConfig/DataTypes/dataTypes.spec.ts | 13 ++--- .../DefaultConfig/Languages/languages.spec.ts | 6 +- .../DefaultConfig/Media/mediaSection.spec.ts | 43 +++------------ .../ModelsBuilder/modelsbuilder.spec.ts | 8 ++- .../DefaultConfig/Packages/packages.spec.ts | 1 + .../Settings/partialViews.spec.ts | 24 ++++---- 12 files changed, 98 insertions(+), 90 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index ac838508c1..8c3caad6e2 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -17,7 +17,7 @@ "xhr2": "^0.2.1" }, "devDependencies": { - "@playwright/test": "^1.29", + "@playwright/test": "^1.31", "del": "^6.0.0", "ncp": "^2.0.0", "prompt": "^1.2.0", @@ -86,19 +86,22 @@ } }, "node_modules/@playwright/test": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.30.0.tgz", - "integrity": "sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.1.tgz", + "integrity": "sha512-IsytVZ+0QLDh1Hj83XatGp/GsI1CDJWbyDaBGbainsh0p2zC7F4toUocqowmjS6sQff2NGT3D9WbDj/3K2CJiA==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.30.0" + "playwright-core": "1.31.1" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=14" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "node_modules/@sideway/address": { @@ -409,6 +412,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -725,9 +742,9 @@ } }, "node_modules/playwright-core": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.30.0.tgz", - "integrity": "sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.1.tgz", + "integrity": "sha512-JTyX4kV3/LXsvpHkLzL2I36aCdml4zeE35x+G5aPc4bkLsiRiQshU5lWeVpHFAuC8xAcbI6FDcw/8z3q2xtJSQ==", "dev": true, "bin": { "playwright": "cli.js" @@ -1018,13 +1035,14 @@ } }, "@playwright/test": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.30.0.tgz", - "integrity": "sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.1.tgz", + "integrity": "sha512-IsytVZ+0QLDh1Hj83XatGp/GsI1CDJWbyDaBGbainsh0p2zC7F4toUocqowmjS6sQff2NGT3D9WbDj/3K2CJiA==", "dev": true, "requires": { "@types/node": "*", - "playwright-core": "1.30.0" + "fsevents": "2.3.2", + "playwright-core": "1.31.1" } }, "@sideway/address": { @@ -1273,6 +1291,13 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1503,9 +1528,9 @@ "dev": true }, "playwright-core": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.30.0.tgz", - "integrity": "sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.1.tgz", + "integrity": "sha512-JTyX4kV3/LXsvpHkLzL2I36aCdml4zeE35x+G5aPc4bkLsiRiQshU5lWeVpHFAuC8xAcbI6FDcw/8z3q2xtJSQ==", "dev": true }, "prompt": { diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 617da342ce..5df5fc8d4a 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -10,7 +10,7 @@ "createTest": "node createTest.js" }, "devDependencies": { - "@playwright/test": "^1.29", + "@playwright/test": "^1.31", "typescript": "^4.8.3", "tslib": "^2.4.0", "del": "^6.0.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts b/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts index f5c9bf5fde..d084cd69ba 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts @@ -36,6 +36,7 @@ const config: PlaywrightTestConfig = { // baseURL: 'http://localhost:44332', /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + // When working locally it can be a good idea to use trace: 'on-first-retry' instead of 'retain-on-failure', it can cut the local test times in half. trace: 'retain-on-failure', ignoreHTTPSErrors: true, }, diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts index fac41edba8..a55c12a7d9 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAreasContent.spec.ts @@ -920,7 +920,7 @@ test.describe('BlockGridEditorAreasContent', () => { // Drags and drops the ElementBody to another element const dragFrom = await page.locator('[data-element-udi="' + ElementMoveFromUdi + '"]').locator('[data-content-element-type-alias="' + elementBodyAlias + '"]'); const dragTo = await page.locator('[data-element-udi="' + ElementMoveToUdi + '"]').locator('[data-area-alias="' + titleArea + '"]').getByRole('button', {name: 'Add content'}); - await umbracoUi.dragAndDrop(dragFrom, dragTo, 0, 0, 10); + await umbracoUi.dragAndDrop(dragFrom, dragTo, -15, 0, 15); // Assert // Expects the element MoveFrom to have 0 entries diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts index 0555157f2b..9eb4d75e92 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts @@ -230,7 +230,7 @@ test.describe('BlockGridEditorContent', () => { // Drag and Drop const dragFromLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: bottomBlock}); const dragToLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: topBlock}); - await umbracoUi.dragAndDrop(dragFromLocator, dragToLocator, 10, 0, 10); + await umbracoUi.dragAndDrop(dragFromLocator, dragToLocator, 10, -5, 15); // Assert // Checks if the BottomBlock is moved to be under TopBlock @@ -289,7 +289,7 @@ test.describe('BlockGridEditorContent', () => { // Drag and Drop const dragFromLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: rightBlock}); const dragToLocator = await page.locator('[data-content-element-type-key="' + element['key'] + '"]', {hasText: leftBlock}); - await umbracoUi.dragAndDrop(dragFromLocator, dragToLocator, 0, 20, 10); + await umbracoUi.dragAndDrop(dragFromLocator, dragToLocator, -5, 20, 15); // Assert // Checks if the rightBlock is moved to the right side of the blocks diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts index ebf5c1eed9..2acd818661 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Datatype/BlockGridEditorDataTypeBlocks.spec.ts @@ -583,7 +583,10 @@ test.describe('BlockGridEditorDataTypeBlock', () => { await umbracoUi.navigateToDataType(blockGridName); // Drags the element from the default group to the 'MoveToHere' Group. - await page.locator('.umb-block-card-group').nth(0).locator('[data-content-element-type-key="' + element['key'] + '"]').dragTo(page.locator('[key="blockEditor_addBlockType"]').nth(1)); + const dragFrom = await page.locator('.umb-block-card-group').nth(0).locator('[data-content-element-type-key="' + element['key'] + '"]'); + const dragTo = await page.locator('[key="blockEditor_addBlockType"]').nth(1); + await umbracoUi.dragAndDrop(dragFrom, dragTo, 0, 0, 15); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.save)); // Assert @@ -620,7 +623,10 @@ test.describe('BlockGridEditorDataTypeBlock', () => { await umbracoUi.navigateToDataType(blockGridName); // Drags the group GroupMove under GroupNotMoving - await page.locator('.umb-block-card-group >> [icon="icon-navigation"]').nth(0).dragTo(page.locator('[key="blockEditor_addBlockType"]').nth(2)); + const dragFrom = await page.locator('.umb-block-card-group >> [icon="icon-navigation"]').nth(0); + const dragTo = await page.locator('[key="blockEditor_addBlockType"]').nth(2); + await umbracoUi.dragAndDrop(dragFrom, dragTo, 0, 0, 15); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.save)); // Assert @@ -634,7 +640,9 @@ test.describe('BlockGridEditorDataTypeBlock', () => { await umbracoUi.doesDataTypeExist(blockGridName); }); - test('can move a group with elements in a block grid editor ', async ({page, umbracoApi, umbracoUi}) => { + test('can move a group with elements in a block grid editor', async ({page, umbracoApi, umbracoUi}, testInfo) => { + await testInfo.slow(); + const GroupMove = 'GroupMove'; const GroupNotMoving = 'GroupNotMoving'; @@ -674,17 +682,12 @@ test.describe('BlockGridEditorDataTypeBlock', () => { await umbracoUi.navigateToDataType(blockGridName); // Drags the group GroupMove under GroupNotMoving - await page.locator('.umb-block-card-group >> [icon="icon-navigation"]').nth(0).hover(); - await page.mouse.down(); - await page.mouse.move(0, -20); - await page.locator('[key="blockEditor_addBlockType"]').nth(2).hover({ - position: { - x: 0, y: 20 - } - }); - await page.mouse.up(); + const dragFrom = await page.locator('.umb-block-card-group >> [icon="icon-navigation"]').nth(0); + const dragTo = await page.locator('[key="blockEditor_addBlockType"]').nth(2); + await umbracoUi.dragAndDrop(dragFrom, dragTo, 20, 0, 15); + await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.save)); - + // Assert await umbracoUi.isSuccessNotificationVisible(); // Checks if the elements were moved with their group diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataTypes/dataTypes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataTypes/dataTypes.spec.ts index bc9b644820..be7802dca4 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataTypes/dataTypes.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataTypes/dataTypes.spec.ts @@ -120,7 +120,6 @@ test.describe('DataTypes', () => { }); test('Test Url Picker', async ({page, umbracoApi, umbracoUi}) => { - const urlPickerDocTypeName = 'Url Picker Test'; const pickerDocTypeAlias = AliasHelper.toAlias(urlPickerDocTypeName); @@ -155,18 +154,18 @@ test.describe('DataTypes', () => { await page.locator('.umb-tree-root').click({button: "right"}); await page.locator('[data-element="action-create"]').click(); await page.locator('[data-element="action-create-' + pickerDocTypeAlias + '"] > .umb-action-link').click(); - + // Fill out content await umbracoUi.setEditorHeaderName('UrlPickerContent'); await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); await umbracoUi.isSuccessNotificationVisible(); await page.locator('span:has-text("×")').click(); await page.locator('.umb-node-preview-add').click(); - - // Should really try and find a better way to do this, but umbracoTreeItem tries to click the content pane in the background - await page.locator('#treePicker >> [data-element="tree-item-UrlPickerContent"]').click(); - await page.locator('.umb-editor-footer-content__right-side > [button-style="success"] > .umb-button > .btn > .umb-button__content').click(); - await expect(await page.locator('.umb-node-preview__name').first()).toBeVisible(); + + await page.locator('[data-element="editor-container"]').locator('[data-element="tree-item-UrlPickerContent"]').click(); + await expect(page.locator('[alias="urlLinkPicker"]').locator('input[id="urlLinkPicker"]')).toHaveValue('/'); + await page.locator('.umb-editor-footer-content__right-side').locator('[label-key="' + ConstantHelper.buttons.submit + '"]').click(); + await expect(page.locator('.umb-node-preview__name').first()).toBeVisible(); // Save and publish await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Languages/languages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Languages/languages.spec.ts index e28b0ee341..8e951d8d82 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Languages/languages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Languages/languages.spec.ts @@ -59,19 +59,19 @@ test.describe('Languages', () => { await expect(doesExistEN).toBe(true); // Delete UK Language - await page.locator('umb-button[label-key="general_delete"]').last().click(); - await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey('contentTypeEditor_yesDelete')); + await page.getByRole('button', {name: language2}).locator('[label-key=' + ConstantHelper.buttons.delete + ']').click(); + await umbracoUi.clickDataElementByElementName('button-overlaySubmit'); // Assert the da language still exists and that the uk is deleted // DA doesExistDA = await umbracoApi.languages.exists(language1); await expect(doesExistDA).toBe(true); // EN + await expect(page.getByRole('button', {name: language2})).not.toBeVisible(); doesExistEN = await umbracoApi.languages.exists(language2); await expect(doesExistEN).toBe(false); // Cleanup await umbracoApi.languages.ensureCultureNotExists(language1); - await umbracoApi.languages.ensureCultureNotExists(language2); }); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaSection.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaSection.spec.ts index ec9dbb5900..6d0d870e33 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaSection.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/mediaSection.spec.ts @@ -7,7 +7,13 @@ test.describe('Media', () => { await umbracoApi.report.report(testInfo); await umbracoApi.login(); await umbracoUi.goToSection(ConstantHelper.sections.media); - await umbracoApi.media.deleteAllMedia() + await umbracoApi.media.deleteAllMedia(); + await umbracoApi.media.clearRecycleBin(); + }); + + test.afterEach(async ({page, umbracoApi, umbracoUi}, testInfo) => { + await umbracoApi.media.deleteAllMedia(); + await umbracoApi.media.clearRecycleBin(); }); test('move one of each Files into a Folder', async ({page, umbracoApi, umbracoUi}) => { @@ -28,10 +34,7 @@ test.describe('Media', () => { {fileTypeNames: vectorGraphicsName}, {fileTypeNames: videoName} ]; - - await umbracoApi.media.deleteAllFiles(articleName,audioName,fileName,folderName,imageName,vectorGraphicsName,videoName); - await umbracoApi.media.ensureNameNotExists(folderToMoveTooName); - + // Action await umbracoApi.media.createAllFileTypes(articleName, audioName, fileName, folderName, imageName, vectorGraphicsName, videoName); await umbracoApi.media.createDefaultFolder(folderToMoveTooName); @@ -60,20 +63,13 @@ test.describe('Media', () => { await expect(page.locator('[data-element="media-grid"]', {hasText: names.fileTypeNames})).toBeVisible(); } await expect(page.locator(".umb-folder-grid", {hasText: folderName})).toBeVisible(); - - // Clean - await umbracoApi.media.deleteAllFiles(articleName, audioName, fileName, folderName, imageName, vectorGraphicsName, videoName); - await umbracoApi.media.ensureNameNotExists(folderToMoveTooName); }); test('sort by Name', async ({page, umbracoApi, umbracoUi}) => { const FolderNameA = 'A'; const FolderNameB = 'B'; const FolderNameC = 'C'; - await umbracoApi.media.ensureNameNotExists(FolderNameA); - await umbracoApi.media.ensureNameNotExists(FolderNameB); - await umbracoApi.media.ensureNameNotExists(FolderNameC); - + // Action await umbracoApi.media.createDefaultFolder(FolderNameC); await umbracoApi.media.createDefaultFolder(FolderNameB); @@ -88,16 +84,10 @@ test.describe('Media', () => { // Assert const item = await page.locator('[ui-sortable="vm.sortableOptions"]').locator("xpath=/*[1]") await expect(item).toContainText(FolderNameA); - - // Clean - await umbracoApi.media.ensureNameNotExists(FolderNameA); - await umbracoApi.media.ensureNameNotExists(FolderNameB); - await umbracoApi.media.ensureNameNotExists(FolderNameC); }); test('search after a specific Folder', async ({page, umbracoApi, umbracoUi}) => { const FolderSearchName = 'SearchMe'; - await umbracoApi.media.ensureNameNotExists(FolderSearchName); // Action await umbracoApi.media.createDefaultFolder(FolderSearchName) @@ -106,16 +96,11 @@ test.describe('Media', () => { // Assert await expect(page.locator(".umb-folder-grid__folder-description", {hasText: FolderSearchName})).toBeVisible(); - - // Clean - await umbracoApi.media.ensureNameNotExists(FolderSearchName); }); test('change Grid to List', async ({page, umbracoApi, umbracoUi}) => { const FolderOneName = 'FolderOne'; const FolderTwoName = 'FolderTwo'; - await umbracoApi.media.ensureNameNotExists(FolderOneName); - await umbracoApi.media.ensureNameNotExists(FolderTwoName); // Action await umbracoApi.media.createDefaultFolder(FolderOneName); @@ -126,17 +111,11 @@ test.describe('Media', () => { // Assert await expect(page.locator('[icon="icon-list"]')).toBeVisible(); - - // Clean - await umbracoApi.media.ensureNameNotExists(FolderOneName); - await umbracoApi.media.ensureNameNotExists(FolderTwoName); }); test('change List to Grid', async ({page, umbracoApi, umbracoUi}) => { const FolderOneName = 'FolderOne'; const FolderTwoName = 'FolderTwo'; - await umbracoApi.media.ensureNameNotExists(FolderOneName); - await umbracoApi.media.ensureNameNotExists(FolderTwoName); // Action await umbracoApi.media.createDefaultFolder(FolderOneName); @@ -150,9 +129,5 @@ test.describe('Media', () => { // Assert await expect(page.locator('[icon="icon-thumbnails-small"]')).toBeVisible(); - - // Clean - await umbracoApi.media.ensureNameNotExists(FolderOneName); - await umbracoApi.media.ensureNameNotExists(FolderTwoName); }); }); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/ModelsBuilder/modelsbuilder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/ModelsBuilder/modelsbuilder.spec.ts index 49ffc2afd0..445fa2f7a6 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/ModelsBuilder/modelsbuilder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/ModelsBuilder/modelsbuilder.spec.ts @@ -193,7 +193,9 @@ test.describe('Modelsbuilder tests', () => { await umbracoApi.templates.ensureNameNotExists(docTypeName); }); - test('Can update view and document type', async ({page, umbracoApi, umbracoUi}) => { + test('Can update view and document type', async ({page, umbracoApi, umbracoUi},testInfo) => { + await testInfo.slow(); + const docTypeName = "TestDocument"; const docTypeAlias = AliasHelper.toAlias(docTypeName); const propertyAlias = "title"; @@ -263,7 +265,7 @@ test.describe('Modelsbuilder tests', () => { // We only have to type out the opening tag, the editor adds the closing tag automatically. await editor.type("

@Model.Bod"); await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.save)); - await umbracoUi.isSuccessNotificationVisible({timeout: 10000}); + await umbracoUi.isSuccessNotificationVisible({timeout: 20000}); await page.locator('span:has-text("×")').click(); // Navigate to the content section and update the content @@ -273,6 +275,8 @@ test.describe('Modelsbuilder tests', () => { await page.locator("#bod").type("Fancy body text"); await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.saveAndPublish)); + await page.waitForTimeout(2000); + await umbracoApi.content.verifyRenderedContent("/", "

" + propertyValue + "

Fancy body text

", true); await umbracoApi.content.deleteAllContent(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/packages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/packages.spec.ts index f08a48b8fd..5506cc7ddd 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/packages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/packages.spec.ts @@ -79,6 +79,7 @@ test.describe('Packages', () => { // Fill out package creation form // Waits until the element package Content is visible await page.locator('[key="packager_packageContent"]').isVisible(); + await expect(page.locator('[label="@treeHeaders_documentTypes"]').locator('[text="' + rootDocTypeName + '"]')).toBeVisible(); await page.locator("#headerName").type(packageName); await page.locator('.controls > .umb-node-preview-add').click(); await page.locator('.umb-tree-item__label').first().click(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/partialViews.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/partialViews.spec.ts index 12343a66de..1ae2768156 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/partialViews.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/partialViews.spec.ts @@ -23,7 +23,7 @@ test.describe('Partial Views', () => { const name = "TestPartialView"; const fileName = name + ".cshtml"; - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); await openPartialViewsCreatePanel(page, umbracoUi); @@ -31,23 +31,23 @@ test.describe('Partial Views', () => { await page.locator('.menu-label localize[key="create_newEmptyPartialView"]').click(); //Type name - await umbracoUi.setEditorHeaderName(name); + await page.locator('[data-element="editor-name-field"]').type(name); //Save await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.save)); //Assert - await umbracoUi.isSuccessNotificationVisible({timeout:10000}); + await umbracoUi.isSuccessNotificationVisible({timeout: 20000}); //Clean up - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); }); test('Create partial view from snippet', async ({page, umbracoApi, umbracoUi}) => { const name = "TestPartialViewFromSnippet"; const fileName = name + ".cshtml"; - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); await openPartialViewsCreatePanel(page, umbracoUi); @@ -63,10 +63,10 @@ test.describe('Partial Views', () => { await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.save)); // Assert - await umbracoUi.isSuccessNotificationVisible({timeout:10000}); + await umbracoUi.isSuccessNotificationVisible({timeout:20000}); // Clean up - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); }); test('Partial view with no name', async ({page, umbracoApi, umbracoUi}) => { @@ -90,7 +90,7 @@ test.describe('Partial Views', () => { const name = "TestDeletePartialView"; const fileName = name + ".cshtml"; - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); // Build and save partial view const partialView = new PartialViewBuilder() @@ -111,14 +111,14 @@ test.describe('Partial Views', () => { await expect(await page.locator("body", { hasText: fileName})).not.toBeVisible(); // Clean - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); }); test('Edit partial view', async ({page, umbracoApi, umbracoUi}) => { const name = 'EditPartialView'; const fileName = name + ".cshtml"; - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); const partialView = new PartialViewBuilder() .withName(name) @@ -135,9 +135,9 @@ test.describe('Partial Views', () => { await umbracoUi.clickElement(umbracoUi.getButtonByLabelKey(ConstantHelper.buttons.save)); // Assert - await umbracoUi.isSuccessNotificationVisible({timeout:10000}); + await umbracoUi.isSuccessNotificationVisible({timeout:20000}); // Clean - await umbracoApi.partialViews.ensureNameNotExists(fileName); + await umbracoApi.partialViews.ensureNameNotExists('', fileName); }); });