diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 940e5ca79c1b..8383cb50286f 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -7,8 +7,8 @@ "name": "acceptancetest", "hasInstallScript": true, "dependencies": { - "@umbraco/json-models-builders": "^2.0.6", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.60", + "@umbraco/json-models-builders": "^2.0.7", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.61", "camelize": "^1.0.0", "dotenv": "^16.3.1", "faker": "^4.1.0", @@ -132,9 +132,9 @@ } }, "node_modules/@umbraco/json-models-builders": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.6.tgz", - "integrity": "sha512-eoOhTSH7rcC7NESId0vhqtxNXPuoy+ZaQo1moXxpv8/T6vqmKoDdLEydjtDz0FOXzqVZ5yQ1xWK0cpag37Laag==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.7.tgz", + "integrity": "sha512-roR5A+jzIFN9z1BhogMGOEzSzoR8jOrIYIAevT7EnyS3H3OM0m0uREgvjYCQo0+QMfVws4zq4Ydjx2TIfGYvlQ==", "dependencies": { "camelize": "^1.0.1", "faker": "^6.6.6" @@ -146,11 +146,11 @@ "integrity": "sha512-9tCqYEDHI5RYFQigXFwF1hnCwcWCOJl/hmll0lr5D2Ljjb0o4wphb69wikeJDz5qCEzXCoPvG6ss5SDP6IfOdg==" }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.60", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.60.tgz", - "integrity": "sha512-5KJkn1GtfCXqbwYP8RnDyjWUNqSQ/62UYFARuXhUzQoz4xvv3Fme8rPeiOBxqJRWWoj3MQCaP7nyPPs3FDe8vQ==", + "version": "2.0.0-beta.61", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.61.tgz", + "integrity": "sha512-Y2RqGrjfLDCZGDPyix4r8LoSl/YaluzY8RHLlkdcbL5GojDprzfB0jN9P3ZbrCDvnu9hydA8qE6ElPq/Zw5qXw==", "dependencies": { - "@umbraco/json-models-builders": "2.0.6", + "@umbraco/json-models-builders": "2.0.7", "camelize": "^1.0.0", "faker": "^4.1.0", "form-data": "^4.0.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index c7261b06f397..11606d1a8e01 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -21,8 +21,8 @@ "wait-on": "^7.2.0" }, "dependencies": { - "@umbraco/json-models-builders": "^2.0.6", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.60", + "@umbraco/json-models-builders": "^2.0.7", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.61", "camelize": "^1.0.0", "dotenv": "^16.3.1", "faker": "^4.1.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts new file mode 100644 index 000000000000..789bf96939cf --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts @@ -0,0 +1,577 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from '@playwright/test'; + +const nameOfTheUser = 'TestUser'; +const userEmail = 'TestUser@EmailTest.test'; +const defaultUserGroupName = 'Writers'; + +test.beforeEach(async ({umbracoUi, umbracoApi}) => { + await umbracoUi.goToBackOffice(); + await umbracoApi.user.ensureNameNotExists(nameOfTheUser); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.user.ensureNameNotExists(nameOfTheUser); +}); + +test('can create a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickCreateButton(); + await umbracoUi.user.enterNameOfTheUser(nameOfTheUser); + await umbracoUi.user.enterUserEmail(userEmail); + await umbracoUi.user.clickChooseButton(); + await umbracoUi.user.clickButtonWithName(defaultUserGroupName); + await umbracoUi.user.clickSubmitButton(); + await umbracoUi.user.clickCreateUserButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesNameExist(nameOfTheUser)).toBeTruthy(); +}); + +test('can rename a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const wrongName = 'WrongName'; + await umbracoApi.user.ensureNameNotExists(wrongName); + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(wrongName, wrongName + userEmail, [userGroup.id]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(wrongName); + await umbracoUi.user.enterUpdatedNameOfUser(nameOfTheUser); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesNameExist(nameOfTheUser)).toBeTruthy(); +}); + +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.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickDeleteButton(); + await umbracoUi.user.clickConfirmToDeleteButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesNameExist(nameOfTheUser)).toBeFalsy(); + // Checks if the user is deleted from the list + await umbracoUi.user.clickUsersTabButton(); + await umbracoUi.user.isUserVisible(nameOfTheUser, false); +}); + +test('can add multiple user groups to a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const secondUserGroupName = 'Translators'; + 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.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickChooseUserGroupsButton(); + await umbracoUi.user.clickButtonWithName(secondUserGroupName); + await umbracoUi.user.clickSubmitButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(await umbracoApi.user.doesUserContainUserGroupIds(nameOfTheUser, [userGroupWriters.id, userGroupTranslators.id])).toBeTruthy(); +}); + +test('can remove a user group from 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.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickRemoveButtonForUserGroupWithName(defaultUserGroupName); + await umbracoUi.user.clickConfirmRemoveButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.userGroupIds).toEqual([]); +}); + +test('can update culture for a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const danishIsoCode = 'da-dk'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.selectUserLanguage('Dansk'); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.languageIsoCode).toEqual(danishIsoCode); +}); + +test('can add a content start node to a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickChooseContentStartNodeButton(); + await umbracoUi.user.clickLabelWithName(documentName); + await umbracoUi.user.clickChooseContainerButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeTruthy(); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can add multiple content start nodes for a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + const secondDocumentName = 'SecondDocument'; + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.document.ensureNameNotExists(secondDocumentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + // Adds the content start node to the user + const userData = await umbracoApi.user.getByName(nameOfTheUser); + userData.documentStartNodeIds.push({id: documentId}); + await umbracoApi.user.update(userId, userData); + const secondDocumentId = await umbracoApi.document.createDefaultDocument(secondDocumentName, documentTypeId); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickChooseContentStartNodeButton(); + await umbracoUi.user.clickLabelWithName(secondDocumentName); + await umbracoUi.user.clickChooseContainerButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId, secondDocumentId])).toBeTruthy(); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.document.ensureNameNotExists(secondDocumentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can remove a content start node from a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + // Adds the content start node to the user + const userData = await umbracoApi.user.getByName(nameOfTheUser); + userData.documentStartNodeIds.push({id: documentId}); + await umbracoApi.user.update(userId, userData); + expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeTruthy(); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickRemoveButtonForContentNodeWithName(documentName); + await umbracoUi.user.clickConfirmRemoveButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeFalsy(); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can add media start nodes for a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + const mediaTypeName = 'File'; + const mediaName = 'TestMediaFile'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoApi.media.ensureNameNotExists(mediaName); + const mediaId = await umbracoApi.media.createDefaultMedia(mediaName, mediaTypeName); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickChooseMediaStartNodeButton(); + await umbracoUi.user.clickMediaCardWithName(mediaName); + await umbracoUi.user.clickSubmitButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeTruthy(); + + // Clean + await umbracoApi.media.ensureNameNotExists(mediaName); +}); + +test('can add multiple media start nodes for a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const mediaTypeName = 'File'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const mediaName = 'TestMediaFile'; + const secondMediaName = 'SecondMediaFile'; + await umbracoApi.media.ensureNameNotExists(mediaName); + await umbracoApi.media.ensureNameNotExists(secondMediaName); + const firstMediaId = await umbracoApi.media.createDefaultMedia(mediaName, mediaTypeName); + const secondMediaId = await umbracoApi.media.createDefaultMedia(secondMediaName, mediaTypeName); + // Adds the media start node to the user + const userData = await umbracoApi.user.getByName(nameOfTheUser); + userData.mediaStartNodeIds.push({id: firstMediaId}); + await umbracoApi.user.update(userId, userData); + expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [firstMediaId])).toBeTruthy(); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickChooseMediaStartNodeButton(); + await umbracoUi.user.clickMediaCardWithName(secondMediaName); + await umbracoUi.user.clickSubmitButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [firstMediaId, secondMediaId])).toBeTruthy(); + + // Clean + await umbracoApi.media.ensureNameNotExists(mediaName); + await umbracoApi.media.ensureNameNotExists(secondMediaName); +}); + +test('can remove a media start node from a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const mediaTypeName = 'File'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const mediaName = 'TestMediaFile'; + await umbracoApi.media.ensureNameNotExists(mediaName); + const mediaId = await umbracoApi.media.createDefaultMedia(mediaName, mediaTypeName); + // Adds the media start node to the user + const userData = await umbracoApi.user.getByName(nameOfTheUser); + userData.mediaStartNodeIds.push({id: mediaId}); + await umbracoApi.user.update(userId, userData); + expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeTruthy(); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickRemoveButtonForMediaNodeWithName(mediaName); + await umbracoUi.user.clickConfirmRemoveButton(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeFalsy(); + + // Clean + await umbracoApi.media.ensureNameNotExists(mediaName); +}); + +test('can allow access to all documents 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.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickAllowAccessToAllDocumentsSlider(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.hasDocumentRootAccess).toBeTruthy() +}); + +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.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickAllowAccessToAllMediaSlider(); + await umbracoUi.user.clickSaveButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.hasMediaRootAccess).toBeTruthy(); +}); + +test('can see if the user has the correct access based on content start nodes', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + // Adds the content start node to the user + const userData = await umbracoApi.user.getByName(nameOfTheUser); + userData.documentStartNodeIds.push({id: documentId}); + await umbracoApi.user.update(userId, userData); + expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeTruthy(); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + + // Assert + await umbracoUi.user.doesUserHaveAccessToContentNode(documentName); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can see if the user has the correct access based on media start nodes', async ({umbracoApi, umbracoUi}) => { + // Arrange + const mediaTypeName = 'File'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const mediaName = 'TestMediaFile'; + await umbracoApi.media.ensureNameNotExists(mediaName); + const mediaId = await umbracoApi.media.createDefaultMedia(mediaName, mediaTypeName); + // Adds the media start node to the user + const userData = await umbracoApi.user.getByName(nameOfTheUser); + userData.mediaStartNodeIds.push({id: mediaId}); + await umbracoApi.user.update(userId, userData); + expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeTruthy(); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + + // Assert + await umbracoUi.user.doesUserHaveAccessToMediaNode(mediaName); + + // Clean + await umbracoApi.media.ensureNameNotExists(mediaName); +}); + +test('can change password for a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + const userPassword = 'TestPassword'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickChangePasswordButton(); + await umbracoUi.user.updatePassword(userPassword); + + // Assert + await umbracoUi.user.isPasswordUpdatedForUserWithId(userId); +}); + +test('can disable a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const disabledStatus = 'Disabled'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickDisableButton(); + await umbracoUi.user.clickConfirmDisableButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + expect(umbracoUi.user.isUserDisabledTextVisible()).toBeTruthy(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.state).toBe(disabledStatus); +}); + +test('can enable a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + const inactiveStatus = 'Inactive'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + const userId = await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoApi.user.disable([userId]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickEnableButton(); + await umbracoUi.user.clickConfirmEnableButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.isUserActiveTextVisible(); + // The state of the user is not enabled. The reason for this is that the user has not logged in, resulting in the state Inactive. + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.state).toBe(inactiveStatus); +}); + +test('can add an avatar to a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { + // Arrange + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + const filePath = './fixtures/mediaLibrary/Umbraco.png'; + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.changePhotoWithFileChooser(filePath); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.avatarUrls).not.toHaveLength(0); +}); + +test('can remove an avatar from a user', async ({umbracoApi, umbracoUi}) => { + // Arrange + 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.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(nameOfTheUser); + await umbracoUi.user.clickRemovePhotoButton(); + + // Assert + await umbracoUi.user.isSuccessNotificationVisible(); + const userData = await umbracoApi.user.getByName(nameOfTheUser); + expect(userData.avatarUrls).toHaveLength(0); +}); + +test('can see if the inactive label is removed from the admin user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const userLabel = 'Active'; + const currentUser = await umbracoApi.user.getCurrentUser(); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.clickUserWithName(currentUser.name); + + // Assert + await umbracoUi.user.isTextWithExactNameVisible(userLabel); + const userData = await umbracoApi.user.getByName(currentUser.name); + expect(userData.state).toBe(userLabel); +}); + +test('can search 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.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.searchInUserSection(nameOfTheUser); + + // Assert + // Wait for filtering to be done + await umbracoUi.waitForTimeout(200); + await umbracoUi.user.doesUserSectionContainUserAmount(1); + await umbracoUi.user.doesUserSectionContainUserWithText(nameOfTheUser); +}); + +test('can filter by status', async ({umbracoApi, umbracoUi}) => { + // Arrange + const inactiveStatus = 'Inactive'; + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.filterByStatusName(inactiveStatus); + + // Assert + // Wait for filtering to be done + await umbracoUi.waitForTimeout(200); + await umbracoUi.user.doesUserSectionContainUserAmount(1); + await umbracoUi.user.doesUserSectionContainUserWithText(nameOfTheUser); + await umbracoUi.user.doesUserSectionContainUserWithText(inactiveStatus); +}); + +test('can filter by user groups', async ({umbracoApi, umbracoUi}) => { + // Arrange + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.filterByGroupName(defaultUserGroupName); + + // Assert + // Wait for filtering to be done + await umbracoUi.waitForTimeout(200); + await umbracoUi.user.doesUserSectionContainUserAmount(1); + await umbracoUi.user.doesUserSectionContainUserWithText(defaultUserGroupName); +}); + +test('can order by newest user', async ({umbracoApi, umbracoUi}) => { + // Arrange + const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); + await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + await umbracoUi.user.goToSection(ConstantHelper.sections.users); + + // Act + await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.orderByNewestUser(); + + // Assert + // Wait for filtering to be done + await umbracoUi.waitForTimeout(200); + await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.isUserWithNameTheFirstUserInList(nameOfTheUser); +}); + +// TODO: Sometimes the frontend does not switch from grid to table, or table to grid. +test.skip('can change from grid to table view', async ({page, umbracoApi, umbracoUi}) => { +});