From ccba918281069f3ce003988f591389df4fefdde5 Mon Sep 17 00:00:00 2001 From: David Komer Date: Sat, 2 Sep 2023 07:05:23 +0300 Subject: [PATCH] chore(tests/utils): add observable tests (#2008) * observable-tests * observable-tests: plain rxjs with Subject * observable-tests: comments * Update atomWithObservable.test.tsx --------- Co-authored-by: Daishi Kato --- .../vanilla-utils/atomWithObservable.test.tsx | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/react/vanilla-utils/atomWithObservable.test.tsx b/tests/react/vanilla-utils/atomWithObservable.test.tsx index 2d5cc2d6c8..c2bda7809a 100644 --- a/tests/react/vanilla-utils/atomWithObservable.test.tsx +++ b/tests/react/vanilla-utils/atomWithObservable.test.tsx @@ -1,7 +1,7 @@ import { Component, StrictMode, Suspense, useState } from 'react' import type { ReactElement, ReactNode } from 'react' import { act, fireEvent, render, waitFor } from '@testing-library/react' -import { BehaviorSubject, Observable, Subject, delay, of } from 'rxjs' +import { BehaviorSubject, Observable, Subject, delay, map, of } from 'rxjs' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { fromValue, makeSubject, pipe, toObservable } from 'wonka' import { useAtom, useAtomValue, useSetAtom } from 'jotai/react' @@ -795,4 +795,33 @@ describe('atomWithObservable vanilla tests', () => { unsub() }) + + it('can propagate updates with rxjs chains', async () => { + const store = createStore() + + const single$ = new Subject() + const double$ = single$.pipe(map((n) => n * 2)) + + const singleAtom = atomWithObservable(() => single$) + const doubleAtom = atomWithObservable(() => double$) + + const unsubs = [ + store.sub(singleAtom, () => {}), + store.sub(doubleAtom, () => {}), + ] + + single$.next(1) + expect(store.get(singleAtom)).toBe(1) + expect(store.get(doubleAtom)).toBe(2) + + single$.next(2) + expect(store.get(singleAtom)).toBe(2) + expect(store.get(doubleAtom)).toBe(4) + + single$.next(3) + expect(store.get(singleAtom)).toBe(3) + expect(store.get(doubleAtom)).toBe(6) + + unsubs.forEach((unsub) => unsub()) + }) })