@eeacms/volto-accordion-block
Version:
volto-accordion-block: Volto accordion block
202 lines (188 loc) • 5.6 kB
JSX
import React from 'react';
import { render, fireEvent, screen } from '@testing-library/react';
import { Provider } from 'react-intl-redux';
import configureStore from 'redux-mock-store';
import { MemoryRouter } from 'react-router-dom';
import '@testing-library/jest-dom/extend-expect';
import Edit from './Edit';
import config from '@plone/volto/registry';
jest.mock('@plone/volto/components', () => ({
BlocksForm: jest.fn(
({ children, onSelectBlock, onChangeFormData, properties }) => {
const blockList = properties.blocks
? Object.entries(properties.blocks)
: [];
return (
<div>
{blockList.map(([blockId, blockData], index) => (
<div key={blockId}>
{children(
{
child: blockData,
childId: blockId,
index,
},
<div>EditBlock</div>,
{
allowedBlocks: [],
block: blockId,
data: blockData,
id: blockId,
index,
onChangeBlock: jest.fn(),
onSelectBlock,
onChangeFormData,
properties,
selected: false,
type: blockData['@type'],
},
)}
</div>
))}
</div>
);
},
),
Icon: () => <div>Icon</div>,
SidebarPortal: ({ children }) => <div>{children}</div>,
BlocksToolbar: () => <div>BlocksToolbar</div>,
BlockDataForm: () => <div>BlockDataForm</div>,
}));
jest.mock('@plone/volto/helpers', () => ({
withBlockExtensions: jest.fn((Component) => Component),
emptyBlocksForm: jest.fn(),
getBlocksLayoutFieldname: () => 'blocks_layout',
}));
config.blocks.blocksConfig.accordion = {
...config.blocks.blocksConfig.accordion,
titleIcons: {
opened: {
rightPosition: 'chevron left',
leftPosition: 'chevron right',
},
closed: {
rightPosition: 'chevron down',
leftPosition: 'chevron down',
},
size: 'tiny',
iconComponent: 'SemanticIcon',
unfiltered: {
rightPosition: 'chevron left',
leftPosition: 'chevron right',
},
filtered: {
rightPosition: 'chevron down',
leftPosition: 'chevron down',
},
},
};
const mockStore = configureStore();
const store = mockStore({
intl: {
locale: 'en',
messages: {},
},
});
const mockData = {
title: 'Accordion',
data: {
blocks: {
1: {
'@type': 'accordionPanel',
title: 'Panel 1',
blocks_layout: {
items: ['block1', 'block2'],
},
},
2: {
'@type': 'accordionPanel',
title: 'Panel 2',
blocks_layout: {
items: ['block3', 'block4'],
},
},
},
blocks_layout: {
items: ['1', '2'],
},
},
};
describe('Edit Component', () => {
it('renders the accordion title correctly', () => {
const onChangeBlock = jest.fn();
render(
<Provider store={store}>
<MemoryRouter>
<Edit data={mockData} onChangeBlock={onChangeBlock} />
</MemoryRouter>
</Provider>,
);
expect(screen.getByText('Accordion')).toBeInTheDocument();
});
it('renders the accordion panels correctly', () => {
const onChangeBlock = jest.fn();
render(
<Provider store={store}>
<MemoryRouter>
<Edit data={mockData} onChangeBlock={onChangeBlock} />
</MemoryRouter>
</Provider>,
);
expect(screen.getByDisplayValue('Panel 1')).toBeInTheDocument();
expect(screen.getByDisplayValue('Panel 2')).toBeInTheDocument();
});
it('calls onChangeBlock when the title changes', () => {
const onChangeBlock = jest.fn();
render(
<Provider store={store}>
<MemoryRouter>
<Edit data={mockData} onChangeBlock={onChangeBlock} />
</MemoryRouter>
</Provider>,
);
const titleInput = screen.getByDisplayValue('Panel 1');
fireEvent.change(titleInput, { target: { value: 'New Panel Title' } });
expect(onChangeBlock).toHaveBeenCalled();
});
it('filters the accordion panels based on the filter value', () => {
const onChangeBlock = jest.fn();
render(
<Provider store={store}>
<MemoryRouter>
<Edit
data={{ ...mockData, filtering: true }}
onChangeBlock={onChangeBlock}
/>
</MemoryRouter>
</Provider>,
);
const filterInput = screen.getByPlaceholderText('Type to filter...');
fireEvent.change(filterInput, { target: { value: 'Panel 1' } });
expect(screen.getByPlaceholderText('Enter Title')).toHaveDisplayValue(
'Panel 1',
);
expect(screen.queryByDisplayValue('Panel 2')).not.toBeInTheDocument();
});
it('renders the block toolbar when a block is selected', () => {
const onChangeBlock = jest.fn();
render(
<Provider store={store}>
<MemoryRouter>
<Edit data={mockData} selected={true} onChangeBlock={onChangeBlock} />
</MemoryRouter>
</Provider>,
);
expect(screen.getByText('BlocksToolbar')).toBeInTheDocument();
});
it('renders the block data form in the sidebar portal', () => {
const onChangeBlock = jest.fn();
render(
<Provider store={store}>
<MemoryRouter>
<Edit data={mockData} selected={true} onChangeBlock={onChangeBlock} />
</MemoryRouter>
</Provider>,
);
expect(screen.getByText('BlockDataForm')).toBeInTheDocument();
});
});