mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-10 21:03:01 +00:00
* feat: Add AP Top 25 dynamic teams feature - Add DynamicTeamResolver for resolving AP_TOP_25, AP_TOP_10, AP_TOP_5 to actual team abbreviations - Integrate dynamic team resolution into SportsCore base class - Add comprehensive test suite for dynamic team functionality - Update config template with AP_TOP_25 example - Add complete documentation for the new feature Features: - Automatic weekly updates of AP Top 25 rankings - 1-hour caching for performance optimization - Support for AP_TOP_25, AP_TOP_10, AP_TOP_5 dynamic teams - Seamless integration with existing favorite teams system - Comprehensive error handling and edge case support Tests: - Unit tests for core dynamic team resolution - Integration tests for configuration scenarios - Performance tests for caching functionality - Edge case tests for unknown dynamic teams All tests passing with 100% success rate. * docs: Update wiki submodule with AP Top 25 documentation - Add comprehensive documentation for AP Top 25 dynamic teams feature - Include usage examples, configuration guides, and troubleshooting - Update submodule reference to include new documentation * feat: Add AP_TOP_25 support to odds ticker - Integrate DynamicTeamResolver into OddsTickerManager - Resolve dynamic teams for all enabled leagues during initialization - Add comprehensive logging for dynamic team resolution - Support AP_TOP_25, AP_TOP_10, AP_TOP_5 in odds ticker - Add test suite for odds ticker dynamic teams integration Features: - Odds ticker now automatically resolves AP_TOP_25 to current top 25 teams - Shows odds for all current AP Top 25 teams automatically - Updates weekly when rankings change - Works seamlessly with existing favorite teams system - Supports mixed regular and dynamic teams Tests: - Configuration integration tests - Multiple league configuration tests - Edge case handling tests - All tests passing with 100% success rate
117 lines
4.2 KiB
Python
117 lines
4.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Integration test to verify dynamic team resolver works with sports managers.
|
|
This test checks that the SportsCore class properly resolves dynamic teams.
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import json
|
|
from datetime import datetime, timedelta
|
|
import pytz
|
|
|
|
# Add the project root to the path so we can import the modules
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
from src.base_classes.sports import SportsCore
|
|
from src.display_manager import DisplayManager
|
|
from src.cache_manager import CacheManager
|
|
|
|
def create_test_config():
|
|
"""Create a test configuration with dynamic teams."""
|
|
config = {
|
|
"ncaa_fb_scoreboard": {
|
|
"enabled": True,
|
|
"show_favorite_teams_only": True,
|
|
"favorite_teams": [
|
|
"UGA",
|
|
"AP_TOP_25"
|
|
],
|
|
"logo_dir": "assets/sports/ncaa_logos",
|
|
"show_records": True,
|
|
"show_ranking": True,
|
|
"update_interval_seconds": 3600
|
|
},
|
|
"display": {
|
|
"hardware": {
|
|
"rows": 32,
|
|
"cols": 64,
|
|
"chain_length": 1
|
|
}
|
|
},
|
|
"timezone": "America/Chicago"
|
|
}
|
|
return config
|
|
|
|
def test_sports_core_integration():
|
|
"""Test that SportsCore properly resolves dynamic teams."""
|
|
print("Testing SportsCore integration with dynamic teams...")
|
|
|
|
# Create test configuration
|
|
config = create_test_config()
|
|
|
|
# Create mock display manager and cache manager
|
|
display_manager = DisplayManager(config)
|
|
cache_manager = CacheManager(config)
|
|
|
|
# Create SportsCore instance
|
|
sports_core = SportsCore(config, display_manager, cache_manager,
|
|
__import__('logging').getLogger(__name__), "ncaa_fb")
|
|
|
|
# Check that favorite_teams were resolved
|
|
print(f"Raw favorite teams from config: {config['ncaa_fb_scoreboard']['favorite_teams']}")
|
|
print(f"Resolved favorite teams: {sports_core.favorite_teams}")
|
|
|
|
# Verify that UGA is still in the list
|
|
assert "UGA" in sports_core.favorite_teams, "UGA should be in resolved teams"
|
|
|
|
# Verify that AP_TOP_25 was resolved to actual teams
|
|
assert len(sports_core.favorite_teams) > 1, "Should have more than 1 team after resolving AP_TOP_25"
|
|
|
|
# Verify that AP_TOP_25 is not in the final list (should be resolved)
|
|
assert "AP_TOP_25" not in sports_core.favorite_teams, "AP_TOP_25 should be resolved, not left as-is"
|
|
|
|
print(f"✓ SportsCore successfully resolved dynamic teams")
|
|
print(f"✓ Final favorite teams: {sports_core.favorite_teams[:10]}{'...' if len(sports_core.favorite_teams) > 10 else ''}")
|
|
|
|
return True
|
|
|
|
def test_dynamic_resolver_availability():
|
|
"""Test that the dynamic resolver is available in SportsCore."""
|
|
print("Testing dynamic resolver availability...")
|
|
|
|
config = create_test_config()
|
|
display_manager = DisplayManager(config)
|
|
cache_manager = CacheManager(config)
|
|
|
|
sports_core = SportsCore(config, display_manager, cache_manager,
|
|
__import__('logging').getLogger(__name__), "ncaa_fb")
|
|
|
|
# Check that dynamic resolver is available
|
|
assert hasattr(sports_core, 'dynamic_resolver'), "SportsCore should have dynamic_resolver attribute"
|
|
assert sports_core.dynamic_resolver is not None, "Dynamic resolver should be initialized"
|
|
|
|
# Test dynamic resolver methods
|
|
assert sports_core.dynamic_resolver.is_dynamic_team("AP_TOP_25"), "Should detect AP_TOP_25 as dynamic"
|
|
assert not sports_core.dynamic_resolver.is_dynamic_team("UGA"), "Should not detect UGA as dynamic"
|
|
|
|
print("✓ Dynamic resolver is properly integrated")
|
|
|
|
return True
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
print("🧪 Testing Sports Integration with Dynamic Teams...")
|
|
print("=" * 50)
|
|
|
|
test_sports_core_integration()
|
|
test_dynamic_resolver_availability()
|
|
|
|
print("\n🎉 All integration tests passed!")
|
|
print("Dynamic team resolver is successfully integrated with SportsCore!")
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ Integration test failed with error: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
sys.exit(1) |