/**
* 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');
}));
});