All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.js.tests.ObjectEntries.ScheduleContainer.spec.tsx Maven / Gradle / Ivy

The newest version!
/**
 * 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 '@testing-library/jest-dom/extend-expect';
import {render, screen, waitFor} from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';

import ScheduleContainer from '../../../object_entries/object_entry/ScheduleContainer';

import type {ScheduleProperties} from '../../../object_entries/object_entry/ScheduleContainer';

function renderScheduleContainer(
	scheduledProperties: ScheduleProperties = {
		displayDate: {
			value: '',
		},
		expirationDate: {
			checked: false,
			value: '',
		},
		reviewDate: {
			checked: false,
			value: '',
		},
	},
	portletNamespace = ''
) {
	return render(
		<>
			
			
		
	);
}

describe('ScheduleContainer component', () => {
	beforeAll(() => {
		global.Liferay = {
			...global.Liferay,
			FeatureFlags: {
				...global.Liferay?.FeatureFlags,
				'LPD-17564': true,
			},
			ThemeDisplay: {
				...global.Liferay?.ThemeDisplay,
				getBCP47LanguageId: jest.fn(),
				getTimeZone: jest.fn(),
			},
		};
	});

	it('expiration and reviewDate are disabled when checked is true', async () => {
		const scheduledProperties: ScheduleProperties = {
			displayDate: {
				value: '',
			},
			expirationDate: {
				checked: true,
				value: '',
			},
			reviewDate: {
				checked: true,
				value: '',
			},
		};

		const {container} = renderScheduleContainer(scheduledProperties);

		for (const scheduledProperty in scheduledProperties) {
			if (
				scheduledProperty.includes('expiration') ||
				scheduledProperty.includes('review')
			) {
				const dateInput = container.querySelector(
					`input[id$="${scheduledProperty}"]`
				);

				expect(dateInput).toBeDisabled();
			}
		}

		const checkbox = screen.getAllByRole('checkbox');

		checkbox.forEach((checkbox) => {
			expect(checkbox).toBeChecked();
		});
	});

	it('displays a description message for the fields inside it', async () => {
		renderScheduleContainer();

		expect(
			screen.getByText(
				'set-expiration-and-review-dates-for-the-object-entry'
			)
		).toBeInTheDocument();
	});

	it('displays error for past expiration date', async () => {
		const {container} = renderScheduleContainer({
			displayDate: {
				value: '',
			},
			expirationDate: {
				checked: false,
				value: '05/13/2020 02:38 PM',
			},
			reviewDate: {
				checked: true,
				value: '',
			},
		});

		const expireDateInput = container.querySelector(
			'input[id$="expirationDate"]'
		) as HTMLElement;

		await userEvent.click(expireDateInput);

		await userEvent.click(screen.getByTestId('outside-click-target'));

		await waitFor(() =>
			expect(
				screen.getByText('the-date-entered-is-in-the-past')
			).toBeInTheDocument()
		);
	});

	it('shows required error on blur when no value is provided', async () => {
		const {container} = renderScheduleContainer();

		const scheduledProperties = ['expirationDate', 'reviewDate'];

		for (const scheduledProperty of scheduledProperties) {
			const dateInput = container.querySelector(
				`input[id$="${scheduledProperty}"]`
			) as HTMLElement;

			await userEvent.click(dateInput);
		}

		await userEvent.click(screen.getByTestId('outside-click-target'));

		await waitFor(() =>
			expect(screen.getAllByText('this-field-is-required').length).toBe(
				Object.keys(scheduledProperties).length
			)
		);
	});

	it('shows required error on change when no value is provided', async () => {
		const scheduledProperties: ScheduleProperties = {
			displayDate: {
				value: '',
			},
			expirationDate: {
				checked: false,
				value: '05/13/2025 02:38 PM',
			},
			reviewDate: {
				checked: false,
				value: '05/13/2025 02:38 PM',
			},
		};
		const {container} = renderScheduleContainer(scheduledProperties);

		for (const scheduledProperty in scheduledProperties) {
			if (
				scheduledProperty.includes('expiration') ||
				scheduledProperty.includes('review')
			) {
				const dateInput = container.querySelector(
					`input[id$="${scheduledProperty}"]`
				) as HTMLElement;

				await userEvent.click(dateInput);

				await userEvent.type(dateInput, '{selectall}{backspace}');

				await waitFor(() =>
					expect(
						screen.getByText('this-field-is-required')
					).toBeInTheDocument()
				);

				await userEvent.type(dateInput, '05/13/2025 02:38 PM');

				expect(
					screen.queryByText('this-field-is-required')
				).not.toBeInTheDocument();
			}
		}
	});
});




© 2015 - 2025 Weber Informatics LLC | Privacy Policy