const puppeteer = require('puppeteer'); const AuthHelper = require('./auth_helper'); const { getPuppeteerLaunchOptions } = require('./puppeteer_config'); (async () => { const browser = await puppeteer.launch(getPuppeteerLaunchOptions()); const page = await browser.newPage(); const baseUrl = 'http://127.0.0.1:5000'; const authHelper = new AuthHelper(page, baseUrl); // Monitor console errors page.on('console', msg => { if (msg.type() === 'error') { console.log(` Browser error: ${msg.text()}`); } }); // Monitor network page.on('response', async (response) => { if (response.url().includes('/metrics/api/cost-analytics')) { console.log(`API Response: ${response.status()}`); try { const text = await response.text(); console.log('API Data:', text.substring(0, 200)); } catch {} } }); try { // Authenticate first console.log('🔐 Ensuring authentication...'); await authHelper.ensureAuthenticated(); console.log('Loading page...'); // Clear cache and reload await page.setCacheEnabled(false); await page.goto('http://localhost:5000/metrics/costs?' + Date.now(), { waitUntil: 'domcontentloaded', timeout: 15000 }); // Wait for initial load await new Promise(resolve => setTimeout(resolve, 3000)); // Check loading state const states = await page.evaluate(() => { const loading = document.getElementById('loading'); const error = document.getElementById('error'); const content = document.getElementById('cost-content'); const noData = document.getElementById('no-data'); return { loading: loading ? loading.style.display : 'not found', error: error ? error.style.display : 'not found', content: content ? content.style.display : 'not found', noData: noData ? noData.style.display : 'not found' }; }); console.log('Element states:', states); // Try manual API call and simulate the loadCostData function const apiTest = await page.evaluate(async () => { try { console.log('Starting manual API test...'); const response = await fetch('/metrics/api/cost-analytics?period=7d'); const data = await response.json(); console.log('API Response received:', data.status); console.log('Total calls:', data.overview?.total_calls); console.log('Total cost:', data.overview?.total_cost); // Now simulate what the loadCostData function should do if (data.status === 'success') { console.log('Status is success'); if (data.overview.total_calls > 0) { console.log('Total calls > 0, should show content'); // Try to manually call the show functions function showContent() { document.getElementById('loading').style.display = 'none'; document.getElementById('cost-content').style.display = 'block'; document.getElementById('error').style.display = 'none'; document.getElementById('no-data').style.display = 'none'; } showContent(); console.log('Called showContent() manually'); } else { console.log('Total calls is 0, should show no data'); } } else { console.log('Status is not success:', data.status); } return { success: true, data }; } catch (error) { console.error('Manual API test failed:', error); return { success: false, error: error.message }; } }); console.log('Manual API test:', apiTest.success ? 'SUCCESS' : 'FAILED'); if (apiTest.success) { console.log('API returned cost:', apiTest.data.overview?.total_cost); console.log('API returned calls:', apiTest.data.overview?.total_calls); } // Test the actual logic from the page const testLogic = await page.evaluate(() => { // Simulate what the loadCostData function does const testData = { status: 'success', overview: { total_cost: 0.0, total_calls: 58 } }; console.log('Testing logic: total_calls =', testData.overview.total_calls); console.log('Testing logic: total_cost =', testData.overview.total_cost); if (testData.status === 'success') { if (testData.overview.total_calls > 0) { console.log('Should show content!'); return 'should_show_content'; } console.log('Should show no data'); return 'should_show_no_data'; } return 'unknown'; }); console.log('Logic test result:', testLogic); // Wait a bit more await new Promise(resolve => setTimeout(resolve, 3000)); // Check final states after manual showContent const finalStates = await page.evaluate(() => { const loading = document.getElementById('loading'); const error = document.getElementById('error'); const content = document.getElementById('cost-content'); const noData = document.getElementById('no-data'); return { loading: loading ? loading.style.display : 'not found', error: error ? error.style.display : 'not found', content: content ? content.style.display : 'not found', noData: noData ? noData.style.display : 'not found' }; }); console.log('Final element states:', finalStates); console.log('✅ Done'); } catch (error) { console.error('❌ Test failed:', error.message); process.exitCode = 1; } finally { await browser.close(); } })();