chartbastan/backend/tests/test_prediction_schema.py
2026-02-01 09:31:38 +01:00

212 lines
7.0 KiB
Python

"""
Unit tests for Prediction Pydantic schemas.
"""
import pytest
from datetime import datetime, timezone
from pydantic import ValidationError
from app.schemas.prediction import (
PredictionBase,
PredictionCreate,
PredictionUpdate,
PredictionResponse,
PredictionListResponse,
PredictionStatsResponse
)
class TestPredictionBase:
"""Test PredictionBase schema."""
def test_prediction_base_valid(self):
"""Test creating a valid PredictionBase."""
prediction_data = {
"match_id": 1,
"energy_score": "high",
"confidence": "85%",
"predicted_winner": "PSG",
"created_at": datetime.now(timezone.utc)
}
prediction = PredictionBase(**prediction_data)
assert prediction.match_id == 1
assert prediction.energy_score == "high"
assert prediction.confidence == "85%"
assert prediction.predicted_winner == "PSG"
def test_prediction_base_energy_score_too_long(self):
"""Test that energy_score exceeds max length."""
with pytest.raises(ValidationError) as exc_info:
PredictionBase(
match_id=1,
energy_score="A" * 51, # Too long
confidence="85%",
predicted_winner="PSG",
created_at=datetime.now(timezone.utc)
)
assert "at most 50 characters" in str(exc_info.value).lower()
def test_prediction_base_confidence_too_long(self):
"""Test that confidence exceeds max length."""
with pytest.raises(ValidationError) as exc_info:
PredictionBase(
match_id=1,
energy_score="high",
confidence="A" * 51, # Too long
predicted_winner="PSG",
created_at=datetime.now(timezone.utc)
)
assert "at most 50 characters" in str(exc_info.value).lower()
def test_prediction_base_predicted_winner_too_long(self):
"""Test that predicted_winner exceeds max length."""
with pytest.raises(ValidationError) as exc_info:
PredictionBase(
match_id=1,
energy_score="high",
confidence="85%",
predicted_winner="A" * 256, # Too long
created_at=datetime.now(timezone.utc)
)
assert "at most 255 characters" in str(exc_info.value).lower()
class TestPredictionCreate:
"""Test PredictionCreate schema."""
def test_prediction_create_valid(self):
"""Test creating a valid PredictionCreate."""
prediction_data = {
"match_id": 1,
"energy_score": "medium",
"confidence": "70%",
"predicted_winner": "Barcelona",
"created_at": datetime.now(timezone.utc)
}
prediction = PredictionCreate(**prediction_data)
assert prediction.match_id == 1
assert prediction.energy_score == "medium"
assert prediction.confidence == "70%"
assert prediction.predicted_winner == "Barcelona"
class TestPredictionUpdate:
"""Test PredictionUpdate schema."""
def test_prediction_update_partial(self):
"""Test updating only some fields."""
update_data = {
"confidence": "90%"
}
prediction_update = PredictionUpdate(**update_data)
assert prediction_update.confidence == "90%"
assert prediction_update.energy_score is None
assert prediction_update.predicted_winner is None
def test_prediction_update_all_fields(self):
"""Test updating all fields."""
update_data = {
"energy_score": "very_high",
"confidence": "95%",
"predicted_winner": "Real Madrid"
}
prediction_update = PredictionUpdate(**update_data)
assert prediction_update.energy_score == "very_high"
assert prediction_update.confidence == "95%"
assert prediction_update.predicted_winner == "Real Madrid"
def test_prediction_update_empty(self):
"""Test that PredictionUpdate can be empty."""
prediction_update = PredictionUpdate()
assert prediction_update.energy_score is None
assert prediction_update.confidence is None
assert prediction_update.predicted_winner is None
class TestPredictionResponse:
"""Test PredictionResponse schema."""
def test_prediction_response_from_dict(self):
"""Test creating PredictionResponse from dictionary."""
prediction_dict = {
"id": 1,
"match_id": 1,
"energy_score": "high",
"confidence": "85%",
"predicted_winner": "Manchester City",
"created_at": datetime.now(timezone.utc)
}
prediction = PredictionResponse(**prediction_dict)
assert prediction.id == 1
assert prediction.match_id == 1
assert prediction.energy_score == "high"
assert prediction.confidence == "85%"
assert prediction.predicted_winner == "Manchester City"
class TestPredictionListResponse:
"""Test PredictionListResponse schema."""
def test_prediction_list_response(self):
"""Test creating a PredictionListResponse."""
predictions_data = [
{
"id": 1,
"match_id": 1,
"energy_score": "high",
"confidence": "85%",
"predicted_winner": "PSG",
"created_at": datetime.now(timezone.utc)
},
{
"id": 2,
"match_id": 2,
"energy_score": "medium",
"confidence": "70%",
"predicted_winner": "Barcelona",
"created_at": datetime.now(timezone.utc)
}
]
response = PredictionListResponse(data=predictions_data, count=2, meta={"page": 1})
assert response.count == 2
assert len(response.data) == 2
assert response.meta["page"] == 1
class TestPredictionStatsResponse:
"""Test PredictionStatsResponse schema."""
def test_prediction_stats_response(self):
"""Test creating a PredictionStatsResponse."""
stats = {
"total_predictions": 20,
"predictions_by_confidence": {"high": 10, "medium": 5, "low": 5},
"predictions_by_energy_score": {"high": 8, "medium": 7, "low": 5},
"avg_confidence": 75.5,
"unique_matches_predicted": 15
}
prediction_stats = PredictionStatsResponse(**stats)
assert prediction_stats.total_predictions == 20
assert prediction_stats.predictions_by_confidence["high"] == 10
assert prediction_stats.predictions_by_energy_score["medium"] == 7
assert prediction_stats.avg_confidence == 75.5
assert prediction_stats.unique_matches_predicted == 15