Skip to content

Commit c70f72c

Browse files
committed
fix: Clean up tests
1 parent 9153326 commit c70f72c

File tree

1 file changed

+47
-144
lines changed

1 file changed

+47
-144
lines changed
Lines changed: 47 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1,169 +1,72 @@
11
import React from 'react';
2-
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
32
import '@testing-library/jest-dom';
43

4+
import { render, screen, fireEvent } from '../../../../test-utils/testing-library';
5+
56
import makeDroppable from '../makeDroppable';
67

7-
// Test component that will be wrapped with makeDroppable
8-
const TestComponent = React.forwardRef<HTMLDivElement, { className?: string; 'data-testid'?: string }>(
9-
({ className, 'data-testid': testId, ...props }, ref) => (
10-
<div ref={ref} className={className} data-testid={testId || 'test-component'} {...props}>
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}>
1111
Test Content
1212
</div>
1313
),
1414
);
1515

16-
TestComponent.displayName = 'TestComponent';
17-
18-
describe('elements/common/droppable/makeDroppable', () => {
16+
describe('makeDroppable', () => {
1917
const mockDropValidator = jest.fn();
2018
const mockOnDrop = jest.fn();
21-
const createDT = () => (typeof DataTransfer === 'function' ? new DataTransfer() : ({} as DataTransfer));
2219

2320
beforeEach(() => {
2421
jest.clearAllMocks();
2522
});
2623

27-
describe('Basic functionality', () => {
28-
test('should render wrapped component with correct props', () => {
29-
const DroppableComponent = makeDroppable({
30-
dropValidator: mockDropValidator,
31-
onDrop: mockOnDrop,
32-
})(TestComponent);
33-
34-
render(<DroppableComponent className="test-class" data-testid="droppable" />);
35-
36-
const element = screen.getByTestId('droppable');
37-
expect(element).toBeInTheDocument();
38-
expect(element).toHaveClass('test-class');
39-
expect(element).toHaveTextContent('Test Content');
40-
});
41-
42-
test('should apply droppable classes when canDrop is true', async () => {
43-
mockDropValidator.mockReturnValue(true);
44-
const DroppableComponent = makeDroppable({
45-
dropValidator: mockDropValidator,
46-
onDrop: mockOnDrop,
47-
})(TestComponent);
48-
49-
render(<DroppableComponent data-testid="droppable" />);
50-
51-
const element = screen.getByTestId('droppable');
52-
53-
// Simulate drag enter
54-
fireEvent.dragEnter(element, {
55-
dataTransfer: createDT(),
56-
});
57-
58-
await waitFor(() => expect(element).toHaveClass('is-droppable'));
59-
await waitFor(() => expect(element).toHaveClass('is-over'));
60-
});
61-
});
62-
63-
describe('Drag and drop events', () => {
64-
test('should call dropValidator on drag enter', () => {
65-
const mockProps = { className: 'test' };
66-
mockDropValidator.mockReturnValue(true);
67-
const DroppableComponent = makeDroppable({
68-
dropValidator: mockDropValidator,
69-
onDrop: mockOnDrop,
70-
})(TestComponent);
71-
72-
render(<DroppableComponent {...mockProps} data-testid="droppable" />);
73-
74-
const element = screen.getByTestId('droppable');
75-
const dataTransfer = createDT();
76-
77-
fireEvent.dragEnter(element, { dataTransfer });
78-
79-
expect(mockDropValidator).toHaveBeenCalledWith(expect.objectContaining(mockProps), dataTransfer);
80-
});
81-
82-
test('should call onDrop when item is dropped and canDrop is true', async () => {
83-
mockDropValidator.mockReturnValue(true);
84-
const DroppableComponent = makeDroppable({
85-
dropValidator: mockDropValidator,
86-
onDrop: mockOnDrop,
87-
})(TestComponent);
88-
89-
render(<DroppableComponent data-testid="droppable" />);
90-
91-
const element = screen.getByTestId('droppable');
92-
const dataTransfer = createDT();
93-
94-
// First drag enter to set canDrop to true, then drop
95-
fireEvent.dragEnter(element, { dataTransfer });
96-
fireEvent.drop(element, { dataTransfer });
97-
98-
await waitFor(() => expect(mockOnDrop).toHaveBeenCalled());
99-
});
100-
101-
test('should not call onDrop when canDrop is false', async () => {
102-
mockDropValidator.mockReturnValue(false);
103-
const DroppableComponent = makeDroppable({
104-
dropValidator: mockDropValidator,
105-
onDrop: mockOnDrop,
106-
})(TestComponent);
107-
108-
render(<DroppableComponent data-testid="droppable" />);
109-
110-
const element = screen.getByTestId('droppable');
111-
const dataTransfer = createDT();
112-
113-
// Drag enter with canDrop false, then drop
114-
fireEvent.dragEnter(element, { dataTransfer });
115-
fireEvent.drop(element, { dataTransfer });
116-
117-
await waitFor(() => expect(mockOnDrop).not.toHaveBeenCalled());
118-
});
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+
);
11955
});
12056

121-
describe('Component lifecycle', () => {
122-
test('should add event listeners on mount and remove them on unmount', () => {
123-
const addEventListenerSpy = jest.spyOn(Element.prototype, 'addEventListener');
124-
const removeEventListenerSpy = jest.spyOn(Element.prototype, 'removeEventListener');
125-
126-
const DroppableComponent = makeDroppable({
127-
dropValidator: mockDropValidator,
128-
onDrop: mockOnDrop,
129-
})(TestComponent);
130-
131-
const { unmount } = render(<DroppableComponent data-testid="droppable" />);
132-
133-
// Verify event listeners were added
134-
expect(addEventListenerSpy).toHaveBeenCalledWith('dragenter', expect.any(Function));
135-
expect(addEventListenerSpy).toHaveBeenCalledWith('dragover', expect.any(Function));
136-
expect(addEventListenerSpy).toHaveBeenCalledWith('dragleave', expect.any(Function));
137-
expect(addEventListenerSpy).toHaveBeenCalledWith('drop', expect.any(Function));
138-
139-
// Unmount component
140-
unmount();
141-
142-
// Verify event listeners were removed
143-
expect(removeEventListenerSpy).toHaveBeenCalledWith('dragenter', expect.any(Function));
144-
expect(removeEventListenerSpy).toHaveBeenCalledWith('dragover', expect.any(Function));
145-
expect(removeEventListenerSpy).toHaveBeenCalledWith('dragleave', expect.any(Function));
146-
expect(removeEventListenerSpy).toHaveBeenCalledWith('drop', expect.any(Function));
147-
148-
addEventListenerSpy.mockRestore();
149-
removeEventListenerSpy.mockRestore();
150-
});
151-
});
57+
test('should not allow drop when validator returns false', async () => {
58+
mockDropValidator.mockReturnValue(false);
59+
renderComponent();
15260

153-
describe('Edge cases', () => {
154-
test('should work without dropValidator (defaults to true)', async () => {
155-
const DroppableComponent = makeDroppable({
156-
onDrop: mockOnDrop,
157-
})(TestComponent);
61+
const element = screen.getByTestId('droppable');
62+
const dataTransfer = {} as DataTransfer;
15863

159-
render(<DroppableComponent data-testid="droppable" />);
64+
fireEvent.dragEnter(element, { dataTransfer });
65+
expect(element).not.toHaveClass('is-droppable');
66+
expect(element).toHaveClass('is-over');
16067

161-
const element = screen.getByTestId('droppable');
162-
const dataTransfer = createDT();
68+
fireEvent.drop(element, { dataTransfer });
16369

164-
fireEvent.dragEnter(element, { dataTransfer });
165-
await waitFor(() => expect(element).toHaveClass('is-droppable'));
166-
await waitFor(() => expect(element).toHaveClass('is-over'));
167-
});
70+
expect(mockOnDrop).not.toHaveBeenCalled();
16871
});
16972
});

0 commit comments

Comments
 (0)