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

META-INF.resources.js.tests.ModelBuilder.utils.spec.ts Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2024 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 {Node} from 'react-flow-renderer';

import {
	checkPostalAddressUnsupportedObjectRelationship,
	getUnsupportedObjectRelationshipErrorMessage,
} from '../../components/ModelBuilder/utils';

interface BuildObjectDefinitionNodeMockProps {
	dbTableName?: string;
	linkedObjectDefinition?: boolean;
	modifiable?: boolean;
	objectDefinitionExternalReferenceCode: string;
	objectDefinitionName: string;
	objectRelationships?: ObjectRelationship[];
	storageType?: string;
}

const objectRelationshipMock = {
	deletionType: 'prevent',
	externalReferenceCode: '',
	id: 33837,
	label: {
		en_US: 'object relationship',
	},
	name: 'objectRelationship',
	objectDefinitionExternalReferenceCode1: 'L_ACCOUNT',
	objectDefinitionExternalReferenceCode2: 'customObjectDefinitionERC',
	objectDefinitionId1: 31670,
	objectDefinitionId2: 33563,
	objectDefinitionModifiable2: true,
	objectDefinitionName2: 'customObject',
	objectDefinitionSystem2: false,
	parameterObjectFieldId: 0,
	parameterObjectFieldName: '',
	reverse: false,
	system: false,
	type: 'oneToMany',
} as ObjectRelationship;

function buildObjectDefinitionNodeMock({
	dbTableName,
	linkedObjectDefinition,
	modifiable,
	objectDefinitionExternalReferenceCode,
	objectDefinitionName,
	objectRelationships,
	storageType,
}: BuildObjectDefinitionNodeMockProps): Node {
	return {
		data: {
			accountEntryRestricted: false,
			accountEntryRestrictedObjectFieldId: '',
			accountEntryRestrictedObjectFieldName: '',
			actions: {},
			active: true,
			dateCreated: '',
			dateModified: '',
			dbTableName: dbTableName ?? '',
			defaultLanguageId: 'en_US',
			enableCategorization: true,
			enableComments: false,
			enableFriendlyURLCustomization: false,
			enableIndexSearch: false,
			enableLocalization: false,
			enableObjectEntryDraft: false,
			enableObjectEntryHistory: false,
			enableObjectEntrySchedule: false,
			externalReferenceCode: objectDefinitionExternalReferenceCode,
			friendlyURLSeparator: objectDefinitionName,
			hasObjectDefinitionDeleteResourcePermission: false,
			hasObjectDefinitionManagePermissionsResourcePermission: true,
			hasObjectDefinitionUpdateResourcePermission: true,
			hasObjectDefinitionViewResourcePermission: true,
			id: 31201,
			label: {
				en_US: '',
			},
			linkedObjectDefinition: linkedObjectDefinition ?? false,
			modifiable: modifiable ?? true,
			name: objectDefinitionName,
			objectActions: [],
			objectFields: [],
			objectFolderExternalReferenceCode: 'default',
			objectLayouts: [],
			objectRelationships: objectRelationships ?? [],
			objectViews: [],
			panelCategoryKey: 'site_administration.content',
			parameterRequired: false,
			pluralLabel: {
				en_US: '',
			},
			portlet: false,
			restContextPath: '',
			rootObjectDefinitionExternalReferenceCode: '',
			scope: 'site',
			selected: false,
			showAllObjectFields: false,
			status: {
				code: 0,
				label: 'approved',
				label_i18n: 'Approved',
			},
			storageType: storageType ?? 'default',
			system: true,
			titleObjectFieldId: 1233,
			titleObjectFieldName: 'name',
		},
		id: '31201',
		position: {
			x: 260,
			y: 550,
		},
		type: 'objectDefinitionNode',
	};
}

describe('checkPostalAddressUnsupportedObjectRelationship function', () => {
	it('returns true if the target node name is Address', () => {
		const customObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
		});

		const postalAddressObjectDefinition = buildObjectDefinitionNodeMock({
			dbTableName: 'Address',
			objectDefinitionExternalReferenceCode: 'L_POSTAL_ADDRESS',
			objectDefinitionName: 'Address',
		});

		const unsupportedObjectRelationship =
			checkPostalAddressUnsupportedObjectRelationship(
				[customObjectDefinition, postalAddressObjectDefinition],
				customObjectDefinition,
				postalAddressObjectDefinition
			);

		expect(unsupportedObjectRelationship).toBe(true);
	});

	it('returns true if the source node name is Address, but the target node does not have a relationship with the Account object', () => {
		const accountObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'L_ACCOUNT',
			objectDefinitionName: 'AccountEntry',
		});

		const customObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
		});

		const postalAddressObjectDefinition = buildObjectDefinitionNodeMock({
			dbTableName: 'Address',
			objectDefinitionExternalReferenceCode: 'L_POSTAL_ADDRESS',
			objectDefinitionName: 'Address',
		});

		const unsupportedObjectRelationship =
			checkPostalAddressUnsupportedObjectRelationship(
				[
					accountObjectDefinition,
					customObjectDefinition,
					postalAddressObjectDefinition,
				],
				postalAddressObjectDefinition,
				customObjectDefinition
			);

		expect(unsupportedObjectRelationship).toBe(true);
	});

	it('returns false if the source node name is Address but the target node has a relationship with the Account object', () => {
		const accountObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'L_ACCOUNT',
			objectDefinitionName: 'AccountEntry',
			objectRelationships: [objectRelationshipMock],
		});

		const customObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
		});

		const postalAddressObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'L_POSTAL_ADDRESS',
			objectDefinitionName: 'Address',
		});

		const unsupportedObjectRelationship =
			checkPostalAddressUnsupportedObjectRelationship(
				[
					accountObjectDefinition,
					customObjectDefinition,
					postalAddressObjectDefinition,
				],
				postalAddressObjectDefinition,
				customObjectDefinition
			);

		expect(unsupportedObjectRelationship).toBe(false);
	});

	it('returns false if the source and target nodes are custom objects', () => {
		const customObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
		});

		const customObjectDefinition2 = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC2',
			objectDefinitionName: 'customObject2',
		});

		const unsupportedObjectRelationship =
			checkPostalAddressUnsupportedObjectRelationship(
				[customObjectDefinition, customObjectDefinition2],
				customObjectDefinition,
				customObjectDefinition2
			);

		expect(unsupportedObjectRelationship).toBe(false);
	});
});

describe('getUnsupportedObjectRelationshipErrorMessage function', () => {
	it('returns errorMessage when source and target object definition nodes are unmodifiable', () => {
		const unmodifiableObjectDefinition = buildObjectDefinitionNodeMock({
			modifiable: false,
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
		});

		const unmodifiableObjectDefinition2 = buildObjectDefinitionNodeMock({
			modifiable: false,
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC2',
			objectDefinitionName: 'customObject2',
		});

		const errorMessage = getUnsupportedObjectRelationshipErrorMessage(
			[unmodifiableObjectDefinition, unmodifiableObjectDefinition2],
			unmodifiableObjectDefinition,
			unmodifiableObjectDefinition2
		);

		expect(errorMessage).toMatchObject({
			errorMessage: 'unmodifiable-system-objects-cannot-be-related',
		});
	});

	it('returns errorMessage when the source node is a linked object definition', () => {
		const linkedObjectDefinition = buildObjectDefinitionNodeMock({
			linkedObjectDefinition: true,
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
		});

		const customObjectDefinition2 = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC2',
			objectDefinitionName: 'customObject2',
		});

		const errorMessage = getUnsupportedObjectRelationshipErrorMessage(
			[linkedObjectDefinition, customObjectDefinition2],
			linkedObjectDefinition,
			customObjectDefinition2
		);

		expect(errorMessage).toMatchObject({
			errorMessage:
				'adding-relationships-directly-to-linked-objects-is-not-allowed',
		});
	});

	it('returns errorMessage when source and target object definition nodes have Salesforce storageType', () => {
		const salesforceObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
			storageType: 'salesforce',
		});

		const salesforceObjectDefinition2 = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC2',
			objectDefinitionName: 'customObject2',
			storageType: 'salesforce',
		});

		const errorMessage = getUnsupportedObjectRelationshipErrorMessage(
			[salesforceObjectDefinition, salesforceObjectDefinition2],
			salesforceObjectDefinition,
			salesforceObjectDefinition2
		);

		expect(errorMessage).toMatchObject({
			errorMessage: 'salesforce-objects-do-not-support-relationships',
		});
	});

	it('returns errorMessage when there is an unsupported postal address object relationship', () => {
		const customObjectDefinition = buildObjectDefinitionNodeMock({
			objectDefinitionExternalReferenceCode: 'customObjectDefinitionERC',
			objectDefinitionName: 'customObject',
		});

		const postalAddressObjectDefinition = buildObjectDefinitionNodeMock({
			dbTableName: 'Address',
			objectDefinitionExternalReferenceCode: 'L_POSTAL_ADDRESS',
			objectDefinitionName: 'Address',
		});

		const errorMessage = getUnsupportedObjectRelationshipErrorMessage(
			[customObjectDefinition, postalAddressObjectDefinition],
			customObjectDefinition,
			postalAddressObjectDefinition
		);

		expect(errorMessage).toMatchObject({
			errorMessage:
				'postal-address-can-only-have-a-relationship-with-the-account-object',
			learnMessage: 'accessing-accounts-data-from-custom-objects',
		});
	});
});




© 2015 - 2025 Weber Informatics LLC | Privacy Policy