partial-test.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /* eslint-disable func-names */
  2. require('./helper');
  3. describe('Partials spec', function () {
  4. beforeEach(function () {
  5. Mustache.clearCache();
  6. });
  7. it('The greater-than operator should expand to the named partial.', function () {
  8. var template = '"{{>text}}"';
  9. var data = {};
  10. var partials = {'text':'from partial'};
  11. var expected = '"from partial"';
  12. var renderResult = Mustache.render(template, data, partials);
  13. assert.equal(renderResult, expected);
  14. });
  15. it('The empty string should be used when the named partial is not found.', function () {
  16. var template = '"{{>text}}"';
  17. var data = {};
  18. var partials = {};
  19. var expected = '""';
  20. var renderResult = Mustache.render(template, data, partials);
  21. assert.equal(renderResult, expected);
  22. });
  23. it('The greater-than operator should operate within the current context.', function () {
  24. var template = '"{{>partial}}"';
  25. var data = {'text':'content'};
  26. var partials = {'partial':'*{{text}}*'};
  27. var expected = '"*content*"';
  28. var renderResult = Mustache.render(template, data, partials);
  29. assert.equal(renderResult, expected);
  30. });
  31. it('Inline partials should not be indented', function () {
  32. var template = ' <div>{{> partial}}</div>';
  33. var data = {};
  34. var partials = {'partial':'This is a partial.'};
  35. var expected = ' <div>This is a partial.</div>';
  36. var renderResult = Mustache.render(template, data, partials);
  37. assert.equal(renderResult, expected);
  38. });
  39. it('Inline partials should not be indented (multiline)', function () {
  40. var template = ' <div>{{> partial}}</div>';
  41. var data = {};
  42. var partials = {'partial':'This is a\npartial.'};
  43. var expected = ' <div>This is a\n partial.</div>';
  44. var renderResult = Mustache.render(template, data, partials);
  45. assert.equal(renderResult, expected);
  46. });
  47. it('The greater-than operator should properly recurse.', function () {
  48. var template = '{{>node}}';
  49. var data = {'content':'X','nodes':[{'content':'Y','nodes':[]}]};
  50. var partials = {'node':'{{content}}<{{#nodes}}{{>node}}{{/nodes}}>'};
  51. var expected = 'X<Y<>>';
  52. var renderResult = Mustache.render(template, data, partials);
  53. assert.equal(renderResult, expected);
  54. });
  55. it('The greater-than operator should not alter surrounding whitespace.', function () {
  56. var template = '| {{>partial}} |';
  57. var data = {};
  58. var partials = {'partial':'\t|\t'};
  59. var expected = '| \t|\t |';
  60. var renderResult = Mustache.render(template, data, partials);
  61. assert.equal(renderResult, expected);
  62. });
  63. it('"\r\n" should be considered a newline for standalone tags.', function () {
  64. var template = '|\r\n{{>partial}}\r\n|';
  65. var data = {};
  66. var partials = {'partial':'>'};
  67. var expected = '|\r\n>|';
  68. var renderResult = Mustache.render(template, data, partials);
  69. assert.equal(renderResult, expected);
  70. });
  71. it('Standalone tags should not require a newline to precede them.', function () {
  72. var template = ' {{>partial}}\n>';
  73. var data = {};
  74. var partials = {'partial':'>\n>'};
  75. var expected = ' >\n >>';
  76. var renderResult = Mustache.render(template, data, partials);
  77. assert.equal(renderResult, expected);
  78. });
  79. it('Superfluous in-tag whitespace should be ignored.', function () {
  80. var template = '|{{> partial }}|';
  81. var data = {'boolean':true};
  82. var partials = {'partial':'[]'};
  83. var expected = '|[]|';
  84. var renderResult = Mustache.render(template, data, partials);
  85. assert.equal(renderResult, expected);
  86. });
  87. it('Each line of the partial should be indented before rendering.', function () {
  88. var template = '\\\n {{>partial}}\n/\n';
  89. var data = {
  90. 'content': '<\n->'
  91. };
  92. var partials = {
  93. 'partial': '|\n{{{content}}}\n|\n'
  94. };
  95. var expected = '\\\n |\n <\n->\n |\n/\n';
  96. var renderResult = Mustache.render(template, data, partials);
  97. assert.equal(renderResult, expected);
  98. });
  99. it('Standalone tags should not require a newline to follow them.', function () {
  100. var template = '>\n {{>partial}}';
  101. var data = {
  102. };
  103. var partials = {
  104. 'partial': '>\n>'
  105. };
  106. var expected = '>\n >\n >';
  107. var renderResult = Mustache.render(template, data, partials);
  108. assert.equal(renderResult, expected);
  109. });
  110. it('Whitespace should be left untouched.', function () {
  111. var template = ' {{data}} {{> partial}}\n';
  112. var data = {
  113. 'data': '|'
  114. };
  115. var partials = {
  116. 'partial': '>\n>'
  117. };
  118. var expected = ' | >\n>\n';
  119. var renderResult = Mustache.render(template, data, partials);
  120. assert.equal(renderResult, expected);
  121. });
  122. it('Partial without indentation should inherit functions.', function () {
  123. var template = '{{> partial }}';
  124. var data = {
  125. toUpperCase: function () {
  126. return function (label) {
  127. return label.toUpperCase();
  128. };
  129. }
  130. };
  131. var partials = {partial: 'aA-{{ #toUpperCase }}Input{{ /toUpperCase }}-Aa'};
  132. var expected = 'aA-INPUT-Aa';
  133. var renderResult = Mustache.render(template, data, partials);
  134. assert.equal(renderResult, expected);
  135. });
  136. it('Partial with indentation should inherit functions.', function () {
  137. var template = ' {{> partial }}';
  138. var data = {
  139. toUpperCase: function () {
  140. return function (label) {
  141. return label.toUpperCase();
  142. };
  143. }
  144. };
  145. var partials = {partial: 'aA-{{ #toUpperCase }}Input{{ /toUpperCase }}-Aa'};
  146. var expected = ' aA-INPUT-Aa';
  147. var renderResult = Mustache.render(template, data, partials);
  148. assert.equal(renderResult, expected);
  149. });
  150. it('Nested partials should support custom delimiters.', function () {
  151. var tags = ['[[', ']]'];
  152. var template = '[[> level1 ]]';
  153. var partials = {
  154. level1: 'partial 1\n[[> level2]]',
  155. level2: 'partial 2\n[[> level3]]',
  156. level3: 'partial 3\n[[> level4]]',
  157. level4: 'partial 4\n[[> level5]]',
  158. level5: 'partial 5',
  159. };
  160. var expected = 'partial 1\npartial 2\npartial 3\npartial 4\npartial 5';
  161. var renderResult = Mustache.render(template, {}, partials, tags);
  162. assert.equal(renderResult, expected);
  163. });
  164. });