graph_tooltip.test.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. jest.mock('app/core/core', () => ({}));
  2. import $ from 'jquery';
  3. import GraphTooltip from '../graph_tooltip';
  4. const scope = {
  5. appEvent: jest.fn(),
  6. onAppEvent: jest.fn(),
  7. ctrl: {},
  8. };
  9. const elem = $('<div></div>');
  10. const dashboard = {};
  11. const getSeriesFn = () => {};
  12. function describeSharedTooltip(desc: string, fn: any) {
  13. const ctx: any = {};
  14. ctx.ctrl = scope.ctrl;
  15. ctx.ctrl.panel = {
  16. tooltip: {
  17. shared: true,
  18. },
  19. legend: {},
  20. stack: false,
  21. };
  22. ctx.setup = (setupFn: any) => {
  23. ctx.setupFn = setupFn;
  24. };
  25. describe(desc, () => {
  26. beforeEach(() => {
  27. ctx.setupFn();
  28. // @ts-ignore
  29. const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn);
  30. ctx.results = tooltip.getMultiSeriesPlotHoverInfo(ctx.data, ctx.pos);
  31. });
  32. fn(ctx);
  33. });
  34. }
  35. describe('findHoverIndexFromData', () => {
  36. // @ts-ignore
  37. const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn);
  38. const series = {
  39. data: [[100, 0], [101, 0], [102, 0], [103, 0], [104, 0], [105, 0], [106, 0], [107, 0]],
  40. };
  41. it('should return 0 if posX out of lower bounds', () => {
  42. const posX = 99;
  43. expect(tooltip.findHoverIndexFromData(posX, series)).toBe(0);
  44. });
  45. it('should return n - 1 if posX out of upper bounds', () => {
  46. const posX = 108;
  47. expect(tooltip.findHoverIndexFromData(posX, series)).toBe(series.data.length - 1);
  48. });
  49. it('should return i if posX in series', () => {
  50. const posX = 104;
  51. expect(tooltip.findHoverIndexFromData(posX, series)).toBe(4);
  52. });
  53. it('should return i if posX not in series and i + 1 > posX', () => {
  54. const posX = 104.9;
  55. expect(tooltip.findHoverIndexFromData(posX, series)).toBe(4);
  56. });
  57. });
  58. describeSharedTooltip('steppedLine false, stack false', (ctx: any) => {
  59. ctx.setup(() => {
  60. ctx.data = [
  61. { data: [[10, 15], [12, 20]], lines: {}, hideTooltip: false },
  62. { data: [[10, 2], [12, 3]], lines: {}, hideTooltip: false },
  63. ];
  64. ctx.pos = { x: 11 };
  65. });
  66. it('should return 2 series', () => {
  67. expect(ctx.results.length).toBe(2);
  68. });
  69. it('should add time to results array', () => {
  70. expect(ctx.results.time).toBe(10);
  71. });
  72. it('should set value and hoverIndex', () => {
  73. expect(ctx.results[0].value).toBe(15);
  74. expect(ctx.results[1].value).toBe(2);
  75. expect(ctx.results[0].hoverIndex).toBe(0);
  76. });
  77. });
  78. describeSharedTooltip('one series is hidden', (ctx: any) => {
  79. ctx.setup(() => {
  80. ctx.data = [{ data: [[10, 15], [12, 20]] }, { data: [] }];
  81. ctx.pos = { x: 11 };
  82. });
  83. });
  84. describeSharedTooltip('steppedLine false, stack true, individual false', (ctx: any) => {
  85. ctx.setup(() => {
  86. ctx.data = [
  87. {
  88. data: [[10, 15], [12, 20]],
  89. lines: {},
  90. datapoints: {
  91. pointsize: 2,
  92. points: [[10, 15], [12, 20]],
  93. },
  94. stack: true,
  95. hideTooltip: false,
  96. },
  97. {
  98. data: [[10, 2], [12, 3]],
  99. lines: {},
  100. datapoints: {
  101. pointsize: 2,
  102. points: [[10, 2], [12, 3]],
  103. },
  104. stack: true,
  105. hideTooltip: false,
  106. },
  107. ];
  108. ctx.ctrl.panel.stack = true;
  109. ctx.pos = { x: 11 };
  110. });
  111. it('should show stacked value', () => {
  112. expect(ctx.results[1].value).toBe(17);
  113. });
  114. });
  115. describeSharedTooltip('steppedLine false, stack true, individual false, series stack false', (ctx: any) => {
  116. ctx.setup(() => {
  117. ctx.data = [
  118. {
  119. data: [[10, 15], [12, 20]],
  120. lines: {},
  121. datapoints: {
  122. pointsize: 2,
  123. points: [[10, 15], [12, 20]],
  124. },
  125. stack: true,
  126. hideTooltip: false,
  127. },
  128. {
  129. data: [[10, 2], [12, 3]],
  130. lines: {},
  131. datapoints: {
  132. pointsize: 2,
  133. points: [[10, 2], [12, 3]],
  134. },
  135. stack: false,
  136. hideTooltip: false,
  137. },
  138. ];
  139. ctx.ctrl.panel.stack = true;
  140. ctx.pos = { x: 11 };
  141. });
  142. it('should not show stacked value', () => {
  143. expect(ctx.results[1].value).toBe(2);
  144. });
  145. });
  146. describeSharedTooltip('steppedLine false, stack true, individual true', (ctx: any) => {
  147. ctx.setup(() => {
  148. ctx.data = [
  149. {
  150. data: [[10, 15], [12, 20]],
  151. lines: {},
  152. datapoints: {
  153. pointsize: 2,
  154. points: [[10, 15], [12, 20]],
  155. },
  156. stack: true,
  157. hideTooltip: false,
  158. },
  159. {
  160. data: [[10, 2], [12, 3]],
  161. lines: {},
  162. datapoints: {
  163. pointsize: 2,
  164. points: [[10, 2], [12, 3]],
  165. },
  166. stack: false,
  167. hideTooltip: false,
  168. },
  169. ];
  170. ctx.ctrl.panel.stack = true;
  171. ctx.ctrl.panel.tooltip.value_type = 'individual';
  172. ctx.pos = { x: 11 };
  173. });
  174. it('should not show stacked value', () => {
  175. expect(ctx.results[1].value).toBe(2);
  176. });
  177. });