renderer.jest.ts 5.5 KB

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