UNPKG

9.95 kBJavaScriptView Raw
1const request = require('supertest')
2const views = require('../src')
3const path = require('path')
4const Koa = require('koa')
5const should = require('should')
6
7describe('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 // #25
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 // #138
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 // #23 && #27
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 // #43
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 // #82
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 // #87
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 // #94
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})