UNPKG

@netdata/charts

Version:

Netdata frontend SDK and chart utilities

193 lines (184 loc) 7.32 kB
"use strict"; var _heatmap = _interopRequireDefault(require("./heatmap")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } describe("heatmapTicker", function () { var mockOpts; var mockDygraph; beforeEach(function () { mockOpts = jest.fn(function (key) { var options = { pixelsPerLabel: 50, axisLabelFormatter: jest.fn(function (value) { return "label_".concat(value); }) }; return options[key]; }); mockDygraph = { yAxisRange: jest.fn(function () { return [0, 100]; }), getArea: jest.fn(function () { return { h: 300 }; }) }; }); it("generates ticks with proper structure", function () { var defaultLabels = ["prefix_label1", "prefix_label2", "prefix_label3", "prefix_label4"]; var ticks = (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: defaultLabels }); expect(Array.isArray(ticks)).toBe(true); expect(ticks.length).toBeGreaterThan(0); expect(ticks[0]).toHaveProperty("label_v"); expect(ticks[ticks.length - 1]).toHaveProperty("label_v"); }); it("removes prefix from labels", function () { var defaultLabels = ["system_cpu", "system_memory", "system_disk"]; var ticks = (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: defaultLabels }); // withoutPrefix should remove the prefix from labels var dataTicks = ticks.filter(function (tick) { return tick.v !== undefined; }); expect(dataTicks.length).toBe(defaultLabels.length); // Verify ticks have been generated with labels var labeledTicks = ticks.filter(function (tick) { return tick.label !== null && tick.label !== undefined; }); expect(labeledTicks.length).toBeGreaterThan(0); }); it("calculates maximum ticks based on pixels and pixelsPerLabel", function () { var defaultLabels = Array.from({ length: 20 }, function (_, i) { return "label".concat(i); }); var pixels = 300; var ticks = (0, _heatmap["default"])(0, 100, pixels, mockOpts, mockDygraph, null, { labels: defaultLabels }); // Should limit number of visible labels based on available pixels var visibleTicks = ticks.filter(function (tick) { return tick.label && tick.label !== null; }); expect(visibleTicks.length).toBeLessThanOrEqual(Math.floor(pixels / 50)); }); it("formats labels using axisLabelFormatter", function () { var defaultLabels = ["label1", "label2"]; var mockFormatter = jest.fn(function (value) { return "formatted_".concat(value); }); mockOpts.mockImplementation(function (key) { if (key === "axisLabelFormatter") return mockFormatter; if (key === "pixelsPerLabel") return 50; }); (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: defaultLabels }); expect(mockFormatter).toHaveBeenCalled(); }); it("formats SI heatmap bucket labels compactly", function () { var defaultLabels = ["0.005", "1000", "+Inf"]; var ticks = (0, _heatmap["default"])(0, 100, 300, mockOpts, mockDygraph, null, { labels: defaultLabels, scale: "num" }); var labels = ticks.filter(function (tick) { return tick.v !== undefined; }).map(function (tick) { return tick.label; }); expect(labels).toEqual(["label_5m", "label_1k", "label_+Inf"]); }); it("formats binary heatmap bucket labels compactly", function () { var defaultLabels = ["512", "1024", "1048576", "+Inf"]; var ticks = (0, _heatmap["default"])(0, 100, 300, mockOpts, mockDygraph, null, { labels: defaultLabels, scale: "binary" }); var labels = ticks.filter(function (tick) { return tick.v !== undefined; }).map(function (tick) { return tick.label; }); expect(labels).toEqual(["label_512", "label_1Ki", "label_1Mi", "label_+Inf"]); }); it("uses raw prefix-stripped labels when scale is null", function () { var defaultLabels = ["bucket_0.005", "bucket_+Inf"]; var ticks = (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: defaultLabels, scale: null }); var labels = ticks.filter(function (tick) { return tick.v !== undefined; }).map(function (tick) { return tick.label; }); expect(labels).toEqual(["label_0.005", "label_+Inf"]); }); it("calculates hidden step to reduce label density", function () { var defaultLabels = Array.from({ length: 10 }, function (_, i) { return "label".concat(i); }); var pixels = 100; // Small pixel count to force hiding var ticks = (0, _heatmap["default"])(0, 100, pixels, mockOpts, mockDygraph, null, { labels: defaultLabels }); // Check that some labels are hidden (set to null) var middleTicks = ticks.slice(1, -1); // Exclude first and last which have label_v var hiddenTicks = middleTicks.filter(function (tick) { return tick.label === null; }); expect(hiddenTicks.length).toBeGreaterThan(0); }); it("adds boundary ticks with label_v property", function () { var defaultLabels = ["label1", "label2"]; var ticks = (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: defaultLabels }); // First tick should have label_v for top boundary expect(ticks[0]).toHaveProperty("label_v"); expect(_typeof(ticks[0].label_v)).toBe("number"); // Last tick should have label_v for bottom boundary expect(ticks[ticks.length - 1]).toHaveProperty("label_v"); expect(_typeof(ticks[ticks.length - 1].label_v)).toBe("number"); }); it("calculates point height based on y-axis range and area", function () { mockDygraph.yAxisRange.mockReturnValue([10, 90]); mockDygraph.getArea.mockReturnValue({ h: 150 }); var defaultLabels = ["label1"]; var ticks = (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: defaultLabels }); // Point height should be calculated as (max - min) / 15 / area.h var expectedPointHeight = (90 - 10) / 15 / 150; expect(ticks[0].label_v).toBeCloseTo(90 - expectedPointHeight); expect(ticks[ticks.length - 1].label_v).toBeCloseTo(10 + expectedPointHeight); }); it("handles empty labels gracefully", function () { var defaultLabels = []; var ticks = (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: defaultLabels }); expect(Array.isArray(ticks)).toBe(true); expect(ticks.length).toBe(2); // Only boundary ticks expect(ticks[0]).toHaveProperty("label_v"); expect(ticks[1]).toHaveProperty("label_v"); }); it("handles undefined labels parameter", function () { expect(function () { (0, _heatmap["default"])(0, 100, 200, mockOpts, mockDygraph, null, { labels: [] }); }).not.toThrow(); }); });