index_test.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. 'use strict';
  2. var sinon = require('sinon');
  3. var historyApiFallback = require('../lib');
  4. var tests = module.exports = {};
  5. var middleware;
  6. var req = null;
  7. var requestedUrl;
  8. var next;
  9. tests.setUp = function(done) {
  10. middleware = historyApiFallback();
  11. requestedUrl = '/foo';
  12. req = {
  13. method: 'GET',
  14. url: requestedUrl,
  15. headers: {
  16. accept: 'text/html, */*'
  17. }
  18. };
  19. next = sinon.stub();
  20. done();
  21. };
  22. ['POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'].forEach(function(method) {
  23. tests['should ignore ' + method + ' requests'] = function(test) {
  24. req.method = method;
  25. middleware(req, null, next);
  26. test.equal(req.url, requestedUrl);
  27. test.ok(next.called);
  28. test.done();
  29. };
  30. });
  31. tests['should ignore requests that do not accept html'] = function(test) {
  32. req.headers.accept = 'application/json';
  33. middleware(req, null, next);
  34. test.equal(req.url, requestedUrl);
  35. test.ok(next.called);
  36. test.done();
  37. };
  38. tests['should ignore file requests'] = function(test) {
  39. var expected = req.url = 'js/app.js';
  40. middleware(req, null, next);
  41. test.equal(req.url, expected);
  42. test.ok(next.called);
  43. test.done();
  44. };
  45. tests['should rewrite requests when the . rule is disabled'] = function(test) {
  46. req.url = 'js/app.js';
  47. middleware = historyApiFallback({
  48. disableDotRule: true
  49. });
  50. middleware(req, null, next);
  51. test.equal(req.url, '/index.html');
  52. test.ok(next.called);
  53. test.done();
  54. };
  55. tests['should take JSON preference into account'] = function(test) {
  56. req.headers.accept = 'application/json, text/plain, */*';
  57. middleware(req, null, next);
  58. test.equal(req.url, requestedUrl);
  59. test.ok(next.called);
  60. test.done();
  61. };
  62. tests['should rewrite valid requests'] = function(test) {
  63. middleware(req, null, next);
  64. test.equal(req.url, '/index.html');
  65. test.ok(next.called);
  66. test.done();
  67. };
  68. tests['should not fail for missing HTTP accept header'] = function(test) {
  69. delete req.headers.accept;
  70. middleware(req, null, next);
  71. test.equal(req.url, requestedUrl);
  72. test.ok(next.called);
  73. test.done();
  74. };
  75. tests['should not fail for missing headers object'] = function(test) {
  76. delete req.headers;
  77. middleware(req, null, next);
  78. test.equal(req.url, requestedUrl);
  79. test.ok(next.called);
  80. test.done();
  81. };
  82. tests['should work in verbose mode'] = function(test) {
  83. var expected = req.url = 'js/app.js';
  84. middleware = historyApiFallback({
  85. verbose: true
  86. });
  87. middleware(req, null, next);
  88. test.equal(req.url, expected);
  89. test.ok(next.called);
  90. test.done();
  91. };
  92. tests['should work with a custom logger'] = function(test) {
  93. var expected = req.url = 'js/app.js';
  94. var logger = sinon.stub();
  95. middleware = historyApiFallback({
  96. logger: logger
  97. });
  98. middleware(req, null, next);
  99. test.equal(req.url, expected);
  100. test.ok(next.called);
  101. test.ok(logger.calledOnce);
  102. test.done();
  103. };
  104. tests['should rewrite requested path according to rules'] = function(test) {
  105. req.url = '/soccer';
  106. middleware = historyApiFallback({
  107. rewrites: [
  108. {from: /\/soccer/, to: '/soccer.html'}
  109. ]
  110. });
  111. middleware(req, null, next);
  112. test.equal(req.url, '/soccer.html');
  113. test.ok(next.called);
  114. test.done();
  115. };
  116. tests['should support functions as rewrite rule'] = function(test) {
  117. middleware = historyApiFallback({
  118. rewrites: [
  119. {
  120. from: /^\/libs\/(.*)$/,
  121. to: function(context) {
  122. return './bower_components' + context.parsedUrl.pathname;
  123. }
  124. }
  125. ]
  126. });
  127. req.url = '/libs/jquery/jquery.1.12.0.min.js';
  128. middleware(req, null, next);
  129. test.equal(req.url, './bower_components/libs/jquery/jquery.1.12.0.min.js');
  130. test.ok(next.called);
  131. next = sinon.stub();
  132. var expected = req.url = '/js/main.js';
  133. middleware(req, null, next);
  134. test.equal(req.url, expected);
  135. test.ok(next.called);
  136. test.done();
  137. };
  138. tests['should test rewrite rules'] = function(test) {
  139. req.url = '/socer';
  140. middleware = historyApiFallback({
  141. rewrites: [
  142. {from: /\/soccer/, to: '/soccer.html'}
  143. ]
  144. });
  145. middleware(req, null, next);
  146. test.equal(req.url, '/index.html');
  147. test.ok(next.called);
  148. test.done();
  149. };
  150. tests['should support custom index file'] = function(test) {
  151. var index = 'default.html';
  152. req.url = '/socer';
  153. middleware = historyApiFallback({
  154. index: index
  155. });
  156. middleware(req, null, next);
  157. test.equal(req.url, index);
  158. test.ok(next.called);
  159. test.done();
  160. };
  161. tests['should accept html requests based on headers option'] = function(test) {
  162. req.headers.accept = '*/*';
  163. middleware = historyApiFallback({
  164. htmlAcceptHeaders: ['text/html', 'application/xhtml+xml']
  165. });
  166. middleware(req, null, next);
  167. test.equal(req.url, requestedUrl);
  168. test.ok(next.called);
  169. test.done();
  170. };
  171. tests['should support custom rewrite rules'] = function(test) {
  172. req.headers.accept = '*/*';
  173. var url = '/app/login/app.js';
  174. req.url = url;
  175. middleware = historyApiFallback({
  176. rewrites: [
  177. {
  178. from: /\/app\/login/,
  179. to: function onMatch(ctx) {
  180. if (ctx.parsedUrl.path.indexOf('.js')) {
  181. return ctx.parsedUrl.href;
  182. }
  183. return '/app/login/index.html';
  184. }
  185. }
  186. ]
  187. });
  188. middleware(req, null, next);
  189. test.equal(req.url, url);
  190. test.ok(next.called);
  191. test.done();
  192. };