From cc1daa18fb08216a18f551500a1d2a6216404d25 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Fri, 12 May 2023 11:44:42 -0700 Subject: [PATCH] Create shared mock for scheduler (#4313) Summary: The version of scheduler we get internally is always the latest. However, on GitHub we get the version is a transitive dependency from `react-test-renderer`. Some methods in the unstable_mock have been renamed between these two versions. This mock file provides a centralized place to reconcile those differences so that the same tests can work both internally and on GitHub. I also tried manually upgrading `react-test-renderer` to the `experimental` tag in the hopes of getting GitHub to use the same version we have internally, and then transitively inherit the more recent version of `scheduler`. Unfortunately that created many test failures for reasons I don't currently fully understand. Pull Request resolved: https://github.com/facebook/relay/pull/4313 Reviewed By: voideanvalue Differential Revision: D45789944 Pulled By: captbaritone fbshipit-source-id: 1e2a0fb47667cd12bdbe13d9f819015a8d545f13 --- .../ReactRelayFragmentContainer-test.js | 4 +-- .../__tests__/ReactRelayQueryRenderer-test.js | 2 +- .../ReactRelayRefetchContainer-test.js | 4 +-- .../react-relay/__tests__/mockScheduler.js | 36 +++++++++++++++++++ ...nFragment-with-suspense-transition-test.js | 4 +-- .../__tests__/useEntryPointLoader-test.js | 2 +- ...eFragmentNode-react-double-effects-test.js | 2 +- .../__tests__/useFragmentNode-test.js | 4 +-- .../useQueryLoader-live-query-test.js | 2 +- ...seQueryLoader-react-double-effects-test.js | 2 +- .../__tests__/useQueryLoader-test.js | 2 +- .../useRefetchableFragmentNode-test.js | 4 +-- ...gmentNode-with-suspense-transition-test.js | 4 +-- 13 files changed, 48 insertions(+), 24 deletions(-) create mode 100644 packages/react-relay/__tests__/mockScheduler.js diff --git a/packages/react-relay/__tests__/ReactRelayFragmentContainer-test.js b/packages/react-relay/__tests__/ReactRelayFragmentContainer-test.js index afbe15ba66ba1..cbbe6369f0bae 100644 --- a/packages/react-relay/__tests__/ReactRelayFragmentContainer-test.js +++ b/packages/react-relay/__tests__/ReactRelayFragmentContainer-test.js @@ -82,9 +82,7 @@ describe('ReactRelayFragmentContainer', () => { } beforeEach(() => { - jest.mock('scheduler', () => { - return jest.requireActual('scheduler/unstable_mock'); - }); + jest.mock('scheduler', () => require('./mockScheduler')); environment = createMockEnvironment(); UserQuery = graphql` query ReactRelayFragmentContainerTestUserQuery($id: ID!) { diff --git a/packages/react-relay/__tests__/ReactRelayQueryRenderer-test.js b/packages/react-relay/__tests__/ReactRelayQueryRenderer-test.js index 8fc4140aa6655..b2e7a42cc85d4 100644 --- a/packages/react-relay/__tests__/ReactRelayQueryRenderer-test.js +++ b/packages/react-relay/__tests__/ReactRelayQueryRenderer-test.js @@ -10,7 +10,7 @@ 'use strict'; -jest.mock('scheduler', () => require('scheduler/unstable_mock')); +jest.mock('scheduler', () => require('./mockScheduler')); const ReactRelayContext = require('../ReactRelayContext'); const ReactRelayQueryRenderer = require('../ReactRelayQueryRenderer'); diff --git a/packages/react-relay/__tests__/ReactRelayRefetchContainer-test.js b/packages/react-relay/__tests__/ReactRelayRefetchContainer-test.js index 09c2c9a25e007..733c6dd125f24 100644 --- a/packages/react-relay/__tests__/ReactRelayRefetchContainer-test.js +++ b/packages/react-relay/__tests__/ReactRelayRefetchContainer-test.js @@ -88,9 +88,7 @@ describe('ReactRelayRefetchContainer', () => { } } beforeEach(() => { - jest.mock('scheduler', () => { - return jest.requireActual('scheduler/unstable_mock'); - }); + jest.mock('scheduler', () => require('./mockScheduler')); environment = createMockEnvironment(); UserFragment = graphql` fragment ReactRelayRefetchContainerTestUserFragment on User diff --git a/packages/react-relay/__tests__/mockScheduler.js b/packages/react-relay/__tests__/mockScheduler.js new file mode 100644 index 0000000000000..a38660d759e1b --- /dev/null +++ b/packages/react-relay/__tests__/mockScheduler.js @@ -0,0 +1,36 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + * @format + * @oncall relay + */ + +const invariant = require('invariant'); +const Scheduler = require('scheduler/unstable_mock'); + +// The version of scheduler we get internally is always the latest. However, the +// version we get on GitHub is a transitive dependency from `react-test-renderer`. +// +// Some methods in the unstable_mock have been renamed between these two +// versions. This mock file provides a centralized place to reconcile those +// differences so that the same tests can work both internally and on GitHub. + +if (Scheduler.log == null) { + invariant( + Scheduler.unstable_yieldValue != null, + 'Expected to find one of log or unstable_yieldValue', + ); + Scheduler.log = Scheduler.unstable_yieldValue; +} +if (Scheduler.unstable_clearLog == null) { + invariant( + Scheduler.unstable_clearYields != null, + 'Expected to find one of unstable_clearLog or unstable_clearYields', + ); + Scheduler.unstable_clearLog = Scheduler.unstable_clearYields; +} +module.exports = Scheduler; diff --git a/packages/react-relay/relay-hooks/__tests__/useBlockingPaginationFragment-with-suspense-transition-test.js b/packages/react-relay/relay-hooks/__tests__/useBlockingPaginationFragment-with-suspense-transition-test.js index 025750dbabfa7..a943e8688cd8f 100644 --- a/packages/react-relay/relay-hooks/__tests__/useBlockingPaginationFragment-with-suspense-transition-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useBlockingPaginationFragment-with-suspense-transition-test.js @@ -194,9 +194,7 @@ describe('useBlockingPaginationFragment with useTransition', () => { // Set up mocks jest.resetModules(); jest.mock('warning'); - jest.mock('scheduler', () => { - return jest.requireActual('scheduler/unstable_mock'); - }); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); // Supress `act` warnings since we are intentionally not // using it for most tests here. `act` currently always diff --git a/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js b/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js index 2fef1f05b6627..5cb751ff79643 100644 --- a/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js @@ -153,7 +153,7 @@ it('disposes the entry point and nullifies the state when the disposeEntryPoint }); beforeEach(() => { - jest.mock('scheduler', () => require('scheduler/unstable_mock')); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); }); afterEach(() => { diff --git a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-react-double-effects-test.js b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-react-double-effects-test.js index ee6fb2ce6c26f..13f25cc00eaca 100644 --- a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-react-double-effects-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-react-double-effects-test.js @@ -30,7 +30,7 @@ let renderSpy; // TODO(T83890478): enable once double invoked effects lands in xplat describe.skip('useFragmentNode-react-double-effects-test', () => { beforeEach(() => { - jest.mock('scheduler', () => require('scheduler/unstable_mock')); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); jest.mock('warning'); jest.spyOn(console, 'warn').mockImplementationOnce(() => {}); renderSpy = jest.fn<$ReadOnlyArray, mixed>(); diff --git a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js index 73d3b1fc23c42..c62e1fd31bfc9 100644 --- a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js @@ -237,9 +237,7 @@ describe.each([ } beforeEach(() => { - jest.mock('scheduler', () => { - return jest.requireActual('scheduler/unstable_mock'); - }); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); commitSpy = jest.fn(); renderSpy = jest.fn<[any], mixed>(); diff --git a/packages/react-relay/relay-hooks/__tests__/useQueryLoader-live-query-test.js b/packages/react-relay/relay-hooks/__tests__/useQueryLoader-live-query-test.js index ba679969d93b4..9a9195cd7dfff 100644 --- a/packages/react-relay/relay-hooks/__tests__/useQueryLoader-live-query-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useQueryLoader-live-query-test.js @@ -297,7 +297,7 @@ describe('when an initial preloaded query is passed', () => { }); beforeEach(() => { - jest.mock('scheduler', () => require('scheduler/unstable_mock')); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); }); afterEach(() => { diff --git a/packages/react-relay/relay-hooks/__tests__/useQueryLoader-react-double-effects-test.js b/packages/react-relay/relay-hooks/__tests__/useQueryLoader-react-double-effects-test.js index 125f4a790b14f..1d4aa8eac4040 100644 --- a/packages/react-relay/relay-hooks/__tests__/useQueryLoader-react-double-effects-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useQueryLoader-react-double-effects-test.js @@ -76,7 +76,7 @@ describe.skip('useQueryLoader-react-double-effects', () => { let loaderRenderLogs: Array; beforeEach(() => { - jest.mock('scheduler', () => require('scheduler/unstable_mock')); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); environment = createMockEnvironment(); diff --git a/packages/react-relay/relay-hooks/__tests__/useQueryLoader-test.js b/packages/react-relay/relay-hooks/__tests__/useQueryLoader-test.js index da99d0edf72be..9cadad9e48a0e 100644 --- a/packages/react-relay/relay-hooks/__tests__/useQueryLoader-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useQueryLoader-test.js @@ -347,7 +347,7 @@ describe('useQueryLoader', () => { }); beforeEach(() => { - jest.mock('scheduler', () => require('scheduler/unstable_mock')); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); }); afterEach(() => { diff --git a/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-test.js b/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-test.js index 64f60d3e039ae..59ad59c7476eb 100644 --- a/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-test.js @@ -200,9 +200,7 @@ describe.each([ // Set up mocks jest.spyOn(console, 'warn').mockImplementationOnce(() => {}); jest.mock('warning'); - jest.mock('scheduler', () => - jest.requireActual('scheduler/unstable_mock'), - ); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); /* $FlowFixMe[underconstrained-implicit-instantiation] error found when * enabling Flow LTI mode */ commitSpy = jest.fn<_, mixed>(); diff --git a/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-with-suspense-transition-test.js b/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-with-suspense-transition-test.js index 3e763073519f5..3357bbf71383d 100644 --- a/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-with-suspense-transition-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useRefetchableFragmentNode-with-suspense-transition-test.js @@ -180,9 +180,7 @@ describe('useRefetchableFragmentNode with useTransition', () => { // Set up mocks jest.resetModules(); jest.mock('warning'); - jest.mock('scheduler', () => { - return jest.requireActual('scheduler/unstable_mock'); - }); + jest.mock('scheduler', () => require('../../__tests__/mockScheduler')); // Supress `act` warnings since we are intentionally not // using it for most tests here. `act` currently always