Skip to content

Commit c68a4e7

Browse files
test($core): add missing tests for Page (#2218)
1 parent 318068f commit c68a4e7

File tree

5 files changed

+274
-83
lines changed

5 files changed

+274
-83
lines changed

packages/@vuepress/core/lib/node/__tests__/prepare/Page.spec.js

Lines changed: 229 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -7,54 +7,51 @@ const {
77
readFile
88
} = require('./util')
99

10-
describe('Page', () => {
11-
let app
12-
let computed
10+
let app
11+
let computed
1312

14-
beforeAll(async () => {
15-
app = new App()
16-
await app.process()
17-
computed = new app.ClientComputedMixinConstructor()
18-
})
13+
beforeAll(async () => {
14+
app = new App()
15+
await app.process()
16+
computed = new app.ClientComputedMixinConstructor()
17+
})
1918

20-
test('pure route', async () => {
21-
const page = new Page({ path: '/' }, app)
19+
async function setupPage (options, processOption = {}) {
20+
const page = new Page(options, app)
21+
await page.process({ computed, ...processOption })
22+
return page
23+
}
2224

23-
expect(page.path).toBe('/')
24-
expect(page.regularPath).toBe('/')
25-
26-
await page.process({ computed })
25+
describe('pure route', () => {
26+
test('should get pure route', async () => {
27+
const page = await setupPage({ path: '/' })
2728

2829
expect(page.path).toBe('/')
2930
expect(page.regularPath).toBe('/')
31+
expect(page.frontmatter).toEqual({})
3032
})
3133

32-
test('pure route - encodeURI', async () => {
34+
test('should encode the path', async () => {
3335
const path = '/尤/'
34-
const page = new Page({ path }, app)
36+
const encodePath = encodeURI(path)
37+
const page = await setupPage({ path })
3538

36-
expect(page.path).toBe(encodeURI(path))
37-
expect(page.regularPath).toBe(encodeURI(path))
39+
expect(page.path).toBe(encodePath)
40+
expect(page.regularPath).toBe(encodePath)
3841
})
3942

40-
test('pure route - custom frontmatter', async () => {
41-
const frontmatter = { title: 'alpha' }
42-
const page = new Page({
43+
test('should be able to set custom frontmatter', async () => {
44+
const frontmatter = { foo: 'alpha' }
45+
const page = await setupPage({
4346
path: '/',
4447
frontmatter
45-
}, app)
46-
expect(page.frontmatter).toBe(frontmatter)
48+
})
49+
50+
expect(page.frontmatter.foo).toBe(frontmatter.foo)
4751
})
4852

49-
test('pure route - enhancers', async () => {
53+
test('should be able to use enhancers', async () => {
5054
const frontmatter = { title: 'alpha' }
51-
const page = new Page({
52-
path: '/',
53-
frontmatter
54-
}, app)
55-
56-
expect(page.frontmatter.title).toBe('alpha')
57-
5855
const enhancers = [
5956
{
6057
name: 'plugin-a',
@@ -63,91 +60,240 @@ describe('Page', () => {
6360
}
6461
}
6562
]
66-
await page.process({ computed, enhancers })
63+
const page = await setupPage({ path: '/', frontmatter }, { enhancers })
6764

6865
expect(page.frontmatter.title).toBe('beta')
6966
})
67+
})
68+
69+
describe('permalink', () => {
70+
test('should be able to set permalink', async () => {
71+
const page = await setupPage({ permalink: '/permalink' })
72+
73+
expect(page.path).toBe('/permalink')
74+
expect(page.regularPath).toBe('/permalink')
75+
})
76+
77+
test('should be able to set permalink from frontmatter', async () => {
78+
const frontmatter = { permalink: '/permalink' }
79+
const page = await setupPage({ path: '/', frontmatter })
80+
81+
expect(page.path).toBe('/permalink/')
82+
expect(page.regularPath).toBe('/')
83+
})
84+
85+
test('should be able to set permalink from global pattern', async () => {
86+
const permalinkPattern = '/:year/:month/:day/:slug'
87+
const { relative, filePath } = getDocument('2020-01-01-date.md')
88+
const markdown = getMarkdown()
89+
const page = await setupPage({ filePath, relative, permalinkPattern }, { markdown })
90+
expect(page.path).toBe('/2020/01/01/date/')
91+
expect(page.regularPath).toBe('/2020-01-01-date.html')
92+
93+
const pageWithLocalePath = await setupPage(
94+
{ filePath, relative, permalinkPattern },
95+
{ computed: { setPage () {}, $localePath: '/zh/' }, markdown }
96+
)
97+
expect(pageWithLocalePath.path).toBe('/zh/2020/01/01/date/')
98+
})
99+
})
70100

71-
test('markdown page - pointing to a markdown file', async () => {
101+
describe('markdown page', () => {
102+
test('should be able to pointing to a markdown file', async () => {
72103
const { relative, filePath } = getDocument('README.md')
73-
const page = new Page({ filePath, relative }, app)
104+
const markdown = getMarkdown()
105+
const page = await setupPage({ filePath, relative }, { markdown })
74106

75107
expect(page._filePath).toBe(filePath)
76108
expect(page.regularPath).toBe('/')
77109
expect(page.path).toBe('/')
78110
expect(page.frontmatter).toEqual({})
79111

80-
const markdown = getMarkdown()
81-
await page.process({ computed, markdown })
112+
const content = await readFile(filePath)
113+
114+
expect(page._content).toBe(content)
115+
expect(page._strippedContent).toBe(content)
116+
})
82117

83-
expect(page.title).toBe('Home')
118+
test('should be able add a page with explicit content', async () => {
119+
const { filePath } = getDocument('README.md')
84120
const content = await readFile(filePath)
121+
const markdown = getMarkdown()
122+
const page = await setupPage({ content }, { markdown })
123+
85124
expect(page._content).toBe(content)
86125
expect(page._strippedContent).toBe(content)
87126
})
88127

89-
test('markdown page - pointing to a markdown file with frontmatter', async () => {
128+
test('should work with frontmatter when pointing to a markdown file', async () => {
90129
const { relative, filePath } = getDocument('alpha.md')
91-
const page = new Page({ filePath, relative }, app)
130+
const title = 'VuePress Alpha' // from fixture
131+
const markdown = getMarkdown()
132+
const page = await setupPage({ filePath, relative }, { markdown })
92133

93134
expect(page._filePath).toBe(filePath)
94135
expect(page.regularPath).toBe('/alpha.html')
95136
expect(page.path).toBe('/alpha.html')
96-
expect(page.frontmatter).toEqual({})
137+
expect(page.frontmatter.title).toBe(title)
138+
expect(page._content.startsWith('---')).toBe(true)
139+
expect(page._strippedContent.startsWith('---')).toBe(false)
140+
})
97141

142+
test('should extract any content above <!-- more --> as excerpt', async () => {
143+
const { relative, filePath } = getDocument('excerpt.md')
98144
const markdown = getMarkdown()
99-
await page.process({ computed, markdown })
145+
const page = await setupPage({ filePath, relative }, { markdown })
100146

101-
expect(page.title).toBe(page.frontmatter.title)
102-
expect(page._content.startsWith('---')).toBe(true)
103-
expect(page._strippedContent.startsWith('---')).toBe(false)
147+
expect(page.excerpt).toMatchSnapshot()
104148
})
105149

106-
describe('enhance - ', () => {
107-
let page
108-
let enhancers
109-
110-
beforeEach(() => {
111-
page = new Page({ path: '/' }, app)
112-
enhancers = [
113-
{
114-
name: 'foo',
115-
value: jest.fn()
116-
},
117-
{
118-
name: 'bar',
119-
value: jest.fn()
120-
}
121-
]
122-
global.console.log = jest.fn()
123-
})
150+
test('should extract level 2 and 3 headers by default', async () => {
151+
const { relative, filePath } = getDocument('alpha.md')
152+
const markdown = getMarkdown()
153+
const page = await setupPage({ filePath, relative }, { markdown })
124154

125-
test('should loop over sync enhancers', async () => {
126-
await page.enhance(enhancers)
155+
expect(page.headers).toMatchSnapshot()
156+
})
127157

128-
return enhancers.map(enhancer => expect(enhancer.value).toHaveBeenCalled())
129-
})
158+
test('should extract headers by config', async () => {
159+
const { relative, filePath } = getDocument('alpha.md')
160+
const markdown = getMarkdown()
161+
const extractHeaders = ['h1', 'h2']
162+
const page = await setupPage({ filePath, relative, extractHeaders }, { markdown })
130163

131-
test('should loop over sync and async enhancers', async () => {
132-
const mixedEnhancers = [...enhancers, {
133-
name: 'blog',
134-
value: jest.fn().mockResolvedValue({})
135-
}]
136-
await page.enhance(mixedEnhancers)
164+
expect(page.headers).toMatchSnapshot()
165+
})
166+
})
137167

138-
return mixedEnhancers.map(enhancer => expect(enhancer.value).toHaveBeenCalled())
139-
})
168+
describe('title', () => {
169+
test('should be able to set title', async () => {
170+
const title = 'VuePress'
171+
const page = await setupPage({ path: '/', title })
172+
expect(page.title).toBe(title)
173+
})
140174

141-
test('should log and throw an error when enhancing fails', async () => {
142-
const error = { errorMessage: 'this is an error message' }
143-
const pluginName = 'error-plugin'
175+
test('should set title from frontmatter', async () => {
176+
const title = 'VuePress Alpha' // from fixture
177+
const { relative, filePath } = getDocument('alpha.md')
178+
const markdown = getMarkdown()
179+
const page = await setupPage({ filePath, relative }, { markdown })
180+
expect(page.title).toBe(title)
181+
})
144182

145-
await expect(page.enhance([{
146-
name: pluginName,
147-
value: jest.fn().mockRejectedValue(error)
148-
}])).rejects.toThrowError(`[${pluginName}] execute extendPageData failed.`)
183+
test('should use first header in markdown to set title ', async () => {
184+
const title = 'Home' // from fixture
185+
const { relative, filePath } = getDocument('README.md')
186+
const markdown = getMarkdown()
187+
const page = await setupPage({ filePath, relative }, { markdown })
188+
expect(page.title).toBe(title)
189+
})
190+
})
149191

150-
expect(console.log).toHaveBeenCalledWith(error)
151-
})
192+
describe('enhancer', () => {
193+
test('should loop over sync enhancers', async () => {
194+
const page = await setupPage({ path: '/' })
195+
const enhancers = [
196+
{
197+
name: 'foo',
198+
value: jest.fn()
199+
},
200+
{
201+
name: 'foo',
202+
value: jest.fn()
203+
}
204+
]
205+
await page.enhance(enhancers)
206+
207+
return enhancers.map(enhancer => expect(enhancer.value).toHaveBeenCalled())
208+
})
209+
210+
test('should loop over sync and async enhancers', async () => {
211+
const page = await setupPage({ path: '/' })
212+
const enhancers = [
213+
{
214+
name: 'foo',
215+
value: jest.fn()
216+
},
217+
{
218+
name: 'foo',
219+
value: jest.fn()
220+
}
221+
]
222+
const mixedEnhancers = [...enhancers, {
223+
name: 'blog',
224+
value: jest.fn().mockResolvedValue({})
225+
}]
226+
await page.enhance(mixedEnhancers)
227+
228+
return mixedEnhancers.map(enhancer => expect(enhancer.value).toHaveBeenCalled())
229+
})
230+
231+
test('should log and throw an error when enhancing fails', async () => {
232+
global.console.log = jest.fn()
233+
const pluginName = 'error-plugin'
234+
235+
const page = await setupPage({ path: '/' })
236+
const error = { errorMessage: 'this is an error message' }
237+
238+
await expect(page.enhance([{
239+
name: pluginName,
240+
value: jest.fn().mockRejectedValue(error)
241+
}])).rejects.toThrowError(`[${pluginName}] execute extendPageData failed.`)
242+
243+
expect(console.log).toHaveBeenCalledWith(error)
152244
})
153245
})
246+
247+
describe('public api', () => {
248+
test('dirname', async () => {
249+
const dirname = 'docs'
250+
const { relative, filePath } = getDocument('README.md')
251+
const markdown = getMarkdown()
252+
const page = await setupPage({ filePath, relative }, { markdown })
253+
expect(page.dirname).toBe(dirname)
254+
})
255+
256+
test('filename', async () => {
257+
const filename = 'README'
258+
const { relative, filePath } = getDocument(`${filename}.md`)
259+
const markdown = getMarkdown()
260+
const page = await setupPage({ filePath, relative }, { markdown })
261+
expect(page.filename).toBe(filename)
262+
})
263+
264+
test('slug', async () => {
265+
const markdown = getMarkdown()
266+
const dirname = 'docs'
267+
const indexPageFixture = getDocument('README.md')
268+
const indexPage = await setupPage(
269+
{ filePath: indexPageFixture.filePath, relative: indexPageFixture.relative }, { markdown }
270+
)
271+
expect(indexPage.slug).toBe(dirname)
272+
273+
const filename = 'alpha'
274+
const pageFixture = getDocument(`${filename}.md`)
275+
const page = await setupPage(
276+
{ filePath: pageFixture.filePath, relative: pageFixture.relative }, { markdown }
277+
)
278+
expect(page.slug).toBe(filename)
279+
})
280+
281+
test('strippedFilename', async () => {
282+
const { relative, filePath } = getDocument('2020-01-01-date.md')
283+
const markdown = getMarkdown()
284+
const page = await setupPage({ filePath, relative }, { markdown })
285+
expect(page.strippedFilename).toBe('date')
286+
})
287+
288+
test('date', async () => {
289+
const frontmatter = { date: '2020-01-01' }
290+
const dateInFrontmatterPage = await setupPage({ path: '/', frontmatter })
291+
expect(dateInFrontmatterPage.date).toBe('2020-01-01')
292+
293+
const { relative, filePath } = getDocument('2020-01-01-date.md')
294+
const markdown = getMarkdown()
295+
const dateInPathPage = await setupPage({ filePath, relative }, { markdown })
296+
expect(dateInPathPage.date).toBe('2020-01-01')
297+
})
298+
})
299+

0 commit comments

Comments
 (0)