Skip to content

Commit 6d7dcd9

Browse files
committed
main 🧊 rework test for server, rework use ref state
1 parent f92169c commit 6d7dcd9

File tree

23 files changed

+124
-83
lines changed

23 files changed

+124
-83
lines changed

‎src/hooks/useBattery/useBattery.test.ts‎

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
import { act, renderHook, waitFor } from '@testing-library/react';
22

3+
import { createTrigger, renderHookServer } from '@/tests';
4+
35
import { useBattery } from './useBattery';
46

5-
const events: Record<string, () => void> = {};
7+
const trigger = createTrigger<string, () => void>();
68
const mockBatteryManager = {
79
charging: true,
810
chargingTime: 0,
911
dischargingTime: 5,
1012
level: 1,
1113
addEventListener: (type: string, callback: () => void) => {
12-
events[type] = callback;
14+
trigger.add(type, callback);
1315
},
1416
removeEventListener: (type: string, callback: () => void) => {
15-
if (events[type] === callback) {
16-
delete events[type];
17+
if (trigger.get(type) === callback) {
18+
trigger.delete(type);
1719
}
1820
},
1921
dispatchEvent: (event: Event) => {
20-
events[event.type]?.();
22+
trigger.callback(event.type);
2123
return true;
2224
}
2325
};
@@ -59,24 +61,37 @@ it('Should use battery', async () => {
5961
);
6062
});
6163

