// qa-audit-v2.js — QA audit dengan correct route paths const https = require('https'); const BASE = 'https://dev.demoplace.my.id'; let COOKIES = ''; function req(method, path, body) { return new Promise((resolve) => { const urlObj = new URL(`${BASE}${path}`); const options = { hostname: urlObj.hostname, port: 443, path: urlObj.pathname + urlObj.search, method, headers: { 'Content-Type': 'application/json', 'Accept': 'text/html,application/json,*/*', ...(COOKIES ? { 'Cookie': COOKIES } : {}), ...(body ? { 'Content-Length': Buffer.byteLength(JSON.stringify(body)) } : {}), }, rejectUnauthorized: false, timeout: 15000, }; const r = https.request(options, (res) => { let data = ''; res.on('data', d => data += d); res.on('end', () => resolve({ status: res.statusCode, headers: res.headers, body: data })); }); r.on('error', e => resolve({ status: 0, error: e.message, body: '' })); r.on('timeout', () => { r.destroy(); resolve({ status: 0, error: 'timeout', body: '' }); }); if (body) r.write(JSON.stringify(body)); r.end(); }); } const ic = (s) => s===200?'āœ…':s===307||s===302||s===301?'šŸ”€':s===401||s===403?'šŸ”’':s===404?'āŒ':s===500?'šŸ’„':'āš ļø'; async function main() { console.log('╔══════════════════════════════════════════════════════════╗'); console.log('ā•‘ QA AUDIT v2 — dev.demoplace.my.id (correct routes) ā•‘'); console.log('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n'); // Login const lr = await req('POST', '/api/auth/login', { username: 'admin', password: 'admin' }); if (lr.headers?.['set-cookie']) { COOKIES = lr.headers['set-cookie'].map(c => c.split(';')[0]).join('; '); console.log(`āœ… Login OK | Cookie: ${COOKIES.substring(0,50)}...\n`); } // Dashboard pages — correct paths console.log('šŸ  DASHBOARD PAGES (correct route paths):'); const pages = [ ['/', 'Root (after auth)'], ['/flows', 'Flows table'], ['/agents', 'Network Agents'], ['/device-labeling', 'Device Labeling'], ['/devices', 'Devices'], ['/dpi-analytics', 'DPI Analytics'], ['/flows', 'Flows'], ['/geography', 'Geography'], ['/intelligence', 'Intelligence'], ['/network-infrastructure', 'Network Infrastructure'], ['/network-intelligence', 'Network Intelligence'], ['/security-audit', 'Security Audit'], ['/threats', 'Threats'], ['/events', 'Events'], ['/dns', 'DNS'], ['/lookup', 'Lookup'], ['/apps', 'Applications'], ['/user-accounts', 'User Accounts'], ['/help', 'Help'], ]; for (const [path, label] of pages) { const r = await req('GET', path); const isHtml = r.body?.startsWith('