renderer.jest.ts 5.8 KB

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