7a0da7932b
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Has been cancelled
Docker Tests (Consolidated) / Accessibility Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Unit Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Example Tests (push) Has been cancelled
Docker Tests (Consolidated) / Production Image Smoke Test (push) Has been cancelled
Docker Tests (Consolidated) / Infrastructure Tests (push) Has been cancelled
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Has been cancelled
Backwards Compatibility / Verify Encryption Constants (push) Has been cancelled
Backwards Compatibility / PyPI Version Compatibility (push) Has been cancelled
Backwards Compatibility / Database Migration Tests (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Docker Tests (Consolidated) / detect-changes (push) Has been cancelled
Docker Tests (Consolidated) / Build Test Image (push) Has been cancelled
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Has been cancelled
338 lines
12 KiB
JavaScript
338 lines
12 KiB
JavaScript
/**
|
|
* Research Diagnosis Test
|
|
* Detailed diagnostic test to understand why research doesn't start
|
|
*/
|
|
|
|
const puppeteer = require('puppeteer');
|
|
const AuthHelper = require('./auth_helper');
|
|
const { getPuppeteerLaunchOptions } = require('./puppeteer_config');
|
|
|
|
async function testResearchDiagnosis() {
|
|
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);
|
|
|
|
console.log('🔬 Research Diagnosis Test');
|
|
console.log('=' .repeat(60) + '\n');
|
|
|
|
// Collect all console messages
|
|
const consoleLogs = [];
|
|
page.on('console', msg => {
|
|
const entry = `[${msg.type().toUpperCase()}] ${msg.text()}`;
|
|
consoleLogs.push(entry);
|
|
console.log(`🖥️ ${entry}`);
|
|
});
|
|
|
|
// Collect JavaScript errors
|
|
page.on('pageerror', error => {
|
|
console.log(`❌ JS Error: ${error.message}`);
|
|
});
|
|
|
|
// Monitor all network requests
|
|
await page.setRequestInterception(true);
|
|
const networkLog = [];
|
|
|
|
page.on('request', request => {
|
|
const logEntry = {
|
|
url: request.url(),
|
|
method: request.method(),
|
|
headers: request.headers(),
|
|
postData: request.postData(),
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
networkLog.push(logEntry);
|
|
|
|
// Log important requests
|
|
if (request.url().includes('/api/') || request.url().includes('/research/')) {
|
|
console.log(`\n📤 ${request.method()} ${request.url()}`);
|
|
if (request.postData()) {
|
|
console.log('📦 Request Body:', request.postData());
|
|
}
|
|
}
|
|
|
|
request.continue();
|
|
});
|
|
|
|
page.on('response', async response => {
|
|
if (response.url().includes('/api/') || response.url().includes('/research/')) {
|
|
console.log(`📥 Response: ${response.status()} ${response.statusText()}`);
|
|
|
|
// Try to get response body for errors
|
|
if (response.status() >= 400) {
|
|
try {
|
|
const body = await response.text();
|
|
console.log('📄 Error Response Body:', body);
|
|
} catch {
|
|
console.log('Could not read response body');
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
try {
|
|
// Step 1: Authenticate
|
|
console.log('🔐 Authenticating...');
|
|
await authHelper.ensureAuthenticated();
|
|
console.log('✅ Authenticated\n');
|
|
|
|
// Step 2: Go to home page
|
|
await page.goto(baseUrl, {
|
|
waitUntil: 'domcontentloaded',
|
|
timeout: 30000
|
|
});
|
|
|
|
// Step 3: Check what's on the page
|
|
console.log('📋 Checking page structure...\n');
|
|
|
|
const pageInfo = await page.evaluate(() => {
|
|
const info = {
|
|
forms: [],
|
|
scripts: [],
|
|
apiEndpoints: [],
|
|
formElements: {}
|
|
};
|
|
|
|
// Find all forms
|
|
document.querySelectorAll('form').forEach(form => {
|
|
info.forms.push({
|
|
id: form.id,
|
|
action: form.action,
|
|
method: form.method,
|
|
onsubmit: form.onsubmit ? 'has onsubmit handler' : 'no handler'
|
|
});
|
|
});
|
|
|
|
// Find form elements
|
|
const elements = ['#query', '#mode-quick', '#mode-detailed',
|
|
'#model_provider', '#search_engine', '#iterations',
|
|
'#questions_per_iteration', 'button[type="submit"]'];
|
|
|
|
elements.forEach(selector => {
|
|
const el = document.querySelector(selector);
|
|
info.formElements[selector] = el ? {
|
|
found: true,
|
|
type: el.type || el.tagName,
|
|
value: el.value || '',
|
|
disabled: el.disabled
|
|
} : { found: false };
|
|
});
|
|
|
|
// Find loaded scripts
|
|
document.querySelectorAll('script[src]').forEach(script => {
|
|
if (script.src.includes('research') || script.src.includes('form')) {
|
|
info.scripts.push(script.src);
|
|
}
|
|
});
|
|
|
|
// Check for API endpoints in JavaScript
|
|
const scriptContent = Array.from(document.scripts)
|
|
.map(s => s.textContent)
|
|
.join('\n');
|
|
|
|
const apiMatches = scriptContent.match(/['"]\/api\/[^'"]+['"]/g) || [];
|
|
info.apiEndpoints = [...new Set(apiMatches.map(m => m.slice(1, -1)))];
|
|
|
|
return info;
|
|
});
|
|
|
|
console.log('Forms found:', pageInfo.forms);
|
|
console.log('\nForm elements:');
|
|
Object.entries(pageInfo.formElements).forEach(([selector, info]) => {
|
|
console.log(` ${selector}: ${info.found ? '✅ Found' : '❌ Not found'}`);
|
|
if (info.found && info.value) {
|
|
console.log(` Value: ${info.value}`);
|
|
}
|
|
});
|
|
console.log('\nAPI endpoints found in JavaScript:', pageInfo.apiEndpoints);
|
|
console.log('\nResearch-related scripts:', pageInfo.scripts);
|
|
|
|
// Step 4: Fill the form
|
|
console.log('\n📝 Filling research form...\n');
|
|
|
|
// Clear and type query
|
|
await page.click('#query', { clickCount: 3 }); // Triple click to select all
|
|
await page.type('#query', 'What is artificial intelligence?');
|
|
console.log('✅ Entered query');
|
|
|
|
// Select quick mode
|
|
const quickMode = await page.$('#mode-quick');
|
|
if (quickMode) {
|
|
await page.click('#mode-quick');
|
|
console.log('✅ Selected quick mode');
|
|
}
|
|
|
|
// Get form data before submission
|
|
const formData = await page.evaluate(() => {
|
|
const data = {};
|
|
const form = document.getElementById('research-form');
|
|
if (form) {
|
|
const fd = new FormData(form);
|
|
for (const [key, value] of fd.entries()) {
|
|
data[key] = value;
|
|
}
|
|
}
|
|
|
|
// Also check hidden inputs and selects
|
|
document.querySelectorAll('input[type="hidden"], select').forEach(el => {
|
|
if (el.name || el.id) {
|
|
data[el.name || el.id] = el.value;
|
|
}
|
|
});
|
|
|
|
return data;
|
|
});
|
|
|
|
console.log('\n📊 Form data to be submitted:');
|
|
console.log(JSON.stringify(formData, null, 2));
|
|
|
|
// Step 5: Check JavaScript state
|
|
console.log('\n🔧 Checking JavaScript state...\n');
|
|
|
|
const jsState = await page.evaluate(() => {
|
|
const state = {
|
|
jQuery: typeof $ !== 'undefined',
|
|
socketIO: typeof io !== 'undefined',
|
|
formHandlers: [],
|
|
globalFunctions: []
|
|
};
|
|
|
|
// Check for form submit handlers
|
|
const form = document.getElementById('research-form');
|
|
if (form) {
|
|
// Check jQuery handlers
|
|
if (typeof $ !== 'undefined' && $._data) {
|
|
const events = $._data(form, 'events');
|
|
if (events && events.submit) {
|
|
state.formHandlers.push('jQuery submit handler');
|
|
}
|
|
}
|
|
|
|
// Check native handlers
|
|
if (form.onsubmit) {
|
|
state.formHandlers.push('Native onsubmit handler');
|
|
}
|
|
}
|
|
|
|
// Check for global functions
|
|
const funcs = ['startResearch', 'submitResearch', 'validateForm'];
|
|
funcs.forEach(func => {
|
|
if (typeof window[func] === 'function') {
|
|
state.globalFunctions.push(func);
|
|
}
|
|
});
|
|
|
|
return state;
|
|
});
|
|
|
|
console.log('JavaScript environment:');
|
|
console.log(` jQuery loaded: ${jsState.jQuery}`);
|
|
console.log(` Socket.IO loaded: ${jsState.socketIO}`);
|
|
console.log(` Form handlers: ${jsState.formHandlers.join(', ') || 'None'}`);
|
|
console.log(` Global functions: ${jsState.globalFunctions.join(', ') || 'None'}`);
|
|
|
|
// Step 6: Submit the form
|
|
console.log('\n🚀 Attempting to submit research...\n');
|
|
|
|
// Take screenshot before submit
|
|
await page.screenshot({ path: './screenshots/diagnosis_before_submit.png' });
|
|
|
|
// Find submit button
|
|
const submitButton = await page.$('button[type="submit"]');
|
|
if (!submitButton) {
|
|
throw new Error('Submit button not found!');
|
|
}
|
|
|
|
// Click and monitor what happens
|
|
console.log('Clicking submit button...');
|
|
await submitButton.click();
|
|
|
|
// Wait a bit to see what happens
|
|
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
|
|
// Check current state
|
|
const afterSubmit = await page.evaluate(() => {
|
|
return {
|
|
url: window.location.href,
|
|
alerts: Array.from(document.querySelectorAll('.alert')).map(a => ({
|
|
class: a.className,
|
|
text: a.textContent.trim()
|
|
})),
|
|
bodyClasses: document.body.className,
|
|
visibleModals: Array.from(document.querySelectorAll('.modal.show')).length,
|
|
activeRequests: typeof $.active !== 'undefined' ? $.active : 'unknown'
|
|
};
|
|
});
|
|
|
|
console.log('\n📍 After submit state:');
|
|
console.log(` URL: ${afterSubmit.url}`);
|
|
console.log(` Alerts: ${afterSubmit.alerts.length}`);
|
|
afterSubmit.alerts.forEach(alert => {
|
|
console.log(` - [${alert.class}] ${alert.text}`);
|
|
});
|
|
console.log(` Active AJAX requests: ${afterSubmit.activeRequests}`);
|
|
|
|
// Take final screenshot
|
|
await page.screenshot({ path: './screenshots/diagnosis_after_submit.png' });
|
|
|
|
// Step 7: Summary
|
|
console.log('\n' + '=' .repeat(60));
|
|
console.log('📊 DIAGNOSIS SUMMARY');
|
|
console.log('=' .repeat(60));
|
|
|
|
console.log('\n🔍 Key Findings:');
|
|
|
|
// Check console logs for errors
|
|
const errors = consoleLogs.filter(log => log.includes('ERROR'));
|
|
if (errors.length > 0) {
|
|
console.log('\n❌ JavaScript Errors:');
|
|
errors.forEach(err => console.log(` - ${err}`));
|
|
}
|
|
|
|
// Check network failures
|
|
const failedRequests = networkLog.filter(req => {
|
|
const response = networkLog.find(r => r.url === req.url && r.status);
|
|
return response && response.status >= 400;
|
|
});
|
|
|
|
if (failedRequests.length > 0) {
|
|
console.log('\n❌ Failed API Calls:');
|
|
failedRequests.forEach(req => {
|
|
console.log(` - ${req.method} ${req.url}`);
|
|
});
|
|
}
|
|
|
|
console.log('\n💡 Recommendations:');
|
|
console.log('1. Check server logs for SQLAlchemy errors');
|
|
console.log('2. Verify all required form fields are being sent');
|
|
console.log('3. Check if API endpoints are correctly configured');
|
|
console.log('4. Ensure database migrations are up to date');
|
|
|
|
} catch (error) {
|
|
console.error('\n❌ Test error:', error.message);
|
|
console.error(error.stack);
|
|
await page.screenshot({ path: './screenshots/diagnosis_error.png' });
|
|
}
|
|
|
|
// Save detailed logs
|
|
const fs = require('fs');
|
|
fs.writeFileSync('./diagnosis_network_log.json', JSON.stringify(networkLog, null, 2));
|
|
fs.writeFileSync('./diagnosis_console_log.json', JSON.stringify(consoleLogs, null, 2));
|
|
console.log('\n📁 Detailed logs saved to:');
|
|
console.log(' - ./diagnosis_network_log.json');
|
|
console.log(' - ./diagnosis_console_log.json');
|
|
|
|
console.log('\n⏸️ Keeping browser open for manual inspection...');
|
|
console.log('Press Ctrl+C to close');
|
|
|
|
// Keep browser open indefinitely for debugging
|
|
await new Promise(() => {});
|
|
}
|
|
|
|
// Run the test
|
|
testResearchDiagnosis().catch(error => {
|
|
console.error('💥 Test runner error:', error);
|
|
process.exit(1);
|
|
});
|