| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>API Endpoints Test</title> |
| <style> |
| body { |
| font-family: Arial, sans-serif; |
| max-width: 1200px; |
| margin: 0 auto; |
| padding: 20px; |
| background: #1a1a1a; |
| color: #fff; |
| } |
| h1 { |
| color: #4CAF50; |
| } |
| .test-section { |
| background: #2a2a2a; |
| padding: 15px; |
| margin: 10px 0; |
| border-radius: 5px; |
| border-left: 4px solid #4CAF50; |
| } |
| .endpoint { |
| margin: 10px 0; |
| padding: 10px; |
| background: #333; |
| border-radius: 3px; |
| } |
| .endpoint-url { |
| color: #64B5F6; |
| font-family: monospace; |
| font-size: 14px; |
| } |
| button { |
| background: #4CAF50; |
| color: white; |
| border: none; |
| padding: 8px 16px; |
| border-radius: 4px; |
| cursor: pointer; |
| margin: 5px; |
| } |
| button:hover { |
| background: #45a049; |
| } |
| .result { |
| margin-top: 10px; |
| padding: 10px; |
| background: #1a1a1a; |
| border-radius: 3px; |
| white-space: pre-wrap; |
| font-family: monospace; |
| font-size: 12px; |
| max-height: 300px; |
| overflow-y: auto; |
| } |
| .success { |
| border-left: 4px solid #4CAF50; |
| } |
| .error { |
| border-left: 4px solid #f44336; |
| } |
| .loading { |
| color: #FFC107; |
| } |
| </style> |
| |
| <script src="/static/js/api-config.js"></script> |
| <script> |
| |
| window.apiReady = new Promise((resolve) => { |
| if (window.apiClient) { |
| console.log('✅ API Client ready'); |
| resolve(window.apiClient); |
| } else { |
| console.error('❌ API Client not loaded'); |
| } |
| }); |
| </script> |
|
|
| </head> |
| <body> |
| <h1>🔧 API Endpoints Test</h1> |
| <p>Testing all fixed endpoints...</p> |
|
|
| <div class="test-section"> |
| <h2>1. Health Check</h2> |
| <div class="endpoint"> |
| <div class="endpoint-url">GET /api/health</div> |
| <button onclick="testHealth()">Test</button> |
| <div id="health-result" class="result"></div> |
| </div> |
| </div> |
|
|
| <div class="test-section"> |
| <h2>2. Exchange Rate (Fixed)</h2> |
| <div class="endpoint"> |
| <div class="endpoint-url">GET /api/service/rate?pair=BTC/USDT</div> |
| <button onclick="testRate()">Test</button> |
| <div id="rate-result" class="result"></div> |
| </div> |
| </div> |
|
|
| <div class="test-section"> |
| <h2>3. Market OHLC (New)</h2> |
| <div class="endpoint"> |
| <div class="endpoint-url">GET /api/market/ohlc?symbol=BTC&interval=1h&limit=10</div> |
| <button onclick="testOHLC()">Test</button> |
| <div id="ohlc-result" class="result"></div> |
| </div> |
| </div> |
|
|
| <div class="test-section"> |
| <h2>4. OHLCV (New)</h2> |
| <div class="endpoint"> |
| <div class="endpoint-url">GET /api/ohlcv?symbol=BTC&timeframe=1h&limit=10</div> |
| <button onclick="testOHLCV()">Test</button> |
| <div id="ohlcv-result" class="result"></div> |
| </div> |
| </div> |
|
|
| <div class="test-section"> |
| <h2>5. Latest News (Fixed - Real Data Only)</h2> |
| <div class="endpoint"> |
| <div class="endpoint-url">GET /api/news/latest?limit=3</div> |
| <button onclick="testNews()">Test</button> |
| <div id="news-result" class="result"></div> |
| </div> |
| </div> |
|
|
| <div class="test-section"> |
| <h2>6. Test All Endpoints</h2> |
| <button onclick="testAll()" style="background: #2196F3; font-size: 16px; padding: 12px 24px;">🚀 Test All Endpoints</button> |
| <div id="all-results" class="result"></div> |
| </div> |
|
|
| <script> |
| const API_BASE = window.location.origin; |
| |
| async function testEndpoint(url, resultId) { |
| const resultDiv = document.getElementById(resultId); |
| resultDiv.className = 'result loading'; |
| resultDiv.textContent = '⏳ Testing...'; |
| |
| try { |
| const startTime = Date.now(); |
| const response = await fetch(url); |
| const duration = Date.now() - startTime; |
| |
| const data = await response.json(); |
| |
| if (response.ok) { |
| resultDiv.className = 'result success'; |
| resultDiv.textContent = `✅ SUCCESS (${duration}ms)\n\n${JSON.stringify(data, null, 2)}`; |
| } else { |
| resultDiv.className = 'result error'; |
| resultDiv.textContent = `❌ ERROR ${response.status}\n\n${JSON.stringify(data, null, 2)}`; |
| } |
| } catch (error) { |
| resultDiv.className = 'result error'; |
| resultDiv.textContent = `❌ FAILED\n\n${error.message}\n\n⚠️ Make sure Flask server is running and restarted after code changes!`; |
| } |
| } |
| |
| function testHealth() { |
| testEndpoint(`${API_BASE}/api/health`, 'health-result'); |
| } |
| |
| function testRate() { |
| testEndpoint(`${API_BASE}/api/service/rate?pair=BTC/USDT`, 'rate-result'); |
| } |
| |
| function testOHLC() { |
| testEndpoint(`${API_BASE}/api/market/ohlc?symbol=BTC&interval=1h&limit=10`, 'ohlc-result'); |
| } |
| |
| function testOHLCV() { |
| testEndpoint(`${API_BASE}/api/ohlcv?symbol=BTC&timeframe=1h&limit=10`, 'ohlcv-result'); |
| } |
| |
| function testNews() { |
| testEndpoint(`${API_BASE}/api/news/latest?limit=3`, 'news-result'); |
| } |
| |
| async function testAll() { |
| const allResults = document.getElementById('all-results'); |
| allResults.className = 'result loading'; |
| allResults.textContent = '⏳ Testing all endpoints...\n\n'; |
| |
| const endpoints = [ |
| { name: 'Health', url: '/api/health' }, |
| { name: 'Exchange Rate', url: '/api/service/rate?pair=BTC/USDT' }, |
| { name: 'Market OHLC', url: '/api/market/ohlc?symbol=BTC&interval=1h&limit=10' }, |
| { name: 'OHLCV', url: '/api/ohlcv?symbol=BTC&timeframe=1h&limit=10' }, |
| { name: 'Latest News', url: '/api/news/latest?limit=3' } |
| ]; |
| |
| let results = []; |
| |
| for (const endpoint of endpoints) { |
| try { |
| const startTime = Date.now(); |
| const response = await fetch(`${API_BASE}${endpoint.url}`); |
| const duration = Date.now() - startTime; |
| const data = await response.json(); |
| |
| if (response.ok) { |
| results.push(`✅ ${endpoint.name}: SUCCESS (${duration}ms)`); |
| } else { |
| results.push(`❌ ${endpoint.name}: ERROR ${response.status}`); |
| } |
| } catch (error) { |
| results.push(`❌ ${endpoint.name}: FAILED - ${error.message}`); |
| } |
| |
| allResults.textContent = results.join('\n') + '\n\n⏳ Testing...'; |
| } |
| |
| const successCount = results.filter(r => r.startsWith('✅')).length; |
| const totalCount = results.length; |
| |
| allResults.className = successCount === totalCount ? 'result success' : 'result error'; |
| allResults.textContent = results.join('\n') + `\n\n📊 Results: ${successCount}/${totalCount} passed`; |
| |
| if (successCount < totalCount) { |
| allResults.textContent += '\n\n⚠️ Some endpoints failed. Make sure:'; |
| allResults.textContent += '\n1. Flask server is running (python app.py)'; |
| allResults.textContent += '\n2. Server was restarted after code changes'; |
| allResults.textContent += '\n3. Check server logs for errors'; |
| } |
| } |
| |
| |
| window.addEventListener('load', () => { |
| setTimeout(testAll, 1000); |
| }); |
| </script> |
| </body> |
| </html> |
|
|
|
|