#!/usr/bin/env node /** * Test script for the dual-session enhanced screenshot service * Uses API calls instead of direct imports for Docker compatibility */ async function testDualSessionScreenshots() { console.log('šŸš€ Testing Enhanced Screenshot Service with Dual Sessions (API)') try { // Test configuration const config = { symbol: 'SOLUSD', timeframe: '240', layouts: ['ai', 'diy'], analyze: true // Request AI analysis of both screenshots } console.log('šŸ“‹ Test Configuration:', config) // Test API endpoint availability console.log('\nšŸ” Checking API endpoint...') const healthResponse = await fetch('http://localhost:3000/api/enhanced-screenshot') if (!healthResponse.ok) { throw new Error(`API endpoint not available: ${healthResponse.status}`) } const healthData = await healthResponse.json() console.log('āœ… API endpoint available:', healthData.message) // Perform the dual-session screenshot capture via API console.log('\nšŸ”„ Starting dual-session capture via API...') const startTime = Date.now() const response = await fetch('http://localhost:3000/api/enhanced-screenshot', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(config) }) const endTime = Date.now() const duration = (endTime - startTime) / 1000 if (!response.ok) { const errorData = await response.json() throw new Error(`API request failed: ${errorData.error || response.statusText}`) } const result = await response.json() console.log('\nāœ… Capture completed!') console.log(`ā±ļø Duration: ${duration.toFixed(2)} seconds`) console.log(`šŸ“ø Screenshots captured: ${result.screenshots?.length || 0}`) if (result.screenshots) { result.screenshots.forEach((screenshot, index) => { console.log(` ${index + 1}. ${screenshot}`) }) } if (result.screenshots?.length === 2) { console.log('\nšŸŽÆ SUCCESS: Both AI and DIY layouts captured successfully!') } else { console.log('\nāš ļø WARNING: Expected 2 screenshots, got', result.screenshots?.length || 0) if (result.errors) { console.log('šŸ“‹ Errors encountered:') result.errors.forEach((error, index) => { console.log(` ${index + 1}. ${error}`) }) } } // Display AI analysis results if available if (result.analysis) { console.log('\nšŸ¤– AI Analysis Results:') console.log(` šŸ“Š Market Sentiment: ${result.analysis.marketSentiment}`) console.log(` šŸ“ˆ Recommendation: ${result.analysis.recommendation}`) console.log(` šŸŽÆ Confidence: ${result.analysis.confidence}%`) // Trading Setup Section if (result.analysis.entry) { console.log('\nšŸ’° TRADING SETUP:') console.log(` ļæ½ Entry: $${result.analysis.entry.price}${result.analysis.entry.buffer ? ' ' + result.analysis.entry.buffer : ''}`) if (result.analysis.entry.rationale) { console.log(` šŸ’” ${result.analysis.entry.rationale}`) } } if (result.analysis.stopLoss) { console.log(` šŸ›‘ Stop Loss: $${result.analysis.stopLoss.price}`) if (result.analysis.stopLoss.rationale) { console.log(` šŸ’” ${result.analysis.stopLoss.rationale}`) } } // Enhanced Take Profit Display if (result.analysis.takeProfits) { console.log('\nšŸŽÆ TAKE PROFIT TARGETS:') if (result.analysis.takeProfits.tp1) { const tp1 = result.analysis.takeProfits.tp1 console.log(` šŸ„‰ TP1: $${tp1.price}`) console.log(` šŸ“‹ ${tp1.description}`) if (tp1.rsiExpectation) { console.log(` šŸ“Š RSI: ${tp1.rsiExpectation}`) } if (tp1.obvExpectation) { console.log(` šŸ“ˆ OBV: ${tp1.obvExpectation}`) } } if (result.analysis.takeProfits.tp2) { const tp2 = result.analysis.takeProfits.tp2 console.log(` 🄈 TP2: $${tp2.price}`) console.log(` šŸ“‹ ${tp2.description}`) if (tp2.rsiExpectation) { console.log(` šŸ“Š RSI: ${tp2.rsiExpectation}`) } if (tp2.obvExpectation) { console.log(` šŸ“ˆ OBV: ${tp2.obvExpectation}`) } } } if (result.analysis.riskToReward) { console.log(`\nāš–ļø Risk/Reward: ${result.analysis.riskToReward}`) } if (result.analysis.confirmationTrigger) { console.log(`\nšŸ”” Confirmation Trigger: ${result.analysis.confirmationTrigger}`) } // Timeframe Risk Assessment if (result.analysis.timeframeRisk) { console.log('\nā° TIMEFRAME RISK ASSESSMENT:') if (result.analysis.timeframeRisk.assessment) { console.log(` šŸ“Š Risk Level: ${result.analysis.timeframeRisk.assessment}`) } if (result.analysis.timeframeRisk.positionSize) { console.log(` ļæ½ Position Size: ${result.analysis.timeframeRisk.positionSize}`) } if (result.analysis.timeframeRisk.leverageRecommendation) { console.log(` šŸŽšļø Leverage: ${result.analysis.timeframeRisk.leverageRecommendation}`) } } // Key Levels if (result.analysis.keyLevels) { console.log('\nšŸ“Š KEY LEVELS:') if (result.analysis.keyLevels.resistance?.length > 0) { console.log(` ļæ½šŸ”“ Resistance: ${result.analysis.keyLevels.resistance.map(r => `$${r}`).join(', ')}`) } if (result.analysis.keyLevels.support?.length > 0) { console.log(` 🟢 Support: ${result.analysis.keyLevels.support.map(s => `$${s}`).join(', ')}`) } } // Indicator Analysis if (result.analysis.indicatorAnalysis) { console.log('\nšŸ“ˆ TECHNICAL INDICATORS:') if (result.analysis.indicatorAnalysis.rsi) { console.log(` šŸ“Š RSI: ${result.analysis.indicatorAnalysis.rsi}`) } if (result.analysis.indicatorAnalysis.vwap) { console.log(` šŸ“ˆ VWAP: ${result.analysis.indicatorAnalysis.vwap}`) } if (result.analysis.indicatorAnalysis.obv) { console.log(` šŸ“Š OBV: ${result.analysis.indicatorAnalysis.obv}`) } if (result.analysis.indicatorAnalysis.macd) { console.log(` šŸ“‰ MACD: ${result.analysis.indicatorAnalysis.macd}`) } } // Layout Comparison if (result.analysis.layoutComparison) { console.log('\nšŸ”„ LAYOUT COMPARISON:') if (result.analysis.layoutComparison.aiLayout) { console.log(` šŸ¤– AI Layout: ${result.analysis.layoutComparison.aiLayout}`) } if (result.analysis.layoutComparison.diyLayout) { console.log(` šŸ”§ DIY Layout: ${result.analysis.layoutComparison.diyLayout}`) } if (result.analysis.layoutComparison.consensus) { console.log(` āœ… Consensus: ${result.analysis.layoutComparison.consensus}`) } if (result.analysis.layoutComparison.divergences) { console.log(` āš ļø Divergences: ${result.analysis.layoutComparison.divergences}`) } } // Alternatives if (result.analysis.alternatives) { console.log('\nšŸ”„ ALTERNATIVES:') if (result.analysis.alternatives.tigherStopOption) { console.log(` šŸŽÆ Tighter Stop: ${result.analysis.alternatives.tigherStopOption}`) } if (result.analysis.alternatives.scaledEntry) { console.log(` šŸ“Š Scaled Entry: ${result.analysis.alternatives.scaledEntry}`) } if (result.analysis.alternatives.invalidationScenario) { console.log(` āŒ Invalidation: ${result.analysis.alternatives.invalidationScenario}`) } } } else { console.log('\nāš ļø No AI analysis results received') } // Test summary console.log('\nšŸ“Š Test Summary:') console.log(` • API Response: ${response.ok ? 'Success' : 'Failed'}`) console.log(` • Duration: ${duration.toFixed(2)}s`) console.log(` • Screenshots: ${result.screenshots?.length || 0}/2`) console.log(` • Success Rate: ${((result.screenshots?.length || 0) / 2 * 100).toFixed(0)}%`) } catch (error) { console.error('\nāŒ Test failed:', error.message) console.error('Stack trace:', error.stack) process.exit(1) } } // Run the test if (require.main === module) { // Add fetch for Node.js environments that don't have it built-in if (typeof fetch === 'undefined') { const { default: fetch } = require('node-fetch') global.fetch = fetch } testDualSessionScreenshots() .then(() => { console.log('\nšŸŽ‰ All tests completed successfully!') process.exit(0) }) .catch((error) => { console.error('\nšŸ’„ Test suite failed:', error) process.exit(1) }) } module.exports = { testDualSessionScreenshots }