From 203b003e410d41136bbde15b8009e8d1c6b7d81b Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Fri, 23 Feb 2024 18:41:35 +0700 Subject: [PATCH] V14 Added missing tests and fixed failed tests for Partial View (#15635) * Added beforeEach() and remove .skip for the passed tests * Fixed failed tests and add the tests to cover query builder * Bumped version of test helper * Updated api tests for Partial View as the endpoints are changed * Fixed failed tests and remove .skip tests * Updated test helper version and api tests for Partial View as the name of method changes * Changed createButton() to createThreeDotsButton() * Bumped version * Bumped version of test helper * Fixed comments * Added more waits * Splited tests out * Changed verification method * Added debug * Removed console.log() and increased wait time * Changed expect from toEqual to toBeTruthy * Changed to use "" instead of '' * more changes * Updated the expectedPartialViewContent * Changes * Removed * Fixed test * Update PartialView.spec.ts * Removed .skip * Added code to detect os platform * Updated expectedPartialViewContent varibale * Added waits * Bumped version of test helper --------- Co-authored-by: Andreas Zerbst Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> --- .../package-lock.json | 8 +- .../Umbraco.Tests.AcceptanceTest/package.json | 2 +- .../PartialView/PartialView.spec.ts | 19 +- .../PartialView/PartialViewFolder.spec.ts | 34 +-- .../Settings/PartialView/PartialView.spec.ts | 228 ++++++++++++++++++ .../PartialView/PartialViewFolder.spec.ts | 73 ++++++ .../Settings/PartialViews.spec.ts | 211 ---------------- 7 files changed, 338 insertions(+), 237 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts delete mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialViews.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 2707bfddad..48316d8ebf 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -8,7 +8,7 @@ "hasInstallScript": true, "dependencies": { "@umbraco/json-models-builders": "^2.0.1 ", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.18", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.20", "camelize": "^1.0.0", "dotenv": "^16.3.1", "faker": "^4.1.0", @@ -146,9 +146,9 @@ "integrity": "sha512-9tCqYEDHI5RYFQigXFwF1hnCwcWCOJl/hmll0lr5D2Ljjb0o4wphb69wikeJDz5qCEzXCoPvG6ss5SDP6IfOdg==" }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.18.tgz", - "integrity": "sha512-krL/FwgisdmIJRy1ThaC/BOqeebJj9sCtDDbcy2h0B8Tmz4NhYdjdEMh3X+IvJDnfHX+rS2DiYa97cHyvVMhHA==", + "version": "2.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.20.tgz", + "integrity": "sha512-XFkKr1TyEp2l1Nb9hlwODkYK1PAzsdHmtn6yRPu72gWhN5AO8/JTeKWrfhJZIgXPYCo4AhS2Rn9r/1PiXreKNw==", "dependencies": { "@umbraco/json-models-builders": "2.0.1", "camelize": "^1.0.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index d29ede9e12..e9649ae6ec 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@umbraco/json-models-builders": "^2.0.1 ", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.18", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.20", "camelize": "^1.0.0", "dotenv": "^16.3.1", "faker": "^4.1.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialView.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialView.spec.ts index 51dcc49ce5..c8ef633d5d 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialView.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialView.spec.ts @@ -2,7 +2,7 @@ import {test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; test.describe('Partial View tests', () => { - let partialViewPath = ""; + let partialViewPath = ''; const partialViewName = 'partialViewName.cshtml'; test.beforeEach(async ({umbracoApi}) => { @@ -25,17 +25,28 @@ test.describe('Partial View tests', () => { // Arrange const newContent = 'Howdy'; partialViewPath = await umbracoApi.partialView.create(partialViewName, 'test'); - const partialView = await umbracoApi.partialView.get(partialViewPath); - partialView.content = newContent; // Act - await umbracoApi.partialView.update(partialView); + await umbracoApi.partialView.updateContent(partialViewPath, newContent); // Assert const updatedPartialView = await umbracoApi.partialView.get(partialViewPath); expect(updatedPartialView.content).toEqual(newContent); }); + test('can rename a partial view', async ({umbracoApi}) => { + // Arrange + const wrongPartialViewName = 'wrongPartialViewName.cshtml'; + const wrongPartialViewPath = await umbracoApi.partialView.create(wrongPartialViewName, 'test'); + + // Act + const updatedPartialViewPath = await umbracoApi.partialView.updateName(wrongPartialViewPath, partialViewName); + + // Assert + const updatedPartialView = await umbracoApi.partialView.get(updatedPartialViewPath); + expect(updatedPartialView.name).toEqual(partialViewName); + }); + test('can delete a partial view', async ({umbracoApi}) => { // Arrange partialViewPath = await umbracoApi.partialView.create(partialViewName, 'test'); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialViewFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialViewFolder.spec.ts index ed7bccde44..08d45b6d0e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialViewFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/PartialView/PartialViewFolder.spec.ts @@ -2,6 +2,7 @@ import {test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; test.describe('Partial View Folder tests', () => { + let partialViewFolderPath = ''; const partialViewFolderName = 'partialViewFolder'; test.beforeEach(async ({umbracoApi}) => { @@ -14,48 +15,47 @@ test.describe('Partial View Folder tests', () => { test('can create a partial view folder', async ({umbracoApi}) => { // Act - await umbracoApi.partialView.createFolder(partialViewFolderName); + partialViewFolderPath = await umbracoApi.partialView.createFolder(partialViewFolderName); // Assert - expect(await umbracoApi.partialView.doesFolderExist(partialViewFolderName)).toBeTruthy(); + expect(await umbracoApi.partialView.doesFolderExist(partialViewFolderPath)).toBeTruthy(); }); test('can delete a partial view folder', async ({umbracoApi}) => { // Arrange - await umbracoApi.partialView.createFolder(partialViewFolderName); - expect(await umbracoApi.partialView.doesFolderExist(partialViewFolderName)).toBeTruthy(); + partialViewFolderPath = await umbracoApi.partialView.createFolder(partialViewFolderName); + expect(await umbracoApi.partialView.doesFolderExist(partialViewFolderPath)).toBeTruthy(); // Act - await umbracoApi.partialView.deleteFolder(partialViewFolderName); + await umbracoApi.partialView.deleteFolder(partialViewFolderPath); // Assert - expect(await umbracoApi.partialView.doesFolderExist(partialViewFolderName)).toBeFalsy(); + expect(await umbracoApi.partialView.doesFolderExist(partialViewFolderPath)).toBeFalsy(); }); test('can add a partial view folder in another', async ({umbracoApi}) => { // Arrange const childFolderName = 'childFolder'; - await umbracoApi.partialView.createFolder(partialViewFolderName); + partialViewFolderPath = await umbracoApi.partialView.createFolder(partialViewFolderName); // Act - await umbracoApi.partialView.createFolder(childFolderName, partialViewFolderName); - const children = await umbracoApi.partialView.getChildren(partialViewFolderName); + await umbracoApi.partialView.createFolder(childFolderName, partialViewFolderPath); // Assert - expect(children[0].name).toEqual(childFolderName); + const childrenData = await umbracoApi.partialView.getChildren(partialViewFolderPath); + expect(childrenData[0].name).toEqual(childFolderName); }); test('can add a partial view folder in a folder in another folder', async ({umbracoApi}) => { // Arrange const childFolderName = 'childFolder'; const childOfChildFolderName = 'childOfChildFolder'; - const childFolderPath = partialViewFolderName + '/' + childFolderName; // Creates parent folder - await umbracoApi.partialView.createFolder(partialViewFolderName); + partialViewFolderPath = await umbracoApi.partialView.createFolder(partialViewFolderName); // Creates child folder in parent folder - await umbracoApi.partialView.createFolder(childFolderName, partialViewFolderName); + const childFolderPath = await umbracoApi.partialView.createFolder(childFolderName, partialViewFolderPath); // Act // Creates childOfChild folder in child folder @@ -63,9 +63,9 @@ test.describe('Partial View Folder tests', () => { // Assert // Checks if the partial views folder are in the correct folders - const childOfParent = await umbracoApi.partialView.getChildren(partialViewFolderName); - const childOfChild = await umbracoApi.partialView.getChildren(childFolderPath); - expect(childOfParent[0].name).toEqual(childFolderName); - expect(childOfChild[0].name).toEqual(childOfChildFolderName); + const childOfParentData = await umbracoApi.partialView.getChildren(partialViewFolderPath); + expect(childOfParentData[0].name).toEqual(childFolderName); + const childOfChildData = await umbracoApi.partialView.getChildren(childFolderPath); + expect(childOfChildData[0].name).toEqual(childOfChildFolderName); }); }); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts new file mode 100644 index 0000000000..0cd38af3c5 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts @@ -0,0 +1,228 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +test.describe('Partial View tests', () => { + const partialViewName = 'TestPartialView'; + const partialViewFileName = partialViewName + '.cshtml'; + const dictionaryName = 'TestDictionaryPartialView'; + + test.beforeEach(async ({umbracoUi, umbracoApi}) => { + await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); + await umbracoUi.goToBackOffice(); + await umbracoUi.partialView.goToSection(ConstantHelper.sections.settings); + }); + + test.afterEach(async ({umbracoApi}) => { + await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); + await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); + }); + + test('can create an empty partial view', async ({umbracoApi, umbracoUi}) => { + // Act + await umbracoUi.partialView.clickActionsMenuAtRoot(); + await umbracoUi.partialView.clickCreateThreeDotsButton(); + await umbracoUi.partialView.clickNewEmptyPartialViewButton(); + await umbracoUi.partialView.enterPartialViewName(partialViewName); + await umbracoUi.partialView.clickSaveButton(); + + // Assert + await umbracoUi.partialView.isSuccessNotificationVisible(); + expect(await umbracoApi.partialView.doesNameExist(partialViewFileName)).toBeTruthy(); + // Verify the new partial view is displayed under the Partial Views section + await umbracoUi.partialView.clickRootFolderCaretButton(); + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(partialViewFileName)).toBeVisible(); + }) + + test('can create a partial view from snippet', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedPartialViewContent = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\n@using Umbraco.Cms.Core.Routing\n@using Umbraco.Extensions\n\n@inject IPublishedUrlProvider PublishedUrlProvider\n@*\n This snippet makes a breadcrumb of parents using an unordered HTML list.\n\n How it works:\n - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back\n - Finally it outputs the name of the current page (without a link)\n*@\n\n@{ var selection = Model.Ancestors().ToArray(); }\n\n@if (selection?.Length > 0)\n{\n \n}'; + + // Act + await umbracoUi.partialView.clickActionsMenuAtRoot(); + await umbracoUi.partialView.clickCreateThreeDotsButton(); + await umbracoUi.partialView.clickNewPartialViewFromSnippetButton(); + await umbracoUi.partialView.clickBreadcrumbButton(); + await umbracoUi.partialView.enterPartialViewName(partialViewName); + await umbracoUi.waitForTimeout(1000); + await umbracoUi.partialView.clickSaveButton(); + + // Assert + await umbracoUi.partialView.isSuccessNotificationVisible(); + expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); + const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); + expect(partialViewData.content.length).toBe(expectedPartialViewContent.length); + expect(partialViewData.content).toBe(expectedPartialViewContent); + // Verify the new partial view is displayed under the Partial Views section + await umbracoUi.partialView.clickRootFolderCaretButton(); + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(partialViewFileName)).toBeVisible(); + }); + + test('can update a partial view name', async ({umbracoApi, umbracoUi}) => { + // Arrange + const wrongPartialViewName = 'WrongName'; + const wrongPartialViewFileName = wrongPartialViewName + '.cshtml'; + + await umbracoApi.partialView.ensureNameNotExists(wrongPartialViewFileName); + await umbracoApi.partialView.create(wrongPartialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); + expect(await umbracoApi.partialView.doesExist(wrongPartialViewFileName)).toBeTruthy(); + + //Act + await umbracoUi.partialView.clickRootFolderCaretButton(); + await umbracoUi.partialView.clickActionsMenuForPartialView(wrongPartialViewFileName); + await umbracoUi.partialView.rename(partialViewName); + + // Assert + await umbracoUi.partialView.isSuccessNotificationVisible(); + expect(await umbracoApi.partialView.doesNameExist(partialViewFileName)).toBeTruthy(); + expect(await umbracoApi.partialView.doesNameExist(wrongPartialViewFileName)).toBeFalsy(); + // Verify the old partial view is NOT displayed under the Partial Views section + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(wrongPartialViewFileName)).not.toBeVisible(); + // Verify the new partial view is displayed under the Partial Views section + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(partialViewFileName)).toBeVisible(); + + }); + + test('can update a partial view content', async ({umbracoApi, umbracoUi}) => { + // Arrange + const updatedPartialViewContent = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n' + + '@{\r\n' + + '\tLayout = null;\r\n' + + '}\r\n' + + '

AcceptanceTests

'; + + await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); + expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); + + //Act + await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); + await umbracoUi.partialView.enterPartialViewContent(updatedPartialViewContent); + await umbracoUi.partialView.clickSaveButton(); + + // Assert + const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); + expect(updatedPartialView.content).toBe(updatedPartialViewContent); + }); + + test('can use query builder with Order By statement for a partial view', async ({umbracoApi, umbracoUi}) => { + //Arrange + const propertyAliasValue = 'UpdateDate'; + const isAscending = false; + const expectedCode = 'Umbraco.ContentAtRoot().FirstOrDefault()\r\n' + + ' .Children()\r\n' + + ' .Where(x => x.IsVisible())\r\n' + + ' .OrderByDescending(x => x.' + propertyAliasValue + ')'; + const expectedTemplateContent = '\r\n' + + '@{\r\n' + + '\tvar selection = ' + expectedCode + ';\r\n' + + '}\r\n' + + '\r\n' + + '\r\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n'; + + await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); + expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); + + // Act + await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); + // Wait for the partial view to open + await umbracoUi.waitForTimeout(1000); + await umbracoUi.partialView.addQueryBuilderWithOrderByStatement(propertyAliasValue, isAscending); + // Verify that the code is shown + await umbracoUi.partialView.isQueryBuilderCodeShown(expectedCode); + await umbracoUi.partialView.clickSubmitButton(); + await umbracoUi.partialView.clickSaveButton(); + + // Assert + const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); + expect(updatedPartialView.content).toBe(expectedTemplateContent); + }); + + test.skip('can use query builder with Where statement for a partial view', async ({umbracoApi, umbracoUi}) => { + //Arrange + const propertyAliasValue = 'Name'; + const operatorValue = 'is'; + const constrainValue = 'Test Content'; + const expectedCode = 'Umbraco.ContentAtRoot().FirstOrDefault()\r\n' + + ' .Children()\r\n' + + ' .Where(x => (x.' + propertyAliasValue + ' == "' + constrainValue + '"))\r\n' + + ' .Where(x => x.IsVisible())'; + const expectedTemplateContent = '\r\n' + + '@{\r\n' + + '\tvar selection = ' + expectedCode + ';\r\n' + + '}\r\n' + + '\r\n' + + '\r\n' + + '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n'; + + await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); + expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); + + // Act + await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); + // Wait for the partial view to open + await umbracoUi.waitForTimeout(1000); + await umbracoUi.partialView.addQueryBuilderWithWhereStatement(propertyAliasValue, operatorValue, constrainValue); + // Verify that the code is shown + await umbracoUi.partialView.isQueryBuilderCodeShown(expectedCode); + await umbracoUi.partialView.clickSubmitButton(); + await umbracoUi.partialView.clickSaveButton(); + + // Assert + const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); + expect(updatedPartialView.content).toBe(expectedTemplateContent); + }); + + test('can insert dictionaryItem into a partial view', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); + expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); + + await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); + await umbracoApi.dictionary.create(dictionaryName); + + const partialViewContent = '@Umbraco.GetDictionaryValue("' + dictionaryName + '")@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n'; + + // Act + await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); + // Wait for the partial view to open + await umbracoUi.waitForTimeout(1000); + await umbracoUi.partialView.insertDictionaryByName(dictionaryName); + await umbracoUi.partialView.clickSaveButton(); + + // Assert + const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); + expect(partialViewData.content).toBe(partialViewContent); + }); + + test('can delete a partial view', async ({umbracoApi, umbracoUi}) => { + //Arrange + await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); + expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); + + //Act + await umbracoUi.partialView.clickRootFolderCaretButton(); + await umbracoUi.partialView.clickActionsMenuForPartialView(partialViewFileName); + await umbracoUi.partialView.deletePartialView(); + + // Assert + await umbracoUi.partialView.isSuccessNotificationVisible(); + expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeFalsy(); + // Verify the partial view is NOT displayed under the Partial Views section + await umbracoUi.partialView.clickRootFolderCaretButton(); + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(partialViewFileName)).not.toBeVisible(); + }); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts new file mode 100644 index 0000000000..0d3fe143a0 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts @@ -0,0 +1,73 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +test.describe('Partial View Folder tests', () => { + const partialViewName = 'TestPartialView'; + const partialViewFileName = partialViewName + '.cshtml'; + const folderName = 'TestFolder'; + + test.beforeEach(async ({umbracoUi, umbracoApi}) => { + await umbracoApi.partialView.ensureNameNotExists(folderName); + await umbracoUi.goToBackOffice(); + await umbracoUi.partialView.goToSection(ConstantHelper.sections.settings); + }); + + test.afterEach(async ({umbracoApi}) => { + await umbracoApi.partialView.ensureNameNotExists(folderName); + }); + + test('can create a folder', async ({umbracoApi, umbracoUi}) => { + // Act + await umbracoUi.partialView.clickActionsMenuAtRoot(); + await umbracoUi.partialView.createFolder(folderName); + + // Assert + await umbracoUi.partialView.isSuccessNotificationVisible(); + expect(await umbracoApi.partialView.doesFolderExist(folderName)).toBeTruthy(); + // Verify the partial view folder is displayed under the Partial Views section + await umbracoUi.partialView.clickRootFolderCaretButton(); + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(folderName)).toBeVisible(); + }); + + test('can delete a folder', async ({umbracoApi, umbracoUi}) => { + //Arrange + await umbracoApi.partialView.createFolder(folderName); + expect(await umbracoApi.partialView.doesFolderExist(folderName)).toBeTruthy(); + + // Act + await umbracoUi.partialView.clickRootFolderCaretButton(); + await umbracoUi.partialView.clickActionsMenuForPartialView(folderName); + await umbracoUi.partialView.deletePartialView(); + + // Assert + await umbracoUi.partialView.isSuccessNotificationVisible(); + expect(await umbracoApi.partialView.doesFolderExist(folderName)).toBeFalsy(); + // Verify the partial view folder is NOT displayed under the Partial Views section + await umbracoUi.partialView.clickRootFolderCaretButton(); + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(folderName)).not.toBeVisible(); + }); + + test('can place a partial view into folder', async ({umbracoApi, umbracoUi}) => { + //Arrange + await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); + const folderPath = await umbracoApi.partialView.createFolder(folderName); + expect(await umbracoApi.partialView.doesFolderExist(folderName)).toBeTruthy(); + + // Act + await umbracoUi.partialView.clickRootFolderCaretButton(); + await umbracoUi.partialView.clickActionsMenuForPartialView(folderName); + await umbracoUi.partialView.clickCreateThreeDotsButton(); + await umbracoUi.partialView.clickNewEmptyPartialViewButton(); + await umbracoUi.partialView.enterPartialViewName(partialViewName); + await umbracoUi.partialView.clickSaveButton(); + + // Assert + await umbracoUi.partialView.isSuccessNotificationVisible(); + const childrenData = await umbracoApi.partialView.getChildren(folderPath); + expect(childrenData[0].name).toEqual(partialViewFileName); + // Verify the partial view is displayed in the folder under the Partial Views section + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(partialViewFileName)).not.toBeVisible(); + await umbracoUi.partialView.clickCaretButtonForName(folderName); + await expect(umbracoUi.partialView.checkItemNameUnderPartialViewTree(partialViewFileName)).toBeVisible(); + }); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialViews.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialViews.spec.ts deleted file mode 100644 index 05b3c9a6ae..0000000000 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialViews.spec.ts +++ /dev/null @@ -1,211 +0,0 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -import {expect} from "@playwright/test"; - -test.describe('Partial Views tests', () => { - const partialViewName = 'TestPartialView'; - const partialViewFileName = partialViewName + ".cshtml"; - - test.beforeEach(async ({umbracoUi}) => { - await umbracoUi.goToBackOffice(); - await umbracoUi.partialView.goToSection(ConstantHelper.sections.settings); - }); - - test('can create an empty partial view', async ({umbracoApi, umbracoUi}) => { - //Arrange - await umbracoApi.partialView.ensureNameNotExists(partialViewName); - - // Act - await umbracoUi.partialView.clickActionsMenuAtRoot(); - await umbracoUi.partialView.clickNewEmptyPartialViewButton(); - await umbracoUi.partialView.enterPartialViewName(partialViewName); - // TODO: Remove this timeout when frontend validation is implemented - await umbracoUi.waitForTimeout(1000); - await umbracoUi.partialView.clickSaveButton(); - - // Assert - expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); - // TODO: when frontend is ready, verify the new partial view is displayed under the Partial Views section - // TODO: when frontend is ready, verify the notification displays - - // Clean - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - }); - - test.skip('can create a partial view from snippet', async ({umbracoApi, umbracoUi}) => { - // Arrange - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - const expectedTemplateContent = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n@using Umbraco.Cms.Core.Routing\r\n@using Umbraco.Extensions\r\n\n@inject IPublishedUrlProvider PublishedUrlProvider\r\n@*\r\n This snippet makes a breadcrumb of parents using an unordered HTML list.\r\n\r\n How it works:\r\n - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back\r\n - Finally it outputs the name of the current page (without a link)\r\n*@\r\n\r\n@{ var selection = Model.Ancestors().ToArray(); }\r\n\r\n@if (selection?.Length > 0)\r\n{\r\n \r\n}'; - - // Act - await umbracoUi.partialView.clickActionsMenuAtRoot(); - await umbracoUi.partialView.clickNewPartialViewFromSnippetButton(); - await umbracoUi.partialView.clickBreadcrumbButton(); - await umbracoUi.partialView.enterPartialViewName(partialViewName); - // TODO: Remove this timeout when frontend validation is implemented - await umbracoUi.waitForTimeout(1000); - await umbracoUi.partialView.clickSaveButton(); - - // Assert - expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); - const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); - expect(partialViewData.content).toBe(expectedTemplateContent); - // TODO: when frontend is ready, verify the new partial view is displayed under the Partial Views section - // TODO: when frontend is ready, verify the notification displays - - // Clean - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - }); - - test('can update a partial view name', async ({umbracoApi, umbracoUi}) => { - // Arrange - const updatedPartialViewName = 'TestPartialViewUpdated'; - const updatedPartialViewFileName = updatedPartialViewName + ".cshtml"; - - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); - - //Act - await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); - await umbracoUi.partialView.enterPartialViewName(updatedPartialViewName); - // TODO: Remove this timeout when frontend validation is implemented - await umbracoUi.waitForTimeout(1000); - await umbracoUi.partialView.clickSaveButton(); - - // Assert - expect(await umbracoApi.partialView.doesExist(updatedPartialViewFileName)).toBeTruthy(); - // TODO: when frontend is ready, verify the updated partial view name is displayed under the Partial Views section - expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeFalsy(); - // TODO: when frontend is ready, verify the old partial view name is NOT displayed under the Partial Views section - - // Clean - await umbracoApi.partialView.ensureNameNotExists(updatedPartialViewFileName); - }); - - test('can update a partial view content', async ({umbracoApi, umbracoUi}) => { - // Arrange - const updatedPartialViewContent = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n' + - '@{\r\n' + - '\tLayout = null;\r\n' + - '}\r\n' + - '

AcceptanceTests

'; - - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); - - //Act - await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); - await umbracoUi.partialView.enterPartialViewContent(updatedPartialViewContent); - // TODO: Remove this timeout when frontend validation is implemented - await umbracoUi.waitForTimeout(1000); - await umbracoUi.partialView.clickSaveButton(); - - // Assert - const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); - expect(updatedPartialView.content).toBe(updatedPartialViewContent); - - // Clean - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - }); - - test('can use query builder for a partial view', async ({umbracoApi, umbracoUi}) => { - //Arrange - const expectedTemplateContent = '\r\n' + - '@{\r\n' + - '\tvar selection = Umbraco.ContentAtRoot().FirstOrDefault()\r\n' + - ' .Children()\r\n' + - ' .Where(x => x.IsVisible());\r\n' + - '}\r\n' + - '\r\n' + - '\r\n' + - '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n'; - - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); - - // Act - await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); - await umbracoUi.partialView.addQueryBuilderWithCreateDateOption(); - await umbracoUi.partialView.clickSaveButton(); - - // Assert - const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); - expect(updatedPartialView.content).toBe(expectedTemplateContent); - - // Clean - await umbracoApi.template.ensureNameNotExists(partialViewFileName); - }); - - // Skip this test now as the function delete dictionary is missing - test.skip('can insert dictionaryItem into a partial view', async ({umbracoApi, umbracoUi}) => { - // Arrange - const dictionaryName = 'TestDictionary'; - - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); - - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.dictionary.create(dictionaryName); - - const partialViewContent = '@Umbraco.GetDictionaryValue("' + dictionaryName + '")@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n'; - - // Act - await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); - await umbracoUi.partialView.insertDictionaryByName(dictionaryName); - await umbracoUi.partialView.clickSaveButton(); - - // Assert - const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); - expect(partialViewData.content).toBe(partialViewContent); - - // Clean - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.template.ensureNameNotExists(partialViewFileName); - }); - - test.skip('can delete a partial view', async ({umbracoApi, umbracoUi}) => { - //Arrange - await umbracoApi.partialView.ensureNameNotExists(partialViewFileName); - await umbracoApi.partialView.create(partialViewFileName, "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n", "/"); - - //Act - await umbracoUi.partialView.clickRootFolderCaretButton(); - await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); - await umbracoUi.partialView.deletePartialView(); - - // Assert - expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeFalsy(); - // TODO: when frontend is ready, verify the partial view is NOT displayed under the Partial Views section - // TODO: when frontend is ready, verify the notification displays - - }); - - test('can create a folder', async ({umbracoApi, umbracoUi}) => { - //Arrange - const folderName = 'TestFolder'; - await umbracoApi.partialView.ensureNameNotExists(folderName); - - // Act - await umbracoUi.partialView.clickActionsMenuAtRoot(); - await umbracoUi.partialView.createFolder(folderName); - - // Assert - expect(await umbracoApi.partialView.doesFolderExist(folderName)).toBeTruthy(); - // TODO: when frontend is ready, verify the new folder is displayed under the Partial Views section - // TODO: when frontend is ready, verify the notification displays - - //Clean - await umbracoApi.partialView.ensureNameNotExists(folderName); - }); - - test.skip('can place a partial view into folder', async ({umbracoApi}) => { - // TODO: implement this later as the frontend is missing now - }); - -});