diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json
index 2160d6f958ae..70665ecbad8b 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.44",
- "@umbraco/playwright-testhelpers": "^17.0.31",
+ "@umbraco/playwright-testhelpers": "^17.0.32",
"camelize": "^1.0.0",
"dotenv": "^16.3.1",
"node-fetch": "^2.6.7"
@@ -58,21 +58,21 @@
}
},
"node_modules/@umbraco/json-models-builders": {
- "version": "2.0.44",
- "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.44.tgz",
- "integrity": "sha512-izcyaq9QL1TTAGjMVbKfLtRCEMzPY/iu6EJGgsv2Tei5tBHCXEWtxBF/mVYIJPUG5ll5MJkGPM7QdEDtFhEB7w==",
+ "version": "2.0.45",
+ "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.45.tgz",
+ "integrity": "sha512-MxBoUCXZM5QSFMeWJ9tgbtYBcs0FMHaVjRW15aTr82HjqdO5IjQ/VSMb5KvSMiQDYSGDeS50mW8DTMnwG1ws6Q==",
"license": "MIT",
"dependencies": {
"camelize": "^1.0.1"
}
},
"node_modules/@umbraco/playwright-testhelpers": {
- "version": "17.0.31",
- "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-17.0.31.tgz",
- "integrity": "sha512-7IKMGbgjtbay38Exgto3n5fiyMsjmd3eV5JCV9Hv1wVfCB3298wrKht/n50a4b9jrfUfq9WZypc158frWxYB7w==",
+ "version": "17.0.32",
+ "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-17.0.32.tgz",
+ "integrity": "sha512-l3ZMf8vRthFGXhsi0JbfRIAP/EIv7KbHMpsc17PJB2sCt3km3NfOQ4d2htiIXNt6LGhioKBCOS2lw2IClsOJtQ==",
"license": "MIT",
"dependencies": {
- "@umbraco/json-models-builders": "2.0.44",
+ "@umbraco/json-models-builders": "2.0.45",
"node-fetch": "^2.6.7"
}
},
diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json
index 3a898e959f08..9de4bdd513f5 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.44",
- "@umbraco/playwright-testhelpers": "^17.0.31",
+ "@umbraco/playwright-testhelpers": "^17.0.32",
"camelize": "^1.0.0",
"dotenv": "^16.3.1",
"node-fetch": "^2.6.7"
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 587c5c8bf702..dd301e7c0ab8 100644
--- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts
+++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts
@@ -609,4 +609,4 @@ test('cannot remove all user group from a user', {tag: '@release'}, async ({umbr
// Assert
await umbracoUi.user.isErrorNotificationVisible();
-});
+});
\ No newline at end of file
diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts
index fa2337c43d14..7c72febfe881 100644
--- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts
+++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts
@@ -449,4 +449,4 @@ test('can remove granular permission to a specific document for a user group', a
// Clean
await umbracoApi.document.ensureNameNotExists(documentTypeName);
-});
+});
\ No newline at end of file
diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroupsDescription.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroupsDescription.spec.ts
new file mode 100644
index 000000000000..ea97f3e708b3
--- /dev/null
+++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroupsDescription.spec.ts
@@ -0,0 +1,138 @@
+import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
+import {expect} from "@playwright/test";
+
+const userGroupName = 'TestUserGroupName';
+
+test.beforeEach(async ({umbracoUi, umbracoApi}) => {
+ await umbracoApi.userGroup.ensureNameNotExists(userGroupName);
+ await umbracoUi.goToBackOffice();
+ await umbracoUi.userGroup.goToSection(ConstantHelper.sections.users);
+});
+
+test.afterEach(async ({umbracoApi}) => {
+ await umbracoApi.userGroup.ensureNameNotExists(userGroupName);
+});
+
+test('the default descriptions for all default user groups are correct', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
+ // Arrange
+ const userGroupDescriptions = ConstantHelper.userGroupDescriptionValues;
+
+ // Act
+ await umbracoUi.userGroup.clickUserGroupsButton();
+
+ // Assert
+ for (const userGroup of Object.entries(userGroupDescriptions)) {
+ const groupName = userGroup[0];
+ const expectedDescription = userGroup[1];
+ // Verify description in UI
+ await umbracoUi.userGroup.doesUserGroupHaveDescription(groupName, expectedDescription);
+ // Verify description via API
+ const userGroupData = await umbracoApi.userGroup.getByName(groupName);
+ expect(userGroupData.description).toBe(expectedDescription);
+ }
+});
+
+const descriptionTestCases = [
+ {
+ name: 'short description',
+ description: 'Short desc',
+ tag: '@release'
+ },
+ {
+ name: 'normal description',
+ description: 'This is a test description for user group',
+ tag: '@release'
+ },
+ {
+ name: 'long description',
+ description: 'This is a very long description that contains multiple sentences to test the maximum length handling of the description field. It should be able to handle large amounts of text without any issues. This description is intentionally verbose to ensure the system can process and store lengthy descriptions properly.',
+ tag: undefined
+ },
+ {
+ name: 'description with special characters',
+ description: 'Description with special chars: @#$%^&*()_+-=[]{}|;:\'",.<>?/~`!',
+ tag: undefined
+ },
+ {
+ name: 'description with unicode characters',
+ description: 'Description with unicode: émojis 😀🎉 và tiếng Việt ăn ơ ư đ 日本語 こんにちは カタカナ',
+ tag: undefined
+ },
+ {
+ name: 'description with HTML-like content',
+ description: ' & bold text',
+ tag: undefined
+ },
+ {
+ name: 'description with quotes and apostrophes',
+ description: 'It\'s a "test" description with \'single\' and "double" quotes',
+ tag: undefined
+ }
+];
+
+for (const testCase of descriptionTestCases) {
+ test(`can create user group with ${testCase.name}`, testCase.tag ? {tag: testCase.tag} : {}, async ({umbracoApi, umbracoUi}) => {
+ // Act
+ await umbracoUi.userGroup.clickUserGroupsButton();
+ await umbracoUi.userGroup.clickCreateLink();
+ await umbracoUi.userGroup.enterUserGroupName(userGroupName);
+ if (testCase.description !== '') {
+ await umbracoUi.userGroup.enterDescription(testCase.description);
+ }
+ const userGroupId = await umbracoUi.userGroup.clickSaveButtonAndWaitForUserGroupToBeCreated();
+
+ // Assert
+ expect(userGroupId).toBeTruthy();
+ expect(await umbracoApi.userGroup.doesExist(userGroupId!)).toBe(true);
+ // Checks if the user group was created in the UI as well
+ await umbracoUi.userGroup.clickUserGroupsButton();
+ await umbracoUi.userGroup.isUserGroupWithNameVisible(userGroupName);
+ await umbracoUi.userGroup.doesUserGroupHaveDescription(userGroupName, testCase.description);
+
+ // Verify description was saved correctly via API
+ const userGroupData = await umbracoApi.userGroup.getByName(userGroupName);
+ expect(userGroupData.description).toBe(testCase.description);
+ });
+}
+
+test('can update description for a user group', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
+ // Arrange
+ const originalDescription = 'Original description for testing';
+ const updatedDescription = 'Updated description after modification';
+ await umbracoApi.userGroup.createEmptyUserGroup(userGroupName, originalDescription);
+ // Verify original description
+ const originalUserGroupData = await umbracoApi.userGroup.getByName(userGroupName);
+ expect(originalUserGroupData.description).toBe(originalDescription);
+
+ // Act
+ await umbracoUi.userGroup.clickUserGroupsButton();
+ await umbracoUi.userGroup.clickUserGroupWithName(userGroupName);
+ await umbracoUi.userGroup.enterDescription(updatedDescription);
+ await umbracoUi.userGroup.clickSaveButtonAndWaitForUserGroupToBeUpdated();
+
+ // Assert
+ await umbracoUi.userGroup.clickUserGroupsButton();
+ await umbracoUi.userGroup.doesUserGroupHaveDescription(userGroupName,updatedDescription);
+ const updatedUserGroupData = await umbracoApi.userGroup.getByName(userGroupName);
+ expect(updatedUserGroupData.description).toBe(updatedDescription);
+});
+
+test('can see user group description in the user group picker', async ({umbracoApi, umbracoUi}) => {
+ // Arrange
+ const userGroupHaveNoDescriptionName = 'UserGroupNoDescriptionPickerTest';
+ const userGroupDescription = 'This is a test description for user group';
+ await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName, userGroupDescription);
+ await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupHaveNoDescriptionName, '');
+ await umbracoUi.user.goToUsers();
+
+ // Act
+ await umbracoUi.user.clickCreateActionWithOptionName('User');
+ await umbracoUi.user.clickChooseButton();
+
+ // Assert
+ await umbracoUi.user.doesUserGroupPickerHaveDetails(userGroupName, userGroupDescription);
+ await umbracoUi.user.doesUserGroupPickerHaveDetails(userGroupHaveNoDescriptionName, 'Sections: Content');
+
+ // Clean
+ await umbracoApi.userGroup.ensureNameNotExists(userGroupHaveNoDescriptionName);
+});