Skip to content

Commit 417affa

Browse files
committed
[test] Deal with double Effect invocation
1 parent 8d24e50 commit 417affa

5 files changed

Lines changed: 26 additions & 17 deletions

File tree

packages/next/src/client/link.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ const prefetched = new Set<string>()
147147
type PrefetchOptions = RouterPrefetchOptions & {
148148
/**
149149
* bypassPrefetchedCheck will bypass the check to see if the `href` has
150-
* already been fetched.
150+
* already been fetched i.e. unconditionally prefetch the `href`.
151151
*/
152-
bypassPrefetchedCheck?: boolean
152+
bypassPrefetchedCheck: boolean
153153
}
154154

155155
function prefetch(
@@ -576,7 +576,11 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkPropsReal>(
576576
}
577577

578578
// Prefetch the URL.
579-
prefetch(router, href, as, { locale })
579+
prefetch(router, href, as, {
580+
// dedupe across appear/disappear of the Link.
581+
bypassPrefetchedCheck: false,
582+
locale,
583+
})
580584
}, [as, href, isVisible, locale, prefetchEnabled, router?.locale, router])
581585

582586
const childProps: {

test/development/app-dir/browser-log-forwarding/fixtures/error-level/error-level.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ describe('browser-log-forwarding error level', () => {
2828
)
2929
.join('\n')
3030

31-
expect(browserLogs).toMatchInlineSnapshot(
32-
`"[browser] browser error: this is an error message "`
33-
)
31+
expect(browserLogs).toMatchInlineSnapshot(`
32+
"[browser] browser error: this is an error message
33+
[browser] browser error: this is an error message "
34+
`)
3435
})
3536
})
Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
import { nextTestSetup } from 'e2e-utils'
2-
import { check } from 'next-test-utils'
2+
import { retry } from 'next-test-utils'
33

44
describe('Strict Mode enabled by default', () => {
55
const { next } = nextTestSetup({
66
files: __dirname,
77
})
8-
// TODO: modern StrictMode does not double invoke effects during hydration: https://github.com/facebook/react/pull/28951
9-
it.skip('should work using browser', async () => {
8+
it('should work using browser', async () => {
109
const browser = await next.browser('/')
11-
await check(async () => {
12-
const text = await browser.elementByCss('p').text()
13-
// FIXME: Bug in React. Strict Effects no longer work in current beta.
14-
return text === '1' ? 'success' : `failed: ${text}`
15-
}, 'success')
10+
await retry(async () => {
11+
expect(await browser.elementByCss('p').text()).toBe('2')
12+
})
1613
})
1714
})

test/e2e/app-dir/log-file/log-file.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ describe('log-file', () => {
140140
{"timestamp":"xx:xx:xx.xxx","source":"Browser","level":"ERROR","message":"Client: This is an error message from client component \\n at ClientPage.useEffect (app/client/page.tsx:25:13)\\n 23 | circularObj.data.parent = circularObj\\n 24 | console.log('Client: Complex circular object:', circularObj)\\n> 25 | console.error('Client: This is an error message from client component')\\n | ^\\n 26 | console.warn('Client: This is a warning message from client component')\\n 27 | }, [])\\n 28 | (app/client/page.tsx:25:13)"}
141141
{"timestamp":"xx:xx:xx.xxx","source":"Server","level":"ERROR","message":"[browser] \\"Client: This is an error message from client component\\" \\"\\\\n at ClientPage.useEffect (app/client/page.tsx:25:13)\\\\n 23 | circularObj.data.parent = circularObj\\\\n 24 | console.log('Client: Complex circular object:', circularObj)\\\\n> 25 | console.error('Client: This is an error message from client component')\\\\n | ^\\\\n 26 | console.warn('Client: This is a warning message from client component')\\\\n 27 | }, [])\\\\n 28 |\\" \\"(app/client/page.tsx:25:13)\\""}
142142
{"timestamp":"xx:xx:xx.xxx","source":"Browser","level":"WARN","message":"Client: This is a warning message from client component"}
143+
{"timestamp":"xx:xx:xx.xxx","source":"Server","level":"WARN","message":"[browser] \\"Client: This is a warning message from client component\\" \\"(app/client/page.tsx:26:13)\\""}
144+
{"timestamp":"xx:xx:xx.xxx","source":"Browser","level":"LOG","message":"Client: Complex circular object: {\\"data\\":{\\"nested\\":{\\"items\\":[1,2,3],\\"value\\":42},\\"parent\\":\\"[Circular]\\"},\\"metadata\\":{\\"name\\":\\"safe stringify\\",\\"version\\":\\"1.0.0\\"},\\"name\\":\\"test\\"}"}
145+
{"timestamp":"xx:xx:xx.xxx","source":"Browser","level":"ERROR","message":"Client: This is an error message from client component \\n at ClientPage.useEffect (app/client/page.tsx:25:13)\\n 23 | circularObj.data.parent = circularObj\\n 24 | console.log('Client: Complex circular object:', circularObj)\\n> 25 | console.error('Client: This is an error message from client component')\\n | ^\\n 26 | console.warn('Client: This is a warning message from client component')\\n 27 | }, [])\\n 28 | (app/client/page.tsx:25:13)"}
146+
{"timestamp":"xx:xx:xx.xxx","source":"Server","level":"ERROR","message":"[browser] \\"Client: This is an error message from client component\\" \\"\\\\n at ClientPage.useEffect (app/client/page.tsx:25:13)\\\\n 23 | circularObj.data.parent = circularObj\\\\n 24 | console.log('Client: Complex circular object:', circularObj)\\\\n> 25 | console.error('Client: This is an error message from client component')\\\\n | ^\\\\n 26 | console.warn('Client: This is a warning message from client component')\\\\n 27 | }, [])\\\\n 28 |\\" \\"(app/client/page.tsx:25:13)\\""}
147+
{"timestamp":"xx:xx:xx.xxx","source":"Browser","level":"WARN","message":"Client: This is a warning message from client component"}
143148
{"timestamp":"xx:xx:xx.xxx","source":"Server","level":"WARN","message":"[browser] \\"Client: This is a warning message from client component\\" \\"(app/client/page.tsx:26:13)\\""}"
144149
`)
145150
})

test/e2e/app-dir/navigation/app/use-router/navigate.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import { useEffect, useState } from 'react'
44

55
export function NavigateAndTrackRouterIdentity({ href }) {
66
const router = useRouter()
7+
const [prevRouter, setPrevRouter] = useState(router)
78

8-
const [changedCount, setChangedCount] = useState(-1)
9-
useEffect(() => {
9+
const [changedCount, setChangedCount] = useState(0)
10+
if (prevRouter !== router) {
11+
setPrevRouter(router)
1012
setChangedCount((p) => p + 1)
11-
}, [router])
13+
}
1214

1315
const [navigationCount, setNavigationCount] = useState(0)
1416
const navigate = () => {

0 commit comments

Comments
 (0)