Merge branch 'v14/dev' into contrib
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
<ItemGroup>
|
||||
<!-- Microsoft packages -->
|
||||
<PackageVersion Include="BenchmarkDotNet" Version="0.13.12" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.5" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.6" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
|
||||
<PackageVersion Include="System.Data.DataSetExtensions" Version="4.5.0" />
|
||||
|
||||
18
tests/Umbraco.Tests.AcceptanceTest/package-lock.json
generated
18
tests/Umbraco.Tests.AcceptanceTest/package-lock.json
generated
@@ -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.63",
|
||||
"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.63",
|
||||
"resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.63.tgz",
|
||||
"integrity": "sha512-fLXUcWNJupfGKkD6zOGg6WcU5cmqQ6gQkyIyG+UsKSrkgCxK23+N5LrOz2OVp2NZ8GQ8kB5pJ4izvCp+yMMOnA==",
|
||||
"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",
|
||||
|
||||
@@ -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.63",
|
||||
"camelize": "^1.0.0",
|
||||
"dotenv": "^16.3.1",
|
||||
"faker": "^4.1.0",
|
||||
|
||||
@@ -15,64 +15,64 @@ test.afterEach(async ({umbracoApi}) => {
|
||||
test('can create a dictionary item', async ({umbracoApi, umbracoUi}) => {
|
||||
// Arrange
|
||||
await umbracoApi.dictionary.ensureNameNotExists(dictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.clickCreateLink();
|
||||
await umbracoUi.translation.enterDictionaryName(dictionaryName);
|
||||
await umbracoUi.translation.clickSaveButton();
|
||||
await umbracoUi.dictionary.clickCreateLink();
|
||||
await umbracoUi.dictionary.enterDictionaryName(dictionaryName);
|
||||
await umbracoUi.dictionary.clickSaveButton();
|
||||
|
||||
// Assert
|
||||
expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeTruthy();
|
||||
await umbracoUi.translation.isSuccessNotificationVisible();
|
||||
await umbracoUi.translation.clickLeftArrowButton();
|
||||
await umbracoUi.dictionary.isSuccessNotificationVisible();
|
||||
await umbracoUi.dictionary.clickLeftArrowButton();
|
||||
// Verify the dictionary item displays in the tree and in the list
|
||||
await umbracoUi.translation.isDictionaryTreeItemVisible(dictionaryName);
|
||||
expect(await umbracoUi.translation.doesDictionaryListHaveText(dictionaryName)).toBeTruthy();
|
||||
await umbracoUi.dictionary.isDictionaryTreeItemVisible(dictionaryName);
|
||||
expect(await umbracoUi.dictionary.doesDictionaryListHaveText(dictionaryName)).toBeTruthy();
|
||||
});
|
||||
|
||||
test('can delete a dictionary item', async ({umbracoApi, umbracoUi}) => {
|
||||
// Arrange
|
||||
await umbracoApi.dictionary.ensureNameNotExists(dictionaryName);
|
||||
await umbracoApi.dictionary.create(dictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.translation.deleteDictionary();
|
||||
await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.dictionary.deleteDictionary();
|
||||
|
||||
// Assert
|
||||
await umbracoUi.translation.isSuccessNotificationVisible();
|
||||
await umbracoUi.dictionary.isSuccessNotificationVisible();
|
||||
expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeFalsy();
|
||||
// Verify the dictionary item does not display in the tree
|
||||
await umbracoUi.translation.isDictionaryTreeItemVisible(dictionaryName, false);
|
||||
await umbracoUi.dictionary.isDictionaryTreeItemVisible(dictionaryName, false);
|
||||
// TODO: Uncomment this when the front-end is ready. Currently the dictionary list is not updated immediately.
|
||||
// Verify the dictionary item does not display in the list
|
||||
//expect(await umbracoUi.translation.doesDictionaryListHaveText(dictionaryName)).toBeFalsy();
|
||||
//expect(await umbracoUi.dictionary.doesDictionaryListHaveText(dictionaryName)).toBeFalsy();
|
||||
});
|
||||
|
||||
test('can create a dictionary item in a dictionary', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => {
|
||||
// Arrange
|
||||
await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName);
|
||||
let parentDictionaryId = await umbracoApi.dictionary.create(parentDictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.clickActionsMenuForDictionary(parentDictionaryName);
|
||||
await umbracoUi.translation.clickCreateDictionaryItemButton();
|
||||
await umbracoUi.translation.enterDictionaryName(dictionaryName);
|
||||
await umbracoUi.translation.clickSaveButton();
|
||||
await umbracoUi.dictionary.clickActionsMenuForDictionary(parentDictionaryName);
|
||||
await umbracoUi.dictionary.clickCreateDictionaryItemButton();
|
||||
await umbracoUi.dictionary.enterDictionaryName(dictionaryName);
|
||||
await umbracoUi.dictionary.clickSaveButton();
|
||||
|
||||
// Assert
|
||||
await umbracoUi.translation.isSuccessNotificationVisible();
|
||||
await umbracoUi.dictionary.isSuccessNotificationVisible();
|
||||
const dictionaryChildren = await umbracoApi.dictionary.getChildren(parentDictionaryId);
|
||||
expect(dictionaryChildren[0].name).toEqual(dictionaryName);
|
||||
await umbracoUi.translation.clickLeftArrowButton();
|
||||
await umbracoUi.dictionary.clickLeftArrowButton();
|
||||
// Verify the new dictionary item displays in the list
|
||||
expect(await umbracoUi.translation.doesDictionaryListHaveText(dictionaryName)).toBeTruthy();
|
||||
expect(await umbracoUi.dictionary.doesDictionaryListHaveText(dictionaryName)).toBeTruthy();
|
||||
// Verify the new dictionary item displays in the tree
|
||||
await umbracoUi.translation.reloadTree(parentDictionaryName);
|
||||
await umbracoUi.translation.isDictionaryTreeItemVisible(dictionaryName);
|
||||
await umbracoUi.dictionary.reloadTree(parentDictionaryName);
|
||||
await umbracoUi.dictionary.isDictionaryTreeItemVisible(dictionaryName);
|
||||
|
||||
// Clean
|
||||
await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName);
|
||||
@@ -82,12 +82,12 @@ test('can export a dictionary item', async ({umbracoApi, umbracoUi}) => {
|
||||
// Arrange
|
||||
await umbracoApi.dictionary.ensureNameNotExists(dictionaryName);
|
||||
const dictionaryId = await umbracoApi.dictionary.create(dictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.translation.clickExportMenu();
|
||||
const exportData = await umbracoUi.translation.exportDictionary(false);
|
||||
await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.dictionary.clickExportMenu();
|
||||
const exportData = await umbracoUi.dictionary.exportDictionary(false);
|
||||
|
||||
// Assert
|
||||
expect(exportData).toEqual(dictionaryId + '.udt');
|
||||
@@ -98,12 +98,12 @@ test('can export a dictionary item with descendants', {tag: '@smoke'}, async ({u
|
||||
await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName);
|
||||
let parentDictionaryId = await umbracoApi.dictionary.create(parentDictionaryName);
|
||||
await umbracoApi.dictionary.create(dictionaryName, [], parentDictionaryId);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.clickActionsMenuForDictionary(parentDictionaryName);
|
||||
await umbracoUi.translation.clickExportMenu();
|
||||
const exportData = await umbracoUi.translation.exportDictionary(true);
|
||||
await umbracoUi.dictionary.clickActionsMenuForDictionary(parentDictionaryName);
|
||||
await umbracoUi.dictionary.clickExportMenu();
|
||||
const exportData = await umbracoUi.dictionary.exportDictionary(true);
|
||||
|
||||
// Assert
|
||||
expect(exportData).toEqual(parentDictionaryId + '.udt');
|
||||
@@ -119,20 +119,20 @@ test('can import a dictionary item', async ({umbracoApi, umbracoUi}) => {
|
||||
const importDictionaryName = 'TestImportDictionary';
|
||||
await umbracoApi.dictionary.ensureNameNotExists(dictionaryName);
|
||||
await umbracoApi.dictionary.create(dictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.translation.clickImportMenu();
|
||||
await umbracoUi.translation.importDictionary(udtFilePath);
|
||||
await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.dictionary.clickImportMenu();
|
||||
await umbracoUi.dictionary.importDictionary(udtFilePath);
|
||||
|
||||
// Assert
|
||||
// Verify the imported dictionary item displays in the tree
|
||||
await umbracoUi.translation.reloadTree(dictionaryName);
|
||||
await umbracoUi.translation.isDictionaryTreeItemVisible(importDictionaryName);
|
||||
await umbracoUi.dictionary.reloadTree(dictionaryName);
|
||||
await umbracoUi.dictionary.isDictionaryTreeItemVisible(importDictionaryName);
|
||||
// TODO: Uncomment this when the front-end is ready. Currently the dictionary list is not updated immediately.
|
||||
// Verify the imported dictionary item displays in the list
|
||||
//expect(await umbracoUi.translation.doesDictionaryListHaveText(importDictionaryName)).toBeTruthy();
|
||||
//expect(await umbracoUi.dictionary.doesDictionaryListHaveText(importDictionaryName)).toBeTruthy();
|
||||
});
|
||||
|
||||
test('can import a dictionary item with descendants', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => {
|
||||
@@ -143,23 +143,23 @@ test('can import a dictionary item with descendants', {tag: '@smoke'}, async ({u
|
||||
const importChildDictionaryName = 'TestImportChild';
|
||||
await umbracoApi.dictionary.ensureNameNotExists(dictionaryName);
|
||||
await umbracoApi.dictionary.create(dictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.translation.clickImportMenu();
|
||||
await umbracoUi.translation.importDictionary(udtFilePath);
|
||||
await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName);
|
||||
await umbracoUi.dictionary.clickImportMenu();
|
||||
await umbracoUi.dictionary.importDictionary(udtFilePath);
|
||||
|
||||
// Assert
|
||||
// Verify the imported dictionary items display in the tree
|
||||
await umbracoUi.translation.reloadTree(dictionaryName);
|
||||
await umbracoUi.translation.isDictionaryTreeItemVisible(importParentDictionaryName);
|
||||
await umbracoUi.translation.reloadTree(importParentDictionaryName);
|
||||
await umbracoUi.translation.isDictionaryTreeItemVisible(importChildDictionaryName);
|
||||
await umbracoUi.dictionary.reloadTree(dictionaryName);
|
||||
await umbracoUi.dictionary.isDictionaryTreeItemVisible(importParentDictionaryName);
|
||||
await umbracoUi.dictionary.reloadTree(importParentDictionaryName);
|
||||
await umbracoUi.dictionary.isDictionaryTreeItemVisible(importChildDictionaryName);
|
||||
// TODO: Uncomment this when the front-end is ready. Currently the dictionary list is not updated immediately.
|
||||
// Verify the imported dictionary items display in the list
|
||||
//expect(await umbracoUi.translation.doesDictionaryListHaveText(importParentDictionaryName)).toBeTruthy();
|
||||
//expect(await umbracoUi.translation.doesDictionaryListHaveText(importChildDictionaryName)).toBeTruthy();
|
||||
//expect(await umbracoUi.dictionary.doesDictionaryListHaveText(importParentDictionaryName)).toBeTruthy();
|
||||
//expect(await umbracoUi.dictionary.doesDictionaryListHaveText(importChildDictionaryName)).toBeTruthy();
|
||||
});
|
||||
|
||||
// Skip this test as the search function is removed
|
||||
@@ -167,13 +167,13 @@ test.skip('can search a dictionary item in list when have results', async ({umbr
|
||||
// Arrange
|
||||
await umbracoApi.dictionary.ensureNameNotExists(dictionaryName);
|
||||
await umbracoApi.dictionary.create(dictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.enterSearchKeywordAndPressEnter(dictionaryName);
|
||||
await umbracoUi.dictionary.enterSearchKeywordAndPressEnter(dictionaryName);
|
||||
|
||||
// Assert
|
||||
expect(await umbracoUi.translation.doesDictionaryListHaveText(dictionaryName)).toBeTruthy();
|
||||
expect(await umbracoUi.dictionary.doesDictionaryListHaveText(dictionaryName)).toBeTruthy();
|
||||
});
|
||||
|
||||
// Skip this test as the search function is removed
|
||||
@@ -182,11 +182,11 @@ test.skip('can search a dictionary item in list when have no results', async ({u
|
||||
const emptySearchResultMessage = 'No Dictionary items to choose from';
|
||||
await umbracoApi.dictionary.ensureNameNotExists(dictionaryName);
|
||||
await umbracoApi.dictionary.create(dictionaryName);
|
||||
await umbracoUi.translation.goToSection(ConstantHelper.sections.translation);
|
||||
await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary);
|
||||
|
||||
// Act
|
||||
await umbracoUi.translation.enterSearchKeywordAndPressEnter('xyz');
|
||||
await umbracoUi.dictionary.enterSearchKeywordAndPressEnter('xyz');
|
||||
|
||||
// Assert
|
||||
await umbracoUi.translation.isSearchResultMessageDisplayEmpty(emptySearchResultMessage);
|
||||
await umbracoUi.dictionary.isSearchResultMessageDisplayEmpty(emptySearchResultMessage);
|
||||
});
|
||||
@@ -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}) => {
|
||||
});
|
||||
@@ -0,0 +1,48 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Cms.Api.Delivery.Services;
|
||||
|
||||
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Delivery.Services;
|
||||
|
||||
[TestFixture]
|
||||
public class RequestHeaderHandlerTests
|
||||
{
|
||||
private const string HeaderName = "TestHeader";
|
||||
[Test]
|
||||
public void GetHeaderValue_return_null_when_http_context_is_unavailable()
|
||||
{
|
||||
IHttpContextAccessor httpContextAccessor = Mock.Of<IHttpContextAccessor>();
|
||||
|
||||
var sut = new TestRequestHeaderHandler(httpContextAccessor);
|
||||
|
||||
Assert.IsNull(sut.TestGetHeaderValue(HeaderName));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetHeaderValue_return_header_value_when_http_context_is_available()
|
||||
{
|
||||
|
||||
const string headerValue = "TestValue";
|
||||
|
||||
HttpContext httpContext = new DefaultHttpContext();
|
||||
httpContext.Request.Headers[HeaderName] = headerValue;
|
||||
|
||||
IHttpContextAccessor httpContextAccessor = Mock.Of<IHttpContextAccessor>();
|
||||
Mock.Get(httpContextAccessor).Setup(x => x.HttpContext).Returns(httpContext);
|
||||
|
||||
var sut = new TestRequestHeaderHandler(httpContextAccessor);
|
||||
|
||||
Assert.AreEqual(headerValue, sut.TestGetHeaderValue(HeaderName));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal class TestRequestHeaderHandler : RequestHeaderHandler
|
||||
{
|
||||
public TestRequestHeaderHandler(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
|
||||
{
|
||||
}
|
||||
|
||||
public string? TestGetHeaderValue(string headerName) => base.GetHeaderValue(headerName);
|
||||
}
|
||||
@@ -21,7 +21,7 @@ public class ApiMediaUrlProviderTests : PropertyValueConverterTests
|
||||
|
||||
var publishedUrlProvider = new Mock<IPublishedUrlProvider>();
|
||||
publishedUrlProvider
|
||||
.Setup(p => p.GetMediaUrl(content.Object, UrlMode.Relative, It.IsAny<string?>(), It.IsAny<string?>(), It.IsAny<Uri?>()))
|
||||
.Setup(p => p.GetMediaUrl(content.Object, UrlMode.Default, It.IsAny<string?>(), It.IsAny<string?>(), It.IsAny<Uri?>()))
|
||||
.Returns(publishedUrl);
|
||||
|
||||
var apiMediaUrlProvider = new ApiMediaUrlProvider(publishedUrlProvider.Object);
|
||||
|
||||
@@ -9,7 +9,6 @@ using Umbraco.Cms.Core.Models.PublishedContent;
|
||||
using Umbraco.Cms.Core.PropertyEditors;
|
||||
using Umbraco.Cms.Core.PropertyEditors.ValueConverters;
|
||||
using Umbraco.Cms.Core.PublishedCache;
|
||||
using Umbraco.Cms.Core.Routing;
|
||||
using Umbraco.Cms.Infrastructure.DeliveryApi;
|
||||
|
||||
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.DeliveryApi;
|
||||
@@ -474,7 +473,7 @@ public class RichTextParserTests : PropertyValueConverterTests
|
||||
Mock.Of<ILogger<ApiRichTextMarkupParser>>());
|
||||
}
|
||||
|
||||
private void SetupTestContent(out IApiContentRouteBuilder routeBuilder, out IPublishedSnapshotAccessor snapshotAccessor, out IPublishedUrlProvider urlProvider)
|
||||
private void SetupTestContent(out IApiContentRouteBuilder routeBuilder, out IPublishedSnapshotAccessor snapshotAccessor, out IApiMediaUrlProvider apiMediaUrlProvider)
|
||||
{
|
||||
var contentMock = new Mock<IPublishedContent>();
|
||||
contentMock.SetupGet(m => m.Key).Returns(_contentKey);
|
||||
@@ -502,14 +501,14 @@ public class RichTextParserTests : PropertyValueConverterTests
|
||||
.Setup(m => m.Build(contentMock.Object, null))
|
||||
.Returns(new ApiContentRoute("/some-content-path", new ApiContentStartItem(_contentRootKey, "the-root-path")));
|
||||
|
||||
var urlProviderMock = new Mock<IPublishedUrlProvider>();
|
||||
urlProviderMock
|
||||
.Setup(m => m.GetMediaUrl(mediaMock.Object, It.IsAny<UrlMode>(), It.IsAny<string?>(), It.IsAny<string>(), It.IsAny<Uri?>()))
|
||||
var apiMediaUrlProviderMock = new Mock<IApiMediaUrlProvider>();
|
||||
apiMediaUrlProviderMock
|
||||
.Setup(m => m.GetUrl(mediaMock.Object))
|
||||
.Returns("/some-media-url");
|
||||
|
||||
routeBuilder = routeBuilderMock.Object;
|
||||
snapshotAccessor = snapshotAccessorMock.Object;
|
||||
urlProvider = urlProviderMock.Object;
|
||||
apiMediaUrlProvider = apiMediaUrlProviderMock.Object;
|
||||
}
|
||||
|
||||
private IPublishedElement CreateElement(Guid id, int propertyValue)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Cms.Core.Cache;
|
||||
using Umbraco.Cms.Core.Cache.PropertyEditors;
|
||||
using Umbraco.Cms.Core.IO;
|
||||
using Umbraco.Cms.Core.Models.Blocks;
|
||||
using Umbraco.Cms.Core.PropertyEditors;
|
||||
@@ -43,7 +44,7 @@ public class DataValueEditorReuseTests
|
||||
_propertyEditorCollection,
|
||||
_dataValueReferenceFactories,
|
||||
Mock.Of<IDataTypeConfigurationCache>(),
|
||||
Mock.Of<IContentTypeService>(),
|
||||
Mock.Of<IBlockEditorElementTypeCache>(),
|
||||
Mock.Of<ILocalizedTextService>(),
|
||||
Mock.Of<ILogger<BlockListPropertyEditorBase.BlockListEditorPropertyValueEditor>>(),
|
||||
Mock.Of<IShortStringHelper>(),
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ContentFinderByAliasWithDomainsTests : UrlRoutingTestBase
|
||||
var request = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);
|
||||
|
||||
// must lookup domain
|
||||
publishedRouter.FindDomain(request);
|
||||
publishedRouter.FindAndSetDomain(request);
|
||||
|
||||
if (expectedNode > 0)
|
||||
{
|
||||
|
||||
@@ -207,7 +207,7 @@ public class ContentFinderByUrlWithDomainsTests : UrlRoutingTestBase
|
||||
var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);
|
||||
|
||||
// must lookup domain else lookup by URL fails
|
||||
publishedRouter.FindDomain(frequest);
|
||||
publishedRouter.FindAndSetDomain(frequest);
|
||||
|
||||
var lookup = new ContentFinderByUrl(Mock.Of<ILogger<ContentFinderByUrl>>(), umbracoContextAccessor);
|
||||
var result = await lookup.TryFindContent(frequest);
|
||||
@@ -245,7 +245,7 @@ public class ContentFinderByUrlWithDomainsTests : UrlRoutingTestBase
|
||||
var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);
|
||||
|
||||
// must lookup domain else lookup by URL fails
|
||||
publishedRouter.FindDomain(frequest);
|
||||
publishedRouter.FindAndSetDomain(frequest);
|
||||
Assert.AreEqual(expectedCulture, frequest.Culture);
|
||||
|
||||
var lookup = new ContentFinderByUrl(Mock.Of<ILogger<ContentFinderByUrl>>(), umbracoContextAccessor);
|
||||
|
||||
@@ -261,7 +261,7 @@ public class DomainsAndCulturesTests : UrlRoutingTestBase
|
||||
var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);
|
||||
|
||||
// lookup domain
|
||||
publishedRouter.FindDomain(frequest);
|
||||
publishedRouter.FindAndSetDomain(frequest);
|
||||
|
||||
Assert.AreEqual(expectedCulture, frequest.Culture);
|
||||
|
||||
@@ -310,7 +310,7 @@ public class DomainsAndCulturesTests : UrlRoutingTestBase
|
||||
var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);
|
||||
|
||||
// lookup domain
|
||||
publishedRouter.FindDomain(frequest);
|
||||
publishedRouter.FindAndSetDomain(frequest);
|
||||
|
||||
// find document
|
||||
var finder = new ContentFinderByUrl(Mock.Of<ILogger<ContentFinderByUrl>>(), umbracoContextAccessor);
|
||||
@@ -345,7 +345,7 @@ public class DomainsAndCulturesTests : UrlRoutingTestBase
|
||||
var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);
|
||||
|
||||
// lookup domain
|
||||
publishedRouter.FindDomain(frequest);
|
||||
publishedRouter.FindAndSetDomain(frequest);
|
||||
Assert.IsNotNull(frequest.Domain);
|
||||
|
||||
Assert.AreEqual(expectedCulture, frequest.Culture);
|
||||
|
||||
@@ -62,7 +62,7 @@ public class UrlsWithNestedDomains : UrlRoutingTestBase
|
||||
var publishedRouter = CreatePublishedRouter(umbracoContextAccessor);
|
||||
var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl);
|
||||
|
||||
publishedRouter.FindDomain(frequest);
|
||||
publishedRouter.FindAndSetDomain(frequest);
|
||||
Assert.IsTrue(frequest.HasDomain());
|
||||
|
||||
// check that it's been routed
|
||||
|
||||
Reference in New Issue
Block a user