import { chromium } from 'playwright'; (async () => { console.log('=== Verifying Action Mappings Download ===\n'); const browser = await chromium.launch({ headless: false, slowMo: 300 }); const context = await browser.newContext(); const page = await context.newPage(); let downloadSuccess = false; let typeError = null; let apiData = null; page.on('console', msg => { const text = msg.text(); // Check for type errors if (text.includes('type') && (text.includes('String') || text.includes('int') || text.includes('List'))) { typeError = text; console.log('❌ TYPE ERROR:', text); } // Check for success indicators if (text.includes('action-mappings') || text.includes('mappings')) { console.log('[APP]', text); } }); // Capture API response page.on('response', async response => { if (response.url().includes('/configuration/action-mappings')) { const status = response.status(); console.log(`\n📥 API Response: ${status} ${response.url()}`); if (status === 200) { try { const body = await response.text(); apiData = JSON.parse(body); console.log(`✅ Downloaded ${apiData.total_mappings} action mappings`); if (apiData.mappings && apiData.mappings.length > 0) { const first = apiData.mappings[0]; console.log('\n🔍 First mapping analysis:'); console.log(` id: ${typeof first.id} = ${first.id}`); console.log(` name: ${typeof first.name} = ${first.name}`); console.log(` input_actions: ${Array.isArray(first.input_actions) ? 'array' : typeof first.input_actions}`); console.log(` output_actions: ${Array.isArray(first.output_actions) ? 'array' : typeof first.output_actions}`); if (first.input_actions && first.input_actions.length > 0) { console.log(` input_actions[0].action: ${first.input_actions[0].action}`); } if (first.output_actions && first.output_actions.length > 0) { console.log(` output_actions[0].action: ${first.output_actions[0].action}`); } } downloadSuccess = true; } catch (e) { console.log('⚠️ Could not parse response:', e.message); } } } }); try { console.log('1. Login...'); await page.goto('http://100.81.138.77:8081/', { waitUntil: 'networkidle', timeout: 60000 }); await page.waitForTimeout(3000); await page.click('body'); await page.waitForTimeout(500); await page.keyboard.press('Tab'); await page.waitForTimeout(300); await page.keyboard.type('admin', { delay: 50 }); await page.waitForTimeout(300); await page.keyboard.press('Tab'); await page.waitForTimeout(300); await page.keyboard.type('admin123', { delay: 50 }); await page.waitForTimeout(300); await page.keyboard.press('Enter'); await page.waitForTimeout(4000); console.log('\n2. Navigate to Action Mappings...'); await page.goto('http://100.81.138.77:8081/#/action-mappings', { waitUntil: 'networkidle', timeout: 60000 }); await page.waitForTimeout(2000); console.log('\n3. Click download button...'); // Tab to download button (skip search field) for (let i = 0; i < 3; i++) { await page.keyboard.press('Tab'); await page.waitForTimeout(300); } await page.keyboard.press('Enter'); console.log(' Waiting for download and parsing...'); await page.waitForTimeout(8000); console.log('\n4. Take screenshot...'); await page.screenshot({ path: 'action-mappings-verified.png', fullPage: true }); } catch (error) { console.error('\n💥 TEST ERROR:', error.message); await page.screenshot({ path: 'action-mappings-verify-error.png', fullPage: true }); } console.log('\n' + '='.repeat(60)); console.log('VERIFICATION RESULTS'); console.log('='.repeat(60)); if (typeError) { console.log('\n❌ FAILED: Type error detected'); console.log(' Error:', typeError); } else if (downloadSuccess) { console.log('\n✅ SUCCESS: Action mappings downloaded and parsed correctly'); console.log(` Total mappings: ${apiData.total_mappings}`); console.log(` No type errors detected`); } else { console.log('\n⚠️ WARNING: Download may not have completed'); } await page.waitForTimeout(2000); await browser.close(); const exitCode = typeError ? 1 : 0; console.log(`\nExit code: ${exitCode}`); console.log('='.repeat(60)); process.exit(exitCode); })();