Skip to content

Commit 0228301

Browse files
committed
test(use-long-press): Add test for rendering hook in SSR context
1 parent 473b78b commit 0228301

File tree

2 files changed

+59
-28
lines changed

2 files changed

+59
-28
lines changed

packages/use-long-press/src/lib/tests/use-long-press.test.tsx

+54-26
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { act, renderHook } from "@testing-library/react-hooks";
2+
import { renderHook as renderHookSSR } from "@testing-library/react-hooks/server";
23
import { createEvent, fireEvent, render } from "@testing-library/react";
34
import { useLongPress } from "../use-long-press";
45
import {
@@ -39,7 +40,7 @@ import {
3940
getDOMTestHandlersMap,
4041
getTestHandlersMap
4142
} from "./use-long-press.test.utils";
42-
import { isMouseEvent, isPointerEvent, isTouchEvent } from "../use-long-press.utils";
43+
import { isMouseEvent, isPointerEvent, isRecognisableEvent, isTouchEvent } from "../use-long-press.utils";
4344

4445
/*
4546
⌜‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
@@ -127,42 +128,31 @@ describe('Hook handlers', () => {
127128
⎹ Component context tests
128129
⌞____________________________________________________________________________________________________
129130
*/
130-
describe('Browsers compatibility', () => {
131-
const originalTouchEvent = window.TouchEvent;
132-
133-
let touchEvent: React.TouchEvent;
134-
135-
let callback: MockedFunction<LongPressCallback>;
136-
let onStart: MockedFunction<LongPressCallback>;
137-
let onFinish: MockedFunction<LongPressCallback>;
138-
let onCancel: MockedFunction<LongPressCallback>;
139-
131+
describe('Different environments compatibility', () => {
140132
beforeEach(() => {
141133
// Use fake timers for detecting long press
142134
vi.useFakeTimers();
143-
144-
touchEvent = createMockedTouchEvent();
145-
146-
// Temporary remove TouchEvent from window to check if test will be properly handled
147-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
148-
// @ts-ignore
149-
delete window.TouchEvent;
150-
151-
callback = vi.fn();
152-
onStart = vi.fn();
153-
onFinish = vi.fn();
154-
onCancel = vi.fn();
155135
});
156136

157137
afterEach(() => {
158-
// Restore original window touch event
159-
window.TouchEvent = originalTouchEvent;
160-
161138
vi.clearAllMocks();
162139
vi.clearAllTimers();
163140
});
164141

165142
test('Properly detect TouchEvent event if browser doesnt provide test', () => {
143+
const originalTouchEvent = window.TouchEvent;
144+
const touchEvent = createMockedTouchEvent();
145+
146+
// Temporary remove TouchEvent from window to check if test will be properly handled
147+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
148+
// @ts-ignore
149+
delete window.TouchEvent;
150+
151+
const callback = vi.fn();
152+
const onStart = vi.fn();
153+
const onFinish = vi.fn();
154+
const onCancel = vi.fn();
155+
166156
const component = createTestElement({
167157
callback,
168158
onStart,
@@ -186,7 +176,45 @@ describe('Browsers compatibility', () => {
186176
expect(callback).toHaveBeenCalledWith(expectTouchEvent, emptyContext);
187177

188178
expect(onCancel).toHaveBeenCalledTimes(0);
179+
180+
// Restore original window touch event
181+
window.TouchEvent = originalTouchEvent;
189182
});
183+
184+
test.each([[LongPressEventType.Mouse], [LongPressEventType.Touch], [LongPressEventType.Pointer]])(
185+
'Using hook will not throw error when rendered in SSR context, using "%s" events',
186+
(eventType) => {
187+
const originalWindow = global.window;
188+
189+
// Temporary delete window
190+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
191+
// @ts-ignore
192+
delete global.window;
193+
194+
const callback = vi.fn();
195+
const onStart = vi.fn();
196+
const onMove = vi.fn();
197+
const onCancel = vi.fn();
198+
const onFinish = vi.fn();
199+
200+
const event = longPressMockedEventCreatorMap[eventType]();
201+
const { result } = renderHookSSR(() =>
202+
useLongPress(callback, { detect: eventType, onStart, onMove, onCancel, onFinish })
203+
);
204+
const handlers = getTestHandlersMap(eventType, result.current());
205+
206+
handlers.start(event);
207+
handlers.move(event);
208+
vi.runOnlyPendingTimers();
209+
handlers.stop(event);
210+
211+
expect(isRecognisableEvent(event)).toBe(true);
212+
expect(callback).toHaveBeenCalledTimes(1);
213+
214+
// Restore window
215+
global.window = originalWindow;
216+
}
217+
);
190218
});
191219

192220
describe('Detecting long press', () => {

packages/use-long-press/src/lib/use-long-press.utils.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ import {
66
TouchEvent as ReactTouchEvent,
77
} from 'react';
88

9-
const PointerEvent = global?.PointerEvent ?? window?.PointerEvent ?? null;
10-
const TouchEvent = global?.TouchEvent ?? window?.TouchEvent ?? null;
9+
const getPointerEvent = () => global?.PointerEvent ?? window?.PointerEvent ?? null;
10+
const getTouchEvent = () => global?.TouchEvent ?? window?.TouchEvent ?? null;
1111

1212
export function isTouchEvent<Target extends Element>(event: SyntheticEvent<Target>): event is ReactTouchEvent<Target> {
1313
const { nativeEvent } = event;
1414
if (!nativeEvent) {
1515
return false;
1616
}
17+
const TouchEvent = getTouchEvent();
1718

1819
return (TouchEvent && nativeEvent instanceof TouchEvent) || 'touches' in nativeEvent;
1920
}
2021

2122
export function isMouseEvent<Target extends Element>(event: SyntheticEvent<Target>): event is ReactMouseEvent<Target> {
23+
const PointerEvent = getPointerEvent();
2224
return event.nativeEvent instanceof MouseEvent && !(PointerEvent && event.nativeEvent instanceof PointerEvent);
2325
}
2426

@@ -30,6 +32,7 @@ export function isPointerEvent<Target extends Element>(
3032
return false;
3133
}
3234

35+
const PointerEvent = getPointerEvent();
3336
return (PointerEvent && nativeEvent instanceof PointerEvent) || 'pointerId' in nativeEvent;
3437
}
3538

0 commit comments

Comments
 (0)