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

META-INF.resources.js.tests.ViewObjectDefinitions.ObjectFoldersSidebar.spec.tsx Maven / Gradle / Ivy

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

import ObjectFoldersSideBar from '../../components/ViewObjectDefinitions/ObjectFoldersSidebar';
import {exportObjectEntity} from '../../utils/exportObjectEntity';

const mockBaseResourceURL = 'http://localhost/resource';
const mockExportObjectFolderURL = 'http://localhost/export';
const mockImportObjectFolderURL = 'http://localhost/import';

const mockObjectDefinitionsActions = {
	create: {href: '', method: ''},
};

const mockObjectFolder1 = {
	actions: {get: {href: '', method: 'GET'}},
	dateCreated: '2023-08-07T14:42:21Z',
	dateModified: '2023-08-07T14:42:21Z',
	externalReferenceCode: 'folder1',
	id: 2,
	label: {en_US: 'Folder 1'},
	name: 'folder1',
	objectFolderItems: [],
};

const mockObjectFolder2 = {
	actions: {get: {href: '', method: 'GET'}},
	dateCreated: '2023-08-07T14:45:00Z',
	dateModified: '2023-08-07T14:45:00Z',
	externalReferenceCode: 'folder2',
	id: 1,
	label: {en_US: 'Folder 2'},
	name: 'folder2',
	objectFolderItems: [],
};

const mockObjectFoldersRequestInfo = {
	actions: {create: {href: '', method: 'POST'}},
	items: [mockObjectFolder1, mockObjectFolder2],
};

const mockSelectedObjectFolder = {
	externalReferenceCode: 'folder1',
	id: 1,
	label: {en_US: 'Folder 1'},
	name: 'folder-1',
};

const mockSetModalImportProperties = jest.fn();
const mockSetSelectedObjectFolder = jest.fn();
const mockSetShowModal = jest.fn();

jest.mock('frontend-js-web', () => ({
	createResourceURL: jest.fn(() => ({href: mockExportObjectFolderURL})),
	sub: jest.fn(),
}));

jest.mock('../../utils/exportObjectEntity', () => ({
	exportObjectEntity: jest.fn(),
}));

describe('The ObjectFoldersSidebar component should', () => {
	it('render all created object folders', () => {
		render(
			 {}}
				setSelectedObjectFolder={() => {}}
				setShowModal={() => {}}
			/>
		);

		expect(screen.getAllByRole('listitem')).toHaveLength(2);

		expect(screen.getByText('Folder 1')).toBeInTheDocument();

		expect(screen.getByText('Folder 2')).toBeInTheDocument();

		userEvent.click(
			screen.getByRole('button', {name: 'object-folder-actions'})
		);

		const menuItem = screen.getAllByRole('menuitem');

		expect(menuItem).toHaveLength(2);

		expect(menuItem[0]).toHaveAttribute('value', 'exportObjectFolder');

		expect(menuItem[1]).toHaveAttribute('value', 'importObjectFolder');
	});

	it('renders object folders and allows selection', () => {
		render(
			
		);

		expect(screen.getByText('Folder 1')).toBeInTheDocument();
		expect(screen.getByText('Folder 2')).toBeInTheDocument();

		fireEvent.click(screen.getByText('Folder 2'));
		expect(mockSetSelectedObjectFolder).toHaveBeenCalledWith(
			mockObjectFoldersRequestInfo.items[1]
		);
	});

	it('triggers export action for selected folder', () => {
		render(
			
		);

		fireEvent.click(screen.getByLabelText('object-folder-actions'));
		fireEvent.click(screen.getByText('export-object-folder'));

		expect(mockSetShowModal).not.toHaveBeenCalled();

		expect(exportObjectEntity).toHaveBeenCalledWith({
			exportObjectEntityURL: mockExportObjectFolderURL,
			objectEntityId: mockSelectedObjectFolder.id,
		});
	});

	it('opens import modal when clicking import action', () => {
		render(
			
		);

		fireEvent.click(screen.getByLabelText('object-folder-actions'));
		fireEvent.click(screen.getByText('import-object-folder'));

		expect(mockSetModalImportProperties).toHaveBeenCalledWith({
			JSONInputId: 'objectFolderJSON',
			apiURL: '/o/object-admin/v1.0/object-folders/by-external-reference-code/',
			importURL: mockImportObjectFolderURL,
			modalImportKey: 'objectFolder',
		});

		expect(mockSetShowModal).toHaveBeenCalledWith(expect.any(Function));
	});

	it('renders correctly without selectedObjectFolder', () => {
		render(
			
		);

		expect(
			screen.queryByLabelText('object-folder-actions')
		).not.toBeInTheDocument();
		expect(
			screen.queryByLabelText('add-object-folder')
		).not.toBeInTheDocument();
	});

	it('opens add folder modal when "add" button is clicked', () => {
		render(
			
		);

		fireEvent.click(screen.getByLabelText('add-object-folder'));

		expect(mockSetShowModal).toHaveBeenCalledWith(expect.any(Function));
	});
});




© 2015 - 2025 Weber Informatics LLC | Privacy Policy