From f45cb707b52363f1cb1b32a0ebf2fdbdae79b322 Mon Sep 17 00:00:00 2001 From: Edwin Joseph Date: Tue, 13 Oct 2020 11:37:26 +0100 Subject: [PATCH] feat(useOrientation): add tests --- tests/useOrientation.test.ts | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/useOrientation.test.ts diff --git a/tests/useOrientation.test.ts b/tests/useOrientation.test.ts new file mode 100644 index 00000000..aa1d28a5 --- /dev/null +++ b/tests/useOrientation.test.ts @@ -0,0 +1,68 @@ +import { act, renderHook } from '@testing-library/react-hooks'; +import { replaceRaf } from 'raf-stub'; +import useOrientation from '../src/useOrientation'; +import { isClient } from '../src/util'; + +declare var requestAnimationFrame: { + reset: () => void; + step: (steps?: number, duration?: number) => void; +}; + +describe('useOrientation', () => { + beforeAll(() => { + replaceRaf(); + (window.screen.orientation as object) = { + type: 'landscape-primary', + angle: 0, + }; + }); + + afterEach(() => { + requestAnimationFrame.reset(); + }); + + it('should be defined', () => { + expect(useOrientation).toBeDefined(); + }); + + function getHook(...args) { + return renderHook(() => useOrientation(...args)); + } + + function triggerOrientation(type: string, angle: number) { + (window.screen.orientation.type as string) = type; + (window.screen.orientation.angle as number) = angle; + + window.dispatchEvent(new Event('orientationchange')); + } + + it('should return current window orientation', () => { + const hook = getHook(); + + expect(typeof hook.result.current).toBe('object'); + expect(typeof hook.result.current.type).toBe('string'); + expect(typeof hook.result.current.angle).toBe('number'); + }); + + it('should use passed parameters as initial values in case of non-browser use', () => { + const hook = getHook({ + angle: 90, + type: 'portrait-primary' + }); + + expect(hook.result.current.type).toBe(isClient ? window.screen.orientation.type : 'portrait-primary'); + expect(hook.result.current.angle).toBe(isClient ? window.screen.orientation.angle : 90); + }); + + it('should re-render after orientation change on closest RAF', () => { + const hook = getHook(); + + act(() => { + triggerOrientation('portrait-secondary', 180); + requestAnimationFrame.step(); + }); + + expect(hook.result.current.type).toBe('portrait-secondary'); + expect(hook.result.current.angle).toBe(180); + }); +});