From 7b462c17f96d3e0485dec9ed73aebb22730a8093 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Thu, 4 Dec 2025 09:26:47 +0100 Subject: [PATCH] E2E: QA updated flaky acceptance tests (#21012) * Updated tests * Updated tests * Cleane up * Bumped version of test helpers * Updated tests * Bumped test helpers --- .../package-lock.json | 8 +-- .../Umbraco.Tests.AcceptanceTest/package.json | 2 +- .../Content/ContentWithMediaPicker.spec.ts | 2 + .../Content/ContentWithMultiURLPicker.spec.ts | 9 ++- .../Content/CultureAndHostnames.spec.ts | 16 ++--- .../Content/PublishWithDescendants.spec.ts | 2 +- .../Content/RedirectManagement.spec.ts | 12 ++-- .../RichTextEditor/TiptapToolbar.spec.ts | 6 +- .../tests/DefaultConfig/Media/Media.spec.ts | 12 ++-- .../DocumentBlueprint.spec.ts | 4 ++ .../Settings/MediaType/MediaType.spec.ts | 3 +- .../Users/CurrentUserProfile.spec.ts | 4 +- .../DefaultPermissionsInContent.spec.ts | 4 +- .../GranularPermissionsInContent.spec.ts | 4 +- .../tests/DefaultConfig/Users/User.spec.ts | 71 +++++++------------ 15 files changed, 72 insertions(+), 87 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 5fa63bbeff..d31a2f2f0d 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.42", - "@umbraco/playwright-testhelpers": "^17.0.12", + "@umbraco/playwright-testhelpers": "^17.0.15", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -67,9 +67,9 @@ } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "17.0.12", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-17.0.12.tgz", - "integrity": "sha512-GhOj5ytXEY1sG8Nt6CAkJcqjxfRWUFKLl63SCk2quew/1rLCeaUV5I2+YJ3LkfQetMdDlqtMVZP7FdMk+iWJNQ==", + "version": "17.0.15", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-17.0.15.tgz", + "integrity": "sha512-aV31VbzkSGTH0q8AloB6aWQuYIxvKrH613DOFBhO0Ccw99Xv1NB9ZsE/HrG2QO//Si6p9y8aWv4mfQKcUfQ41w==", "license": "MIT", "dependencies": { "@umbraco/json-models-builders": "2.0.42", diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 1e142aba1d..a5f31426cf 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@umbraco/json-models-builders": "^2.0.42", - "@umbraco/playwright-testhelpers": "^17.0.12", + "@umbraco/playwright-testhelpers": "^17.0.15", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts index afdf50ab44..77c427fceb 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts @@ -185,5 +185,7 @@ test('can add a media image to a media picker in variant content, remove it and await umbracoUi.content.clickChooseModalButton(); // Assert + // Wait for the media file to be visible + await umbracoUi.waitForTimeout(500); await umbracoUi.content.isMediaNameVisible(mediaFileName); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts index 5cb5b80667..b2468f13a2 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts @@ -267,7 +267,8 @@ test('can edit the URL picker in the content', async ({umbracoApi, umbracoUi}) = expect(contentData.values[0].value[0].url).toEqual(link); }); -test('cannot submit an empty link', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => { +// TODO: fails due to https://github.com/umbraco/Umbraco-CMS/issues/21044 +test.skip('cannot submit an empty link', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => { // Arrange const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id); @@ -288,7 +289,8 @@ test('cannot submit an empty link', {tag: '@release'}, async ({umbracoApi, umbra await umbracoUi.content.isTextWithMessageVisible(ConstantHelper.validationMessages.emptyLinkPicker); }); -test('cannot update the URL picker with an empty link', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => { +// TODO: fails due to https://github.com/umbraco/Umbraco-CMS/issues/21044 +test.skip('cannot update the URL picker with an empty link', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => { // Arrange const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id); @@ -308,7 +310,8 @@ test('cannot update the URL picker with an empty link', {tag: '@release'}, async await umbracoUi.content.isTextWithMessageVisible(ConstantHelper.validationMessages.emptyLinkPicker); }); -test('cannot submit an empty URL with an anchor or query', async ({umbracoApi, umbracoUi}) => { +// TODO: fails due to https://github.com/umbraco/Umbraco-CMS/issues/21044 +test.skip('cannot submit an empty URL with an anchor or query', async ({umbracoApi, umbracoUi}) => { // Arrange const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts index 7db43f1611..0034d995be 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts @@ -50,11 +50,11 @@ test('can add a domain', async ({umbracoApi, umbracoUi}) => { // Act await umbracoUi.content.clickActionsMenuForContent(contentName); await umbracoUi.content.clickCultureAndHostnamesActionMenuOption(); - await umbracoUi.content.clickAddNewDomainButton(); + await umbracoUi.content.clickAddNewHostnameButton(); await umbracoUi.waitForTimeout(500); await umbracoUi.content.enterDomain(domainName); await umbracoUi.waitForTimeout(500); - await umbracoUi.content.selectDomainLanguageOption(languageName); + await umbracoUi.content.selectHostnameLanguageOption(languageName); await umbracoUi.waitForTimeout(500); await umbracoUi.content.clickSaveModalButton(); await umbracoUi.waitForTimeout(500); @@ -81,7 +81,7 @@ test('can update culture and hostname', async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.clickSaveModalButton(); // Assert - await umbracoUi.content.waitForDomainToBeUpdated(); + await umbracoUi.content.waitForDomainToBeCreated(); domainsData = await umbracoApi.document.getDomains(contentId); expect(domainsData.domains[0].domainName).toEqual(updatedDomainName); expect(domainsData.domains[0].isoCode).toEqual(isoCode); @@ -96,7 +96,7 @@ test('can delete culture and hostname', async ({umbracoApi, umbracoUi}) => { // Act await umbracoUi.content.clickActionsMenuForContent(contentName); await umbracoUi.content.clickCultureAndHostnamesActionMenuOption(); - await umbracoUi.content.clickDeleteDomainButton(); + await umbracoUi.content.clickDeleteHostnameButton(); await umbracoUi.content.clickSaveModalButton(); // Assert @@ -116,12 +116,12 @@ test('can add culture and hostname for multiple languages', {tag: '@release'}, a // Act await umbracoUi.content.clickActionsMenuForContent(contentName); await umbracoUi.content.clickCultureAndHostnamesActionMenuOption(); - await umbracoUi.content.clickAddNewDomainButton(); + await umbracoUi.content.clickAddNewHostnameButton(); await umbracoUi.content.enterDomain(domainName, 0); - await umbracoUi.content.selectDomainLanguageOption(languageName, 0); - await umbracoUi.content.clickAddNewDomainButton(); + await umbracoUi.content.selectHostnameLanguageOption(languageName, 0); + await umbracoUi.content.clickAddNewHostnameButton(); await umbracoUi.content.enterDomain(secondDomainName, 1); - await umbracoUi.content.selectDomainLanguageOption(secondLanguageName, 1); + await umbracoUi.content.selectHostnameLanguageOption(secondLanguageName, 1); await umbracoUi.content.clickSaveModalButton(); // Assert diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts index 993bca4cf9..d81b1d39d4 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts @@ -135,7 +135,7 @@ test('can publish variant content with descendants without unpublished content i await umbracoUi.content.clickPublishWithDescendantsModalButton(); // Assert - await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.publishWithDescendants); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.publishWithDescendants, true, false, 10000); await umbracoUi.content.isErrorNotificationVisible(false); const contentData = await umbracoApi.document.getByName(contentName); expect(contentData.variants[0].state).toBe('Published'); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RedirectManagement.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RedirectManagement.spec.ts index a840fd03ff..e5cb271665 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RedirectManagement.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RedirectManagement.spec.ts @@ -37,7 +37,7 @@ test('can disable URL tracker', async ({umbracoApi, umbracoUi}) => { await umbracoUi.redirectManagement.clickDisableURLTrackerButton(); await umbracoUi.redirectManagement.clickDisableButton(); // Rename the published content - await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, true, true); await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.enterContentName(updatedContentName); await umbracoUi.content.clickSaveAndPublishButton(); @@ -46,7 +46,7 @@ test('can disable URL tracker', async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.isSuccessStateVisibleForSaveAndPublishButton(); // Verify that there is no redirects have been made const contentUrl = await umbracoApi.document.getDocumentUrl(contentId); - await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, true, true); await umbracoUi.redirectManagement.clickRedirectManagementTab(); await umbracoUi.redirectManagement.isTextWithExactNameVisible(contentUrl, false); // Verify that the status is Disable @@ -63,7 +63,7 @@ test('can re-enable URL tracker', async ({umbracoApi, umbracoUi}) => { await umbracoUi.redirectManagement.clickRedirectManagementTab(); await umbracoUi.redirectManagement.clickEnableURLTrackerButton(); // Rename the published content - await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, true, true); await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.enterContentName(updatedContentName); await umbracoUi.content.clickSaveAndPublishButton(); @@ -72,7 +72,7 @@ test('can re-enable URL tracker', async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.isSuccessStateVisibleForSaveAndPublishButton(); // Verify that there is one redirects have been made const contentUrl = await umbracoApi.document.getDocumentUrl(contentId); - await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, true, true); await umbracoUi.redirectManagement.clickRedirectManagementTab(); await umbracoUi.redirectManagement.isTextWithExactNameVisible(contentUrl); // Verify that the status is Enable @@ -91,7 +91,7 @@ test('can search for original URL', async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.isSuccessStateVisibleForSaveAndPublishButton(); // Act - await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, true, true); await umbracoUi.redirectManagement.clickRedirectManagementTab(); await umbracoUi.redirectManagement.enterOriginalUrl(searchKeyword); await umbracoUi.redirectManagement.clickSearchButton(); @@ -113,7 +113,7 @@ test('can delete a redirect', async ({umbracoApi, umbracoUi}) => { const contentUrl = await umbracoApi.document.getDocumentUrl(contentId); // Act - await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, true, true); await umbracoUi.redirectManagement.clickRedirectManagementTab(); await umbracoUi.redirectManagement.isTextWithExactNameVisible(contentUrl); await umbracoUi.redirectManagement.deleteFirstRedirectURL(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RichTextEditor/TiptapToolbar.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RichTextEditor/TiptapToolbar.spec.ts index 84d10ef71c..e2cb44d5e8 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RichTextEditor/TiptapToolbar.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/RichTextEditor/TiptapToolbar.spec.ts @@ -74,7 +74,8 @@ test('can embed a video into RTE Tiptap property editor', async ({umbracoApi, um expect(contentData.values[0].value.markup).toContain(videoURL); }); -test('cannot submit an empty link in RTE Tiptap property editor', async ({umbracoApi, umbracoUi}) => { +// TODO: fails due to https://github.com/umbraco/Umbraco-CMS/issues/21044 +test.skip('cannot submit an empty link in RTE Tiptap property editor', async ({umbracoApi, umbracoUi}) => { // Arrange const iconTitle = 'Link'; const customDataTypeId = await umbracoApi.dataType.createDefaultTiptapDataType(customDataTypeName); @@ -96,7 +97,8 @@ test('cannot submit an empty link in RTE Tiptap property editor', async ({umbrac await umbracoUi.content.isTextWithMessageVisible(ConstantHelper.validationMessages.emptyLinkPicker); }); -test('cannot submit an empty URL with an anchor or querystring in RTE Tiptap property editor', async ({umbracoApi, umbracoUi}) => { +// TODO: fails due to https://github.com/umbraco/Umbraco-CMS/issues/21044 +test.skip('cannot submit an empty URL with an anchor or querystring in RTE Tiptap property editor', async ({umbracoApi, umbracoUi}) => { // Arrange const iconTitle = 'Link'; const customDataTypeId = await umbracoApi.dataType.createDefaultTiptapDataType(customDataTypeName); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts index 16b1ac8ecc..4e181801ee 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts @@ -53,8 +53,8 @@ const mediaFileTypes = [ {fileName: 'Article', filePath: 'Article.pdf', thumbnail: 'icon-article'}, {fileName: 'Audio', filePath: 'Audio.mp3', thumbnail: 'icon-audio-lines'}, {fileName: 'File', filePath: 'File.txt', thumbnail: 'icon-document'}, - {fileName: 'Image', filePath: 'Umbraco.png', thumbnail: 'image'}, - {fileName: 'Vector Graphics (SVG)', filePath: 'VectorGraphics.svg', thumbnail: 'image'}, + {fileName: 'Image', filePath: 'Umbraco.png', thumbnail: 'icon-picture'}, + {fileName: 'Vector Graphics (SVG)', filePath: 'VectorGraphics.svg', thumbnail: 'icon-origami'}, {fileName: 'Video', filePath: 'Video.mp4', thumbnail: 'icon-video'} ]; @@ -70,7 +70,7 @@ for (const mediaFileType of mediaFileTypes) { await umbracoUi.media.uploadFile('./fixtures/mediaLibrary/' + mediaFileType.filePath); // Wait for the upload to complete await umbracoUi.media.isInputDropzoneVisible(false); - if (mediaFileType.fileName === 'Image') { + if (mediaFileType.fileName === 'Image') { await umbracoUi.media.isImageCropperFieldVisible(); } else { await umbracoUi.media.isInputUploadFieldVisible(); @@ -79,11 +79,7 @@ for (const mediaFileType of mediaFileTypes) { // Assert await umbracoUi.media.waitForMediaItemToBeCreated(); - await umbracoUi.media.goToSection(ConstantHelper.sections.media); - const mediaData = await umbracoApi.media.getByName(mediaFileType.fileName); - const mediaUrl = await umbracoApi.media.getFullMediaUrl(mediaData.id); - await umbracoUi.media.doesMediaHaveThumbnail(mediaData.id, mediaFileType.thumbnail, mediaUrl); - await umbracoUi.media.isMediaTreeItemVisible(mediaFileType.fileName); + await umbracoUi.media.doesMediaItemInTreeHaveThumbnail(mediaFileType.fileName, mediaFileType.thumbnail); expect(await umbracoApi.media.doesNameExist(mediaFileType.fileName)).toBeTruthy(); // Clean diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts index f9e7ce5a72..dbef84cea1 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts @@ -26,6 +26,8 @@ test('can create a document blueprint from the settings menu', {tag: '@smoke'}, await umbracoUi.documentBlueprint.clickCreateNewDocumentBlueprintButton(); await umbracoUi.documentBlueprint.clickTextButtonWithName(documentTypeName); await umbracoUi.documentBlueprint.clickChooseButton(); + // We need to wait for a bit while the new document is being loaded + await umbracoUi.waitForTimeout(1000); await umbracoUi.documentBlueprint.enterDocumentBlueprintName(documentBlueprintName); await umbracoUi.documentBlueprint.clickSaveButton(); @@ -113,6 +115,8 @@ test('can create a variant document blueprint', {tag: '@release'}, async ({umbra await umbracoUi.documentBlueprint.clickCreateNewDocumentBlueprintButton(); await umbracoUi.documentBlueprint.clickTextButtonWithName(documentTypeName); await umbracoUi.documentBlueprint.clickChooseButton(); + // We need to wait for a bit while the new document is being loaded + await umbracoUi.waitForTimeout(1000); await umbracoUi.documentBlueprint.enterDocumentBlueprintName(documentBlueprintName); await umbracoUi.documentBlueprint.clickSaveButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts index e1b07df0c1..48302caf5e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts @@ -1,5 +1,5 @@ import {expect} from "@playwright/test"; -import {AliasHelper, ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {AliasHelper, ConstantHelper, test} from '@umbraco/playwright-testhelpers'; const mediaTypeName = 'TestMediaType'; @@ -55,6 +55,7 @@ test('can update the alias for a media type', async ({umbracoApi, umbracoUi}) => // Act await umbracoUi.mediaType.goToMediaType(mediaTypeName); + await umbracoUi.waitForTimeout(500); await umbracoUi.mediaType.enterAliasName(updatedAlias); await umbracoUi.mediaType.clickSaveButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/CurrentUserProfile.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/CurrentUserProfile.spec.ts index 09c18db99a..decc344102 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/CurrentUserProfile.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/CurrentUserProfile.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; const userPassword = '0123456789'; let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; @@ -32,4 +32,4 @@ for (const userGroup of userGroups) { // Assert await umbracoUi.currentUserProfile.doesSuccessNotificationHaveText(NotificationConstantHelper.success.passwordChanged); }); -} \ No newline at end of file +} diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts index bbddfbe7ca..de054a1971 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts @@ -301,7 +301,7 @@ test.skip('can set permissions with set permissions permission enabled', async ( // Act await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); // await umbracoUi.content.clickSetPermissionsButton(); - + // Assert // await umbracoUi.content.doesDocumentPermissionsDialogExist(); }); @@ -529,7 +529,7 @@ test('can set culture and hostnames with culture and hostnames permission enable // Act await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); await umbracoUi.content.clickCultureAndHostnamesActionMenuOption(); - await umbracoUi.content.clickAddNewDomainButton(); + await umbracoUi.content.clickAddNewHostnameButton(); await umbracoUi.content.enterDomain(domainName); await umbracoUi.content.clickSaveModalButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/GranularPermissionsInContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/GranularPermissionsInContent.spec.ts index cf67544d88..5ae5001928 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/GranularPermissionsInContent.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/GranularPermissionsInContent.spec.ts @@ -267,9 +267,9 @@ test('can set culture and hostnames for a specific content with culture and host // Act await umbracoUi.content.clickActionsMenuForContent(firstDocumentName); await umbracoUi.content.clickCultureAndHostnamesActionMenuOption(); - await umbracoUi.content.clickAddNewDomainButton(); + await umbracoUi.content.clickAddNewHostnameButton(); await umbracoUi.content.enterDomain(domainName, 0); - await umbracoUi.content.selectDomainLanguageOption(languageName, 0); + await umbracoUi.content.selectHostnameLanguageOption(languageName, 0); await umbracoUi.content.clickSaveModalButton(); // Assert diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts index 326f48f39b..70cceadf0d 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts @@ -41,10 +41,9 @@ test('can rename a user', async ({umbracoApi, umbracoUi}) => { await umbracoApi.user.ensureNameNotExists(wrongName); const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(wrongName, wrongName + userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(wrongName); // Act - await umbracoUi.user.clickUserWithName(wrongName); await umbracoUi.user.enterUpdatedNameOfUser(nameOfTheUser); await umbracoUi.user.clickSaveButton(); @@ -57,10 +56,9 @@ test('can delete a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { // Arrange const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickActionButton(); await umbracoUi.user.clickDeleteButton(); await umbracoUi.user.clickConfirmToDeleteButton(); @@ -79,10 +77,9 @@ test('can add multiple user groups to a user', async ({umbracoApi, umbracoUi}) = const userGroupWriters = await umbracoApi.userGroup.getByName(defaultUserGroupName); const userGroupTranslators = await umbracoApi.userGroup.getByName(secondUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroupWriters.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickChooseUserGroupsButton(); await umbracoUi.user.clickButtonWithName(secondUserGroupName); await umbracoUi.user.clickChooseModalButton(); @@ -99,10 +96,9 @@ test('can remove a user group from a user', {tag: '@smoke'}, async ({umbracoApi, const userGroupWriters = await umbracoApi.userGroup.getByName(defaultUserGroupName); const userGroupTranslators = await umbracoApi.userGroup.getByName(secondUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroupWriters.id, userGroupTranslators.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickRemoveButtonForUserGroupWithName(defaultUserGroupName); await umbracoUi.user.clickConfirmRemoveButton(); await umbracoUi.user.clickSaveButton(); @@ -117,10 +113,9 @@ test('can update culture for a user', {tag: '@release'}, async ({umbracoApi, umb const danishIsoCode = 'da'; const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.selectUserLanguage(danishIsoCode); await umbracoUi.user.clickSaveButton(); @@ -140,10 +135,9 @@ test('can add a content start node to a user', {tag: '@smoke'}, async ({umbracoA await umbracoApi.documentType.ensureNameNotExists(documentTypeName); const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickChooseContentStartNodeButton(); await umbracoUi.user.clickLabelWithName(documentName); await umbracoUi.user.clickChooseContainerButton(); @@ -175,10 +169,9 @@ test('can add multiple content start nodes for a user', async ({umbracoApi, umbr userData.documentStartNodeIds.push({id: documentId}); await umbracoApi.user.update(userId, userData); const secondDocumentId = await umbracoApi.document.createDefaultDocument(secondDocumentName, documentTypeId); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickChooseContentStartNodeButton(); await umbracoUi.user.clickLabelWithName(secondDocumentName); await umbracoUi.user.clickChooseContainerButton(); @@ -209,10 +202,9 @@ test('can remove a content start node from a user', {tag: '@release'}, async ({u userData.documentStartNodeIds.push({id: documentId}); await umbracoApi.user.update(userId, userData); expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeTruthy(); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickRemoveButtonForContentNodeWithName(documentName); await umbracoUi.user.clickConfirmRemoveButton(); await umbracoUi.user.clickSaveButton(); @@ -233,10 +225,9 @@ test('can add media start nodes for a user', {tag: '@smoke'}, async ({umbracoApi await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); await umbracoApi.media.ensureNameNotExists(mediaName); const mediaId = await umbracoApi.media.createDefaultMediaFile(mediaName); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickChooseMediaStartNodeButton(); await umbracoUi.user.selectMediaWithName(mediaName); await umbracoUi.user.clickChooseModalButton(); @@ -265,10 +256,9 @@ test('can add multiple media start nodes for a user', async ({umbracoApi, umbrac userData.mediaStartNodeIds.push({id: firstMediaId}); await umbracoApi.user.update(userId, userData); expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [firstMediaId])).toBeTruthy(); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickChooseMediaStartNodeButton(); await umbracoUi.user.selectMediaWithName(secondMediaName); await umbracoUi.user.clickChooseModalButton(); @@ -295,10 +285,9 @@ test('can remove a media start node from a user', async ({umbracoApi, umbracoUi} userData.mediaStartNodeIds.push({id: mediaId}); await umbracoApi.user.update(userId, userData); expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeTruthy(); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickRemoveButtonForMediaNodeWithName(mediaName); await umbracoUi.user.clickConfirmRemoveButton(); await umbracoUi.user.clickSaveButton(); @@ -315,10 +304,9 @@ test('can allow access to all documents for a user', async ({umbracoApi, umbraco // Arrange const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickAllowAccessToAllDocumentsToggle(); await umbracoUi.user.clickSaveButton(); @@ -332,10 +320,9 @@ test('can allow access to all media for a user', async ({umbracoApi, umbracoUi}) // Arrange const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickAllowAccessToAllMediaToggle(); await umbracoUi.user.clickSaveButton(); @@ -360,10 +347,9 @@ test('can see if the user has the correct access based on content start nodes', userData.documentStartNodeIds.push({id: documentId}); await umbracoApi.user.update(userId, userData); expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeTruthy(); - await umbracoUi.user.goToUsers(); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Currently this wait is necessary await umbracoUi.waitForTimeout(2000); @@ -387,10 +373,9 @@ test('can see if the user has the correct access based on media start nodes', as userData.mediaStartNodeIds.push({id: mediaId}); await umbracoApi.user.update(userId, userData); expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeTruthy(); - await umbracoUi.user.goToUsers(); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Assert await umbracoUi.user.doesUserHaveAccessToMediaNode(mediaName); @@ -404,10 +389,9 @@ test('can change password for a user', {tag: '@smoke'}, async ({umbracoApi, umbr const userPassword = 'TestPassword'; const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickActionButton(); await umbracoUi.user.clickChangePasswordButton(); await umbracoUi.user.updatePassword(userPassword); @@ -424,10 +408,9 @@ test('can disable a user', async ({umbracoApi, umbracoUi}) => { await umbracoApi.user.ensureNameNotExists(newTestUser); const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(newTestUser, newTestUser + userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(newTestUser); // Act - await umbracoUi.user.clickUserWithName(newTestUser); await umbracoUi.user.clickActionButton(); await umbracoUi.user.clickDisableButton(); await umbracoUi.user.clickConfirmDisableButton(); @@ -450,10 +433,9 @@ test('can enable a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); const userId = await umbracoApi.user.createDefaultUser(newTestUser, newTestUser + userEmail, [userGroup.id]); await umbracoApi.user.disable([userId]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(newTestUser); // Act - await umbracoUi.user.clickUserWithName(newTestUser); await umbracoUi.user.clickActionButton(); await umbracoUi.user.clickEnableButton(); await umbracoUi.user.clickConfirmEnableButton(); @@ -473,10 +455,9 @@ test('can add an avatar to a user', {tag: '@smoke'}, async ({umbracoApi, umbraco const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); const filePath = './fixtures/mediaLibrary/Umbraco.png'; - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.changePhotoWithFileChooser(filePath); // Assert @@ -490,10 +471,9 @@ test('can remove an avatar from a user', async ({umbracoApi, umbracoUi}) => { const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); await umbracoApi.user.addDefaultAvatarImageToUser(userId); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickRemovePhotoButton(); // Assert @@ -506,10 +486,9 @@ test('can see if the inactive label is removed from the admin user', async ({umb // Arrange const userLabel = 'Active'; const currentUser = await umbracoApi.user.getCurrentUser(); - await umbracoUi.user.goToUsers(); // Act - await umbracoUi.user.clickUserWithName(currentUser.name); + await umbracoUi.user.goToUserWithName(currentUser.name); // Assert await umbracoUi.user.isTextWithExactNameVisible(userLabel); @@ -605,10 +584,9 @@ test('can remove admin user group from a user', {tag: '@release'}, async ({umbra const editorUserGroupName = 'Editors'; const adminUserGroupData = await umbracoApi.userGroup.getByName(adminUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [adminUserGroupData.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); // Removes the admin user group await umbracoUi.user.clickRemoveButtonForUserGroupWithName(adminUserGroupName); await umbracoUi.user.clickConfirmRemoveButton(); @@ -628,12 +606,11 @@ test('cannot remove all user group from a user', {tag: '@release'}, async ({umbr // Arrange const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); - await umbracoUi.user.goToUsers(); + await umbracoUi.user.goToUserWithName(nameOfTheUser); // Act - await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickRemoveButtonForUserGroupWithName(defaultUserGroupName); - await umbracoUi.user.clickConfirmRemoveButton();; + await umbracoUi.user.clickConfirmRemoveButton(); await umbracoUi.user.clickSaveButton(); // Assert