Files
opportunities-extension/tests/consumptionTrend.test.cjs

175 lines
4.7 KiB
JavaScript

const assert = require("node:assert/strict");
const fs = require("node:fs");
const path = require("node:path");
const vm = require("node:vm");
const root = path.resolve(__dirname, "..");
function loadContentHelpers() {
const source = fs.readFileSync(path.join(root, "src", "content.js"), "utf8");
const marker = "\n if (insertTile()) {";
const instrumented = source.replace(marker, `
globalThis.__consumptionTrendTest = {
normalizeConsumptionTrendItems,
formatConsumptionPointLabel,
createNiceConsumptionMaximum,
calculateAverageConsumption
};
${marker}`);
const context = {
chrome: { runtime: { onMessage: { addListener() {} } } },
document: { getElementById: () => ({}) },
window: {
location: {
hostname: "eeho.fa.us2.oraclecloud.com",
pathname: "/fscmUI/faces/FuseWelcome"
}
},
Intl,
Date,
Map,
Set,
Number,
String,
Array,
Object,
Math
};
vm.runInNewContext(instrumented, context);
return context.__consumptionTrendTest;
}
function loadBackground(fetchCalls) {
let listener;
const source = fs.readFileSync(path.join(root, "src", "background.js"), "utf8");
const headers = {
get(name) {
return name.toLowerCase() === "content-type" ? "application/json" : null;
},
forEach(callback) {
callback("application/json", "content-type");
}
};
const context = {
chrome: {
runtime: {
onMessage: {
addListener(callback) {
listener = callback;
}
}
}
},
fetch: async (url, options) => {
fetchCalls.push({ url, options });
return {
ok: true,
status: 200,
statusText: "OK",
headers,
text: async () => JSON.stringify([{ fyDate: "2026-09-01", usedAmount: 25 }])
};
},
URL,
Date,
JSON,
Map,
Set,
Promise,
String,
Array,
Object,
Number,
Math,
setTimeout,
clearTimeout
};
vm.runInNewContext(source, context);
return listener;
}
function dispatch(listener, message) {
return new Promise((resolve) => {
const asynchronous = listener(message, {}, resolve);
assert.equal(asynchronous, true);
});
}
async function run() {
const helpers = loadContentHelpers();
const points = helpers.normalizeConsumptionTrendItems([
{
fyDate: "2026-08-22",
fiscalTime: ["22-Aug-26"],
fiscalQtr: "FY27-Q1",
usageCategory: "Funded Allocation",
usedAmount: 31000,
arrCd: 120000,
currencyCode: "BRL"
},
{
fyDate: "2026-08-22",
fiscalTime: ["22-Aug-26"],
usageCategory: "OVERAGE",
usedAmount: 4200,
currencyCode: "BRL"
},
{
fyDate: "2026-08-15",
fiscalTime: ["15-Aug-26"],
usageCategory: null,
usedAmount: 29000,
currencyCode: "BRL"
}
]);
assert.equal(points.length, 2);
assert.equal(points[0].dateKey, "2026-08-15");
assert.equal(points[0].funded, 29000);
assert.equal(points[1].funded, 31000);
assert.equal(points[1].overage, 4200);
assert.equal(points[1].total, 35200);
assert.equal(points[1].arr, 120000);
assert.equal(helpers.formatConsumptionPointLabel(points[1], "weekly"), "22-Aug-26");
assert.equal(helpers.createNiceConsumptionMaximum(35200), 50000);
assert.equal(helpers.calculateAverageConsumption(points, true), 29000);
assert.equal(helpers.calculateAverageConsumption(points, false), 32100);
assert.equal(helpers.calculateAverageConsumption(points, true, new Set(["funded"])), 29000);
assert.equal(helpers.calculateAverageConsumption(points, false, new Set(["overage"])), 2100);
const fetchCalls = [];
const listener = loadBackground(fetchCalls);
const periods = ["quarterly", "monthly", "weekly", "daily"];
for (const period of periods) {
const response = await dispatch(listener, {
type: "opportunitiesExtension.requestConsumptionTrend",
subPlanNum: "11276098",
period,
authorization: { name: "g2m-authorization", value: "ocicons-secret" }
});
assert.equal(response.ok, true);
assert.equal(response.period, period);
assert.equal(response.items.length, 1);
assert.equal(response.debugRequests[0].name, `requestConsumptionService${period[0].toUpperCase()}${period.slice(1)}`);
}
assert.equal(fetchCalls.length, 4);
fetchCalls.forEach((call, index) => {
assert.equal(call.options.method, "GET");
assert.equal(call.options.headers["G2m-Authorization"], "ocicons-secret");
assert.match(call.url, /\/11276098\?quarter=All&timePeriod=/);
assert.ok(call.url.endsWith(periods[index]));
});
console.log("Consumption trend tests passed.");
}
run().catch((error) => {
console.error(error);
process.exitCode = 1;
});