Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fast Refresh: test cyclic dependencies #12161

Merged
merged 2 commits into from
Apr 24, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 159 additions & 0 deletions test/acceptance/ReactRefresh.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,162 @@ test('can recover from a syntax error without losing state', async () => {

await cleanup()
})

test('cyclic dependencies', async () => {
const [session, cleanup] = await sandbox()

await session.write(
'NudgeOverview.js',
`
import * as React from 'react';

import { foo } from './routes';

const NudgeOverview = () => {
return <span />;
foo;
};

export default NudgeOverview;
`
)

await session.write(
'SurveyOverview.js',
`
const SurveyOverview = () => {
return 100;
};

export default SurveyOverview;
`
)

await session.write(
'Milestones.js',
`
import React from 'react';

import { fragment } from './DashboardPage';

const Milestones = props => {
return <span />;
fragment;
};

export default Milestones;
`
)

await session.write(
'DashboardPage.js',
`
import React from 'react';

import Milestones from './Milestones';
import SurveyOverview from './SurveyOverview';
import NudgeOverview from './NudgeOverview';

export const fragment = {};

const DashboardPage = () => {
return (
<>
<Milestones />
<SurveyOverview />
<NudgeOverview />
</>
);
};

export default DashboardPage;
`
)

await session.write(
'routes.js',
`
import DashboardPage from './DashboardPage';

export const foo = {};

console.warn('DashboardPage at import time:', DashboardPage);
setTimeout(() => console.warn('DashboardPage after:', DashboardPage), 0);

export default DashboardPage;
`
)

await session.patch(
'index.js',
`
import * as React from 'react';

import DashboardPage from './routes';

const HeroApp = (props) => {
return <p>Hello. {DashboardPage ? <DashboardPage /> : null}</p>;
};

export default HeroApp;
`
)

expect(
await session.evaluate(() => document.querySelector('p').textContent)
).toBe('Hello. 100')

let didFullRefresh = !(await session.patch(
'SurveyOverview.js',
`
const SurveyOverview = () => {
return 200;
};

export default SurveyOverview;
`
))

expect(
await session.evaluate(() => document.querySelector('p').textContent)
).toBe('Hello. 200')
expect(didFullRefresh).toBe(false)

didFullRefresh = !(await session.patch(
'index.js',
`
import * as React from 'react';

import DashboardPage from './routes';

const HeroApp = (props) => {
return <p>Hello: {DashboardPage ? <DashboardPage /> : null}</p>;
};

export default HeroApp;
`
))

expect(
await session.evaluate(() => document.querySelector('p').textContent)
).toBe('Hello: 200')
expect(didFullRefresh).toBe(false)

didFullRefresh = !(await session.patch(
'SurveyOverview.js',
`
const SurveyOverview = () => {
return 300;
};

export default SurveyOverview;
`
))

expect(
await session.evaluate(() => document.querySelector('p').textContent)
).toBe('Hello: 300')
expect(didFullRefresh).toBe(false)

await cleanup()
})