import "jest" import { injectPromise } from '../src/inject-promise' import { RenderPromise } from '../src/render-promise' import * as TestRenderer from 'react-test-renderer' import * as React from "react" describe("Test Injecting Promise.", ()=>{ function makeComponent(){ const fooPromise = jest.fn(()=>new Promise(resolve=>setTimeout(()=>{ resolve("bar") }, 100))) const Comp = injectPromise({ values:{ foo:fooPromise }, shouldReload:(p1,p2)=>p1.far !== p2.far })((props)=>{ return
}) const renderer = TestRenderer.create() const div = renderer.root.findByType("div") return {div,fooPromise,renderer,Comp} } it('should render the underlying component',()=>{ const {div} = makeComponent() expect(div).toBeDefined() }) it('should inject some props',()=>{ const {div} = makeComponent() expect('foo' in div.props).toBeTruthy() expect(div.props.fooLoading).toBe(true) expect(div.props.reloadFoo).toBeInstanceOf(Function) expect(div.props.setFoo).toBeInstanceOf(Function) }) it('should resolve promise',(done)=>{ const {renderer,fooPromise,div} = makeComponent() setTimeout(()=>{ expect(div.props.foo).toBe("bar") expect(div.props.fooLoading).toBe(false) expect(fooPromise).toHaveBeenCalledTimes(1) done() }, 200) }) it('should reload promise when shouldReload returns true',(done)=>{ const {div,fooPromise,renderer,Comp} = makeComponent() setTimeout(()=>{ renderer.update() const div = renderer.root.findByType("div") expect(div.props.foo).toBeUndefined() expect(div.props.fooLoading).toBe(true) expect(fooPromise).toHaveBeenCalledTimes(2) done() }, 101) }) it('should reload promise when reload is called',(done)=>{ const {Comp,fooPromise,renderer,div} = makeComponent() setTimeout(()=>{ const promise = div.props.reloadFoo() expect(promise).toBeInstanceOf(Promise) promise.then(()=>{ expect(fooPromise).toHaveBeenCalledTimes(2) done() }) }, 101) }) it('should set the value when set is called',(done)=>{ const {Comp,fooPromise,div} = makeComponent() setTimeout(()=>{ expect(div.props.foo).toBe("bar") div.props.setFoo("boo") expect(div.props.foo).toBe("boo") expect(div.props.fooLoading).toBe(false) expect(fooPromise).toHaveBeenCalledTimes(1) done() }, 101) }) }) describe("Test Render Promise",()=>{ function makeComponent(){ const fooPromise = jest.fn(()=>new Promise(resolve=>setTimeout(()=>{ resolve("bar") }, 100))) const Comp = ({far,promise=fooPromise})=>{ return {injected=>{ return
}} } const renderer = TestRenderer.create() const div = renderer.root.findByType("div") return {div,fooPromise,renderer,Comp} } it('should render the underlying component',()=>{ const {div} = makeComponent() expect(div).toBeDefined() }) it('should inject some props',()=>{ const {div,fooPromise} = makeComponent() expect('value' in div.props).toBeTruthy() expect(div.props.valueLoading).toBe(true) expect(div.props.reloadValue).toBeInstanceOf(Function) expect(div.props.setValue).toBeInstanceOf(Function) }) it('should resolve promise',(done)=>{ const {div,fooPromise} = makeComponent() setTimeout(()=>{ expect(div.props.value).toBe("bar") expect(div.props.valueLoading).toBe(false) expect(fooPromise).toHaveBeenCalledTimes(1) done() }, 200) }) it('should reload promise when shouldReload returns true',(done)=>{ const {div,fooPromise,Comp,renderer} = makeComponent() setTimeout(()=>{ renderer.update() expect(div.props.value).toBeUndefined() expect(div.props.valueLoading).toBe(true) expect(fooPromise).toHaveBeenCalledTimes(2) done() }, 101) }) it('should reload promise when reload is called',(done)=>{ const {Comp,fooPromise,div} = makeComponent() setTimeout(()=>{ const promise = div.props.reloadValue() expect(promise).toBeInstanceOf(Promise) promise.then(()=>{ expect(div.props.value).toBe("bar") expect(fooPromise).toHaveBeenCalledTimes(2) done() }) }, 101) }) it('should set the value when set is called',(done)=>{ const {Comp,div,fooPromise} = makeComponent() setTimeout(()=>{ div.props.setValue("boo") expect(div.props.value).toBe("boo") expect(div.props.valueLoading).toBe(false) expect(fooPromise).toHaveBeenCalledTimes(1) done() }, 101) }) it('should not reload the value even if promise prop is changed',()=>{ const {Comp,div,renderer,fooPromise} = makeComponent() const newPromise = jest.fn(()=>Promise.resolve("gua")) renderer.update() expect(newPromise).toHaveBeenCalledTimes(0) expect(fooPromise).toHaveBeenCalledTimes(1) }) })