Skip to content

Commit

Permalink
test: add tests for useCustomRef, useShallowReactive, useShallowReadonly
Browse files Browse the repository at this point in the history
  • Loading branch information
hlysine committed May 31, 2023
1 parent 045cfc0 commit eb0178a
Showing 1 changed file with 118 additions and 2 deletions.
120 changes: 118 additions & 2 deletions src/__tests__/advanced.test.tsx
Original file line number Diff line number Diff line change
@@ -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', () => {
Expand Down Expand Up @@ -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);
});
});

0 comments on commit eb0178a

Please sign in to comment.