128 lines
4.7 KiB
JavaScript
128 lines
4.7 KiB
JavaScript
// node server/rr/rr-test.js
|
||
|
||
/**
|
||
* @file rr-test.js
|
||
* @description Diagnostic test script for Reynolds & Reynolds (R&R) integration.
|
||
* Run with: NODE_ENV=development node server/rr/rr-test.js
|
||
*/
|
||
|
||
const path = require("path");
|
||
require("dotenv").config({
|
||
path: path.resolve(__dirname, "../../", `.env.${process.env.NODE_ENV || "development"}`)
|
||
});
|
||
|
||
const fs = require("fs/promises");
|
||
const mustache = require("mustache");
|
||
const { getBaseRRConfig } = require("./rr-constants");
|
||
const { RRActions, MakeRRCall } = require("./rr-helpers");
|
||
const RRLogger = require("./rr-logger");
|
||
|
||
// --- Mock socket + redis helpers for standalone test
|
||
const socket = {
|
||
bodyshopId: process.env.TEST_BODYSHOP_ID || null,
|
||
user: { email: "test@romeonline.io" },
|
||
emit: (event, data) => console.log(`[SOCKET EVENT] ${event}`, data),
|
||
logger: console
|
||
};
|
||
|
||
const redisHelpers = {
|
||
setSessionData: async () => {},
|
||
getSessionData: async () => {},
|
||
setSessionTransactionData: async () => {},
|
||
getSessionTransactionData: async () => {},
|
||
clearSessionTransactionData: async () => {}
|
||
};
|
||
|
||
(async () => {
|
||
try {
|
||
console.log("=== Reynolds & Reynolds Integration Test ===");
|
||
console.log("NODE_ENV:", process.env.NODE_ENV);
|
||
|
||
const baseCfg = getBaseRRConfig();
|
||
console.log("Base R&R Config (from env):", {
|
||
baseUrl: baseCfg.baseUrl,
|
||
hasUser: !!baseCfg.username || !!process.env.RR_API_USER || !!process.env.RR_USERNAME,
|
||
hasPass: !!baseCfg.password || !!process.env.RR_API_PASS || !!process.env.RR_PASSWORD,
|
||
timeout: baseCfg.timeout
|
||
});
|
||
|
||
// ---- test variables for GetAdvisors
|
||
const templateVars = {
|
||
DealerCode: process.env.RR_DEALER_NAME || "ROME",
|
||
DealerName: "Rome Collision Test",
|
||
SearchCriteria: {
|
||
Department: "Body Shop",
|
||
Status: "ACTIVE"
|
||
}
|
||
};
|
||
|
||
// Dealer/Store/Branch/PPSysId can come from rr_configuration or env; for test we override:
|
||
const dealerConfigOverride = {
|
||
// baseUrl can also be overridden here if you want
|
||
ppsysid: process.env.RR_PPSYSID || process.env.RR_PP_SYS_ID || process.env.RR_PP_SYSID || "TEST-PPSYSID",
|
||
dealer_number: process.env.RR_DEALER_NUMBER || "12345",
|
||
store_number: process.env.RR_STORE_NUMBER || "01",
|
||
branch_number: process.env.RR_BRANCH_NUMBER || "001",
|
||
// creds (optional here; MakeRRCall will fallback to env if omitted)
|
||
username: process.env.RR_API_USER || process.env.RR_USERNAME || "Rome",
|
||
password: process.env.RR_API_PASS || process.env.RR_PASSWORD || "secret"
|
||
};
|
||
|
||
// Show the first ~600 chars of the envelope we will send (by rendering the template + header)
|
||
// NOTE: This is just for printing; MakeRRCall will rebuild with proper header internally.
|
||
const templatePath = path.join(__dirname, "xml-templates", "GetAdvisors.xml");
|
||
const tpl = await fs.readFile(templatePath, "utf8");
|
||
const renderedBody = mustache.render(tpl, templateVars);
|
||
|
||
// Build a preview envelope using the same helper used by MakeRRCall
|
||
const { renderXmlTemplate } = require("./rr-helpers");
|
||
const headerPreview = await renderXmlTemplate("_EnvelopeHeader", {
|
||
PPSysId: dealerConfigOverride.ppsysid,
|
||
DealerNumber: dealerConfigOverride.dealer_number,
|
||
StoreNumber: dealerConfigOverride.store_number,
|
||
BranchNumber: dealerConfigOverride.branch_number,
|
||
Username: dealerConfigOverride.username,
|
||
Password: dealerConfigOverride.password,
|
||
CorrelationId: "preview-correlation"
|
||
});
|
||
const previewEnvelope = `
|
||
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rr="http://reynoldsandrey.com/">
|
||
<soapenv:Header>
|
||
${headerPreview}
|
||
</soapenv:Header>
|
||
<soapenv:Body>
|
||
${renderedBody}
|
||
</soapenv:Body>
|
||
</soapenv:Envelope>`.trim();
|
||
|
||
console.log("\n--- Rendered SOAP Envelope (first 600 chars) ---\n");
|
||
console.log(previewEnvelope.slice(0, 600));
|
||
console.log("... [truncated]\n");
|
||
|
||
// If we don't have a base URL, skip the live call
|
||
if (!baseCfg.baseUrl) {
|
||
console.warn("\n⚠️ No RR baseUrl defined. Skipping live call.\n");
|
||
return;
|
||
}
|
||
|
||
console.log(`--- Sending SOAP Request: ${RRActions.GetAdvisors.action} ---\n`);
|
||
|
||
const responseXml = await MakeRRCall({
|
||
action: "GetAdvisors",
|
||
baseUrl: process.env.RR_API_BASE_URL,
|
||
body: { template: "GetAdvisors", data: templateVars },
|
||
dealerConfig: dealerConfigOverride,
|
||
redisHelpers,
|
||
socket,
|
||
jobid: "test-job",
|
||
retries: 1
|
||
});
|
||
|
||
RRLogger(socket, "info", "RR test successful", { bytes: Buffer.byteLength(responseXml, "utf8") });
|
||
console.log("\n✅ Test completed successfully.\n");
|
||
} catch (error) {
|
||
console.error("\n❌ Test failed:", error.message);
|
||
console.error(error.stack);
|
||
}
|
||
})();
|