1 | const request = require('supertest')
|
2 | const views = require('../src')
|
3 | const path = require('path')
|
4 | const Koa = require('koa')
|
5 | const should = require('should')
|
6 |
|
7 | describe('koa-views', () => {
|
8 | it('have a render method', done => {
|
9 | const app = new Koa().use(views()).use(ctx => {
|
10 | should(ctx.render).be.ok()
|
11 | should(ctx.render).be.a.Function()
|
12 | should(ctx.response.render).be.equal(ctx.render)
|
13 | })
|
14 |
|
15 | request(app.listen())
|
16 | .get('/')
|
17 | .expect(404, done)
|
18 | })
|
19 |
|
20 | it('have a render method by app.context', done => {
|
21 | const app = new Koa()
|
22 | const render = views()()
|
23 |
|
24 | app.context.render = render
|
25 | app.response.render = render
|
26 |
|
27 | app.use(ctx => {
|
28 | should(ctx.render).be.ok()
|
29 | should(ctx.render).be.a.Function()
|
30 | should(ctx.response.render).be.equal(ctx.render)
|
31 | })
|
32 |
|
33 | request(app.listen())
|
34 | .get('/')
|
35 | .expect(404, done)
|
36 | })
|
37 |
|
38 | it('default to html', done => {
|
39 | const app = new Koa().use(views(__dirname)).use(ctx => {
|
40 | return ctx.render('./fixtures/basic')
|
41 | })
|
42 |
|
43 | request(app.listen())
|
44 | .get('/')
|
45 | .expect('Content-Type', /html/)
|
46 | .expect(/basic:html/)
|
47 | .expect(200, done)
|
48 | })
|
49 |
|
50 | it('default to html', done => {
|
51 | const app = new Koa()
|
52 | const render = views(__dirname)()
|
53 |
|
54 | app.context.render = render
|
55 | app.response.render = render
|
56 |
|
57 | app.use(ctx => {
|
58 | return ctx.render('./fixtures/basic')
|
59 | })
|
60 |
|
61 | request(app.listen())
|
62 | .get('/')
|
63 | .expect('Content-Type', /html/)
|
64 | .expect(/basic:html/)
|
65 | .expect(200, done)
|
66 | })
|
67 |
|
68 | it('autoRender is false', done => {
|
69 | const app = new Koa().use(views(__dirname, { autoRender: false, extension: 'ejs' })).use(async (ctx) => {
|
70 | const res = await ctx.render('./fixtures/basic')
|
71 | ctx.body = res
|
72 | })
|
73 |
|
74 | request(app.listen())
|
75 | .get('/')
|
76 | .expect('Content-Type', /html/)
|
77 | .expect(/basic:ejs/)
|
78 | .expect(200, done)
|
79 | })
|
80 |
|
81 | it('autoRender is false by app.context', done => {
|
82 | const app = new Koa()
|
83 | const render = views(__dirname, { autoRender: false, extension: 'ejs' })()
|
84 |
|
85 | app.context.render = render
|
86 | app.response.render = render
|
87 |
|
88 | app.use(async (ctx) => {
|
89 | const res = await ctx.render('./fixtures/basic')
|
90 | ctx.body = res
|
91 | })
|
92 |
|
93 | request(app.listen())
|
94 | .get('/')
|
95 | .expect('Content-Type', /html/)
|
96 | .expect(/basic:ejs/)
|
97 | .expect(200, done)
|
98 | })
|
99 |
|
100 | it('default to [ext] if a default engine is set', done => {
|
101 | const app = new Koa()
|
102 | .use(views(__dirname, { extension: 'pug' }))
|
103 | .use(ctx => {
|
104 | return ctx.render('./fixtures/basic')
|
105 | })
|
106 |
|
107 | request(app.listen())
|
108 | .get('/')
|
109 | .expect('Content-Type', /html/)
|
110 | .expect(/basic:jade/)
|
111 | .expect(200, done)
|
112 | })
|
113 |
|
114 | it('set and render state', done => {
|
115 | const app = new Koa()
|
116 | .use(views(__dirname, { extension: 'pug' }))
|
117 | .use(ctx => {
|
118 | ctx.state.engine = 'pug'
|
119 | return ctx.render('./fixtures/global-state')
|
120 | })
|
121 |
|
122 | request(app.listen())
|
123 | .get('/')
|
124 | .expect('Content-Type', /html/)
|
125 | .expect(/basic:pug/)
|
126 | .expect(200, done)
|
127 | })
|
128 |
|
129 |
|
130 | it('works with circular references in state', done => {
|
131 | const app = new Koa()
|
132 | .use(views(__dirname, { extension: 'pug' }))
|
133 | .use(function (ctx) {
|
134 | ctx.state = {
|
135 | a: {},
|
136 | app
|
137 | }
|
138 |
|
139 | ctx.state.a.a = ctx.state.a
|
140 |
|
141 | return ctx.render('./fixtures/global-state', {
|
142 | app,
|
143 | b: this.state,
|
144 | engine: 'pug'
|
145 | })
|
146 | })
|
147 |
|
148 | request(app.listen())
|
149 | .get('/')
|
150 | .expect('Content-Type', /html/)
|
151 | .expect(/basic:pug/)
|
152 | .expect(200, done)
|
153 | })
|
154 |
|
155 |
|
156 | it('works with bigint in state', done => {
|
157 | const app = new Koa()
|
158 | .use(views(__dirname, { extension: 'pug' }))
|
159 | .use(function (ctx) {
|
160 | ctx.state = {
|
161 | a: { x: 132n },
|
162 | app
|
163 | }
|
164 |
|
165 | return ctx.render('./fixtures/global-state', {
|
166 | app,
|
167 | b: this.state,
|
168 | engine: 'pug'
|
169 | })
|
170 | })
|
171 |
|
172 | request(app.listen())
|
173 | .get('/')
|
174 | .expect('Content-Type', /html/)
|
175 | .expect(/basic:pug/)
|
176 | .expect(200, done)
|
177 | })
|
178 |
|
179 | it('`map` given `engine` to given file `ext`', done => {
|
180 | const app = new Koa()
|
181 | .use(views(__dirname, { map: { html: 'underscore' } }))
|
182 | .use(ctx => {
|
183 | ctx.state.engine = 'underscore'
|
184 | return ctx.render('./fixtures/underscore')
|
185 | })
|
186 |
|
187 | request(app.listen())
|
188 | .get('/')
|
189 | .expect('Content-Type', /html/)
|
190 | .expect(/basic:underscore/)
|
191 | .expect(200, done)
|
192 | })
|
193 |
|
194 | it('merges global and local state ', done => {
|
195 | const app = new Koa()
|
196 | .use(views(__dirname, { extension: 'pug' }))
|
197 | .use(ctx => {
|
198 | ctx.state.engine = 'pug'
|
199 |
|
200 | return ctx.render('./fixtures/state', {
|
201 | type: 'basic'
|
202 | })
|
203 | })
|
204 |
|
205 | request(app.listen())
|
206 | .get('/')
|
207 | .expect('Content-Type', /html/)
|
208 | .expect(/basic:pug/)
|
209 | .expect(200, done)
|
210 | })
|
211 |
|
212 | it('call to the next middleware if this.render is already defined', done => {
|
213 | const app = new Koa()
|
214 | .use((ctx, next) => {
|
215 | ctx.render = true
|
216 | return next()
|
217 | })
|
218 | .use(views())
|
219 | .use(ctx => {
|
220 | ctx.body = 'hello'
|
221 | })
|
222 |
|
223 | request(app.listen())
|
224 | .get('/')
|
225 | .expect('hello')
|
226 | .expect(200, done)
|
227 | })
|
228 |
|
229 | it('allows view options to be passed in', done => {
|
230 | const app = new Koa()
|
231 | .use(
|
232 | views(__dirname, {
|
233 | map: { hbs: 'handlebars' },
|
234 | options: {
|
235 | helpers: {
|
236 | uppercase: str => str.toUpperCase()
|
237 | },
|
238 |
|
239 | partials: {
|
240 | subTitle: './view-options-partial'
|
241 | }
|
242 | }
|
243 | })
|
244 | )
|
245 | .use(ctx => {
|
246 | ctx.state = { title: 'my title', author: 'queckezz' }
|
247 | return ctx.render('./fixtures/view-options.hbs')
|
248 | })
|
249 |
|
250 | const server = request(app.listen())
|
251 | server
|
252 | .get('/')
|
253 | .expect(/MY TITLE/)
|
254 | .expect(200, () => {
|
255 | server
|
256 | .get('/')
|
257 | .expect(/MY TITLE/)
|
258 | .expect(200, done)
|
259 | })
|
260 | })
|
261 |
|
262 |
|
263 | it('given a directory it should try to require index.[ext]', done => {
|
264 | const app = new Koa().use(views(__dirname)).use(ctx => {
|
265 | return ctx.render('./fixtures')
|
266 | })
|
267 |
|
268 | request(app.listen())
|
269 | .get('/')
|
270 | .expect(/defaults-to-index/)
|
271 | .expect(200, done)
|
272 | })
|
273 |
|
274 |
|
275 | it('it should not overwrite an extension when given one', done => {
|
276 | const app = new Koa().use(views(__dirname)).use(ctx => {
|
277 | return ctx.render('./fixtures/basic.ejs')
|
278 | })
|
279 |
|
280 | request(app.listen())
|
281 | .get('/')
|
282 | .expect(/basic:ejs/)
|
283 | .expect(200, done)
|
284 | })
|
285 |
|
286 | it('it should use an engineSource other than consolidate when provided', done => {
|
287 | const app = new Koa()
|
288 | .use(
|
289 | views(__dirname, {
|
290 | engineSource: {
|
291 | foo: () => Promise.resolve('hello')
|
292 | }
|
293 | })
|
294 | )
|
295 | .use(ctx => {
|
296 | return ctx.render('./fixtures/basic.foo')
|
297 | })
|
298 |
|
299 | request(app.listen())
|
300 | .get('/')
|
301 | .expect(/hello/)
|
302 | .expect(200, done)
|
303 | })
|
304 |
|
305 |
|
306 | describe('extension is ejs, frist visit basic.html then visit basic should render basic.ejs', () => {
|
307 | const app = new Koa()
|
308 | .use(
|
309 | views(__dirname, {
|
310 | extension: 'ejs'
|
311 | })
|
312 | )
|
313 | .use((ctx, next) => {
|
314 | if (ctx.path === '/html') {
|
315 | return ctx.render('./fixtures/basic.html')
|
316 | }
|
317 | return next()
|
318 | })
|
319 | .use((ctx, next) => {
|
320 | if (ctx.path === '/ejs') {
|
321 | return ctx.render('./fixtures/basic')
|
322 | }
|
323 | return next()
|
324 | })
|
325 |
|
326 | const server = request(app.listen())
|
327 |
|
328 | it('first visit html', done => {
|
329 | server
|
330 | .get('/html')
|
331 | .expect(/basic:html/)
|
332 | .expect(200, done)
|
333 | })
|
334 |
|
335 | it('then visit ejs should render basic basic.ejs', done => {
|
336 | server
|
337 | .get('/ejs')
|
338 | .expect(/basic:ejs/)
|
339 | .expect(200, done)
|
340 | })
|
341 | })
|
342 |
|
343 |
|
344 | it('name with dot', done => {
|
345 | const app = new Koa().use(views(__dirname)).use(ctx => {
|
346 | return ctx.render('./fixtures/basic.test')
|
347 | })
|
348 |
|
349 | request(app.listen())
|
350 | .get('/')
|
351 | .expect('Content-Type', /html/)
|
352 | .expect(/basic:html/)
|
353 | .expect(200, done)
|
354 | })
|
355 |
|
356 |
|
357 | it('nunjucks with nunjucksEnv', done => {
|
358 | const nunjucks = require('nunjucks')
|
359 | const env = new nunjucks.Environment(
|
360 | new nunjucks.FileSystemLoader(path.join(__dirname, 'fixtures'))
|
361 | )
|
362 | env.addFilter('shorten', (str, count) => {
|
363 | return str.slice(0, count || 5)
|
364 | })
|
365 |
|
366 | const app = new Koa()
|
367 | .use(
|
368 | views(path.join(__dirname, 'fixtures'), {
|
369 | options: {
|
370 | nunjucksEnv: env
|
371 | },
|
372 | map: { html: 'nunjucks' }
|
373 | })
|
374 | )
|
375 | .use(ctx => {
|
376 | return ctx.render('nunjucks-filter', {
|
377 | message: 'this is a long message'
|
378 | })
|
379 | })
|
380 |
|
381 | request(app.listen())
|
382 | .get('/')
|
383 | .expect('Content-Type', /html/)
|
384 | .expect(/this </)
|
385 | .expect(200, done)
|
386 | })
|
387 |
|
388 | it('nunjucks with nunjucksEnv by app.context', done => {
|
389 | const nunjucks = require('nunjucks')
|
390 | const env = new nunjucks.Environment(
|
391 | new nunjucks.FileSystemLoader(path.join(__dirname, 'fixtures'))
|
392 | )
|
393 | env.addFilter('shorten', (str, count) => {
|
394 | return str.slice(0, count || 5)
|
395 | })
|
396 |
|
397 | const app = new Koa()
|
398 | const render = views(path.join(__dirname, 'fixtures'), {
|
399 | options: {
|
400 | nunjucksEnv: env
|
401 | },
|
402 | map: { html: 'nunjucks' }
|
403 | })()
|
404 |
|
405 | app.context.render = render
|
406 | app.response.render = render
|
407 |
|
408 | app.use(ctx => {
|
409 | return ctx.render('nunjucks-filter', {
|
410 | message: 'this is a long message'
|
411 | })
|
412 | })
|
413 |
|
414 | request(app.listen())
|
415 | .get('/')
|
416 | .expect('Content-Type', /html/)
|
417 | .expect(/this </)
|
418 | .expect(200, done)
|
419 | })
|
420 | })
|