From eb0178a9206a1bae570d86bbb96598c9c5d2cc7d Mon Sep 17 00:00:00 2001 From: Henry Lin Date: Wed, 31 May 2023 18:44:03 +0800 Subject: [PATCH] test: add tests for useCustomRef, useShallowReactive, useShallowReadonly --- src/__tests__/advanced.test.tsx | 120 +++++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 2 deletions(-) diff --git a/src/__tests__/advanced.test.tsx b/src/__tests__/advanced.test.tsx index 5fe966a..98e1eb0 100644 --- a/src/__tests__/advanced.test.tsx +++ b/src/__tests__/advanced.test.tsx @@ -1,8 +1,16 @@ import '@testing-library/jest-dom'; -import { isRef, useShallowRef } from '..'; +import { + isRef, + useCustomRef, + useShallowReactive, + useShallowRef, + isReactive, + isReadonly, + isShallow, + useShallowReadonly, +} from '..'; import 'jest-performance-testing'; import { renderHook } from '@testing-library/react'; -import { isShallow } from '@vue/reactivity'; describe('useShallowRef', () => { it('returns a valid ref', () => { @@ -33,3 +41,111 @@ describe('useShallowRef', () => { expect(result.current).toBe(ref); }); }); + +describe('useCustomRef', () => { + it('returns a valid ref', () => { + let value = 1; + const { result } = renderHook(() => + useCustomRef((track, trigger) => ({ + get() { + track(); + return value; + }, + set(val) { + value = val; + trigger(); + }, + })) + ); + expect(result.current.value).toBe(1); + expect(isRef(result.current)).toBe(true); + }); + it('keeps the same instance across re-render', () => { + let value = 1; + const { result, rerender } = renderHook(() => + useCustomRef((track, trigger) => ({ + get() { + track(); + return value; + }, + set(val) { + value = val; + trigger(); + }, + })) + ); + const ref = result.current; + + rerender(); + + expect(result.current).toBe(ref); + }); +}); + +describe('useShallowReactive', () => { + it('returns a valid reactive object', () => { + const { result } = renderHook(() => useShallowReactive({ a: 1, b: 2 })); + expect(result.current).toEqual({ a: 1, b: 2 }); + expect(isReactive(result.current)).toBe(true); + expect(isShallow(result.current)).toBe(true); + }); + it('keeps the same instance across re-render', () => { + const { result, rerender } = renderHook(() => + useShallowReactive({ a: 1, b: 2 }) + ); + const ref = result.current; + + rerender(); + + expect(result.current).toBe(ref); + }); + it('works with initializer function', () => { + const initializer = jest.fn(() => ({ a: 1, b: 2 })); + const { result, rerender } = renderHook(() => + useShallowReactive(initializer) + ); + const ref = result.current; + expect(result.current).toEqual({ a: 1, b: 2 }); + expect(initializer).toBeCalledTimes(1); + + rerender(); + + expect(result.current).toEqual({ a: 1, b: 2 }); + expect(initializer).toBeCalledTimes(1); + expect(result.current).toBe(ref); + }); +}); + +describe('useShallowReadonly', () => { + it('returns a valid readonly object', () => { + const { result } = renderHook(() => useShallowReadonly({ a: 1, b: 2 })); + expect(result.current).toEqual({ a: 1, b: 2 }); + expect(isReadonly(result.current)).toBe(true); + expect(isShallow(result.current)).toBe(true); + }); + it('keeps the same instance across re-render', () => { + const { result, rerender } = renderHook(() => + useShallowReadonly({ a: 1, b: 2 }) + ); + const ref = result.current; + + rerender(); + + expect(result.current).toBe(ref); + }); + it('works with initializer function', () => { + const initializer = jest.fn(() => ({ a: 1, b: 2 })); + const { result, rerender } = renderHook(() => + useShallowReadonly(initializer) + ); + const ref = result.current; + expect(result.current).toEqual({ a: 1, b: 2 }); + expect(initializer).toBeCalledTimes(1); + + rerender(); + + expect(result.current).toEqual({ a: 1, b: 2 }); + expect(initializer).toBeCalledTimes(1); + expect(result.current).toBe(ref); + }); +});