footypredict-pro / tests /test_api.py
NetBoss
Add H2H API, testing infrastructure, and enhanced features
7f2ccc0
"""
API endpoint tests for the Football Prediction System
Tests for Flask API endpoints.
"""
import pytest
import sys
import os
# Add src to path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
# Import the Flask app
from app import app
@pytest.fixture
def client():
"""Create test client"""
app.config['TESTING'] = True
with app.test_client() as client:
yield client
class TestAPIEndpoints:
"""Tests for API endpoints"""
def test_home_page_loads(self, client):
"""Home page should return 200"""
response = client.get('/')
assert response.status_code == 200
def test_dashboard_page_loads(self, client):
"""Dashboard page should return 200"""
response = client.get('/dashboard')
assert response.status_code == 200
def test_leagues_endpoint(self, client):
"""Leagues endpoint should return list of leagues"""
response = client.get('/api/leagues')
data = response.get_json()
assert response.status_code == 200
assert 'leagues' in data
assert len(data['leagues']) > 0
# Check league structure
league = data['leagues'][0]
assert 'id' in league
assert 'name' in league
assert 'country' in league
def test_predict_endpoint_without_params(self, client):
"""Predict endpoint should require home and away params"""
response = client.get('/api/predict')
assert response.status_code == 400
assert 'error' in response.get_json()
def test_predict_endpoint_with_params(self, client):
"""Predict endpoint should return valid prediction"""
response = client.get('/api/predict?home=Bayern&away=Dortmund')
data = response.get_json()
assert response.status_code == 200
assert data['success'] == True
assert 'prediction' in data
assert 'home_win_prob' in data['prediction']
assert 'draw_prob' in data['prediction']
assert 'away_win_prob' in data['prediction']
class TestH2HEndpoint:
"""Tests for the H2H API endpoint"""
def test_h2h_without_params(self, client):
"""H2H endpoint should require home and away params"""
response = client.get('/api/h2h')
assert response.status_code == 400
assert 'error' in response.get_json()
def test_h2h_known_matchup(self, client):
"""H2H should return data for known matchup"""
response = client.get('/api/h2h?home=Bayern&away=Dortmund')
data = response.get_json()
assert response.status_code == 200
assert data['success'] == True
assert data['found'] == True
assert 'total_matches' in data
assert 'record' in data
assert 'goals' in data
assert 'last_5_matches' in data
def test_h2h_unknown_matchup(self, client):
"""H2H should return found=False for unknown matchup"""
response = client.get('/api/h2h?home=UnknownTeam1&away=UnknownTeam2')
data = response.get_json()
assert response.status_code == 200
assert data['success'] == True
assert data['found'] == False
def test_h2h_record_structure(self, client):
"""H2H record should have correct structure"""
response = client.get('/api/h2h?home=Liverpool&away=Manchester%20City')
data = response.get_json()
if data.get('found'):
record = data['record']
assert 'home_wins' in record
assert 'draws' in record
assert 'away_wins' in record
assert 'home_win_pct' in record
class TestGoalsEndpoint:
"""Tests for goal prediction endpoint"""
def test_goals_endpoint_without_params(self, client):
"""Goals endpoint should require home and away params"""
response = client.get('/api/goals')
assert response.status_code == 400
def test_goals_endpoint_with_params(self, client):
"""Goals endpoint should return valid prediction"""
response = client.get('/api/goals?home=Bayern&away=Dortmund')
data = response.get_json()
assert response.status_code == 200
assert data['success'] == True
assert 'goals' in data
class TestAdvancedEndpoints:
"""Tests for advanced prediction endpoints"""
def test_ml_predict_endpoint(self, client):
"""ML predict endpoint should work"""
response = client.get('/api/ml-predict?home=Bayern&away=Dortmund')
data = response.get_json()
assert response.status_code == 200
assert data['success'] == True
def test_advanced_predict_endpoint(self, client):
"""Advanced predict endpoint should return comprehensive prediction"""
response = client.get('/api/advanced-predict?home=Bayern&away=Dortmund')
data = response.get_json()
assert response.status_code == 200
assert data['success'] == True
assert 'prediction' in data
assert 'factors' in data
assert 'recommendations' in data
if __name__ == '__main__':
pytest.main([__file__, '-v'])