From be05a8b89b3e51a50c6aee99b765a30e85e4f3ba Mon Sep 17 00:00:00 2001 From: balazssk Date: Tue, 23 Apr 2024 11:22:38 +0200 Subject: [PATCH 1/6] LPD-21554 Validate for all supported locales, not just available --- .../portal/service/impl/LayoutLocalServiceHelper.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceHelper.java b/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceHelper.java index 20c5214f4904f3..6bfc58343bf360 100644 --- a/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceHelper.java +++ b/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceHelper.java @@ -56,6 +56,7 @@ import com.liferay.portal.kernel.util.comparator.LayoutPriorityComparator; import com.liferay.portal.model.impl.LayoutImpl; import com.liferay.portal.util.LayoutTypeControllerTracker; +import com.liferay.portal.util.PropsValues; import java.util.HashMap; import java.util.List; @@ -523,13 +524,14 @@ public void validateFriendlyURLKeyword(String friendlyURL) } } - for (Locale locale : LanguageUtil.getAvailableLocales()) { - String languageId = StringUtil.toLowerCase( - LocaleUtil.toLanguageId(locale)); + for (String languageId : PropsValues.LOCALES) { + languageId = StringUtil.toLowerCase(languageId); String i18nPathLanguageId = StringPool.SLASH + - PortalUtil.getI18nPathLanguageId(locale, languageId); + PortalUtil.getI18nPathLanguageId( + LocaleUtil.fromLanguageId(languageId, false), + languageId); String underlineI18nPathLanguageId = StringUtil.replace( i18nPathLanguageId, CharPool.DASH, CharPool.UNDERLINE); From 53d8194af9b608ea88b1ef3667e6b7c5e4dc7d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Pulido?= Date: Tue, 23 Apr 2024 11:22:39 +0200 Subject: [PATCH 2/6] LPD-21554 Expose id since it is needed for deleting a page --- modules/test/playwright/types/content-page.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/test/playwright/types/content-page.d.ts b/modules/test/playwright/types/content-page.d.ts index 055271bded5f25..9e4e335e4773f2 100644 --- a/modules/test/playwright/types/content-page.d.ts +++ b/modules/test/playwright/types/content-page.d.ts @@ -26,6 +26,7 @@ type FragmentField = { type Layout = { friendlyUrlPath: string; + id: number; }; type PageDefinition = { From ba7bf213a694eed6ed8949a4d064c7995cbd0eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Pulido?= Date: Tue, 23 Apr 2024 11:22:40 +0200 Subject: [PATCH 3/6] LPD-21554 Create functional test verifying, in the guest site it can be navigated to a page whose name matches a supported locale which is not an available locale for the site --- .../layout-admin-web/pageFriendlyURL.spec.ts | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts diff --git a/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts b/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts new file mode 100644 index 00000000000000..e1fd58348f50a4 --- /dev/null +++ b/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts @@ -0,0 +1,57 @@ +/** + * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import {expect, mergeTests} from '@playwright/test'; + +import {apiHelpersTest} from '../../fixtures/apiHelpersTest'; +import {featureFlagsTest} from '../../fixtures/featureFlagsTest'; +import {loginTest} from '../../fixtures/loginTest'; +import {liferayConfig} from '../../liferay.config'; +import getRandomString from '../../utils/getRandomString'; +import getFragmentDefinition from '../layout-content-page-editor-web/utils/getFragmentDefinition'; +import getPageDefinition from '../layout-content-page-editor-web/utils/getPageDefinition'; + +export const test = mergeTests( + apiHelpersTest, + featureFlagsTest({ + 'LPS-178052': true, + }), + loginTest() +); + +test('This is a test for LPD-21554. Some page names result in 404 friendly URLs.', async ({ + apiHelpers, + page, +}) => { + const company = await apiHelpers.jsonWebServicesCompany.getCompanyByWebId( + 'liferay.com' + ); + + const group = await apiHelpers.jsonWebServicesGroup.getGroupByKey( + company.companyId, + 'Guest' + ); + + // Create a page in Guest site with name matching a supported locale which + // is not an available locale for the site + + const pageName = 'th'; + + const sitePage = await apiHelpers.headlessDelivery.createSitePage({ + pageDefinition: getPageDefinition([ + getFragmentDefinition(getRandomString(), 'BASIC_COMPONENT-heading'), + ]), + siteId: group.groupId, + title: pageName, + }); + + await page.goto(liferayConfig.environment.baseUrl); + + await page.getByText(pageName, {exact: true}).click(); + + await expect(page.getByText('Heading Example')).toBeVisible(); + + await apiHelpers.jsonWebServicesLayout.deleteLayout(String(sitePage.id)); +}); From 9df585ef71900f96257626643d8210a3b9e6b85e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Pulido?= Date: Tue, 23 Apr 2024 16:16:11 +0200 Subject: [PATCH 4/6] LPD-21554 Use soft assertion so if it fails, the test is not terminated and the page can be deleted at the end of the test --- .../playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts b/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts index e1fd58348f50a4..96bc35f98a2f8a 100644 --- a/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts +++ b/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts @@ -51,7 +51,7 @@ test('This is a test for LPD-21554. Some page names result in 404 friendly URLs. await page.getByText(pageName, {exact: true}).click(); - await expect(page.getByText('Heading Example')).toBeVisible(); + await expect.soft(page.getByText('Heading Example')).toBeVisible(); await apiHelpers.jsonWebServicesLayout.deleteLayout(String(sitePage.id)); }); From 8ae92740dd756c43f488c6f81231ef147c6c141f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Pulido?= Date: Wed, 24 Apr 2024 14:42:11 +0200 Subject: [PATCH 5/6] LPD-21554 Check if link is visible before clicking on it, to ensure that if the link is not found the test will continue and will delete the created page --- .../playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts b/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts index 96bc35f98a2f8a..badcd3b4713952 100644 --- a/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts +++ b/modules/test/playwright/tests/layout-admin-web/pageFriendlyURL.spec.ts @@ -49,7 +49,9 @@ test('This is a test for LPD-21554. Some page names result in 404 friendly URLs. await page.goto(liferayConfig.environment.baseUrl); - await page.getByText(pageName, {exact: true}).click(); + if (await page.getByText(pageName, {exact: true}).isVisible()) { + await page.getByText(pageName, {exact: true}).click(); + } await expect.soft(page.getByText('Heading Example')).toBeVisible(); From eb8a3241bfb2831888629aec52ba709cc1f91d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Pulido?= Date: Wed, 24 Apr 2024 09:39:02 +0200 Subject: [PATCH 6/6] LPD-21554 DO NOT COMMIT - Run only pageFriendlyURL.spec.ts --- modules/test/playwright/playwright.config.ts | 70 +--------- .../layout-admin-web/millerColumns.spec.ts | 126 ------------------ .../utilityPageConfiguration.spec.ts | 52 -------- 3 files changed, 1 insertion(+), 247 deletions(-) delete mode 100644 modules/test/playwright/tests/layout-admin-web/millerColumns.spec.ts delete mode 100644 modules/test/playwright/tests/layout-admin-web/utilityPageConfiguration.spec.ts diff --git a/modules/test/playwright/playwright.config.ts b/modules/test/playwright/playwright.config.ts index c73be42ae69472..90309a940b6c46 100644 --- a/modules/test/playwright/playwright.config.ts +++ b/modules/test/playwright/playwright.config.ts @@ -5,82 +5,14 @@ import {defineConfig} from '@playwright/test'; -import {wemSiteSetup, wemSiteTeardown} from './setup/wem-site/config'; -import {config as accountAdminWebConfig} from './tests/account-admin-web/config'; -import {config as analyticsSettingsWebConfig} from './tests/analytics-settings-web/config'; -import {config as analyticsWebConfig} from './tests/analytics-web/config'; -import {config as announcementsWebConfig} from './tests/announcements-web/config'; -import {config as batchPlannerConfig} from './tests/batch-planner/config'; -import {config as blogsWebConfig} from './tests/blogs-web/config'; -import {config as changeTrackingWebConfig} from './tests/change-tracking-web/config'; -import {config as clientExtensionWebConfig} from './tests/client-extension-web/config'; -import {config as commerceConfig} from './tests/commerce/config'; -import {config as dispatchWebConfig} from './tests/dispatch-web/config'; -import {config as documentLibraryWebConfig} from './tests/document-library-web/config'; -import {config as exportImportWebConfig} from './tests/export-import-web/config'; -import {config as frontendDataSetViewsWebConfig} from './tests/frontend-data-set-views-web/config'; -import {config as headlessBuilderImplConfig} from './tests/headless-builder-impl/config'; -import {config as headlessBuilderWebConfig} from './tests/headless-builder-web/config'; -import {config as journalWebConfig} from './tests/journal-web/config'; -import {config as knowledgeBaseWebConfig} from './tests/knowledge-base-web/config'; import {config as layoutAdminWebConfig} from './tests/layout-admin-web/config'; -import {config as layoutContentPageEditorWebConfig} from './tests/layout-content-page-editor-web/config'; -import {config as layoutSetPrototypeWebConfig} from './tests/layout-set-prototype-web/config'; -import {config as layoutTaglib} from './tests/layout-taglib/config'; -import {config as lockedItemsConfig} from './tests/locked-items-web/config'; -import {config as loginWebConfig} from './tests/login-web/config'; -import {config as objectWebConfig} from './tests/object-web/config'; -import {config as osbFaroWebConfig} from './tests/osb-faro-web/config'; -import {config as portalWorkflowKaleoDesignerWebConfig} from './tests/portal-workflow-kaleo-designer-web/config'; -import {config as productNavigationControlMenuWebConfig} from './tests/product-navigation-control-menu-web/config'; -import {config as productNavigationProductMenuWebConfig} from './tests/product-navigation-product-menu-web/config'; -import {config as productNavigationUserPersonalBarWebConfig} from './tests/product-navigation-user-personal-bar-web/config'; -import {config as stableConfig} from './tests/stable/config'; -import {config as stylebookConfig} from './tests/style-book-web/config'; -import {config as usersAdminWebConfig} from './tests/users-admin-web/config'; - -const setupProjects = [wemSiteSetup, wemSiteTeardown]; export default defineConfig({ expect: { timeout: 15 * 1000, }, forbidOnly: !!process.env.CI, - projects: [ - accountAdminWebConfig, - analyticsWebConfig, - analyticsSettingsWebConfig, - announcementsWebConfig, - batchPlannerConfig, - blogsWebConfig, - changeTrackingWebConfig, - clientExtensionWebConfig, - commerceConfig, - dispatchWebConfig, - documentLibraryWebConfig, - exportImportWebConfig, - frontendDataSetViewsWebConfig, - headlessBuilderImplConfig, - headlessBuilderWebConfig, - journalWebConfig, - knowledgeBaseWebConfig, - layoutAdminWebConfig, - layoutContentPageEditorWebConfig, - layoutSetPrototypeWebConfig, - layoutTaglib, - lockedItemsConfig, - loginWebConfig, - objectWebConfig, - osbFaroWebConfig, - portalWorkflowKaleoDesignerWebConfig, - productNavigationControlMenuWebConfig, - productNavigationProductMenuWebConfig, - productNavigationUserPersonalBarWebConfig, - stableConfig, - stylebookConfig, - usersAdminWebConfig, - ...setupProjects, - ], + projects: [layoutAdminWebConfig], reporter: [ [ 'html', diff --git a/modules/test/playwright/tests/layout-admin-web/millerColumns.spec.ts b/modules/test/playwright/tests/layout-admin-web/millerColumns.spec.ts deleted file mode 100644 index 09f8f4a52dfd61..00000000000000 --- a/modules/test/playwright/tests/layout-admin-web/millerColumns.spec.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com - * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 - */ - -import {expect, mergeTests} from '@playwright/test'; - -import {pagesAdminPageTest} from '../../fixtures/PagesAdminPageTest'; -import {apiHelpersTest} from '../../fixtures/apiHelpersTest'; -import {featureFlagsTest} from '../../fixtures/featureFlagsTest'; -import {isolatedSiteTest} from '../../fixtures/isolatedSiteTest'; -import {loginTest} from '../../fixtures/loginTest'; -import getRandomString from '../../utils/getRandomString'; - -export const test = mergeTests( - apiHelpersTest, - featureFlagsTest({ - 'LPS-178052': true, - 'LPS-196847': true, - }), - isolatedSiteTest, - loginTest(), - pagesAdminPageTest -); - -test('changes the permissions of a group of pages', async ({ - apiHelpers, - page, - pagesAdminPage, - site, -}) => { - - // Create two random pages - - const pageNames = [getRandomString(), getRandomString()]; - - for (const pageName of pageNames) { - await apiHelpers.headlessDelivery.createSitePage({ - siteId: site.id, - title: pageName, - }); - } - - // Go to admin page - - await pagesAdminPage.goto(site.friendlyUrlPath); - - // Select the first page and change the Guest-View permission - - await pagesAdminPage.selectPageAndChangePermissions(pageNames[0], [ - 'guest_ACTION_VIEW', - ]); - - // Select the second page (keeping the first page checked) and open the modal of permissions - - await page - .getByLabel(`Select ${pageNames[1]}`, { - exact: true, - }) - .check(); - - await page.getByRole('button', {name: 'Permissions'}).click(); - - await page.waitForTimeout(3000); - - // Check that the Guest-View permission value for both pages is indeterminate - - const permission = await page - .frameLocator('iframe[title="Permissions"]') - .locator('#guest_ACTION_VIEW'); - - await expect(permission).toHaveValue('indeterminate'); - - await page.getByLabel('close', {exact: true}).click(); - - // Change the Guest-View permission for both pages - - await pagesAdminPage.selectPageAndChangePermissions(pageNames[1], [ - 'guest_ACTION_VIEW', - ]); - - // Refresh the admin page - - await pagesAdminPage.goto(site.friendlyUrlPath); - - // Check if the pages are retricted pages - - for (const pageName of pageNames) { - await expect( - page.getByLabel(`${pageName}. Restricted Page`) - ).toBeVisible(); - } -}); - -test('checks the correct label for restricted pages in Miller Columns', async ({ - apiHelpers, - page, - pagesAdminPage, - site, -}) => { - - // Create a page with only one permission - - const pageName = getRandomString(); - - await apiHelpers.headlessDelivery.createSitePage({ - pagePermissions: [ - { - actionKeys: ['VIEW'], - roleKey: 'Owner', - }, - ], - siteId: site.id, - title: pageName, - }); - - // Go to admin page and check if the Restricted Page label is in the Miller Columns item - - await pagesAdminPage.goto(site.friendlyUrlPath); - - await expect( - page - .locator('.miller-columns-item') - .getByLabel(`${pageName}. Restricted Page`) - ).toBeVisible(); -}); diff --git a/modules/test/playwright/tests/layout-admin-web/utilityPageConfiguration.spec.ts b/modules/test/playwright/tests/layout-admin-web/utilityPageConfiguration.spec.ts deleted file mode 100644 index c7446ae5b2b589..00000000000000 --- a/modules/test/playwright/tests/layout-admin-web/utilityPageConfiguration.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com - * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 - */ - -import {expect, mergeTests} from '@playwright/test'; - -import {apiHelpersTest} from '../../fixtures/apiHelpersTest'; -import {isolatedSiteTest} from '../../fixtures/isolatedSiteTest'; -import {loginTest} from '../../fixtures/loginTest'; -import getRandomString from '../../utils/getRandomString'; -import {pageEditorPagesTest} from '../layout-content-page-editor-web/fixtures/pageEditorPagesTest'; -import {pagesPagesTest} from './fixtures/pagesPagesTest'; - -export const test = mergeTests( - apiHelpersTest, - isolatedSiteTest, - loginTest(), - pageEditorPagesTest, - pagesPagesTest -); - -test('LPD-4459: Asserts the Utility Pages configuration view.', async ({ - page, - pageEditorPage, - site, - utilityPageConfigurationPage, - utilityPagesPage, -}) => { - await page.goto('/'); - - // The configuration action must be available from the card - // The configuration view should only allow setting the htmlTitle and htmlDescription SEO fields - - await utilityPagesPage.goto(site.friendlyUrlPath); - await utilityPageConfigurationPage.setUtilityPageConfiguration( - getRandomString(), - getRandomString(), - '404 Error' - ); - - // During editing the "More Page Design Options" link should not be available - - await utilityPagesPage.goto(site.friendlyUrlPath); - await utilityPagesPage.goToEdit('404 Error'); - await pageEditorPage.goToSidebarTab('Page Design Options'); - - await expect(page.getByText('Master', {exact: true})).toBeVisible(); - expect(await page.getByTitle('More Page Design Options').count()).toEqual( - 0 - ); -});