renderer_specs.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import {describe, beforeEach, it, sinon, expect} from 'test/lib/common';
  2. import _ from 'lodash';
  3. import TableModel from 'app/core/table_model';
  4. import {TableRenderer} from '../renderer';
  5. describe('when rendering table', () => {
  6. describe('given 2 columns', () => {
  7. var table = new TableModel();
  8. table.columns = [
  9. {text: 'Time'},
  10. {text: 'Value'},
  11. {text: 'Colored'},
  12. {text: 'Undefined'},
  13. {text: 'String'},
  14. {text: 'United', unit: 'bps'},
  15. {text: 'Sanitized'},
  16. {text: 'Link'},
  17. ];
  18. table.rows = [
  19. [1388556366666, 1230, 40, undefined, "", "", "my.host.com", "host1"]
  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. };
  71. var sanitize = function(value) {
  72. return 'sanitized';
  73. };
  74. var templateSrv = {
  75. replace: function(value, scopedVars) {
  76. if (scopedVars) {
  77. // For testing variables replacement in link
  78. _.each(scopedVars, function(val, key) {
  79. value = value.replace('$' + key, val.value);
  80. });
  81. }
  82. return value;
  83. }
  84. };
  85. var renderer = new TableRenderer(panel, table, 'utc', sanitize, templateSrv);
  86. it('time column should be formated', () => {
  87. var html = renderer.renderCell(0, 0, 1388556366666);
  88. expect(html).to.be('<td>2014-01-01T06:06:06Z</td>');
  89. });
  90. it('undefined time column should be rendered as -', () => {
  91. var html = renderer.renderCell(0, 0, undefined);
  92. expect(html).to.be('<td>-</td>');
  93. });
  94. it('null time column should be rendered as -', () => {
  95. var html = renderer.renderCell(0, 0, null);
  96. expect(html).to.be('<td>-</td>');
  97. });
  98. it('number column with unit specified should ignore style unit', () => {
  99. var html = renderer.renderCell(5, 0, 1230);
  100. expect(html).to.be('<td>1.23 kbps</td>');
  101. });
  102. it('number column should be formated', () => {
  103. var html = renderer.renderCell(1, 0, 1230);
  104. expect(html).to.be('<td>1.230 s</td>');
  105. });
  106. it('number style should ignore string values', () => {
  107. var html = renderer.renderCell(1, 0, 'asd');
  108. expect(html).to.be('<td>asd</td>');
  109. });
  110. it('colored cell should have style', () => {
  111. var html = renderer.renderCell(2, 0, 40);
  112. expect(html).to.be('<td style="color:green">40.0</td>');
  113. });
  114. it('colored cell should have style', () => {
  115. var html = renderer.renderCell(2, 0, 55);
  116. expect(html).to.be('<td style="color:orange">55.0</td>');
  117. });
  118. it('colored cell should have style', () => {
  119. var html = renderer.renderCell(2, 0, 85);
  120. expect(html).to.be('<td style="color:red">85.0</td>');
  121. });
  122. it('unformated undefined should be rendered as string', () => {
  123. var html = renderer.renderCell(3, 0, 'value');
  124. expect(html).to.be('<td>value</td>');
  125. });
  126. it('string style with escape html should return escaped html', () => {
  127. var html = renderer.renderCell(4, 0, "&breaking <br /> the <br /> row");
  128. expect(html).to.be('<td>&amp;breaking &lt;br /&gt; the &lt;br /&gt; row</td>');
  129. });
  130. it('undefined formater should return escaped html', () => {
  131. var html = renderer.renderCell(3, 0, "&breaking <br /> the <br /> row");
  132. expect(html).to.be('<td>&amp;breaking &lt;br /&gt; the &lt;br /&gt; row</td>');
  133. });
  134. it('undefined value should render as -', () => {
  135. var html = renderer.renderCell(3, 0, undefined);
  136. expect(html).to.be('<td></td>');
  137. });
  138. it('sanitized value should render as', () => {
  139. var html = renderer.renderCell(6, 0, 'text <a href="http://google.com">link</a>');
  140. expect(html).to.be('<td>sanitized</td>');
  141. });
  142. it('Time column title should be Timestamp', () => {
  143. expect(table.columns[0].title).to.be('Timestamp');
  144. });
  145. it('Value column title should be Val', () => {
  146. expect(table.columns[1].title).to.be('Val');
  147. });
  148. it('Colored column title should be Colored', () => {
  149. expect(table.columns[2].title).to.be('Colored');
  150. });
  151. it('link should render as', () => {
  152. var html = renderer.renderCell(7, 0, 'host1');
  153. var expectedHtml = `
  154. <td class="table-panel-cell-link">
  155. <a href="/dashboard?param=host1&param_1=1230&param_2=40"
  156. target="_blank" data-link-tooltip data-original-title="host1 1230 my.host.com" data-placement="right">
  157. host1
  158. </a>
  159. </td>
  160. `;
  161. expect(normalize(html)).to.be(normalize(expectedHtml));
  162. });
  163. });
  164. });
  165. function normalize(str) {
  166. return str.replace(/\s+/gm, ' ').trim();
  167. }