62-
it('Should correct return for unsupported', async () => {
64+
it('Should use battery on server side', async () => {
65+
const { result } = renderHookServer(useBattery);
66+
67+
expect(result.current).toEqual({
68+
supported: false,
69+
value: {
70+
charging: false,
71+
chargingTime: 0,
72+
dischargingTime: 0,
73+
level: 0,
74+
loading: true
75+
}
76+
});
77+
});
78+
79+
it('Should use battery for unsupported', async () => {
6380
Object.assign(navigator, {
6481
getBattery: undefined
6582
});
6683
const { result } = renderHook(useBattery);
6784

68-
await waitFor(() =>
69-
expect(result.current).toEqual({
70-
supported: false,
71-
value: {
72-
charging: false,
73-
chargingTime: 0,
74-
dischargingTime: 0,
75-
level: 0,
76-
loading: false
77-
}
78-
})
79-
);
85+
expect(result.current).toEqual({
86+
supported: false,
87+
value: {
88+
charging: false,
89+
chargingTime: 0,
90+
dischargingTime: 0,
91+
level: 0,
92+
loading: false
93+
}
94+
});
8095
});
8196

8297
it('Should handle levelchange event', async () => {

‎src/hooks/useBattery/useBattery.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ export const useBattery = (): UseBatteryStateReturn => {
7676
battery = batteryManager;
7777
onChange();
7878

79-
batteryManager.addEventListener('levelchange', onChange);
80-
batteryManager.addEventListener('chargingchange', onChange);
81-
batteryManager.addEventListener('chargingtimechange', onChange);
82-
batteryManager.addEventListener('dischargingtimechange', onChange);
79+
battery.addEventListener('levelchange', onChange);
80+
battery.addEventListener('chargingchange', onChange);
81+
battery.addEventListener('chargingtimechange', onChange);
82+
battery.addEventListener('dischargingtimechange', onChange);
8383
});
8484

8585
return () => {

‎src/hooks/useDevicePixelRatio/useDevicePixelRatio.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { createTrigger } from '@/tests';
44

55
import { useDevicePixelRatio } from './useDevicePixelRatio';
66

7-
const trigger = createTrigger<() => void, string>();
7+
const trigger = createTrigger<string, () => void>();
88
const mockMediaQueryListAddEventListener = vi.fn();
99
const mockMediaQueryListRemoveEventListener = vi.fn();
1010
const MockMediaQueryList = class MediaQueryList {

‎src/hooks/useDevicePixelRatio/useDevicePixelRatio.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ export const useDevicePixelRatio = (): UseDevicePixelRatioReturn => {
2929
useEffect(() => {
3030
if (!supported) return;
3131

32-
const updatePixelRatio = () => setRatio(window.devicePixelRatio);
32+
const onChange = () => setRatio(window.devicePixelRatio);
3333

3434
const media = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);
35-
media.addEventListener('change', updatePixelRatio);
35+
media.addEventListener('change', onChange);
3636
return () => {
37-
media.removeEventListener('change', updatePixelRatio);
37+
media.removeEventListener('change', onChange);
3838
};
3939
}, [ratio]);
4040

‎src/hooks/useDocumentVisibility/useDocumentVisibility.test.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ it('Should use document visibility', () => {
1313

1414
it('Should use document visibility on server', () => {
1515
const { result } = renderHookServer(useDocumentVisibility);
16-
1716
expect(result.current).toBe('hidden');
1817
});
1918

‎src/hooks/useElementSize/useElementSize.test.ts‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { act, renderHook } from '@testing-library/react';
22

3-
import { createTrigger } from '@/tests';
3+
import { createTrigger, renderHookServer } from '@/tests';
44
import { getElement } from '@/utils/helpers';
55

66
import type { StateRef } from '../useRefState/useRefState';
77
import type { UseElementSizeReturn } from './useElementSize';
88

99
import { useElementSize } from './useElementSize';
1010

11-
const trigger = createTrigger<ResizeObserverCallback, Element>();
11+
const trigger = createTrigger<Element, ResizeObserverCallback>();
1212
const mockGetBoundingClientRect = vi.spyOn(Element.prototype, 'getBoundingClientRect');
1313
const mockResizeObserverDisconnect = vi.fn();
1414
const mockResizeObserverObserve = vi.fn();
@@ -61,6 +61,19 @@ targets.forEach((target) => {
6161
if (!target) expect(result.current.ref).toBeTypeOf('function');
6262
});
6363

64+
it('Should use element size on server side', () => {
65+
const { result } = renderHookServer(() => {
66+
if (target)
67+
return useElementSize(target) as {
68+
ref: StateRef<HTMLDivElement>;
69+
} & UseElementSizeReturn;
70+
return useElementSize<HTMLDivElement>();
71+
});
72+
73+
expect(result.current.value).toStrictEqual({ width: 0, height: 0 });
74+
if (!target) expect(result.current.ref).toBeTypeOf('function');
75+
});
76+
6477
it('Should set initial value', () => {
6578
mockGetBoundingClientRect.mockImplementation(() => new DOMRect(0, 0, 200, 200));
6679
const { result } = renderHook(() => {
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { useEffect, useLayoutEffect } from 'react';
22

3-
import { isClient } from '@/utils/helpers';
4-
53
/**
64
* @name useIsomorphicLayoutEffect
75
* @description - Hook conditionally selects either `useLayoutEffect` or `useEffect` based on the environment
@@ -10,4 +8,5 @@ import { isClient } from '@/utils/helpers';
108
* @example
119
* useIsomorphicLayoutEffect(() => console.log('effect'), [])
1210
*/
13-
export const useIsomorphicLayoutEffect = isClient ? useLayoutEffect : useEffect;
11+
export const useIsomorphicLayoutEffect =
12+
typeof window !== 'undefined' ? useLayoutEffect : useEffect;

‎src/hooks/useNetwork/useNetwork.test.ts‎

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
import { act, renderHook } from '@testing-library/react';
22

3-
// import { renderHookServer } from '@/tests';
3+
import { renderHookServer } from '@/tests';
4+
45
import { useNetwork } from './useNetwork';
56

67
const mockNavigatorOnline = vi.spyOn(navigator, 'onLine', 'get');
78

89
it('Should use network', () => {
910
const { result } = renderHook(useNetwork);
10-
1111
expect(result.current.online).toBeTruthy();
1212
});
1313

14-
// it('Should use network on server', () => {
15-
// const { result } = renderHookServer(useNetwork);
16-
17-
// expect(result.current).toEqual({
18-
// online: false,
19-
// type: undefined,
20-
// effectiveType: undefined,
21-
// saveData: false,
22-
// downlink: 0,
23-
// downlinkMax: 0,
24-
// rtt: 0
25-
// });
26-
// });
14+
it('Should use network on server side', () => {
15+
const { result } = renderHookServer(useNetwork);
16+
expect(result.current).toEqual({
17+
online: false,
18+
type: undefined,
19+
effectiveType: undefined,
20+
saveData: false,
21+
downlink: 0,
22+
downlinkMax: 0,
23+
rtt: 0
24+
});
25+
});
2726

2827
it('Should change state upon network events', () => {
2928
mockNavigatorOnline.mockReturnValue(true);

‎src/hooks/useNetwork/useNetwork.ts‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { useEffect, useState } from 'react';
22

3-
import { isClient } from '@/utils/helpers';
4-
53
export interface Connection extends EventTarget {
64
readonly downlink: number;
75
readonly downlinkMax: number;
@@ -67,7 +65,7 @@ export const getConnection = () =>
6765
*/
6866
export const useNetwork = (): UseNetworkReturn => {
6967
const [value, setValue] = useState(() => {
70-
if (!isClient) {
68+
if (typeof navigator === 'undefined') {
7169
return {
7270
online: false,
7371
type: undefined,

‎src/hooks/useOnline/useOnline.test.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ it('Should use online', () => {
1212
expect(result.current).toBeTruthy();
1313
});
1414

15-
it('Should use network on server', () => {
15+
it('Should use network on server side', () => {
1616
const { result } = renderHookServer(useOnline);
17-
1817
expect(result.current).toBeFalsy();
1918
});
2019

0 commit comments

Comments
 (0)