renderer.jest.ts 5.8 KB

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