@eeacms/volto-accordion-block
Version:
volto-accordion-block: Volto accordion block
114 lines (103 loc) • 3.35 kB
JavaScript
import { v4 as uuid } from 'uuid';
import { getBlocks } from '@plone/volto/helpers/Blocks/Blocks';
import config from '@plone/volto/registry';
import { cloneData } from './utils';
jest.mock('@plone/volto/helpers/Blocks/Blocks', () => ({
getBlocks: jest.fn(),
getBlocksFieldname: jest.fn(() => 'blocks'),
getBlocksLayoutFieldname: jest.fn(() => 'blocks_layout'),
hasBlocksData: jest.fn((block) => !!block.blocks),
}));
describe('cloneData', () => {
it('should clone the blockData with calling cloneData directly', () => {
const blockId = uuid();
const mockBlockData = {
data: {
'@type': 'accordion',
blocks: {
[blockId]: {
'@type': 'test',
},
},
blocks_layout: {
items: [blockId],
},
},
};
getBlocks.mockReturnValue([[blockId, mockBlockData.data.blocks[blockId]]]);
const [id, clonedBlockData] = cloneData(mockBlockData);
const clonedBlockId = clonedBlockData.data.blocks_layout.items[0];
const clonedBlock = clonedBlockData.data.blocks[clonedBlockId];
expect(clonedBlock).toBeDefined();
expect(clonedBlockId).not.toEqual(blockId);
expect(clonedBlock).toEqual(mockBlockData.data.blocks[blockId]);
expect(id).not.toBeNull();
});
it('should clone the blockData with calling cloneData from block config', () => {
const blockId = uuid();
const mockBlockData = {
data: {
'@type': 'accordion',
blocks: {
[blockId]: {
'@type': 'test',
blocks: {},
},
},
blocks_layout: {
items: [blockId],
},
},
};
getBlocks.mockReturnValue([[blockId, mockBlockData.data.blocks[blockId]]]);
config.blocks.blocksConfig = {
test: {
cloneData: jest.fn(() => [
'test_uuid',
mockBlockData.data.blocks[blockId],
]),
},
};
const [id, clonedBlockData] = cloneData(mockBlockData);
expect(id).not.toEqual('test_uuid');
expect(clonedBlockData.data.blocks['test_uuid']).toEqual(
mockBlockData.data.blocks[blockId],
);
});
it('should recursively clone nested blocks', () => {
const outerBlockId = uuid();
const innerBlockId = uuid();
const innerBlock = {
'@type': 'inner',
blocks: {
[innerBlockId]: { '@type': 'leaf' },
},
blocks_layout: { items: [innerBlockId] },
};
const mockBlockData = {
data: {
'@type': 'accordion',
blocks: {
[outerBlockId]: innerBlock,
},
blocks_layout: {
items: [outerBlockId],
},
},
};
getBlocks
.mockReturnValueOnce([[outerBlockId, innerBlock]])
.mockReturnValueOnce([[innerBlockId, innerBlock.blocks[innerBlockId]]]);
const [id, clonedBlockData] = cloneData(mockBlockData);
const newOuterId = clonedBlockData.data.blocks_layout.items[0];
expect(newOuterId).not.toEqual(outerBlockId);
expect(id).not.toBeNull();
const newOuterBlock = clonedBlockData.data.blocks[newOuterId];
expect(newOuterBlock).toBeDefined();
const newInnerId = newOuterBlock.blocks_layout.items[0];
expect(newInnerId).not.toEqual(innerBlockId);
expect(newOuterBlock.blocks[newInnerId]).toEqual(
innerBlock.blocks[innerBlockId],
);
});
});