chore: Clean up obsolete files and add Puppeteer chat test

- Remove obsolete documentation, examples, and utility scripts
- Remove temporary screenshots and test files from root
- Add test_chat_backend.js for Puppeteer testing of chat RAG
- Update .gitignore

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-15 21:40:56 +01:00
parent 1bf570e201
commit 2a8098f17a
59 changed files with 243 additions and 12008 deletions

View File

@@ -0,0 +1,237 @@
/**
* Puppeteer test for /test-chat-backend page
* Tests the RAG chat functionality with streaming SSE responses
*
* Usage: node test_chat_backend.js
*/
const puppeteer = require('puppeteer');
const BASE_URL = 'http://localhost:5000';
const TIMEOUT = 120000; // 2 minutes for LLM response
async function testChatBackend() {
console.log('=== Test Chat Backend RAG ===\n');
let browser;
try {
// Launch browser
console.log('1. Launching browser...');
browser = await puppeteer.launch({
headless: false, // Set to true for CI
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
page.setDefaultTimeout(TIMEOUT);
// Enable console logging from the page
page.on('console', msg => {
if (msg.type() === 'error') {
console.log(' [Browser Error]', msg.text());
}
});
// Navigate to test page
console.log('2. Navigating to /test-chat-backend...');
await page.goto(`${BASE_URL}/test-chat-backend`, {
waitUntil: 'networkidle0',
timeout: 30000
});
console.log(' OK - Page loaded');
// Fill in the question
console.log('3. Filling in the form...');
const question = "What is a Turing machine?";
await page.evaluate((q) => {
document.getElementById('question').value = q;
}, question);
console.log(` Question: "${question}"`);
// Select provider (Mistral by default)
const provider = 'mistral';
await page.select('#provider', provider);
console.log(` Provider: ${provider}`);
// Select model
const model = 'mistral-small-latest';
await page.select('#model', model);
console.log(` Model: ${model}`);
// Set limit
await page.evaluate(() => {
document.getElementById('limit').value = '3';
});
console.log(' Limit: 3');
// Click send button
console.log('4. Sending question...');
await page.click('#sendBtn');
// Wait for output section to appear
await page.waitForSelector('#output[style*="block"]', { timeout: 10000 });
console.log(' OK - Output section visible');
// Wait for session ID to appear in log
console.log('5. Waiting for session creation...');
await page.waitForFunction(() => {
const log = document.getElementById('log');
return log && log.textContent.includes('Session:');
}, { timeout: 15000 });
const sessionInfo = await page.evaluate(() => {
return document.getElementById('log').textContent;
});
console.log(` ${sessionInfo.trim()}`);
// Wait for context (RAG results) or error
console.log('6. Waiting for RAG context...');
try {
await page.waitForSelector('#contextSection[style*="block"]', { timeout: 30000 });
const contextCount = await page.evaluate(() => {
const items = document.querySelectorAll('.context-item');
return items.length;
});
console.log(` OK - Received ${contextCount} context chunks`);
// Get context details
const contexts = await page.evaluate(() => {
const items = document.querySelectorAll('.context-item');
return Array.from(items).map(item => {
const text = item.textContent;
const match = text.match(/Passage (\d+).*?(\d+)%.*?-\s*([^-]+)\s*-\s*([^\n]+)/);
if (match) {
return {
passage: match[1],
similarity: match[2],
author: match[3].trim(),
work: match[4].trim()
};
}
return { raw: text.substring(0, 100) };
});
});
contexts.forEach(ctx => {
if (ctx.similarity) {
console.log(` - Passage ${ctx.passage}: ${ctx.similarity}% - ${ctx.author} - ${ctx.work}`);
}
});
} catch (e) {
// Check if there's an error
const hasError = await page.evaluate(() => {
const log = document.getElementById('log');
return log && log.textContent.includes('status-error');
});
if (hasError) {
const errorMsg = await page.evaluate(() => {
return document.getElementById('log').textContent;
});
console.log(` ERROR: ${errorMsg}`);
throw new Error(`Chat failed: ${errorMsg}`);
}
console.log(' WARNING: Context section not shown (might be empty results)');
}
// Wait for response streaming
console.log('7. Waiting for LLM response...');
try {
await page.waitForSelector('#responseSection[style*="block"]', { timeout: 60000 });
console.log(' OK - Response section visible');
// Wait for streaming to complete
await page.waitForFunction(() => {
const log = document.getElementById('log');
return log && (log.textContent.includes('Terminé') || log.textContent.includes('error'));
}, { timeout: 90000 });
// Get final status
const finalStatus = await page.evaluate(() => {
return document.getElementById('log').textContent;
});
if (finalStatus.includes('Terminé')) {
console.log(' OK - Response complete');
} else {
console.log(` Status: ${finalStatus}`);
}
// Get response length
const responseLength = await page.evaluate(() => {
const response = document.getElementById('response');
return response ? response.textContent.length : 0;
});
console.log(` Response length: ${responseLength} characters`);
// Get first 200 chars of response
const responsePreview = await page.evaluate(() => {
const response = document.getElementById('response');
return response ? response.textContent.substring(0, 200) : '';
});
console.log(` Preview: "${responsePreview}..."`);
} catch (e) {
const errorMsg = await page.evaluate(() => {
return document.getElementById('log')?.textContent || 'Unknown error';
});
console.log(` ERROR waiting for response: ${errorMsg}`);
throw e;
}
// Final verification
console.log('\n8. Final verification...');
const results = await page.evaluate(() => {
return {
hasContext: document.getElementById('contextSection').style.display !== 'none',
hasResponse: document.getElementById('responseSection').style.display !== 'none',
contextItems: document.querySelectorAll('.context-item').length,
responseLength: document.getElementById('response')?.textContent?.length || 0,
status: document.getElementById('log')?.textContent || ''
};
});
console.log(` Context shown: ${results.hasContext}`);
console.log(` Context items: ${results.contextItems}`);
console.log(` Response shown: ${results.hasResponse}`);
console.log(` Response length: ${results.responseLength}`);
console.log(` Final status: ${results.status.trim()}`);
// Determine test result
const success = results.hasResponse && results.responseLength > 100 && results.status.includes('Terminé');
console.log('\n' + '='.repeat(50));
if (success) {
console.log('TEST PASSED - Chat backend working correctly');
} else {
console.log('TEST FAILED - Check the results above');
}
console.log('='.repeat(50));
// Keep browser open for 5 seconds to see result
await new Promise(resolve => setTimeout(resolve, 5000));
return success;
} catch (error) {
console.error('\nTEST ERROR:', error.message);
return false;
} finally {
if (browser) {
await browser.close();
}
}
}
// Run test
testChatBackend()
.then(success => {
process.exit(success ? 0 : 1);
})
.catch(err => {
console.error('Unexpected error:', err);
process.exit(1);
});