From eda4a6cc550e2d1bffe8c533ae1ea74cf5228624 Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Tue, 14 May 2024 13:45:47 +0700 Subject: [PATCH] V14 QA Added missing acceptance tests for Dictionary (#16241) * Changed name from Dictionary to Translation * Removed old Dictionary * Adding missing tests for Dictionary * Added smoke tag to test * Bumped version of test helper * Add comments * Fixed comments * Removed smoke tag --- .../package-lock.json | 8 +- .../Umbraco.Tests.AcceptanceTest/package.json | 2 +- .../Dictionary/Dictionary.spec.ts | 164 --------------- .../Translation/Translation.spec.ts | 194 ++++++++++++++++++ 4 files changed, 199 insertions(+), 169 deletions(-) delete mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Translation/Translation.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index a981d8c7e5..74cac48efb 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.5", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.40", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.43", "camelize": "^1.0.0", "dotenv": "^16.3.1", "faker": "^4.1.0", @@ -146,9 +146,9 @@ "integrity": "sha512-9tCqYEDHI5RYFQigXFwF1hnCwcWCOJl/hmll0lr5D2Ljjb0o4wphb69wikeJDz5qCEzXCoPvG6ss5SDP6IfOdg==" }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.40.tgz", - "integrity": "sha512-rjGwdUv1itphmpmsqzy6OjAArZYhM/4bEd/RVb6536BeUNBCOYVqj/PvW9oRv8G2SRJH53XKiefro+btNXy/xw==", + "version": "2.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.43.tgz", + "integrity": "sha512-rYXMPf2E2CBLt2iYXrMHNNqQtQioyw14etaWrsu5Ky1x24RAB38LtuGrEiVmppdYBw9Pnmc853PSPsCKlzd8Iw==", "dependencies": { "@umbraco/json-models-builders": "2.0.5", "camelize": "^1.0.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 6c7fa69d68..9049a46ee9 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@umbraco/json-models-builders": "^2.0.5", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.40", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.43", "camelize": "^1.0.0", "dotenv": "^16.3.1", "faker": "^4.1.0", diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts deleted file mode 100644 index 5456bcf576..0000000000 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts +++ /dev/null @@ -1,164 +0,0 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -import {expect} from "@playwright/test"; - -test.describe('Dictionary tests', () => { - const dictionaryName = 'TestDictionaryItem'; - const parentDictionaryName = 'TestParentDictionary'; - - test.beforeEach(async ({umbracoUi}) => { - await umbracoUi.goToBackOffice(); - }); - - test.afterEach(async ({umbracoApi}) => { - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName); - }); - - test('can create a dictionary item', async ({umbracoApi, umbracoUi}) => { - // Arrange - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.clickCreateLink(); - await umbracoUi.dictionary.enterDictionaryName(dictionaryName); - await umbracoUi.dictionary.clickSaveButton(); - - // Assert - expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeTruthy(); - await umbracoUi.dictionary.isSuccessNotificationVisible(); - // TODO: when frontend is ready, verify the new dictionary item displays in tree and in list - // await umbracoUi.goToSection(ConstantHelper.sections.dictionary); - // await umbracoUi.dictionary.isDictionaryListHasText(dictionaryName); - }); - - test('can delete a dictionary item', async ({umbracoApi, umbracoUi}) => { - // Arrange - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.dictionary.create(dictionaryName); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName); - await umbracoUi.dictionary.deleteDictionary(); - - // Assert - expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeFalsy(); - // TODO: when frontend is ready, verify the new dictionary item is NOT displayed in list view and in tree - }); - - test.skip('can create a dictionary item in a dictionary @smoke', async ({umbracoApi, umbracoUi}) => { - // Arrange - await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName); - let parentDictionaryId = await umbracoApi.dictionary.create(parentDictionaryName); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.clickActionsMenuForDictionary(parentDictionaryName); - await umbracoUi.dictionary.clickCreateMenu(); - await umbracoUi.dictionary.enterDictionaryName(dictionaryName); - await umbracoUi.dictionary.clickSaveButton(); - - // Assert - const dictionaryChildren = await umbracoApi.dictionary.getChildren(parentDictionaryId); - await expect(dictionaryChildren[0].name).toEqual(dictionaryName); - // TODO: when frontend is ready, verify the notification displays - }); - - // Remove skip when export function works - test.skip('can export a dictionary item', async ({umbracoApi, umbracoUi}) => { - // Arrange - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.dictionary.create(dictionaryName); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName); - await umbracoUi.dictionary.clickExportMenu(); - await umbracoUi.dictionary.exportDictionary(false); - - // Assert - // TODO: when frontend is ready, verify the notification displays - }); - - // Remove skip when export function works - test.skip('can export a dictionary item with descendants @smoke', async ({umbracoApi, umbracoUi}) => { - // Arrange - await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName); - let parentDictionaryId = await umbracoApi.dictionary.create(parentDictionaryName); - await umbracoApi.dictionary.create(dictionaryName, [], parentDictionaryId); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName); - await umbracoUi.dictionary.clickExportMenu(); - await umbracoUi.dictionary.exportDictionary(true); - - // Assert - // TODO: when frontend is ready, verify the notification displays - }); - - // Remove skip when import function works - test.skip('can import a dictionary item', async ({umbracoApi, umbracoUi}) => { - // Arrange - const udtFilePath = './fixtures/dictionary/TestSingleDictionary.udt'; - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.dictionary.create(dictionaryName); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName); - await umbracoUi.dictionary.clickImportMenu(); - await umbracoUi.dictionary.importDictionary(udtFilePath); - - // Assert - // TODO: when frontend is ready, verify the notification displays - // TODO: when frontend is ready, verify the imported dictionary items displays - }); - - // Remove skip when import function works - test.skip('can import a dictionary item with descendants @smoke', async ({umbracoApi, umbracoUi}) => { - // Arrange - const udtFilePath = './fixtures/dictionary/TestDictionaryWithDescendants.udt'; - await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName); - let parentDictionaryId = await umbracoApi.dictionary.create(parentDictionaryName); - await umbracoApi.dictionary.create(dictionaryName, [], parentDictionaryId); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.clickActionsMenuForDictionary(dictionaryName); - await umbracoUi.dictionary.clickImportMenu(); - await umbracoUi.dictionary.importDictionary(udtFilePath); - - // Assert - // TODO: when frontend is ready, verify the notification displays - // TODO: when frontend is ready, verify the imported dictionary items displays - }); - - test.skip('can search a dictionary item in list when have results', async ({umbracoApi, umbracoUi}) => { - // Arrange - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.dictionary.create(dictionaryName); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.enterSearchKeywordAndPressEnter(dictionaryName); - - // Assert - expect(await umbracoUi.dictionary.doesDictionaryListHaveText(dictionaryName)).toBeTruthy(); - }); - - test.skip('can search a dictionary item in list when have no results', async ({umbracoApi, umbracoUi}) => { - // Arrange - const emptySearchResultMessage = 'No Dictionary items to choose from'; - await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); - await umbracoApi.dictionary.create(dictionaryName); - await umbracoUi.dictionary.goToSection(ConstantHelper.sections.dictionary); - - // Act - await umbracoUi.dictionary.enterSearchKeywordAndPressEnter('xyz'); - - // Assert - await umbracoUi.dictionary.isSearchResultMessageDisplayEmpty(emptySearchResultMessage); - }); -}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Translation/Translation.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Translation/Translation.spec.ts new file mode 100644 index 0000000000..96ecb53039 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Translation/Translation.spec.ts @@ -0,0 +1,194 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +test.describe('Translation tests', () => { + const dictionaryName = 'TestDictionaryItem'; + const parentDictionaryName = 'TestParentDictionary'; + + test.beforeEach(async ({umbracoUi}) => { + await umbracoUi.goToBackOffice(); + }); + + test.afterEach(async ({umbracoApi}) => { + await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); + }); + + test('can create a dictionary item', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); + await umbracoUi.translation.goToSection(ConstantHelper.sections.translation); + + // Act + await umbracoUi.translation.clickCreateLink(); + await umbracoUi.translation.enterDictionaryName(dictionaryName); + await umbracoUi.translation.clickSaveButton(); + + // Assert + expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeTruthy(); + await umbracoUi.translation.isSuccessNotificationVisible(); + await umbracoUi.translation.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(); + }); + + 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); + + // Act + await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName); + await umbracoUi.translation.deleteDictionary(); + + // Assert + await umbracoUi.translation.isSuccessNotificationVisible(); + expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeFalsy(); + // Verify the dictionary item does not display in the tree + await umbracoUi.translation.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(); + }); + + test('can create a dictionary item in a dictionary @smoke', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName); + let parentDictionaryId = await umbracoApi.dictionary.create(parentDictionaryName); + await umbracoUi.translation.goToSection(ConstantHelper.sections.translation); + + // Act + await umbracoUi.translation.clickActionsMenuForDictionary(parentDictionaryName); + await umbracoUi.translation.clickCreateDictionaryItemButton(); + await umbracoUi.translation.enterDictionaryName(dictionaryName); + await umbracoUi.translation.clickSaveButton(); + + // Assert + await umbracoUi.translation.isSuccessNotificationVisible(); + const dictionaryChildren = await umbracoApi.dictionary.getChildren(parentDictionaryId); + expect(dictionaryChildren[0].name).toEqual(dictionaryName); + await umbracoUi.translation.clickLeftArrowButton(); + // Verify the new dictionary item displays in the list + expect(await umbracoUi.translation.doesDictionaryListHaveText(dictionaryName)).toBeTruthy(); + // Verify the new dictionary item displays in the tree + await umbracoUi.translation.reloadTree(parentDictionaryName); + await umbracoUi.translation.isDictionaryTreeItemVisible(dictionaryName); + + // Clean + await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName); + }); + + 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); + + // Act + await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName); + await umbracoUi.translation.clickExportMenu(); + const exportData = await umbracoUi.translation.exportDictionary(false); + + // Assert + expect(exportData).toEqual(dictionaryId + '.udt'); + }); + + test('can export a dictionary item with descendants @smoke', async ({umbracoApi, umbracoUi}) => { + // Arrange + 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); + + // Act + await umbracoUi.translation.clickActionsMenuForDictionary(parentDictionaryName); + await umbracoUi.translation.clickExportMenu(); + const exportData = await umbracoUi.translation.exportDictionary(true); + + // Assert + expect(exportData).toEqual(parentDictionaryId + '.udt'); + + // Clean + await umbracoApi.dictionary.ensureNameNotExists(parentDictionaryName); + }); + + test('can import a dictionary item', async ({umbracoApi, umbracoUi}) => { + // Arrange + const udtFilePath = './fixtures/dictionary/TestSingleDictionary.udt'; + // This variable must not be changed as it is declared in the file TestDictionary.udt + const importDictionaryName = 'TestImportDictionary'; + await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); + await umbracoApi.dictionary.create(dictionaryName); + await umbracoUi.translation.goToSection(ConstantHelper.sections.translation); + + // Act + await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName); + await umbracoUi.translation.clickImportMenu(); + await umbracoUi.translation.importDictionary(udtFilePath); + + // Assert + // Verify the imported dictionary item displays in the tree + await umbracoUi.translation.reloadTree(dictionaryName); + await umbracoUi.translation.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(); + }); + + test('can import a dictionary item with descendants @smoke', async ({umbracoApi, umbracoUi}) => { + // Arrange + const udtFilePath = './fixtures/dictionary/TestDictionaryWithDescendants.udt'; + // This variable must not be changed as it is declared in the file TestDictionaryWithDescendants.udt + const importParentDictionaryName = 'TestImportParent'; + const importChildDictionaryName = 'TestImportChild'; + await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); + await umbracoApi.dictionary.create(dictionaryName); + await umbracoUi.translation.goToSection(ConstantHelper.sections.translation); + + // Act + await umbracoUi.translation.clickActionsMenuForDictionary(dictionaryName); + await umbracoUi.translation.clickImportMenu(); + await umbracoUi.translation.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); + // 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(); + }); + + // Skip this test as the search function is removed + test.skip('can search a dictionary item in list when have results', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); + await umbracoApi.dictionary.create(dictionaryName); + await umbracoUi.translation.goToSection(ConstantHelper.sections.translation); + + // Act + await umbracoUi.translation.enterSearchKeywordAndPressEnter(dictionaryName); + + // Assert + expect(await umbracoUi.translation.doesDictionaryListHaveText(dictionaryName)).toBeTruthy(); + }); + + // Skip this test as the search function is removed + test.skip('can search a dictionary item in list when have no results', async ({umbracoApi, umbracoUi}) => { + // Arrange + 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); + + // Act + await umbracoUi.translation.enterSearchKeywordAndPressEnter('xyz'); + + // Assert + await umbracoUi.translation.isSearchResultMessageDisplayEmpty(emptySearchResultMessage); + }); +});