Skip to content

Commit c3bcad3

Browse files
fix(common): Remove findDOMNode from makeDroppable (BREAKING CHANGE) (#4276)
* fix(common): Remove findDOMNode from makeDroppable BREAKING CHANGE: Wrapped component of makeDroppable must have ref prop, i.e. with React.forwardRef * fix: Clean up tests --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent ef49c77 commit c3bcad3

File tree

4 files changed

+269
-300
lines changed

4 files changed

+269
-300
lines changed

src/elements/common/droppable/__tests__/makeDroppable.test.js

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import React from 'react';
2+
import '@testing-library/jest-dom';
3+
4+
import { render, screen, fireEvent } from '../../../../test-utils/testing-library';
5+
6+
import makeDroppable from '../makeDroppable';
7+
8+
const TestComponent = React.forwardRef<HTMLDivElement, { className: string; 'data-testid': string }>(
9+
({ className, 'data-testid': testId }, ref) => (
10+
<div className={className} data-testid={testId} ref={ref}>
11+
Test Content
12+
</div>
13+
),
14+
);
15+
16+
describe('elements/common/droppable/makeDroppable', () => {
17+
const mockDropValidator = jest.fn();
18+
const mockOnDrop = jest.fn();
19+
20+
beforeEach(() => {
21+
jest.clearAllMocks();
22+
});
23+
24+
const renderComponent = () => {
25+
const DroppableComponent = makeDroppable({
26+
dropValidator: mockDropValidator,
27+
onDrop: mockOnDrop,
28+
})(TestComponent);
29+
30+
return render(<DroppableComponent data-testid="droppable" />);
31+
};
32+
33+
test('should render and handle drag and drop', async () => {
34+
mockDropValidator.mockReturnValue(true);
35+
renderComponent();
36+
37+
const element = screen.getByTestId('droppable');
38+
const dataTransfer = {} as DataTransfer;
39+
40+
fireEvent.dragEnter(element, { dataTransfer });
41+
expect(element).toHaveClass('is-droppable');
42+
expect(element).toHaveClass('is-over');
43+
44+
fireEvent.drop(element, { dataTransfer });
45+
46+
expect(mockOnDrop).toHaveBeenCalledWith(
47+
expect.objectContaining({
48+
dataTransfer: expect.any(Object),
49+
type: 'drop',
50+
}),
51+
expect.objectContaining({
52+
className: expect.any(String),
53+
}),
54+
);
55+
});
56+
57+
test('should not allow drop when validator returns false', async () => {
58+
mockDropValidator.mockReturnValue(false);
59+
renderComponent();
60+
61+
const element = screen.getByTestId('droppable');
62+
const dataTransfer = {} as DataTransfer;
63+
64+
fireEvent.dragEnter(element, { dataTransfer });
65+
expect(element).not.toHaveClass('is-droppable');
66+
expect(element).toHaveClass('is-over');
67+
68+
fireEvent.drop(element, { dataTransfer });
69+
70+
expect(mockOnDrop).not.toHaveBeenCalled();
71+
});
72+
});

0 commit comments

Comments
 (0)