diff --git a/definitions/npm/jest_v22.x.x/flow_v0.39.x-/jest_v22.x.x.js b/definitions/npm/jest_v22.x.x/flow_v0.39.x-/jest_v22.x.x.js index 0eee978242..60150a20ef 100644 --- a/definitions/npm/jest_v22.x.x/flow_v0.39.x-/jest_v22.x.x.js +++ b/definitions/npm/jest_v22.x.x/flow_v0.39.x-/jest_v22.x.x.js @@ -1,3 +1,9 @@ +type ExtractPromiseValueFunc = (Promise) => Value; +type ExtractPromiseValue = $Call< + ExtractPromiseValueFunc, + PromiseValue +>; + type JestMockFn, TReturn> = { (...args: TArguments): TReturn, /** @@ -63,7 +69,24 @@ type JestMockFn, TReturn> = { /** * Sugar for only returning a value once inside your mock */ - mockReturnValueOnce(value: TReturn): JestMockFn + mockReturnValueOnce(value: TReturn): JestMockFn, + + /** + * Sugar functions for returning a resolved Promise (Jest v22.2+) + */ + mockResolvedValue( + value: ExtractPromiseValue + ): JestMockFn, + + mockResolvedValueOnce( + value: ExtractPromiseValue + ): JestMockFn, + + /** + * Sugar functions for returning a rejected Promise (Jest v22.2+) + */ + mockRejectedValue(value: any): JestMockFn, + mockRejectedValueOnce(value: any): JestMockFn }; type JestAsymmetricEqualityType = { diff --git a/definitions/npm/jest_v22.x.x/flow_v0.39.x-/test_jest-v22.x.x.js b/definitions/npm/jest_v22.x.x/flow_v0.39.x-/test_jest-v22.x.x.js index 018de69cc2..a1e78b1806 100644 --- a/definitions/npm/jest_v22.x.x/flow_v0.39.x-/test_jest-v22.x.x.js +++ b/definitions/npm/jest_v22.x.x/flow_v0.39.x-/test_jest-v22.x.x.js @@ -13,12 +13,16 @@ jest.atoMockOff(); const mockFn = jest.fn(); mockFn.mock.calls.map(String).map(a => a + a); -type Foo = { - doStuff: string => number -}; +type Foo = {| + doStuff: string => number, + doAsyncStuff: void => Promise +|}; const foo: Foo = { doStuff(str: string): number { return 5; + }, + doAsyncStuff(): Promise { + return Promise.resolve(5); } }; foo.doStuff = jest.fn().mockImplementation(str => 10); @@ -44,6 +48,28 @@ foo.doStuff = jest.fn().mockReturnValueOnce(10); // $ExpectError Mock function expected to return number, not string. foo.doStuff = jest.fn().mockReturnValueOnce("10"); +foo.doAsyncStuff = jest.fn().mockResolvedValue(10); +// $ExpectError Mock function expected to return Promise, not Promise. +foo.doAsyncStuff = jest.fn().mockResolvedValue("10"); +// $ExpectError Can't return a Promise from a non async function +foo.doStuff = jest.fn().mockResolvedValue(10); + +foo.doAsyncStuff = jest.fn().mockResolvedValueOnce(10); +// $ExpectError Mock function expected to return Promise, not Promise. +foo.doAsyncStuff = jest.fn().mockResolvedValueOnce("10"); +// $ExpectError Can't return a Promise from a non async function +foo.doStuff = jest.fn().mockResolvedValueOnce(10); + +foo.doAsyncStuff = jest.fn().mockRejectedValue(new Error("error")); +// NOTE: No error as Flow doesn't type rejections +foo.doAsyncStuff = jest.fn().mockRejectedValue("10"); + +foo.doAsyncStuff = jest.fn().mockRejectedValueOnce(new Error("error")); +// NOTE: No error as Flow doesn't type rejections +foo.doAsyncStuff = jest.fn().mockRejectedValueOnce("10"); + + + const mockedDoStuff = (foo.doStuff = jest.fn().mockImplementation(str => 10)); mockedDoStuff.mock.calls[0][0].indexOf("a"); // $ExpectError function `doesntExist` not found in string.