renderer_test.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. // Copyright 2011 The Closure Library Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS-IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. goog.provide('goog.soy.RendererTest');
  15. goog.setTestOnly('goog.soy.RendererTest');
  16. goog.require('goog.dom');
  17. goog.require('goog.dom.NodeType');
  18. goog.require('goog.dom.TagName');
  19. goog.require('goog.html.SafeHtml');
  20. goog.require('goog.i18n.bidi.Dir');
  21. goog.require('goog.soy.Renderer');
  22. goog.require('goog.soy.data.SanitizedContentKind');
  23. /** @suppress {extraRequire} */
  24. goog.require('goog.soy.testHelper');
  25. goog.require('goog.testing.jsunit');
  26. goog.require('goog.testing.recordFunction');
  27. var handleRender;
  28. function setUp() {
  29. // Replace the empty default implementation.
  30. handleRender = goog.soy.Renderer.prototype.handleRender =
  31. goog.testing.recordFunction(goog.soy.Renderer.prototype.handleRender);
  32. }
  33. var dataSupplier = {getData: function() { return {name: 'IjValue'}; }};
  34. function testRenderElement() {
  35. var testDiv = goog.dom.createElement(goog.dom.TagName.DIV);
  36. var renderer = new goog.soy.Renderer(dataSupplier);
  37. renderer.renderElement(
  38. testDiv, example.injectedDataTemplate, {name: 'Value'});
  39. assertEquals('ValueIjValue', elementToInnerHtml(testDiv));
  40. assertEquals(testDiv, handleRender.getLastCall().getArguments()[0]);
  41. handleRender.assertCallCount(1);
  42. }
  43. function testRenderElementWithNoTemplateData() {
  44. var testDiv = goog.dom.createElement(goog.dom.TagName.DIV);
  45. var renderer = new goog.soy.Renderer(dataSupplier);
  46. renderer.renderElement(testDiv, example.noDataTemplate);
  47. assertEquals('<div>Hello</div>', elementToInnerHtml(testDiv));
  48. assertEquals(testDiv, handleRender.getLastCall().getArguments()[0]);
  49. handleRender.assertCallCount(1);
  50. }
  51. function testRenderAsFragment() {
  52. var renderer = new goog.soy.Renderer(dataSupplier);
  53. var fragment =
  54. renderer.renderAsFragment(example.injectedDataTemplate, {name: 'Value'});
  55. assertEquals('ValueIjValue', fragmentToHtml(fragment));
  56. assertEquals(fragment, handleRender.getLastCall().getArguments()[0]);
  57. handleRender.assertCallCount(1);
  58. }
  59. function testRenderAsFragmentWithNoTemplateData() {
  60. var renderer = new goog.soy.Renderer(dataSupplier);
  61. var fragment = renderer.renderAsFragment(example.noDataTemplate);
  62. assertEquals(goog.dom.NodeType.ELEMENT, fragment.nodeType);
  63. assertEquals('<div>Hello</div>', fragmentToHtml(fragment));
  64. assertEquals(fragment, handleRender.getLastCall().getArguments()[0]);
  65. handleRender.assertCallCount(1);
  66. }
  67. function testRenderAsElement() {
  68. var renderer = new goog.soy.Renderer(dataSupplier);
  69. var element =
  70. renderer.renderAsElement(example.injectedDataTemplate, {name: 'Value'});
  71. assertEquals('ValueIjValue', elementToInnerHtml(element));
  72. assertEquals(element, handleRender.getLastCall().getArguments()[0]);
  73. handleRender.assertCallCount(1);
  74. }
  75. function testRenderAsElementWithNoTemplateData() {
  76. var renderer = new goog.soy.Renderer(dataSupplier);
  77. var elem = renderer.renderAsElement(example.noDataTemplate);
  78. assertEquals('Hello', elementToInnerHtml(elem));
  79. assertEquals(elem, handleRender.getLastCall().getArguments()[0]);
  80. }
  81. function testRenderConvertsToString() {
  82. var renderer = new goog.soy.Renderer(dataSupplier);
  83. assertEquals(
  84. 'Output should be a string', 'Hello <b>World</b>',
  85. renderer.render(example.sanitizedHtmlTemplate));
  86. assertUndefined(handleRender.getLastCall().getArguments()[0]);
  87. handleRender.assertCallCount(1);
  88. }
  89. function testRenderRejectsNonHtmlStrictTemplates() {
  90. var renderer = new goog.soy.Renderer(dataSupplier);
  91. assertEquals(
  92. 'Assertion failed: ' +
  93. 'render was called with a strict template of kind other than "html"' +
  94. ' (consider using renderText or renderStrict)',
  95. assertThrows(function() {
  96. renderer.render(example.unsanitizedTextTemplate, {});
  97. }).message);
  98. handleRender.assertCallCount(0);
  99. }
  100. function testRenderStrictDoesNotConvertToString() {
  101. var renderer = new goog.soy.Renderer(dataSupplier);
  102. var result = renderer.renderStrict(example.sanitizedHtmlTemplate);
  103. assertEquals('Hello <b>World</b>', result.content);
  104. assertEquals(goog.soy.data.SanitizedContentKind.HTML, result.contentKind);
  105. assertUndefined(handleRender.getLastCall().getArguments()[0]);
  106. handleRender.assertCallCount(1);
  107. }
  108. function testRenderStrictValidatesOutput() {
  109. var renderer = new goog.soy.Renderer(dataSupplier);
  110. // Passes.
  111. renderer.renderStrict(example.sanitizedHtmlTemplate, {});
  112. // No SanitizedContent at all.
  113. assertEquals(
  114. 'Assertion failed: ' +
  115. 'renderStrict cannot be called on a non-strict soy template',
  116. assertThrows(function() {
  117. renderer.renderStrict(example.noDataTemplate, {});
  118. }).message);
  119. assertUndefined(handleRender.getLastCall().getArguments()[0]);
  120. // Passes.
  121. renderer.renderStrictOfKind(
  122. example.sanitizedHtmlTemplate, {},
  123. goog.soy.data.SanitizedContentKind.HTML);
  124. // Wrong content kind.
  125. assertEquals(
  126. 'Assertion failed: ' +
  127. 'renderStrict was called with the wrong kind of template',
  128. assertThrows(function() {
  129. renderer.renderStrictOfKind(
  130. example.sanitizedHtmlTemplate, {},
  131. goog.soy.data.SanitizedContentKind.JS);
  132. }).message);
  133. assertUndefined(handleRender.getLastCall().getArguments()[0]);
  134. // Rendering non-HTML template fails:
  135. assertEquals(
  136. 'Assertion failed: ' +
  137. 'renderStrict was called with the wrong kind of template',
  138. assertThrows(function() {
  139. renderer.renderStrict(example.unsanitizedTextTemplate, {});
  140. }).message);
  141. assertUndefined(handleRender.getLastCall().getArguments()[0]);
  142. handleRender.assertCallCount(2);
  143. }
  144. function testRenderStrictUri() {
  145. var renderer = new goog.soy.Renderer(dataSupplier);
  146. var result = renderer.renderStrictUri(example.sanitizedUriTemplate, {});
  147. assertEquals(goog.soy.data.SanitizedContentKind.URI, result.contentKind);
  148. assertEquals(
  149. 'Assertion failed: ' +
  150. 'renderStrict was called with the wrong kind of template',
  151. assertThrows(function() {
  152. renderer.renderStrictUri(example.sanitizedHtmlTemplate, {});
  153. }).message);
  154. handleRender.assertCallCount(1);
  155. }
  156. function testRenderText() {
  157. var renderer = new goog.soy.Renderer(dataSupplier);
  158. // RenderText converts to string.
  159. assertEquals(
  160. 'Output of renderText should be a string', 'I <3 Puppies & Kittens',
  161. renderer.renderText(example.unsanitizedTextTemplate));
  162. assertUndefined(handleRender.getLastCall().getArguments()[0]);
  163. // RenderText on non-strict template fails.
  164. assertEquals(
  165. 'Assertion failed: ' +
  166. 'renderText cannot be called on a non-strict soy template',
  167. assertThrows(function() {
  168. renderer.renderText(example.noDataTemplate, {});
  169. }).message);
  170. // RenderText on non-text template fails.
  171. assertEquals(
  172. 'Assertion failed: ' +
  173. 'renderText was called with a template of kind other than "text"',
  174. assertThrows(function() {
  175. renderer.renderText(example.sanitizedHtmlTemplate, {});
  176. }).message);
  177. handleRender.assertCallCount(1);
  178. }
  179. function testRenderSafeHtml() {
  180. var renderer = new goog.soy.Renderer(dataSupplier);
  181. var result = renderer.renderSafeHtml(example.sanitizedHtmlTemplate);
  182. assertEquals('Hello <b>World</b>', goog.html.SafeHtml.unwrap(result));
  183. assertEquals(goog.i18n.bidi.Dir.LTR, result.getDirection());
  184. }