/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails oncall+recoil * @flow strict-local * @format */ 'use strict'; const { getRecoilTestFn } = require('../../testing/Recoil_TestingUtils'); let React, act, constSelector, errorSelector, asyncSelector, renderElements, useRecoilValueLoadable; const testRecoil = getRecoilTestFn(() => { React = require('React'); ({ act } = require('ReactTestUtils')); constSelector = require('../../recoil_values/Recoil_constSelector'); errorSelector = require('../../recoil_values/Recoil_errorSelector'); ({ asyncSelector, renderElements } = require('../../testing/Recoil_TestingUtils')); ({ useRecoilValueLoadable } = require('../Recoil_Hooks')); }); // These tests should cover the Loadable interface returned by useRecoilValueLoadable. // It is also used by useRecoilStateNoThrow, waitForNone, and waitForAny testRecoil('useRecoilValueLoadable - loadable with value', async () => { const valueSel = constSelector('VALUE'); let promise; declare function ReadLoadable(): any; const c = renderElements(); expect(c.textContent).toEqual('VALUE'); await promise; }); testRecoil('useRecoilValueLoadable - loadable with error', async () => { const valueSel = errorSelector('ERROR'); let promise; declare function ReadLoadable(): any; const c = renderElements(); expect(c.textContent).toEqual('VALUE'); await promise; }); testRecoil('useRecoilValueLoadable - loading loadable', async () => { const [valueSel, resolve] = asyncSelector(); let resolved = false; const promises = []; declare function ReadLoadable(): any; const c = renderElements(); expect(c.textContent).toEqual('LOADING'); resolve('VALUE'); resolved = true; act(() => jest.runAllTimers()); expect(c.textContent).toEqual('VALUE'); await Promise.all(promises.map(async promise => { if (!(promise instanceof Promise)) { // for flow throw new Error('Expected a promise'); } const res = await promise; const val = typeof res === 'string' ? res : res.__value; expect(val).toBe('VALUE'); })); });