#!/usr/bin/env node
const { spawn } = require('child_process');
const readline = require('readline');
const path = require('path');
const TEST_CASE = {
name: 'AllCloud Bank Leumi Reseller-1 August 2025',
credentials: {
username: 'david+allcloud@umbrellacost.com',
password: process.env.ALLCLOUD_PASSWORD
},
requests: [
{
id: 1,
method: 'tools/call',
params: {
name: 'authenticate_user',
arguments: {
username: 'david+allcloud@umbrellacost.com',
password: process.env.ALLCLOUD_PASSWORD
}
}
},
{
id: 2,
method: 'tools/call',
params: {
name: 'api___invoices_caui',
arguments: {
userQuery: 'Bank Leumi Reseller-1 August no grouping',
startDate: '2025-08-01',
endDate: '2025-08-31',
periodGranLevel: 'month',
groupBy: 'none',
costType: '["cost", "discount"]',
isUnblended: 'true',
customer_account_key: '22676',
customer_division_id: '139'
}
}
}
],
expected: {
// Value from MANUAL_ANSWERS.txt - 4 decimal places
totalCost: 0.0027,
accountId: '696314371547'
}
};
function sendRequest(proc, request) {
const jsonRequest = JSON.stringify({
jsonrpc: '2.0',
...request
});
proc.stdin.write(jsonRequest + '\n');
}
function parseResponse(line) {
try {
if (line.trim().startsWith('{') && line.includes('jsonrpc')) {
return JSON.parse(line);
}
} catch (e) {}
return null;
}
async function runTest() {
return new Promise((resolve) => {
console.log('Testing: AllCloud Account (Bank Leumi Reseller-1, August 2025)');
const result = {
passed: false,
errors: []
};
const proc = spawn('node', [path.join(__dirname, '../dist/index.js')], {
env: process.env
});
const rl = readline.createInterface({
input: proc.stdout,
crlfDelay: Infinity
});
rl.on('line', (line) => {
if (!result.passed && line.includes('"serverInfo"')) {
sendRequest(proc, TEST_CASE.requests[0]);
}
const response = parseResponse(line);
if (response && response.id) {
if (response.id === 1) {
if (response.result) {
sendRequest(proc, TEST_CASE.requests[1]);
} else if (response.error) {
console.log(` ❌ Authentication failed: ${response.error.message}`);
result.errors.push(`Authentication failed: ${response.error.message}`);
proc.kill();
resolve(result);
}
} else if (response.id === 2) {
if (response.result) {
let data = null;
if (response.result.content && response.result.content[0] && response.result.content[0].text) {
const content = response.result.content[0].text;
const jsonMatch = content.match(/```json\n([\s\S]*?)\n```/);
if (jsonMatch) {
data = JSON.parse(jsonMatch[1]);
}
}
if (data && Array.isArray(data)) {
let allPassed = true;
// Check total cost (sum of all rows)
const actualTotal = data.reduce((sum, row) => sum + (row.total_cost || 0), 0);
// Round both to 4 decimal places for comparison
const roundedActual = Math.round(actualTotal * 10000) / 10000;
const roundedExpected = Math.round(TEST_CASE.expected.totalCost * 10000) / 10000;
if (roundedActual !== roundedExpected) {
console.log(` ❌ Total Cost: Expected ${TEST_CASE.expected.totalCost}, got ${actualTotal}`);
result.errors.push('Total cost mismatch');
allPassed = false;
} else {
console.log(` ✅ Total Cost: ${roundedActual} (matches to 4 decimal places)`);
}
// Check account ID
if (data[0] && data[0].account_id !== TEST_CASE.expected.accountId) {
console.log(` ❌ Account ID: Expected ${TEST_CASE.expected.accountId}, got ${data[0].account_id}`);
result.errors.push('Wrong account ID');
allPassed = false;
} else if (data[0]) {
console.log(` ✅ Account ID: ${data[0].account_id}`);
}
// Check customer key and division
console.log(' ℹ️ Customer Key: 22676, Division: 139');
result.passed = allPassed;
} else {
result.errors.push('No data in response');
}
} else if (response.error) {
result.errors.push(`API call failed: ${response.error.message}`);
}
proc.kill();
resolve(result);
}
}
});
proc.stderr.on('data', () => {});
sendRequest(proc, {
jsonrpc: '2.0',
method: 'initialize',
params: {
protocolVersion: '1.0.0',
capabilities: {},
clientInfo: { name: 'test-client', version: '1.0.0' }
},
id: 0
});
setTimeout(() => {
if (!result.passed && result.errors.length === 0) {
result.errors.push('Test timeout');
proc.kill();
resolve(result);
}
}, 30000);
});
}
runTest().then((result) => {
if (result.passed) {
console.log('\n✅ AllCloud test PASSED - Exact match!');
process.exit(0);
} else {
console.log('\n❌ AllCloud test FAILED');
process.exit(1);
}
});