'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.`);