Primeiro Commit v0.beta1

This commit is contained in:
2026-04-29 00:27:50 -03:00
parent 93d4906fb5
commit 8662a153fe
27 changed files with 16303 additions and 0 deletions

597
tests/functions.test.mjs Normal file
View File

@@ -0,0 +1,597 @@
import test, { after } from "node:test";
import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import fs from "node:fs/promises";
import path from "node:path";
import { pathToFileURL } from "node:url";
import {
catalogSaysApiMetricsAreRawRows,
catalogSaysCurrentWorkloadDefaults,
catalogSaysPreserveMixedRows,
catalogSaysUseRevenueLineCloseDate,
parseDefaultWeekYear,
parseCurrentWorkloadDefaults,
parsePrimaryCommercialSubjectArea,
parseSaAttachAliases,
parseSaAttachDateWindowField,
parseSaAttachDefaults,
parseWeekRow,
readSkillCatalogs,
} from "./helpers/catalogs.mjs";
import { skillHome } from "./helpers/cli.mjs";
const catalogs = await readSkillCatalogs();
const fetchModule = await import(
pathToFileURL(path.join(skillHome, "scripts", "fetch-sales-intelligence.mjs")).href
);
const functionTestRows = [];
function functionTest(id, title, details, fn) {
test(title, async () => {
const row = {
id,
teste: title,
entrada: details.entrada,
saida: details.saida || "",
avaliacao: "PASS",
};
try {
const output = await fn();
if (output) row.saida = output;
} catch (error) {
row.avaliacao = `FAIL; ${error.message}`;
throw error;
} finally {
functionTestRows.push(row);
}
});
}
after((t) => {
t.diagnostic(formatFunctionResultsTable(functionTestRows));
});
functionTest(
"auth-refresh-json-stdout",
"automatic auth refresh notice is emitted on stderr",
{
entrada: "source scan for the automatic refresh notice in fetch-sales-intelligence.mjs",
},
async () => {
const source = await fs.readFile(
path.join(skillHome, "scripts", "fetch-sales-intelligence.mjs"),
"utf8"
);
const notice = "Oracle DV session is missing or expired. Opening browser login to refresh auth...";
assert.match(source, new RegExp(`console\\.error\\(${JSON.stringify(notice)}\\)`));
assert.doesNotMatch(source, new RegExp(`console\\.log\\(${JSON.stringify(notice)}\\)`));
const originalLog = console.log;
const originalError = console.error;
const stdoutMessages = [];
const stderrMessages = [];
console.log = (...args) => stdoutMessages.push(args.join(" "));
console.error = (...args) => stderrMessages.push(args.join(" "));
try {
await fetchModule.withConsoleLogRoutedToStderr(async () => {
console.log("helper progress");
});
} finally {
console.log = originalLog;
console.error = originalError;
}
assert.deepEqual(stdoutMessages, []);
assert.deepEqual(stderrMessages, ["helper progress"]);
return "auto-refresh notice and imported helper progress use stderr, preserving JSON-only stdout";
}
);
functionTest(
"date-window",
"date-window functions follow documented shortcuts and week catalog",
{
entrada: "resolveDateWindow com --date, --month, --quarter, --week e combinação inválida",
},
() => {
const exact = fetchModule.resolveDateWindow({ date: "2026-05-02" });
assert.equal(exact.preset, "single-date");
assert.equal(exact.fromDate, "2026-05-02");
assert.equal(exact.toDate, "2026-05-02");
const leapDay = fetchModule.resolveDateWindow({ date: "2024-02-29" });
assert.equal(leapDay.fromDate, "2024-02-29");
assert.equal(leapDay.toDate, "2024-02-29");
assert.throws(
() => fetchModule.resolveDateWindow({ date: "2026-99-99" }),
/Invalid calendar date "2026-99-99"/
);
assert.throws(
() => fetchModule.resolveDateWindow({ date: "2026-02-29" }),
/Invalid calendar date "2026-02-29"/
);
const apiaCheck = spawnSync(
process.execPath,
[
"--input-type=module",
"-e",
`
const fetchModule = await import(${JSON.stringify(pathToFileURL(path.join(skillHome, "scripts", "fetch-sales-intelligence.mjs")).href)});
const window = fetchModule.resolveDateWindow({ date: "2011-12-30" });
console.log(window.fromDate);
`,
],
{
env: { ...process.env, TZ: "Pacific/Apia" },
encoding: "utf8",
}
);
assert.equal(apiaCheck.status, 0, apiaCheck.stderr);
assert.equal(apiaCheck.stdout.trim(), "2011-12-30");
const month = fetchModule.resolveDateWindow({ month: "2026-04" });
assert.equal(month.preset, "calendar-month");
assert.equal(month.fromDate, "2026-04-01");
assert.equal(month.toDate, "2026-04-30");
const quarter = fetchModule.resolveDateWindow({ quarter: "FY26-Q4" });
assert.equal(quarter.preset, "fiscal-quarter");
assert.equal(quarter.fiscalYear, "FY26");
assert.equal(quarter.fiscalQuarter, "Q4");
assert.equal(quarter.fromDate, "2026-03-01");
assert.equal(quarter.toDate, "2026-05-31");
const weekYear = parseDefaultWeekYear(catalogs.scriptCatalog);
const expectedWeek = parseWeekRow(catalogs.scriptCatalog, "W43");
const week = fetchModule.resolveDateWindow({
week: expectedWeek.weekLabel.toLowerCase(),
"week-year": String(weekYear),
});
assert.equal(week.weekLabel, expectedWeek.weekLabel);
assert.equal(week.fromDate, expectedWeek.fromDate);
assert.equal(week.toDate, expectedWeek.toDate);
assert.throws(
() => fetchModule.resolveDateWindow({ date: "2026-05-02", month: "2026-05" }),
/Use either --date/
);
return `single=${exact.fromDate}; month=${month.fromDate}..${month.toDate}; quarter=${quarter.fromDate}..${quarter.toDate}; week=${week.fromDate}..${week.toDate}; invalid-combo rejected`;
});
functionTest(
"sa-attach-defaults",
"SA Attach defaults and aliases come from initial-context-catalog",
{
entrada: "parseSaAttachDefaults/parseSaAttachAliases + resolveSaAttachFilters",
},
() => {
const defaults = parseSaAttachDefaults(catalogs.initialContext);
const aliases = parseSaAttachAliases(catalogs.initialContext);
const filters = fetchModule.resolveSaAttachFilters({}, {
defaultStatuses: defaults.revenueLineStatus,
});
assert.equal(filters.cluster, defaults.cluster[0]);
assert.deepEqual(filters.solutions, defaults.solution);
assert.deepEqual(filters.statuses, defaults.revenueLineStatus);
assert.deepEqual(filters.productLobs, defaults.executiveProductLob);
assert.deepEqual(filters.revenueTypeGroups, defaults.revenueTypeGroup);
assert.equal(filters.salesCreditType, defaults.salesCreditType[0]);
assert.equal(filters.minOpportunityProbability, Number(defaults.minOpportunityProbability[0]));
const lobAlias = Object.entries(aliases).find(([, values]) => values.length > 1);
const targetRevenueType = defaults.revenueTypeGroup.at(-1);
const revenueTypeAlias = Object.entries(aliases).find(([, values]) => values.includes(targetRevenueType));
assert.ok(lobAlias, "Expected at least one multi-value LOB alias in the catalog.");
assert.ok(revenueTypeAlias, "Expected a revenue-type alias for the catalog default workload group.");
const aliasFilters = fetchModule.resolveSaAttachFilters(
{
"executive-product-lob": lobAlias[0],
"revenue-type-group": revenueTypeAlias[0].split("|")[0],
},
{ defaultStatuses: defaults.revenueLineStatus }
);
assert.deepEqual(aliasFilters.productLobs, lobAlias[1]);
assert.deepEqual(aliasFilters.revenueTypeGroups, revenueTypeAlias[1]);
return `cluster=${filters.cluster}; solutions=${filters.solutions.length}; statuses=${filters.statuses.length}; aliases validated`;
});
functionTest(
"close-window-explicit-cluster",
"close-window commercial SQL honors explicit cluster without SA Attach defaults",
{
entrada: "buildPrimaryOpportunityWhereClauses com cluster Mexico",
},
() => {
const clauses = fetchModule.buildPrimaryOpportunityWhereClauses({
fromDateSql: "DATE '2026-05-01'",
toDateSql: "DATE '2026-05-31'",
statuses: ["Open"],
cluster: "Mexico",
});
const sql = clauses.join("\n");
assert.match(sql, /"Revenue Line Close Date" >= DATE '2026-05-01'/);
assert.match(sql, /"Revenue Line Close Date" <= DATE '2026-05-31'/);
assert.match(sql, /"Opportunity Status" IN \('Open'\)/);
assert.match(sql, /"Cluster" = 'Mexico'/);
assert.doesNotMatch(sql, /"Solution" IN/);
assert.doesNotMatch(sql, /"Revenue Type Group" IN/);
assert.doesNotMatch(sql, /"Sales Credit Type" =/);
const withoutCluster = fetchModule.buildPrimaryOpportunityWhereClauses({
fromDateSql: "DATE '2026-05-01'",
toDateSql: "DATE '2026-05-31'",
statuses: ["Open"],
}).join("\n");
assert.doesNotMatch(withoutCluster, /"Cluster" =/);
return "explicit cluster is applied; absent cluster preserves existing unfiltered geography behavior";
});
functionTest(
"manager-resource-workload-explicit-cluster",
"manager/resource workload SQL honors explicit cluster and defaults to Brazil",
{
entrada: "buildManagerResourceWorkloadSql com cluster Mexico e default",
},
() => {
const mexicoSql = fetchModule.buildManagerResourceWorkloadSql({
fromDateSql: "DATE '2026-05-01'",
toDateSql: "DATE '2026-05-31'",
cluster: "Mexico",
});
assert.match(mexicoSql, /"Cluster" = 'Mexico'/);
const defaultSql = fetchModule.buildManagerResourceWorkloadSql({
fromDateSql: "DATE '2026-05-01'",
toDateSql: "DATE '2026-05-31'",
});
assert.match(defaultSql, /"Cluster" = 'Brazil'/);
return "manager/resource workload cluster is explicit when provided and Brazil by default";
});
functionTest(
"coverage-limit-cap",
"coverage enrichment limit never exceeds Oracle DV maximum",
{
entrada: "resolveCoverageLimit com limites baixo, normal e alto",
},
() => {
assert.equal(fetchModule.resolveCoverageLimit(10), 5000);
assert.equal(fetchModule.resolveCoverageLimit(1000), 8000);
assert.equal(fetchModule.resolveCoverageLimit(5000), 10000);
assert.equal(fetchModule.resolveCoverageLimit(10000), 10000);
return "coverage limit is bounded to 5,000..10,000";
});
functionTest(
"current-workload-defaults",
"current workload defaults are documented and applied locally",
{
entrada: "applyCurrentWorkloadIntentDefaults para owner atual e month explícito",
},
() => {
assert.equal(catalogSaysCurrentWorkloadDefaults(catalogs, "workloads-by-owner-current"), true);
assert.equal(catalogSaysCurrentWorkloadDefaults(catalogs, "workloads-by-owner-manager-current"), true);
const expectedDefaults = parseCurrentWorkloadDefaults(catalogs, "workloads-by-owner-current");
const defaults = fetchModule.applyCurrentWorkloadIntentDefaults({
intent: "workloads-by-owner-current",
"owner-email": "territory.owner@oracle.com",
});
assert.equal(defaults.quarter, expectedDefaults.quarter);
assert.equal(defaults.solution, expectedDefaults.solution);
assert.equal(defaults["revenue-type-group"], expectedDefaults.revenueTypeGroup);
assert.equal(fetchModule.hasAnyDateWindowArgs(defaults), true);
const explicitMonth = fetchModule.applyCurrentWorkloadIntentDefaults({
month: "2026-04",
"owner-email": "territory.owner@oracle.com",
});
assert.equal(explicitMonth.month, "2026-04");
assert.equal(explicitMonth.quarter, undefined);
assert.equal(explicitMonth.solution, expectedDefaults.solution);
return `quarter=${defaults.quarter}; solution=${defaults.solution}; revenueTypeGroup=${defaults["revenue-type-group"]}; explicitMonth preserved`;
});
functionTest(
"sa-attach-window-sql",
"SA Attach window SQL uses the documented revenue-line close date field",
{
entrada: "buildSaAttachOpportunityWhereClauses com janela 2026-03-01..2026-05-31",
},
() => {
assert.equal(catalogSaysUseRevenueLineCloseDate(catalogs), true);
const defaults = parseSaAttachDefaults(catalogs.initialContext);
const dateField = parseSaAttachDateWindowField(catalogs);
const dataset = parsePrimaryCommercialSubjectArea(catalogs.apiMap);
const clauses = fetchModule.buildSaAttachOpportunityWhereClauses({
dataset,
fiscalYear: null,
previousFiscalYear: null,
fromDateSql: "DATE '2026-03-01'",
toDateSql: "DATE '2026-05-31'",
cluster: defaults.cluster[0],
solutions: [defaults.solution[0]],
statuses: defaults.revenueLineStatus,
productLobs: [defaults.executiveProductLob[0]],
revenueTypeGroups: [defaults.revenueTypeGroup.at(-1)],
salesCreditType: defaults.salesCreditType[0],
minOpportunityProbability: Number(defaults.minOpportunityProbability[0]),
ownerEmail: "territory.owner@oracle.com",
ownerManagerEmail: "territory.manager@oracle.com",
forecastTypes: ["Forecast"],
});
const sql = clauses.join("\n");
assert.match(sql, new RegExp(escapeRegExp(dateField)));
assert.match(sql, /DATE '2026-03-01'/);
assert.match(sql, /DATE '2026-05-31'/);
assert.match(sql, /Level 7 Territory Owner E-mail/);
assert.match(sql, /Revenue Line Forecast Type Group/);
assert.doesNotMatch(sql, /Revenue Line Close Year/);
return `field=${dateField}; SQL inclui forecast/owner e não usa Revenue Line Close Year`;
});
functionTest(
"scope-sql",
"scope-related SQL follows catalog-backed org-wide and my-team rules",
{
entrada: "renderViewSql para Presales Aux, Hours e srs-by-resource-email",
},
() => {
const coverageOrg = fetchModule.renderViewSql("sa-attach-presales-coverage");
const coverageTeam = fetchModule.renderViewSql("sa-attach-presales-coverage", { scope: "my-team" });
const hoursOrg = fetchModule.renderViewSql("sa-attach-hours-by-opportunity");
const hoursTeam = fetchModule.renderViewSql("sa-attach-hours-by-opportunity", { scope: "my-team" });
const srTeam = fetchModule.renderViewSql("srs-by-resource-email", {
resourceEmailSql: "'resource.member@oracle.com'",
matchRole: "team",
srStatuses: [],
});
const srLead = fetchModule.renderViewSql("srs-by-resource-email", {
resourceEmailSql: "'resource.member@oracle.com'",
matchRole: "lead",
srStatuses: [],
});
assert.match(catalogs.skill, /Presales Involvement Aux - V1.*org-wide/s);
assert.doesNotMatch(coverageOrg, /SEC_ARIA_SI-SR-TEAM/);
assert.match(coverageTeam, /SEC_ARIA_SI-SR-TEAM/);
assert.doesNotMatch(hoursOrg, /SEC_ARIA_SI-SR-TEAM/);
assert.match(hoursTeam, /SEC_ARIA_SI-SR-TEAM/);
assert.match(srTeam, /SE Team Level 1 Email Address/);
assert.match(srTeam, /SE Team Level 4 Email Address/);
assert.match(srLead, /"Service Request"\."Lead Email" = 'resource.member@oracle.com'/);
return "org-wide sem SEC_ARIA; my-team com SEC_ARIA; SR team usa levels 1..4; lead só quando explícito";
});
functionTest(
"current-team-summary",
"current-team coverage summaries preserve unmatched commercial rows",
{
entrada: "summarizeCurrentTeamOpportunityCoverage com 2 oportunidades e 1 cobertura",
},
() => {
assert.equal(catalogSaysPreserveMixedRows(catalogs), true);
const result = fetchModule.summarizeCurrentTeamOpportunityCoverage(
[
{
opportunityId: "OPP-1",
opportunityName: "Alpha",
customerName: "Acme",
opportunityStatus: "Open",
closeDate: "2026-03-31",
salesStage: "Develop",
bookingValue: 100000,
workloadAmount: 50000,
},
{
opportunityId: "OPP-2",
opportunityName: "Beta",
customerName: "Bravo",
opportunityStatus: "Open",
closeDate: "2026-04-01",
salesStage: "Close",
bookingValue: 200000,
workloadAmount: 75000,
},
],
[
{
opportunityId: "OPP-1",
seTeamLevel5EmailAddress: "engineer.one@oracle.com",
opportunityHoursAttribute: 6,
},
]
);
assert.equal(result.records.length, 2);
assert.equal(result.summary.totalWindowOpportunities, 2);
assert.equal(result.summary.matchedOpportunities, 1);
assert.equal(result.summary.unmatchedOpportunities, 1);
assert.equal(result.summary.totalBookingValue, 300000);
assert.equal(result.summary.totalWorkloadAmount, 125000);
const unmatched = result.records.find((record) => record.opportunityId === "OPP-2");
assert.deepEqual(unmatched.teamMemberEmails, []);
assert.equal(unmatched.coverageRows, 0);
return `records=${result.records.length}; matched=${result.summary.matchedOpportunities}; unmatched=${result.summary.unmatchedOpportunities}; totalWorkload=${result.summary.totalWorkloadAmount}`;
});
functionTest(
"manager-resource-summary",
"manager-resource workload summaries keep resource involvement details",
{
entrada: "summarizeOrgWideRevenueLineCoverage com cobertura Aux e cenário opcional com SR injetado",
},
() => {
const defaultResult = fetchModule.summarizeOrgWideRevenueLineCoverage(
[
{
closeDate: "2026-04-06",
revenueLineId: "RL-1",
opportunityId: "OPP-1",
opportunityName: "Alpha",
customerName: "Acme",
workloadAmount: 240000,
},
],
[
{
opportunityId: "OPP-1",
seTeamLevel4EmailAddress: "resource.manager.a@oracle.com",
seTeamLevel5EmailAddress: "resource.member.a@oracle.com",
},
{
opportunityId: "OPP-1",
seTeamLevel4EmailAddress: "resource.manager.b@oracle.com",
seTeamLevel5EmailAddress: "resource.member.b@oracle.com",
},
]
);
assert.deepEqual(defaultResult.records[0].resourceDetails, [
{
resourceEmail: "resource.member.a@oracle.com",
companionEmails: ["resource.member.b@oracle.com"],
},
{
resourceEmail: "resource.member.b@oracle.com",
companionEmails: ["resource.member.a@oracle.com"],
},
]);
assert.equal(Object.hasOwn(defaultResult.records[0].resourceDetails[0], "srNumbers"), false);
const result = fetchModule.summarizeOrgWideRevenueLineCoverage(
[
{
closeDate: "2026-04-06",
revenueLineId: "RL-1",
opportunityId: "OPP-1",
opportunityName: "Alpha",
customerName: "Acme",
workloadAmount: 240000,
},
{
closeDate: "2026-04-07",
revenueLineId: "RL-2",
opportunityId: "OPP-2",
opportunityName: "Beta",
customerName: "Bravo",
workloadAmount: 367000,
},
],
[
{
opportunityId: "OPP-1",
seTeamLevel4EmailAddress: "resource.manager.a@oracle.com",
seTeamLevel5EmailAddress: "resource.member.a@oracle.com",
},
{
opportunityId: "OPP-1",
seTeamLevel4EmailAddress: "resource.manager.b@oracle.com",
seTeamLevel5EmailAddress: "resource.member.b@oracle.com",
},
],
new Map([["OPP-1::resource.member.a@oracle.com", new Set(["SR-100"])] ]),
new Map([
[
"resource.member.a@oracle.com",
new Map([
["SR-900", { srNumber: "SR-900", customerName: "Acme", title: "Internal follow-up" }],
["SR-901", { srNumber: "SR-901", customerName: "Other Corp", title: "Ignore me" }],
]),
],
])
);
assert.equal(result.records.length, 1);
assert.equal(result.records[0].revenueLineId, "RL-1");
assert.deepEqual(result.records[0].managerEmails, [
"resource.manager.a@oracle.com",
"resource.manager.b@oracle.com",
]);
assert.deepEqual(result.records[0].resourceEmails, [
"resource.member.a@oracle.com",
"resource.member.b@oracle.com",
]);
const resourceA = result.records[0].resourceDetails.find(
(detail) => detail.resourceEmail === "resource.member.a@oracle.com"
);
assert.deepEqual(resourceA.srNumbers, ["SR-100", "SR-900"]);
assert.deepEqual(resourceA.directSrNumbers, ["SR-100"]);
assert.deepEqual(resourceA.candidateInternalSrNumbers, ["SR-900"]);
assert.equal(resourceA.srLinkageMode, "direct-plus-candidate-internal");
assert.deepEqual(resourceA.companionEmails, ["resource.member.b@oracle.com"]);
assert.equal(result.summary.totalWindowRevenueLines, 2);
assert.equal(result.summary.matchedRevenueLines, 1);
assert.equal(result.summary.matchedOpportunities, 1);
assert.equal(result.summary.totalWorkloadAmount, 240000);
assert.equal(result.summary.resourcesMatched, 2);
return `defaultResourceDetails=${defaultResult.records[0].resourceDetails.length}; defaultSrFields=omitted; optionalSrLinkage=${resourceA.srLinkageMode}; resourcesMatched=${result.summary.resourcesMatched}`;
});
functionTest(
"api-metrics",
"API metrics count raw backend rows and ignore local-cache-only rows",
{
entrada: "buildApiMetrics com rows 3 + 2 e cache local não contado",
},
() => {
assert.equal(catalogSaysApiMetricsAreRawRows(catalogs), true);
const metrics = fetchModule.buildApiMetrics([
{
label: "window",
result: { aResults: [[1], [2], [3]] },
},
{
label: "coverage",
result: { aResults: [[1], [2]] },
},
{
label: "sessionMetaCache",
rowsReturned: 0,
source: "session-meta-cache",
countedInTotal: false,
},
]);
assert.equal(metrics.totalRowsPulledFromApi, 5);
assert.equal(metrics.queries.length, 3);
assert.equal(metrics.explanation, "Raw rows pulled from API: 5.");
return `totalRowsPulledFromApi=${metrics.totalRowsPulledFromApi}; queries=${metrics.queries.length}; local-cache ignored`;
});
function formatFunctionResultsTable(rows) {
const header = ["id", "teste", "entrada", "saida", "avaliacao"];
const lines = [
`| ${header.join(" | ")} |`,
`| ${header.map(() => "---").join(" | ")} |`,
...rows.map((row) =>
`| ${markdownCell(row.id)} | ${markdownCell(row.teste)} | ${markdownCell(row.entrada)} | ${markdownCell(row.saida)} | ${markdownCell(row.avaliacao)} |`
),
];
return lines.join("\n");
}
function markdownCell(value) {
return String(value ?? "")
.replace(/\r?\n/g, "<br>")
.replace(/\|/g, "\\|");
}
function escapeRegExp(value) {
return String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}