|
- 'use strict';
- const fs = require('fs');
- const vm = require('vm');
- const assert = require('assert/strict');
- const source = fs.readFileSync(__dirname + '/../assets/metrics.js', 'utf8');
- const points = [{x: 1700000000000, y: 125000}, {x: 1700000060000, y: null}, {x: 1700000420000, y: 250000}];
- const metrics = {
- load: {'1 min': points, '5 min': points, '15 min': points},
- memory: {Usada: [{x: 1700000420000, y: 4365361152}], Total: [{x: 1700000420000, y: 8589934592}]},
- memoryPercent: [{x: 1700000420000, y: 50.81949234008789}],
- network: {RX: points, TX: points}
- };
- let assertions = 0;
- function check(condition) { assert.ok(condition); assertions++; }
- function run({version = '4.4.8', noChart = false, failLoad = false, absent = false, throwChart = false} = {}) {
- const configs = [];
- const cards = ['load','memory','network'].map(kind => ({
- dataset: {chart: kind}, summary: {textContent: ''}, canvas: {parentElement: {hidden: false}},
- querySelector(selector) { return selector === 'canvas' ? this.canvas : this.summary; }
- }));
- const data = JSON.parse(JSON.stringify(metrics));
- if (absent) data.network = {RX: [], TX: []};
- const root = {dataset: {metrics: JSON.stringify(data)}, querySelectorAll: () => cards};
- function FakeChart(canvas, config) { if (throwChart) throw Error('fixture'); configs.push(config); }
- FakeChart.version = version;
- let loaded = 0;
- const window = noChart ? {} : {Chart: FakeChart};
- const document = {
- readyState: 'complete', querySelectorAll: () => [root], createElement: () => ({}),
- head: {appendChild(script) {
- loaded++;
- check(script.src === 'modules/servers/vpsmanager/assets/chart-4.4.8.scoped.js');
- if (failLoad) script.onerror();
- else { window.O6HVpsChart = FakeChart; script.onload(); }
- }}
- };
- vm.runInNewContext(source, {window, document});
- return {configs, cards, loaded};
- }
- const r = run();
- check(r.configs.length === 3 && r.loaded === 0);
- const network = r.configs[2];
- check(network.data.datasets[0].data[0].y === 1000000); // Exactly one bytes/s -> bits/s conversion.
- check(network.data.datasets[0].data[1].y === null);
- check(network.data.datasets[0].data[2].x === 1700000420000);
- check(network.data.datasets[0].spanGaps === false);
- check(network.options.scales.x.type === 'linear');
- check(network.options.scales.y.ticks.callback(1000000) === '1 Mbit/s');
- check(network.options.scales.y.ticks.callback(1000) === '1 Kbit/s');
- check(network.options.scales.y.ticks.callback(1) === '1 bit/s');
- check(network.options.scales.y.ticks.callback(1000000000) === '1 Gbit/s');
- check(r.configs[0].options.scales.y.max === undefined); // Load is not CPU percent.
- check(r.configs[1].options.scales.y.ticks.callback(8589934592) === '8 GiB');
- check(r.cards[1].summary.textContent.includes('50.8 %'));
- check(r.cards[1].summary.textContent.includes('8 GiB'));
- check(run({version: '2.9.4'}).loaded === 1);
- check(run({noChart: true}).configs.length === 3);
- check(run({noChart: true, failLoad: true}).cards.every(c => c.canvas.parentElement.hidden));
- const partial = run({absent: true});
- check(partial.configs.length === 2 && partial.cards[2].summary.textContent === 'Las métricas no están disponibles temporalmente.');
- check(run({throwChart: true}).cards.every(c => c.canvas.parentElement.hidden));
- // Local bundle must not overwrite a WHMCS template's global Chart.
- const prior = {version: '2.9.4'};
- const context = {window: {Chart: prior}, console};
- vm.runInNewContext(fs.readFileSync(__dirname + '/../assets/chart-4.4.8.scoped.js', 'utf8'), context);
- check(context.window.Chart === prior);
- check(context.window.O6HVpsChart.version === '4.4.8');
- console.log(`PASS: ${assertions} frontend assertions.`);
|