diff --git a/src/components/manage/Blocks/Group/Edit.test.jsx b/src/components/manage/Blocks/Group/Edit.test.jsx
new file mode 100644
index 0000000..48da9de
--- /dev/null
+++ b/src/components/manage/Blocks/Group/Edit.test.jsx
@@ -0,0 +1,79 @@
+import React from 'react';
+import Edit from './Edit';
+import configureStore from 'redux-mock-store';
+import { Provider } from 'react-intl-redux';
+import thunk from 'redux-thunk';
+import renderer from 'react-test-renderer';
+import { render, fireEvent } from '@testing-library/react';
+import '@testing-library/jest-dom/extend-expect';
+
+const mockStore = configureStore([thunk]);
+const store = mockStore({
+ intl: {
+ locale: 'en',
+ messages: {},
+ },
+});
+
+describe('Edit', () => {
+ const onChangeBlock = jest.fn();
+ const onChangeField = jest.fn();
+ const mockBlockNode = { current: {} };
+ const props = {
+ block: 'testBlock',
+ data: {
+ data: {
+ blocks: {
+ block1: {
+ type: 'test',
+ data: {
+ value: 'Test',
+ },
+ },
+ },
+ blocks_layout: {
+ items: ['block1'],
+ },
+ },
+ },
+ onChangeBlock,
+ onChangeField,
+ pathname: '/',
+ selected: true,
+ manage: true,
+ };
+
+ it('should render without crashing', () => {
+ const component = renderer.create(
+
+
+ ,
+ );
+
+ const json = component.toJSON();
+ expect(json).toMatchSnapshot();
+ });
+
+ it('renders without crashing', () => {
+ const { getByRole } = render(
+
+
+ ,
+ );
+ expect(getByRole('presentation')).toBeInTheDocument();
+ });
+
+ it('should call ArrowUp keydown', () => {
+ const mockOnFocusPreviousBlock = jest.fn();
+ const { getByRole } = render(
+
+
+ ,
+ );
+ fireEvent.keyDown(getByRole('presentation'), { key: 'ArrowUp', code: 38 });
+ });
+});
diff --git a/src/components/manage/Blocks/Group/EditBlockWrapper.test.jsx b/src/components/manage/Blocks/Group/EditBlockWrapper.test.jsx
new file mode 100644
index 0000000..01893c3
--- /dev/null
+++ b/src/components/manage/Blocks/Group/EditBlockWrapper.test.jsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import { fireEvent, render } from '@testing-library/react';
+import { Provider } from 'react-intl-redux';
+import EditBlockWrapper from './EditBlockWrapper';
+import configureStore from 'redux-mock-store';
+import '@testing-library/jest-dom/extend-expect';
+
+const mockDragInfo = {
+ innerRef: {
+ current: {
+ childMethod: jest.fn(),
+ },
+ },
+ draggableProps: {},
+ dragHandleProps: {},
+};
+
+const mockStore = configureStore();
+const store = mockStore({
+ intl: {
+ locale: 'en',
+ messages: {},
+ },
+});
+
+describe('EditBlockWrapper', () => {
+ const mockBlockProps = {
+ allowedBlocks: [],
+ block: 'mockBlock',
+ data: {},
+ onSelectBlock: jest.fn(),
+ onDeleteBlock: jest.fn(),
+ onMutateBlock: jest.fn(),
+ onInsertBlock: jest.fn(),
+ selected: true,
+ };
+
+ it('renders children', () => {
+ const { getByText } = render(
+
+
+ Test child
+
+ ,
+ );
+ expect(getByText('Test child')).toBeInTheDocument();
+ });
+
+ it('calls onDeleteBlock when delete button is clicked', () => {
+ const { getByTitle } = render(
+
+
+ ,
+ );
+ fireEvent.click(getByTitle('Remove block'));
+ expect(mockBlockProps.onDeleteBlock).toHaveBeenCalledWith('mockBlock');
+ });
+});
diff --git a/src/components/manage/Blocks/Group/View.test.jsx b/src/components/manage/Blocks/Group/View.test.jsx
new file mode 100644
index 0000000..f9116b1
--- /dev/null
+++ b/src/components/manage/Blocks/Group/View.test.jsx
@@ -0,0 +1,68 @@
+import React from 'react';
+import View from './View';
+import renderer from 'react-test-renderer';
+import { render } from '@testing-library/react';
+import { RenderBlocks } from '@plone/volto/components';
+import '@testing-library/jest-dom/extend-expect';
+
+jest.mock('@plone/volto/components', () => ({
+ RenderBlocks: jest.fn(() =>
RenderBlocks
),
+}));
+
+describe('View', () => {
+ it('should render without crashing', () => {
+ const props = {
+ data: {},
+ metadata: {},
+ properties: {},
+ };
+ const component = renderer.create();
+
+ const json = component.toJSON();
+ expect(json).toMatchSnapshot();
+ });
+
+ it('renders with default tag and without crashing', () => {
+ const props = {
+ data: {},
+ metadata: {},
+ properties: {},
+ };
+ const { container } = render();
+ expect(container.querySelector('div')).toBeInTheDocument();
+ });
+
+ it('renders with a custom tag and custom id', () => {
+ const props = {
+ data: {
+ as: 'section',
+ title: 'Test Title',
+ data: { key: 'value' },
+ },
+ properties: {},
+ };
+ const { container } = render();
+ expect(container.querySelector('section')).toBeInTheDocument();
+ expect(container.querySelector('#test-title')).toBeInTheDocument();
+ });
+
+ it('renders RenderBlocks with correct props', () => {
+ const props = {
+ data: {
+ as: 'section',
+ title: 'Test Title',
+ data: { key: 'value' },
+ },
+ metadata: { meta: 'data' },
+ properties: { prop: 'erty' },
+ };
+ render();
+ expect(RenderBlocks).toHaveBeenCalledWith(
+ expect.objectContaining({
+ metadata: props.metadata,
+ content: props.data.data,
+ }),
+ {},
+ );
+ });
+});
diff --git a/src/components/manage/Blocks/Group/__snapshots__/Edit.test.jsx.snap b/src/components/manage/Blocks/Group/__snapshots__/Edit.test.jsx.snap
new file mode 100644
index 0000000..e526e26
--- /dev/null
+++ b/src/components/manage/Blocks/Group/__snapshots__/Edit.test.jsx.snap
@@ -0,0 +1,26 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Edit should render without crashing 1`] = `
+
+`;
diff --git a/src/components/manage/Blocks/Group/__snapshots__/View.test.jsx.snap b/src/components/manage/Blocks/Group/__snapshots__/View.test.jsx.snap
new file mode 100644
index 0000000..efc7bd6
--- /dev/null
+++ b/src/components/manage/Blocks/Group/__snapshots__/View.test.jsx.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`View should render without crashing 1`] = `
+
+`;