@netdata/charts
Version:
Netdata frontend SDK and chart utilities
190 lines (182 loc) • 7.06 kB
JavaScript
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); }
import heatmapTicker from "./heatmap";
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 = heatmapTicker(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 = heatmapTicker(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 = heatmapTicker(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;
});
heatmapTicker(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 = heatmapTicker(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 = heatmapTicker(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 = heatmapTicker(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 = heatmapTicker(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 = heatmapTicker(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 = heatmapTicker(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 = heatmapTicker(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 () {
heatmapTicker(0, 100, 200, mockOpts, mockDygraph, null, {
labels: []
});
}).not.toThrow();
});
});