diff --git a/modules/test/playwright/pages/object-web/object-entries/ViewObjectEntriesPage.ts b/modules/test/playwright/pages/object-web/object-entries/ViewObjectEntriesPage.ts index d9bba0cca387d0..b312f0ef19f6ac 100644 --- a/modules/test/playwright/pages/object-web/object-entries/ViewObjectEntriesPage.ts +++ b/modules/test/playwright/pages/object-web/object-entries/ViewObjectEntriesPage.ts @@ -19,6 +19,7 @@ export class ViewObjectEntriesPage { readonly frameSelect: FrameLocator; readonly frontendDatasetActions: Locator; readonly frontendDatasetDeleteAction: Locator; + readonly neverReview: Locator; readonly page: Page; readonly saveObjectEntryButton: Locator; readonly saveObjectEntryButtonArabic: Locator; @@ -54,6 +55,7 @@ export class ViewObjectEntriesPage { this.frontendDatasetDeleteAction = page.getByRole('menuitem', { name: 'Delete', }); + this.neverReview = page.getByLabel('Never Review', {exact: true}); this.page = page; this.searchBar = this.frameSelect.getByPlaceholder('Search for'); this.searchButton = this.frameSelect.getByRole('button', { diff --git a/modules/test/playwright/tests/object-web/main/objectScheduleConfiguration.spec.ts b/modules/test/playwright/tests/object-web/main/objectScheduleConfiguration.spec.ts new file mode 100644 index 00000000000000..106ccc04adec16 --- /dev/null +++ b/modules/test/playwright/tests/object-web/main/objectScheduleConfiguration.spec.ts @@ -0,0 +1,118 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 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 {dataApiHelpersTest} from '../../../fixtures/dataApiHelpersTest'; +import {featureFlagsTest} from '../../../fixtures/featureFlagsTest'; +import {loginTest} from '../../../fixtures/loginTest'; +import {objectPagesTest} from '../../../fixtures/objectPagesTest'; +import {waitForAlert} from '../../../utils/waitForAlert'; +import {getObjectEntryUIDateTimeFormat} from './utils/dateFormat'; + +export const test = mergeTests( + dataApiHelpersTest, + featureFlagsTest({ + 'LPD-17564': {enabled: true}, + }), + loginTest(), + objectPagesTest +); + +test.describe('Manage schedule properties through Object Entries', () => { + test('can create, read, update, and delete a reviewDate of an object entry', async ({ + apiHelpers, + page, + viewObjectEntriesPage, + }) => { + const objectDefinition = + await apiHelpers.objectAdmin.postRandomObjectDefinition({ + objectFolderExternalReferenceCode: 'default', + status: {code: 0}, + titleObjectFieldName: 'textField', + }); + + apiHelpers.data.push({ + id: objectDefinition.id, + type: 'objectDefinition', + }); + + await viewObjectEntriesPage.goto(objectDefinition.className); + + await viewObjectEntriesPage.clickAddObjectEntry( + objectDefinition.label['en_US'] + ); + + await viewObjectEntriesPage.neverReview.uncheck(); + + await page.getByRole('button', {name: 'Choose date'}).click(); + + await page.getByLabel('Select Current Date').click(); + + await page.keyboard.press('Escape'); + + await viewObjectEntriesPage.saveObjectEntryButton.click(); + + await waitForAlert(page); + + const reviewDateInput = page.locator('input[id$="reviewDate"]'); + + const date1 = getObjectEntryUIDateTimeFormat(new Date()); + + await expect(reviewDateInput).toHaveValue(date1); + + const newDate = new Date(); + + newDate.setDate(newDate.getDate() + 1); + + const date2 = getObjectEntryUIDateTimeFormat(newDate); + + await reviewDateInput.fill(date2); + + await viewObjectEntriesPage.saveObjectEntryButton.click(); + + await waitForAlert(page); + + await expect(reviewDateInput).toHaveValue(date2); + + await viewObjectEntriesPage.neverReview.check(); + + await viewObjectEntriesPage.saveObjectEntryButton.click(); + + await waitForAlert(page); + + await expect(reviewDateInput).toHaveValue(''); + }); + + test('cannot submit an empty reviewDate when neverReview is not checked', async ({ + apiHelpers, + page, + viewObjectEntriesPage, + }) => { + const objectDefinition = + await apiHelpers.objectAdmin.postRandomObjectDefinition({ + objectFolderExternalReferenceCode: 'default', + status: {code: 0}, + titleObjectFieldName: 'textField', + }); + + apiHelpers.data.push({ + id: objectDefinition.id, + type: 'objectDefinition', + }); + + await viewObjectEntriesPage.goto(objectDefinition.className); + + await viewObjectEntriesPage.clickAddObjectEntry( + objectDefinition.label['en_US'] + ); + + await viewObjectEntriesPage.neverReview.uncheck(); + + await viewObjectEntriesPage.saveObjectEntryButton.click(); + + await expect(page.getByText('This field is required')).toBeVisible(); + }); +}); diff --git a/modules/test/playwright/tests/object-web/main/utils/dateFormat.ts b/modules/test/playwright/tests/object-web/main/utils/dateFormat.ts index e18ba91017b1c3..dafa53c9496fb8 100644 --- a/modules/test/playwright/tests/object-web/main/utils/dateFormat.ts +++ b/modules/test/playwright/tests/object-web/main/utils/dateFormat.ts @@ -29,6 +29,18 @@ export function getObjectEntryUIDateFormat(date: Date) { }).format(date); } +export function getObjectEntryUIDateTimeFormat(date: Date) { + return date + .toLocaleString('en-US', { + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + month: '2-digit', + year: 'numeric', + }) + .replace(',', ''); +} + export function getPageEditorDateFormat(date: Date) { const formatDate = new Intl.DateTimeFormat('en-US', { day: '2-digit',