/**
* (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
*
* @emails oncall+recoil
* @flow strict-local
* @format
*/
'use strict';
const {
getRecoilTestFn
} = require('recoil-shared/__test_utils__/Recoil_TestingUtils');
let React, act, atom, selector, renderElements, useRecoilValue, useSetRecoilState, useRecoilRefresher;
const testRecoil = getRecoilTestFn(() => {
React = require('react');
({
act
} = require('ReactTestUtils'));
atom = require('../../recoil_values/Recoil_atom');
selector = require('../../recoil_values/Recoil_selector');
({
renderElements
} = require('recoil-shared/__test_utils__/Recoil_TestingUtils'));
useRecoilRefresher = require('../Recoil_useRecoilRefresher');
({
useRecoilValue,
useSetRecoilState
} = require('../Recoil_Hooks'));
});
testRecoil('useRecoilRefresher - no-op for atom', async () => {
const myAtom = atom({
key: 'useRecoilRefresher no-op',
default: 'default'
});
let refresh;
declare function Component(): any;
const container = renderElements();
expect(container.textContent).toBe('default');
act(() => refresh());
expect(container.textContent).toBe('default');
});
testRecoil('useRecoilRefresher - re-executes selector', async () => {
let i = 0;
const myselector = selector({
key: 'useRecoilRefresher re-execute',
get: () => i++
});
let refresh;
declare function Component(): any;
const container = renderElements();
expect(container.textContent).toBe('0');
act(() => refresh());
expect(container.textContent).toBe('1');
});
testRecoil('useRecoilRefresher - clears entire cache', async () => {
const myatom = atom({
key: 'useRecoilRefresher entire cache atom',
default: 'a'
});
let i = 0;
const myselector = selector({
key: 'useRecoilRefresher entire cache selector',
get: ({
get
}) => [get(myatom), i++]
});
let setMyAtom;
let refresh;
declare function Component(): any;
const container = renderElements();
expect(container.textContent).toBe('a-0');
act(() => setMyAtom('b'));
expect(container.textContent).toBe('b-1');
act(() => refresh());
expect(container.textContent).toBe('b-2');
act(() => setMyAtom('a'));
expect(container.textContent).toBe('a-3');
});
testRecoil('useRecoilRefresher - clears ancestor selectors', async () => {
const getA = jest.fn(() => 'A');
const selectorA = selector({
key: 'useRecoilRefresher ancestors A',
get: getA
});
const getB = jest.fn(({
get
}) => get(selectorA) + 'B');
const selectorB = selector({
key: 'useRecoilRefresher ancestors B',
get: getB
});
const getC = jest.fn(({
get
}) => get(selectorB) + 'C');
const selectorC = selector({
key: 'useRecoilRefresher ancestors C',
get: getC
});
let refresh;
declare function Component(): any;
const container = renderElements();
expect(container.textContent).toBe('ABC');
expect(getC).toHaveBeenCalledTimes(1);
expect(getB).toHaveBeenCalledTimes(1);
expect(getA).toHaveBeenCalledTimes(1);
act(() => refresh());
expect(container.textContent).toBe('ABC');
expect(getC).toHaveBeenCalledTimes(2);
expect(getB).toHaveBeenCalledTimes(2);
expect(getA).toHaveBeenCalledTimes(2);
});