175 lines
4.7 KiB
JavaScript
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;
|
|
});
|