import { Observable } from './observable'; import { getCollectionItems } from './utils'; describe('observable', () => { it('should be able to create an observable', async () => { const observable = new Observable(() => Promise.resolve(1)); expect(observable).toBeDefined(); const data = await observable.data; expect(data).toBe(1); }); it('should be able to combine observables', async () => { const observable1 = new Observable(() => Promise.resolve(1)); const observable2 = new Observable(() => Promise.resolve(2)); const combined = Observable.combine({ observable1, observable2 }); const data = await combined.data; expect(data.observable1).toBe(1); expect(data.observable2).toBe(2); }); it('should be able to update observable', async () => { const observable = new Observable(() => Promise.resolve(1)); const data = await observable.data; expect(data).toBe(1); observable.set(() => Promise.resolve(2)); const data2 = await observable.data; expect(data2).toBe(2); }); it('should be able to extract collection items', async () => { const observable = new Observable(() => Promise.resolve([ new Observable(() => Promise.resolve(1)), new Observable(() => Promise.resolve(2)), new Observable(() => Promise.resolve(3)), ]), ); const flatten = observable.pipe(getCollectionItems); const data = await flatten.data; expect(data).toEqual([1, 2, 3]); }); it('should update observable when subscribed', async () => { const observable = new Observable(() => Promise.resolve(1)); const spy = jest.fn(); observable.subscribe(spy); expect(spy).not.toHaveBeenCalled(); observable.set(() => Promise.resolve(2)); expect(spy).toHaveBeenCalled(); expect(spy).toHaveBeenCalledTimes(1); }); it('should update combined observable when subscribed', async () => { const observable1 = new Observable(() => Promise.resolve(1)); const observable2 = new Observable(() => Promise.resolve(2)); const combined = Observable.combine({ observable1, observable2 }); const spy = jest.fn(); const data1 = await combined.data; expect(data1.observable1).toBe(1); expect(data1.observable2).toBe(2); combined.subscribe(spy); expect(spy).not.toHaveBeenCalled(); observable2.set(() => Promise.resolve(3)); expect(spy).toHaveBeenCalled(); expect(spy).toHaveBeenCalledTimes(1); const data2 = await combined.data; expect(data2.observable1).toBe(1); expect(data2.observable2).toBe(3); }); });