renderer.jest.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import _ from "lodash";
  2. import TableModel from "app/core/table_model";
  3. import { TableRenderer } from "../renderer";
  4. describe("when rendering table", () => {
  5. describe("given 2 columns", () => {
  6. var table = new TableModel();
  7. table.columns = [
  8. { text: "Time" },
  9. { text: "Value" },
  10. { text: "Colored" },
  11. { text: "Undefined" },
  12. { text: "String" },
  13. { text: "United", unit: "bps" },
  14. { text: "Sanitized" },
  15. { text: "Link" },
  16. { text: "Array" }
  17. ];
  18. table.rows = [
  19. [
  20. 1388556366666,
  21. 1230,
  22. 40,
  23. undefined,
  24. "",
  25. "",
  26. "my.host.com",
  27. "host1",
  28. ["value1", "value2"]
  29. ]
  30. ];
  31. var panel = {
  32. pageSize: 10,
  33. styles: [
  34. {
  35. pattern: "Time",
  36. type: "date",
  37. format: "LLL",
  38. alias: "Timestamp"
  39. },
  40. {
  41. pattern: "/(Val)ue/",
  42. type: "number",
  43. unit: "ms",
  44. decimals: 3,
  45. alias: "$1"
  46. },
  47. {
  48. pattern: "Colored",
  49. type: "number",
  50. unit: "none",
  51. decimals: 1,
  52. colorMode: "value",
  53. thresholds: [50, 80],
  54. colors: ["green", "orange", "red"]
  55. },
  56. {
  57. pattern: "String",
  58. type: "string"
  59. },
  60. {
  61. pattern: "United",
  62. type: "number",
  63. unit: "ms",
  64. decimals: 2
  65. },
  66. {
  67. pattern: "Sanitized",
  68. type: "string",
  69. sanitize: true
  70. },
  71. {
  72. pattern: "Link",
  73. type: "string",
  74. link: true,
  75. linkUrl:
  76. "/dashboard?param=$__cell&param_1=$__cell_1&param_2=$__cell_2",
  77. linkTooltip: "$__cell $__cell_1 $__cell_6",
  78. linkTargetBlank: true
  79. },
  80. {
  81. pattern: "Array",
  82. type: "number",
  83. unit: "ms",
  84. decimals: 3
  85. }
  86. ]
  87. };
  88. var sanitize = function(value) {
  89. return "sanitized";
  90. };
  91. var templateSrv = {
  92. replace: function(value, scopedVars) {
  93. if (scopedVars) {
  94. // For testing variables replacement in link
  95. _.each(scopedVars, function(val, key) {
  96. value = value.replace("$" + key, val.value);
  97. });
  98. }
  99. return value;
  100. }
  101. };
  102. var renderer = new TableRenderer(
  103. panel,
  104. table,
  105. "utc",
  106. sanitize,
  107. templateSrv
  108. );
  109. it("time column should be formated", () => {
  110. var html = renderer.renderCell(0, 0, 1388556366666);
  111. expect(html).toBe("<td>2014-01-01T06:06:06Z</td>");
  112. });
  113. it("undefined time column should be rendered as -", () => {
  114. var html = renderer.renderCell(0, 0, undefined);
  115. expect(html).toBe("<td>-</td>");
  116. });
  117. it("null time column should be rendered as -", () => {
  118. var html = renderer.renderCell(0, 0, null);
  119. expect(html).toBe("<td>-</td>");
  120. });
  121. it("number column with unit specified should ignore style unit", () => {
  122. var html = renderer.renderCell(5, 0, 1230);
  123. expect(html).toBe("<td>1.23 kbps</td>");
  124. });
  125. it("number column should be formated", () => {
  126. var html = renderer.renderCell(1, 0, 1230);
  127. expect(html).toBe("<td>1.230 s</td>");
  128. });
  129. it("number style should ignore string values", () => {
  130. var html = renderer.renderCell(1, 0, "asd");
  131. expect(html).toBe("<td>asd</td>");
  132. });
  133. it("colored cell should have style", () => {
  134. var html = renderer.renderCell(2, 0, 40);
  135. expect(html).toBe('<td style="color:green">40.0</td>');
  136. });
  137. it("colored cell should have style", () => {
  138. var html = renderer.renderCell(2, 0, 55);
  139. expect(html).toBe('<td style="color:orange">55.0</td>');
  140. });
  141. it("colored cell should have style", () => {
  142. var html = renderer.renderCell(2, 0, 85);
  143. expect(html).toBe('<td style="color:red">85.0</td>');
  144. });
  145. it("unformated undefined should be rendered as string", () => {
  146. var html = renderer.renderCell(3, 0, "value");
  147. expect(html).toBe("<td>value</td>");
  148. });
  149. it("string style with escape html should return escaped html", () => {
  150. var html = renderer.renderCell(4, 0, "&breaking <br /> the <br /> row");
  151. expect(html).toBe(
  152. "<td>&amp;breaking &lt;br /&gt; the &lt;br /&gt; row</td>"
  153. );
  154. });
  155. it("undefined formater should return escaped html", () => {
  156. var html = renderer.renderCell(3, 0, "&breaking <br /> the <br /> row");
  157. expect(html).toBe(
  158. "<td>&amp;breaking &lt;br /&gt; the &lt;br /&gt; row</td>"
  159. );
  160. });
  161. it("undefined value should render as -", () => {
  162. var html = renderer.renderCell(3, 0, undefined);
  163. expect(html).toBe("<td></td>");
  164. });
  165. it("sanitized value should render as", () => {
  166. var html = renderer.renderCell(
  167. 6,
  168. 0,
  169. 'text <a href="http://google.com">link</a>'
  170. );
  171. expect(html).toBe("<td>sanitized</td>");
  172. });
  173. it("Time column title should be Timestamp", () => {
  174. expect(table.columns[0].title).toBe("Timestamp");
  175. });
  176. it("Value column title should be Val", () => {
  177. expect(table.columns[1].title).toBe("Val");
  178. });
  179. it("Colored column title should be Colored", () => {
  180. expect(table.columns[2].title).toBe("Colored");
  181. });
  182. it("link should render as", () => {
  183. var html = renderer.renderCell(7, 0, "host1");
  184. var expectedHtml = `
  185. <td class="table-panel-cell-link">
  186. <a href="/dashboard?param=host1&param_1=1230&param_2=40"
  187. target="_blank" data-link-tooltip data-original-title="host1 1230 my.host.com" data-placement="right">
  188. host1
  189. </a>
  190. </td>
  191. `;
  192. expect(normalize(html)).toBe(normalize(expectedHtml));
  193. });
  194. it("Array column should not use number as formatter", () => {
  195. var html = renderer.renderCell(8, 0, ["value1", "value2"]);
  196. expect(html).toBe("<td>value1, value2</td>");
  197. });
  198. });
  199. });
  200. function normalize(str) {
  201. return str.replace(/\s+/gm, " ").trim();
  202. }