![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.ca/private_html/scripts/ |
#!/usr/bin/env node
/**
* Test Script for Barreau Verification System
*
* This script helps test the Barreau verification API with various scenarios
* to ensure the system is working correctly.
*
* Usage:
* node scripts/test-barreau-verification.js
* node scripts/test-barreau-verification.js --test-all
* node scripts/test-barreau-verification.js --test-case="Justin Wee"
*/
const axios = require('axios');
const readline = require('readline');
const API_BASE_URL = 'http://localhost:3000/api/lawyer/barreau-verify';
// Test cases with different scenarios
const testCases = [
{
name: 'Justin Wee',
phone: '514-555-0101',
practiceArea: 'Civil',
description: 'Real lawyer from screenshots (should match)',
expected: 'success'
},
{
name: 'Wee, Justin',
phone: '5145550101',
practiceArea: 'Civil',
description: 'Same lawyer with "Last, First" format',
expected: 'success'
},
{
name: 'John Doe',
phone: '555-123-4567',
practiceArea: 'Criminal',
description: 'Fictional lawyer (should not match)',
expected: 'no-match'
},
{
name: 'Marie-Claude Tremblay',
phone: '418-555-1234',
practiceArea: 'Family',
description: 'Common Quebec name (may or may not match)',
expected: 'unknown'
},
{
name: 'Jean-François Bouchard',
phone: '450-555-9876',
practiceArea: 'Commercial',
description: 'Another common Quebec name',
expected: 'unknown'
},
{
name: 'A',
phone: '123',
practiceArea: '',
description: 'Invalid input (should fail validation)',
expected: 'validation-error'
}
];
// Colors for console output
const colors = {
reset: '\x1b[0m',
bright: '\x1b[1m',
red: '\x1b[31m',
green: '\x1b[32m',
yellow: '\x1b[33m',
blue: '\x1b[34m',
magenta: '\x1b[35m',
cyan: '\x1b[36m'
};
function log(message, color = 'reset') {
console.log(`${colors[color]}${message}${colors.reset}`);
}
function logHeader(message) {
log('\n' + '='.repeat(60), 'cyan');
log(message, 'bright');
log('='.repeat(60), 'cyan');
}
function logTestResult(testCase, result, success) {
const status = success ? 'PASS' : 'FAIL';
const color = success ? 'green' : 'red';
log(`\n${status}: ${testCase.description}`, color);
log(`Name: ${testCase.name}`, 'yellow');
log(`Phone: ${testCase.phone}`, 'yellow');
log(`Practice Area: ${testCase.practiceArea}`, 'yellow');
if (result.error) {
log(`Error: ${result.error}`, 'red');
}
if (result.message) {
log(`Message: ${result.message}`, 'blue');
}
if (result.matchedProfiles && result.matchedProfiles.length > 0) {
log(`\nMatched Profiles:`, 'green');
result.matchedProfiles.forEach((profile, index) => {
log(` ${index + 1}. ${profile.name}`, 'green');
if (profile.employer) log(` Employer: ${profile.employer}`, 'cyan');
if (profile.phone) log(` Phone: ${profile.phone}`, 'cyan');
if (profile.practiceAreas && profile.practiceAreas.length > 0) {
log(` Practice Areas: ${profile.practiceAreas.join(', ')}`, 'cyan');
}
if (profile.matchScore) log(` Match Score: ${profile.matchScore}`, 'magenta');
});
}
if (result.allProfiles && result.allProfiles.length > 0 && (!result.matchedProfiles || result.matchedProfiles.length === 0)) {
log(`\nAll Found Profiles (${result.allProfiles.length}):`, 'yellow');
result.allProfiles.slice(0, 3).forEach((profile, index) => {
log(` ${index + 1}. ${profile.name}`, 'yellow');
if (profile.employer) log(` Employer: ${profile.employer}`, 'cyan');
if (profile.phone) log(` Phone: ${profile.phone}`, 'cyan');
});
if (result.allProfiles.length > 3) {
log(` ... and ${result.allProfiles.length - 3} more profiles`, 'yellow');
}
}
if (result.suggestions && result.suggestions.length > 0) {
log(`\nSuggestions:`, 'blue');
result.suggestions.forEach(suggestion => {
log(` • ${suggestion}`, 'blue');
});
}
}
async function testVerification(testCase) {
try {
logHeader(`Testing: ${testCase.description}`);
const startTime = Date.now();
const response = await axios.post(API_BASE_URL, {
name: testCase.name,
phone: testCase.phone,
practiceArea: testCase.practiceArea
}, {
timeout: 30000,
headers: {
'Content-Type': 'application/json'
}
});
const endTime = Date.now();
const duration = endTime - startTime;
log(`Response Time: ${duration}ms`, 'magenta');
const result = response.data;
// Determine if test passed based on expected outcome
let success = false;
switch (testCase.expected) {
case 'success':
success = result.found && result.matchedProfiles && result.matchedProfiles.length > 0;
break;
case 'no-match':
success = !result.found && result.allProfiles && result.allProfiles.length === 0;
break;
case 'unknown':
success = true; // Any result is acceptable for unknown cases
break;
case 'validation-error':
success = response.status === 400;
break;
default:
success = true;
}
logTestResult(testCase, result, success);
return { success, result, duration };
} catch (error) {
const isValidationError = error.response && error.response.status === 400;
const success = testCase.expected === 'validation-error' && isValidationError;
log(`\nFAIL: ${testCase.description}`, 'red');
log(`Name: ${testCase.name}`, 'yellow');
log(`Phone: ${testCase.phone}`, 'yellow');
log(`Practice Area: ${testCase.practiceArea}`, 'yellow');
if (error.response) {
log(`Status: ${error.response.status}`, 'red');
if (error.response.data) {
log(`Error: ${error.response.data.error || 'Unknown error'}`, 'red');
if (error.response.data.message) {
log(`Message: ${error.response.data.message}`, 'blue');
}
}
} else {
log(`Error: ${error.message}`, 'red');
}
return { success, error: error.message, duration: 0 };
}
}
async function runAllTests() {
logHeader('Barreau Verification System - Comprehensive Test Suite');
const results = [];
let passed = 0;
let failed = 0;
let totalDuration = 0;
for (const testCase of testCases) {
const result = await testVerification(testCase);
results.push({ testCase, ...result });
if (result.success) {
passed++;
} else {
failed++;
}
totalDuration += result.duration;
// Add delay between tests to be respectful to the server
await new Promise(resolve => setTimeout(resolve, 2000));
}
// Summary
logHeader('Test Summary');
log(`Total Tests: ${testCases.length}`, 'bright');
log(`Passed: ${passed}`, 'green');
log(`Failed: ${failed}`, 'red');
log(`Total Duration: ${totalDuration}ms`, 'magenta');
log(`Average Duration: ${Math.round(totalDuration / testCases.length)}ms`, 'magenta');
// Detailed results
logHeader('Detailed Results');
results.forEach((result, index) => {
const status = result.success ? 'PASS' : 'FAIL';
const color = result.success ? 'green' : 'red';
log(`${index + 1}. ${status}: ${result.testCase.description}`, color);
});
return { passed, failed, total: testCases.length };
}
async function runSingleTest(testName) {
const testCase = testCases.find(tc =>
tc.name.toLowerCase().includes(testName.toLowerCase()) ||
tc.description.toLowerCase().includes(testName.toLowerCase())
);
if (!testCase) {
log(`No test case found matching: ${testName}`, 'red');
log('Available test cases:', 'yellow');
testCases.forEach((tc, index) => {
log(`${index + 1}. ${tc.name} - ${tc.description}`, 'cyan');
});
return;
}
await testVerification(testCase);
}
async function interactiveMode() {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
logHeader('Interactive Barreau Verification Testing');
log('Enter lawyer information to test:', 'bright');
const name = await new Promise(resolve => {
rl.question('Name: ', resolve);
});
const phone = await new Promise(resolve => {
rl.question('Phone: ', resolve);
});
const practiceArea = await new Promise(resolve => {
rl.question('Practice Area: ', resolve);
});
rl.close();
const customTestCase = {
name,
phone,
practiceArea,
description: 'Custom test case',
expected: 'unknown'
};
await testVerification(customTestCase);
}
// Main execution
async function main() {
const args = process.argv.slice(2);
try {
if (args.includes('--test-all')) {
await runAllTests();
} else if (args.includes('--interactive')) {
await interactiveMode();
} else if (args.includes('--test-case')) {
const testCaseIndex = args.indexOf('--test-case');
const testCaseValue = args[testCaseIndex + 1];
if (testCaseValue) {
await runSingleTest(testCaseValue);
} else {
log('Please provide a test case value', 'red');
}
} else {
logHeader('Barreau Verification Test Script');
log('Usage:', 'bright');
log(' node scripts/test-barreau-verification.js --test-all', 'cyan');
log(' node scripts/test-barreau-verification.js --interactive', 'cyan');
log(' node scripts/test-barreau-verification.js --test-case="Justin Wee"', 'cyan');
log('\nAvailable test cases:', 'bright');
testCases.forEach((tc, index) => {
log(`${index + 1}. ${tc.name} - ${tc.description}`, 'cyan');
});
}
} catch (error) {
log(`\nScript error: ${error.message}`, 'red');
process.exit(1);
}
}
// Run the script
if (require.main === module) {
main();
}
module.exports = {
testCases,
testVerification,
runAllTests
};