179 lines
6.0 KiB
JavaScript
179 lines
6.0 KiB
JavaScript
/**
|
|
* JavaScript Table Sender Test
|
|
* Tests the smartsend function with table (Arrow IPC) payloads
|
|
*/
|
|
|
|
const NATSBridge = require('../src/natbridge.js');
|
|
|
|
const TEST_SUBJECT = '/test/table';
|
|
const TEST_BROKER_URL = process.env.NATS_URL || 'nats://localhost:4222';
|
|
const TEST_FILESERVER_URL = process.env.FILESERVER_URL || 'http://localhost:8080';
|
|
|
|
async function runTest() {
|
|
console.log('=== JavaScript Table Sender Test ===\n');
|
|
|
|
const correlationId = NATSBridge.uuidv4();
|
|
console.log(`Correlation ID: ${correlationId}`);
|
|
console.log(`Subject: ${TEST_SUBJECT}`);
|
|
console.log(`Broker URL: ${TEST_BROKER_URL}\n`);
|
|
|
|
// Test data - table data as array of objects
|
|
const tableData = [
|
|
{ id: 1, name: 'Alice', age: 30, active: true },
|
|
{ id: 2, name: 'Bob', age: 25, active: false },
|
|
{ id: 3, name: 'Charlie', age: 35, active: true },
|
|
{ id: 4, name: 'Diana', age: 28, active: true },
|
|
{ id: 5, name: 'Eve', age: 32, active: false }
|
|
];
|
|
|
|
const testData = [
|
|
['users_table', tableData, 'table']
|
|
];
|
|
|
|
try {
|
|
// Send the message
|
|
console.log('Sending table payload...');
|
|
const [env, envJsonStr] = await NATSBridge.smartsend(
|
|
TEST_SUBJECT,
|
|
testData,
|
|
{
|
|
broker_url: TEST_BROKER_URL,
|
|
fileserver_url: TEST_FILESERVER_URL,
|
|
correlation_id: correlationId,
|
|
msg_purpose: 'test',
|
|
sender_name: 'js-table-test',
|
|
is_publish: false
|
|
}
|
|
);
|
|
|
|
console.log('\n=== Envelope Created ===');
|
|
console.log(`Correlation ID: ${env.correlation_id}`);
|
|
console.log(`Message ID: ${env.msg_id}`);
|
|
console.log(`Timestamp: ${env.timestamp}`);
|
|
console.log(`Subject: ${env.send_to}`);
|
|
console.log(`Purpose: ${env.msg_purpose}`);
|
|
console.log(`Sender: ${env.sender_name}`);
|
|
console.log(`Payloads: ${env.payloads.length}\n`);
|
|
|
|
// Validate envelope structure
|
|
console.log('=== Validation ===');
|
|
let passed = true;
|
|
|
|
if (env.payloads.length !== 1) {
|
|
console.log(`❌ Expected 1 payload, got ${env.payloads.length}`);
|
|
passed = false;
|
|
} else {
|
|
console.log('✅ Correct number of payloads');
|
|
}
|
|
|
|
const payload = env.payloads[0];
|
|
if (payload.dataname !== 'users_table') {
|
|
console.log(`❌ Expected dataname 'users_table', got '${payload.dataname}'`);
|
|
passed = false;
|
|
} else {
|
|
console.log('✅ Correct dataname');
|
|
}
|
|
|
|
if (payload.payload_type !== 'table') {
|
|
console.log(`❌ Expected payload_type 'table', got '${payload.payload_type}'`);
|
|
passed = false;
|
|
} else {
|
|
console.log('✅ Correct payload_type');
|
|
}
|
|
|
|
if (payload.transport !== 'direct') {
|
|
console.log(`❌ Expected transport 'direct', got '${payload.transport}'`);
|
|
passed = false;
|
|
} else {
|
|
console.log('✅ Correct transport');
|
|
}
|
|
|
|
if (payload.encoding !== 'base64') {
|
|
console.log(`❌ Expected encoding 'base64', got '${payload.encoding}'`);
|
|
passed = false;
|
|
} else {
|
|
console.log('✅ Correct encoding');
|
|
}
|
|
|
|
// Verify Arrow IPC data can be decoded
|
|
console.log('\n=== Arrow IPC Verification ===');
|
|
const decodedData = Buffer.from(payload.data, 'base64');
|
|
console.log(`Arrow IPC buffer size: ${decodedData.length} bytes`);
|
|
|
|
if (decodedData.length > 0) {
|
|
console.log('✅ Arrow IPC data present');
|
|
} else {
|
|
console.log('❌ Arrow IPC data is empty');
|
|
passed = false;
|
|
}
|
|
|
|
// Test with larger table
|
|
console.log('\n=== Larger Table Test ===');
|
|
const largeTableData = [];
|
|
for (let i = 1; i <= 100; i++) {
|
|
largeTableData.push({
|
|
id: i,
|
|
name: `User${i}`,
|
|
age: Math.floor(Math.random() * 100),
|
|
active: Math.random() > 0.5,
|
|
score: Math.random() * 100
|
|
});
|
|
}
|
|
|
|
const largeTestData = [
|
|
['large_table', largeTableData, 'table']
|
|
];
|
|
|
|
const [largeEnv, _] = await NATSBridge.smartsend(
|
|
TEST_SUBJECT,
|
|
largeTestData,
|
|
{
|
|
broker_url: TEST_BROKER_URL,
|
|
fileserver_url: TEST_FILESERVER_URL,
|
|
correlation_id: 'large-' + correlationId,
|
|
is_publish: false
|
|
}
|
|
);
|
|
|
|
if (largeEnv.payloads.length === 1) {
|
|
console.log('✅ Large table handled correctly');
|
|
console.log(` Size: ${largeEnv.payloads[0].size} bytes`);
|
|
} else {
|
|
console.log('❌ Large table handling failed');
|
|
passed = false;
|
|
}
|
|
|
|
// Test JSON string output
|
|
console.log('\n=== JSON String Output Test ===');
|
|
try {
|
|
const parsed = JSON.parse(envJsonStr);
|
|
if (parsed.correlation_id === env.correlation_id &&
|
|
parsed.payloads.length === env.payloads.length) {
|
|
console.log('✅ JSON string is valid and matches envelope');
|
|
} else {
|
|
console.log('❌ JSON string does not match envelope');
|
|
passed = false;
|
|
}
|
|
} catch (e) {
|
|
console.log('❌ JSON string is invalid:', e.message);
|
|
passed = false;
|
|
}
|
|
|
|
// Final result
|
|
console.log('\n=== Test Result ===');
|
|
if (passed) {
|
|
console.log('✅ ALL TESTS PASSED');
|
|
process.exit(0);
|
|
} else {
|
|
console.log('❌ SOME TESTS FAILED');
|
|
process.exit(1);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Test failed with error:', error.message);
|
|
console.error(error.stack);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
runTest(); |