// qa-audit.js — Komprehensif QA audit semua halaman & API endpoint production const https = require('https'); const http = require('http'); const BASE = 'https://dev.demoplace.my.id'; const BACKEND = 'http://103.185.47.52'; // test via external // Cookies dari login untuk test authenticated pages let COOKIES = ''; function req(method, url, body, cookies) { return new Promise((resolve) => { const isHttps = url.startsWith('https'); const lib = isHttps ? https : http; const urlObj = new URL(url); const options = { hostname: urlObj.hostname, port: urlObj.port || (isHttps ? 443 : 80), 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 = lib.request(options, (res) => { let data = ''; res.on('data', d => data += d); res.on('end', () => resolve({ status: res.statusCode, headers: res.headers, body: data, size: data.length, })); }); r.on('error', e => resolve({ status: 0, error: e.message, body: '', size: 0 })); r.on('timeout', () => { r.destroy(); resolve({ status: 0, error: 'timeout', body: '', size: 0 }); }); if (body) r.write(JSON.stringify(body)); r.end(); }); } function icon(status) { if (status === 200) return 'āœ…'; if (status === 307 || status === 301 || status === 302) return 'šŸ”€'; if (status === 401 || status === 403) return 'šŸ”’'; if (status === 404) return 'āŒ'; if (status === 500) return 'šŸ’„'; if (status === 0) return 'ā›”'; return 'āš ļø'; } async function main() { console.log('╔══════════════════════════════════════════════════════╗'); console.log('ā•‘ QA AUDIT — dev.demoplace.my.id ā•‘'); console.log('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n'); // --- STEP 1: Login & get session cookie --- console.log('šŸ” STEP 1: Login dengan admin/admin...'); const loginRes = await req('POST', `${BASE}/api/auth/login`, { username: 'admin', password: 'admin' }); console.log(` HTTP ${loginRes.status} | Size: ${loginRes.size}b`); if (loginRes.status === 200) { const setCookie = loginRes.headers['set-cookie']; if (setCookie) { COOKIES = setCookie.map(c => c.split(';')[0]).join('; '); console.log(` āœ… Cookie diterima: ${COOKIES.substring(0, 60)}...`); } console.log(` User: ${loginRes.body.substring(0, 100)}`); } else { console.log(` āŒ Login gagal: ${loginRes.body.substring(0, 100)}`); } // --- STEP 2: Unauthenticated pages --- console.log('\nšŸ“„ STEP 2: Public pages (unauthenticated)...'); const publicPages = [ ['/', 'Root (redirect check)'], ['/login', 'Login page'], ]; for (const [path, label] of publicPages) { const r = await req('GET', `${BASE}${path}`); const isHtml = r.body.includes('