UNPKG

3.85 kBJavaScriptView Raw
1var request = require('supertest');
2var path = require('path');
3var rewire = require('rewire');
4var assert = require('assert');
5var fs = require('fs');
6
7
8/**
9 * Creates instance of example app using an injected version of express-hbs to track the number of times a
10 * file is read. Additionally, the $NODE_ENV environment variable may be set.
11 *
12 * @param env
13 * @returns {{app: hbs, readCounts: {}}}
14 */
15function createApp(env) {
16 var readCounts = {};
17 var hbs = rewire('../lib/hbs');
18 hbs.__set__('fs', {
19 readFileSync: function(filename, encoding) {
20 if (typeof readCounts[filename] === 'undefined') {
21 readCounts[filename] = 1;
22 } else {
23 readCounts[filename] += 1;
24 }
25
26 return fs.readFileSync(filename, encoding);
27 },
28
29 readFile: function(filename, encoding, cb) {
30 if (typeof readCounts[filename] === 'undefined') {
31 readCounts[filename] = 1;
32 } else {
33 readCounts[filename] += 1;
34 }
35
36 fs.readFile(filename, encoding, cb);
37 },
38 existsSync: function(filename, encoding) {
39 return fs.existsSync(filename, encoding);
40 }
41 });
42
43 // used mocked hbs in example
44 var example = require('../example/app');
45 var app = example.create(hbs, env);
46 return {app: app, readCounts: readCounts};
47}
48
49
50describe('express-hbs', function() {
51 describe('cache', function() {
52
53 it('should not cache layout in `development`', function(done) {
54 var mock = createApp('development');
55
56 request(mock.app)
57 .get('/')
58 .end(function(err) {
59 assert.ifError(err);
60
61 request(mock.app)
62 .get('/')
63 .expect(/DEFAULT LAYOUT/)
64 .end(function(err) {
65 assert.ifError(err);
66
67 var filename = path.resolve(__dirname, '../example/views/layout/default.hbs');
68 assert.equal(mock.readCounts[filename], 2);
69 done();
70 });
71 });
72 });
73
74 it('should cache layout in `production` reading file once', function(done) {
75 var mock = createApp('production');
76
77 // reads layout from fs once
78 request(mock.app)
79 .get('/')
80 .end(function(err) {
81 assert.ifError(err);
82
83 request(mock.app)
84 .get('/')
85 .expect(/DEFAULT LAYOUT/)
86 .end(function(err, res) {
87 assert.ifError(err);
88
89 var filename = path.resolve(__dirname, '../example/views/layout/default.hbs');
90 assert.equal(mock.readCounts[filename], 1);
91 done();
92 });
93 });
94 });
95
96 it('should not cache partials in `development`', function(done) {
97 var mock = createApp('development');
98
99 request(mock.app)
100 .get('/veggies')
101 .expect(/just a comment/)
102 .end(function(err) {
103 assert.ifError(err);
104 request(mock.app)
105 .get('/veggies')
106 .expect(/just a comment/)
107 .end(function(err) {
108 assert.ifError(err);
109
110 var filename = path.resolve(__dirname, '../example/views/partials/sub/comment.hbs');
111 assert.equal(mock.readCounts[filename], 2);
112 done();
113 });
114 });
115 });
116
117 it('should cache partials in `production', function (done) {
118 var mock = createApp('production');
119
120 request(mock.app)
121 .get('/veggies')
122 .expect(/just a comment/)
123 .end(function(err) {
124 assert.ifError(err);
125 request(mock.app)
126 .get('/veggies')
127 .expect(/just a comment/)
128 .end(function(err) {
129 assert.ifError(err);
130
131 var filename = path.resolve(__dirname, '../example/views/partials/sub/comment.hbs');
132 assert.equal(mock.readCounts[filename], 1);
133 done();
134 });
135 });
136 });
137 });
138});