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 @* For each page in the ancestors collection which have been ordered by Level (so we start with the highest top node first) *@\n @foreach (var item in selection.OrderBy(x => x.Level))\n {\n - @item.Name /
\n }\n\n @* Display the current page as the last item in the list *@\n - @Model.Name
\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' +
+ '\t@foreach (var item in selection)\r\n' +
+ '\t{\r\n' +
+ '\t\t- \r\n' +
+ '\t\t\t@item.Name()\r\n' +
+ '\t\t
\r\n' +
+ '\t}\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' +
+ '\t@foreach (var item in selection)\r\n' +
+ '\t{\r\n' +
+ '\t\t- \r\n' +
+ '\t\t\t@item.Name()\r\n' +
+ '\t\t
\r\n' +
+ '\t}\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 @* For each page in the ancestors collection which have been ordered by Level (so we start with the highest top node first) *@\r\n @foreach (var item in selection.OrderBy(x => x.Level))\r\n {\r\n - @item.Name /
\r\n }\r\n\r\n @* Display the current page as the last item in the list *@\r\n - @Model.Name
\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' +
- '\t@foreach (var item in selection)\r\n' +
- '\t{\r\n' +
- '\t\t- \r\n' +
- '\t\t\t@item.Name()\r\n' +
- '\t\t
\r\n' +
- '\t}\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
- });
-
-});