Skip to content

Commit

Permalink
coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
chartyom committed Jan 16, 2023
1 parent 59671bd commit 12c3cde
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 12 deletions.
44 changes: 43 additions & 1 deletion packages/rx-effects-react/src/useObserver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe('useObserver()', () => {
expect(listener2).toHaveBeenCalledTimes(1);
});

it('should check window', async () => {
it('should check window', () => {
const isBrowserFalsy = isBrowser();
expect(isBrowserFalsy).toBeFalsy();

Expand All @@ -60,6 +60,10 @@ describe('useObserver()', () => {

const isBrowserTruthy = isBrowser();
expect(isBrowserTruthy).toBeTruthy();

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
delete global.window;
});

it('should subscribe to error', () => {
Expand All @@ -75,6 +79,24 @@ describe('useObserver()', () => {
expect(observer.error).toHaveBeenCalledTimes(1);
});

it('should use useLayoutEffect when isBrowser is true', () => {
jest.resetModules();

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
global.window = {};

const useIsomorphicLayoutEffect =
// eslint-disable-next-line @typescript-eslint/no-var-requires
require('./useObserver').useIsomorphicLayoutEffect;

expect(typeof useIsomorphicLayoutEffect).toBe('function');

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
delete global.window;
});

it('should return a subscription', () => {
const source$ = new BehaviorSubject(1);
const listener = jest.fn();
Expand All @@ -88,6 +110,26 @@ describe('useObserver()', () => {
expect(listener).toHaveBeenCalledWith(1);
});

it('should do nothing if is unsubscribe', () => {
const source1$ = new BehaviorSubject(1);
const source2$ = new BehaviorSubject(1);
const listener = jest.fn();

const { result, rerender } = renderHook(
({ source$ }) => useObserver(source$, listener),
{ initialProps: { source$: source1$ } },
);

result.current.unsubscribe();

rerender({ source$: source2$ });

source2$.next(2);

expect(listener).toHaveBeenCalledTimes(1);
expect(listener).toHaveBeenCalledWith(1);
});

it('should unsubscribe on unmount', () => {
const source$ = new BehaviorSubject(1);
const listener = jest.fn();
Expand Down
16 changes: 5 additions & 11 deletions packages/rx-effects-react/src/useObserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,16 @@ export function useObserver<T>(
}
},
error: (error) => {
if (typeof argsRef.current === 'function') {
return;
}

const errorObserver = argsRef.current.error;
const errorObserver =
typeof argsRef.current !== 'function' && argsRef.current.error;

if (errorObserver) {
return errorObserver(error);
}
},
complete: () => {
if (typeof argsRef.current === 'function') {
return;
}

const completeObserver = argsRef.current.complete;
const completeObserver =
typeof argsRef.current !== 'function' && argsRef.current.complete;

if (completeObserver) {
return completeObserver();
Expand All @@ -92,7 +86,7 @@ export function isBrowser() {
/**
* Prevent React warning when using useLayoutEffect on server.
*/
const useIsomorphicLayoutEffect = isBrowser()
export const useIsomorphicLayoutEffect = isBrowser()
? useLayoutEffect
: /* istanbul ignore next: both are not called on server */
useEffect;

0 comments on commit 12c3cde

Please sign in to comment.