Skip to content

Commit 2c70bc7

Browse files
authored
Write tests for navigation between app-dir and pages (vercel#43881)
- Add test for navigating app -> pages - Add test for navigation pages -> app - Remove unneeded React imports - Document back and forward on the BrowserInterface - Add test for navigating back and forth between pages and app pages using `back` and `forward`
1 parent f07f69d commit 2c70bc7

File tree

6 files changed

+115
-0
lines changed

6 files changed

+115
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Link from 'next/link'
2+
3+
export default function Page() {
4+
return (
5+
<div>
6+
<span id="app-page">App Page</span>
7+
<Link id="link-to-pages" href="/pages">
8+
To Pages
9+
</Link>
10+
</div>
11+
)
12+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export default function Layout({ children }) {
2+
return (
3+
<html>
4+
<head />
5+
<body>{children}</body>
6+
</html>
7+
)
8+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { createNext, FileRef } from 'e2e-utils'
2+
import { NextInstance } from 'test/lib/next-modes/base'
3+
import webdriver from 'next-webdriver'
4+
5+
describe('navigation between pages and app dir', () => {
6+
let next: NextInstance
7+
8+
beforeAll(async () => {
9+
next = await createNext({
10+
files: new FileRef(__dirname),
11+
dependencies: {
12+
react: 'latest',
13+
'react-dom': 'latest',
14+
typescript: 'latest',
15+
'@types/react': 'latest',
16+
'@types/node': 'latest',
17+
},
18+
})
19+
})
20+
afterAll(() => next.destroy())
21+
22+
it('It should be able to navigate app -> pages', async () => {
23+
const browser = await webdriver(next.url, '/app')
24+
expect(await browser.elementById('app-page').text()).toBe('App Page')
25+
await browser
26+
.elementById('link-to-pages')
27+
.click()
28+
.waitForElementByCss('#pages-page')
29+
expect(await browser.hasElementByCssSelector('#app-page')).toBeFalse()
30+
expect(await browser.elementById('pages-page').text()).toBe('Pages Page')
31+
})
32+
33+
it('It should be able to navigate pages -> app', async () => {
34+
const browser = await webdriver(next.url, '/pages')
35+
expect(await browser.elementById('pages-page').text()).toBe('Pages Page')
36+
await browser
37+
.elementById('link-to-app')
38+
.click()
39+
.waitForElementByCss('#app-page')
40+
expect(await browser.hasElementByCssSelector('#pages-page')).toBeFalse()
41+
expect(await browser.elementById('app-page').text()).toBe('App Page')
42+
})
43+
44+
it('It should be able to navigate pages -> app and go back an forward', async () => {
45+
const browser = await webdriver(next.url, '/pages')
46+
await browser
47+
.elementById('link-to-app')
48+
.click()
49+
.waitForElementByCss('#app-page')
50+
await browser.back().waitForElementByCss('#pages-page')
51+
expect(await browser.hasElementByCssSelector('#app-page')).toBeFalse()
52+
expect(await browser.elementById('pages-page').text()).toBe('Pages Page')
53+
await browser.forward().waitForElementByCss('#app-page')
54+
expect(await browser.hasElementByCssSelector('#pages-page')).toBeFalse()
55+
expect(await browser.elementById('app-page').text()).toBe('App Page')
56+
})
57+
58+
it('It should be able to navigate app -> pages and go back and forward', async () => {
59+
const browser = await webdriver(next.url, '/app')
60+
await browser
61+
.elementById('link-to-pages')
62+
.click()
63+
.waitForElementByCss('#pages-page')
64+
await browser.back().waitForElementByCss('#app-page')
65+
expect(await browser.hasElementByCssSelector('#pages-page')).toBeFalse()
66+
expect(await browser.elementById('app-page').text()).toBe('App Page')
67+
await browser.forward().waitForElementByCss('#pages-page')
68+
expect(await browser.hasElementByCssSelector('#app-page')).toBeFalse()
69+
expect(await browser.elementById('pages-page').text()).toBe('Pages Page')
70+
})
71+
})
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module.exports = {
2+
experimental: {
3+
appDir: true,
4+
},
5+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Link from 'next/link'
2+
3+
export default function Page() {
4+
return (
5+
<div>
6+
<span id="pages-page">Pages Page</span>
7+
<Link id="link-to-app" href="/app">
8+
To App
9+
</Link>
10+
</div>
11+
)
12+
}

test/lib/browsers/base.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,22 @@ export class BrowserInterface implements PromiseLike<any> {
7777
moveTo(): BrowserInterface {
7878
return this
7979
}
80+
// TODO(NEXT-290): type this correctly as awaitable
8081
waitForElementByCss(selector: string, timeout?: number): BrowserInterface {
8182
return this
8283
}
8384
waitForCondition(snippet: string, timeout?: number): BrowserInterface {
8485
return this
8586
}
87+
/**
88+
* Use browsers `go back` functionality.
89+
*/
8690
back(): BrowserInterface {
8791
return this
8892
}
93+
/**
94+
* Use browsers `go forward` functionality. Inverse of back.
95+
*/
8996
forward(): BrowserInterface {
9097
return this
9198
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy