Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 13:08:55 +08:00

257 lines
9.0 KiB
JavaScript

/**
* Test for News Subscription Form
* Tests the test run functionality
*/
const puppeteer = require('puppeteer');
const AuthHelper = require('./auth_helper');
const BASE_URL = process.env.BASE_URL || 'http://127.0.0.1:5000';
// Breaking news table query
const BREAKING_NEWS_QUERY = `Find UP TO 10 IMPORTANT breaking news stories from TODAY ${new Date().toLocaleDateString()} ONLY.
START YOUR RESPONSE DIRECTLY WITH THE TABLE. NO INTRODUCTION OR PREAMBLE.`;
async function testNewsSubscriptionForm() {
const browser = await puppeteer.launch({
headless: false, // Show browser for debugging
slowMo: 50, // Slow down actions
devtools: true, // Open DevTools
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
await page.setViewport({ width: 1280, height: 800 });
// Log browser console errors
page.on('console', msg => {
if (msg.type() === 'error') {
console.log(` Browser error: ${msg.text()}`);
}
});
// Log network errors
page.on('pageerror', error => {
console.log('PAGE ERROR:', error.message);
});
// Log failed requests
page.on('requestfailed', request => {
console.log('REQUEST FAILED:', request.url(), request.failure().errorText);
});
const authHelper = new AuthHelper(page, BASE_URL);
console.log('🧪 News Subscription Form Test\n');
try {
// Ensure we're logged in
console.log('🔐 Ensuring authentication...');
await authHelper.ensureAuthenticated();
console.log('✅ Authenticated\n');
// Test 1: Load subscription form page
console.log('📄 Test 1: Loading subscription form page');
await page.goto(`${BASE_URL}/news/subscriptions/new`, {
waitUntil: 'domcontentloaded',
timeout: 30000
});
const title = await page.title();
console.log(`✅ Page loaded - Title: ${title}`);
// Check if form exists
const form = await page.$('#subscription-form');
if (!form) {
throw new Error('Subscription form not found');
}
console.log('✅ Subscription form found\n');
// Take screenshot
await page.screenshot({
path: 'screenshots/subscription_form_loaded.png',
fullPage: true
});
// Test 2: Check for test run button
console.log('🔘 Test 2: Checking for test run button');
const testButton = await page.$('#test-subscription-btn');
if (!testButton) {
throw new Error('Test run button not found');
}
const buttonText = await page.evaluate(() => {
const btn = document.getElementById('test-subscription-btn');
return btn ? btn.textContent : null;
});
console.log(`✅ Test button found with text: "${buttonText}"\n`);
// Test 3: Check button event listeners
console.log('🔍 Test 3: Checking button event listeners');
const buttonInfo = await page.evaluate(() => {
const btn = document.getElementById('test-subscription-btn');
if (!btn) return { exists: false };
// Check if handleTestRun function exists
const functionExists = typeof handleTestRun === 'function';
return {
exists: true,
functionExists,
onclick: btn.onclick ? 'has onclick' : 'no onclick',
id: btn.id,
className: btn.className,
type: btn.type || 'button'
};
});
console.log('Button info:', JSON.stringify(buttonInfo, null, 2));
console.log(`✅ handleTestRun function exists: ${buttonInfo.functionExists}\n`);
// Test 4: Test empty query validation
console.log('📝 Test 4: Testing empty query validation');
await page.click('#test-subscription-btn');
// Wait for alert
await new Promise(resolve => setTimeout(resolve, 1000));
const alertText = await page.evaluate(() => {
const alert = document.querySelector('.alert');
return alert ? alert.textContent.trim() : null;
});
console.log(`✅ Alert shown: "${alertText}"\n`);
// Take screenshot
await page.screenshot({
path: 'screenshots/subscription_test_empty_query.png',
fullPage: true
});
// Test 5: Test with breaking news query
console.log('📰 Test 5: Testing with breaking news query');
// Enter the query
const queryTextarea = await page.$('#subscription-query');
await queryTextarea.click({ clickCount: 3 }); // Select all
await queryTextarea.type(BREAKING_NEWS_QUERY);
console.log('✅ Query entered\n');
// Take screenshot before clicking
await page.screenshot({
path: 'screenshots/subscription_before_test_run.png',
fullPage: true
});
// Set up request monitoring
const requests = [];
page.on('request', request => {
if (request.url().includes('/research/api/start_research')) {
console.log('🌐 Research API request intercepted:');
console.log(' Method:', request.method());
console.log(' URL:', request.url());
console.log(' Headers:', JSON.stringify(request.headers(), null, 2));
const postData = request.postData();
if (postData) {
try {
const data = JSON.parse(postData);
console.log(' Body:', JSON.stringify(data, null, 2));
} catch {
console.log(' Body (raw):', postData);
}
}
requests.push(request);
}
});
// Set up response monitoring
page.on('response', response => {
if (response.url().includes('/research/api/start_research')) {
console.log('🌐 Research API response:');
console.log(' Status:', response.status());
console.log(' Headers:', JSON.stringify(response.headers(), null, 2));
}
});
// Click test run
console.log('🚀 Clicking test run button...');
await page.click('#test-subscription-btn');
// Wait for something to happen
console.log('⏳ Waiting for response...');
await new Promise(resolve => setTimeout(resolve, 5000));
// Take screenshot after clicking
await page.screenshot({
path: 'screenshots/subscription_after_test_run.png',
fullPage: true
});
// Check results
console.log(`\n📊 Results:`);
console.log(` Total research API requests: ${requests.length}`);
const currentUrl = page.url();
console.log(` Current URL: ${currentUrl}`);
// Check for alerts
const finalAlerts = await page.$$eval('.alert', alerts =>
alerts.map(alert => ({
class: alert.className,
text: alert.textContent.trim()
}))
);
if (finalAlerts.length > 0) {
console.log(` Alerts found:`);
finalAlerts.forEach(alert => {
console.log(` - [${alert.class}] ${alert.text}`);
});
}
// Final status
if (currentUrl.includes('/news') && !currentUrl.includes('/subscriptions')) {
console.log('\n✅ SUCCESS: Redirected to news page');
} else if (currentUrl.includes('/auth/login')) {
console.log('\n❌ FAILURE: Redirected to login - authentication issue');
} else if (requests.length > 0) {
console.log('\n⚠️ PARTIAL: API request made but no redirect');
} else {
console.log('\n❌ FAILURE: Test run button click had no effect');
// Try to manually call the function
console.log('\n🔧 Attempting manual function call...');
const result = await page.evaluate(async () => {
if (typeof handleTestRun === 'function') {
try {
await handleTestRun();
return { success: true, message: 'Function called' };
} catch (e) {
return { success: false, error: e.message };
}
} else {
return { success: false, error: 'handleTestRun function not found' };
}
});
console.log('Manual call result:', result);
}
console.log('\n✅ All tests completed');
} catch (error) {
console.error('\n❌ Test failed:', error.message);
await page.screenshot({
path: 'screenshots/subscription_test_error.png',
fullPage: true
});
} finally {
console.log('\n🧹 Cleaning up...');
await browser.close();
}
}
// Run the test
testNewsSubscriptionForm().catch(console.error);