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

282 lines
9.3 KiB
Python

"""
Tests for energy calculation worker.
"""
import pytest
from unittest.mock import Mock, patch
from sqlalchemy.orm import Session
from app.workers.energy_worker import (
EnergyWorker,
create_energy_worker
)
class TestEnergyWorker:
"""Tests for EnergyWorker class."""
def test_initialization(self):
"""Test energy worker initialization."""
worker = EnergyWorker()
# No specific initialization required for energy worker
assert worker is not None
@patch('app.workers.energy_worker.calculate_and_store_energy_score')
@patch('app.workers.energy_worker.get_energy_score_by_match_and_team')
def test_execute_energy_calculation_task_new(
self,
mock_get_score,
mock_calculate_store
):
"""Test executing energy calculation for new score."""
# Create worker
worker = EnergyWorker()
# Mock database session
mock_db = Mock(spec=Session)
# Mock no existing score
mock_get_score.return_value = None
# Mock calculation
mock_energy_score = Mock()
mock_energy_score.score = 75.5
mock_energy_score.confidence = 0.82
mock_energy_score.sources_used = ['twitter', 'reddit']
mock_energy_score.twitter_score = 0.6
mock_energy_score.reddit_score = 0.7
mock_energy_score.rss_score = 0.5
mock_energy_score.temporal_factor = 1.0
mock_calculate_store.return_value = mock_energy_score
# Execute task
task = {
'match_id': 123,
'team_id': 456,
'twitter_sentiments': [
{'compound': 0.6, 'sentiment': 'positive'},
{'compound': 0.7, 'sentiment': 'positive'}
],
'reddit_sentiments': [
{'compound': 0.7, 'sentiment': 'positive'},
{'compound': 0.8, 'sentiment': 'positive'}
],
'rss_sentiments': [
{'compound': 0.5, 'sentiment': 'positive'}
],
'tweets_with_timestamps': []
}
result = worker.execute_energy_calculation_task(task, mock_db)
# Verify calculation called
mock_calculate_store.assert_called_once()
# Verify result
assert result['energy_score'] == 75.5
assert result['confidence'] == 0.82
assert result['sources_used'] == ['twitter', 'reddit']
assert result['status'] == 'success'
assert result['metadata']['match_id'] == 123
assert result['metadata']['team_id'] == 456
assert result['metadata']['twitter_score'] == 0.6
assert result['metadata']['reddit_score'] == 0.7
assert result['metadata']['rss_score'] == 0.5
assert result['metadata']['temporal_factor'] == 1.0
@patch('app.workers.energy_worker.get_energy_score_by_match_and_team')
def test_execute_energy_calculation_task_existing(
self,
mock_get_score
):
"""Test executing energy calculation for existing score."""
# Create worker
worker = EnergyWorker()
# Mock database session
mock_db = Mock(spec=Session)
# Mock existing score
mock_existing_score = Mock()
mock_existing_score.score = 72.0
mock_existing_score.confidence = 0.78
mock_existing_score.sources_used = ['twitter', 'reddit']
mock_get_score.return_value = mock_existing_score
# Execute task
task = {
'match_id': 123,
'team_id': 456,
'twitter_sentiments': [],
'reddit_sentiments': [],
'rss_sentiments': [],
'tweets_with_timestamps': []
}
result = worker.execute_energy_calculation_task(task, mock_db)
# Verify result from existing score
assert result['energy_score'] == 72.0
assert result['confidence'] == 0.78
assert result['sources_used'] == ['twitter', 'reddit']
assert result['status'] == 'success'
assert result['metadata']['updated_existing'] is True
@patch('app.workers.energy_worker.calculate_and_store_energy_score')
@patch('app.workers.energy_worker.get_energy_score_by_match_and_team')
def test_execute_energy_calculation_task_error_handling(
self,
mock_get_score,
mock_calculate_store
):
"""Test error handling in energy calculation."""
worker = EnergyWorker()
mock_db = Mock(spec=Session)
# Mock no existing score
mock_get_score.return_value = None
# Mock calculation error
mock_calculate_store.side_effect = Exception("Calculation error")
# Execute task
task = {
'match_id': 123,
'team_id': 456,
'twitter_sentiments': [],
'reddit_sentiments': [],
'rss_sentiments': [],
'tweets_with_timestamps': []
}
result = worker.execute_energy_calculation_task(task, mock_db)
# Verify error handling
assert result['energy_score'] == 0.0
assert result['confidence'] == 0.0
assert result['sources_used'] == []
assert result['status'] == 'error'
assert 'error' in result
@patch('app.workers.energy_worker.calculate_energy_score')
def test_calculate_mock_energy(self, mock_calculate):
"""Test mock energy calculation (for testing)."""
worker = EnergyWorker()
# Mock calculation
mock_calculate.return_value = {
'score': 75.5,
'confidence': 0.82,
'sources_used': ['twitter', 'reddit']
}
# Calculate mock energy
twitter_sentiments = [
{'compound': 0.6, 'sentiment': 'positive'}
]
reddit_sentiments = [
{'compound': 0.7, 'sentiment': 'positive'}
]
result = worker.calculate_mock_energy(
twitter_sentiments=twitter_sentiments,
reddit_sentiments=reddit_sentiments
)
# Verify calculation called
mock_calculate.assert_called_once_with(
match_id=0,
team_id=0,
twitter_sentiments=twitter_sentiments,
reddit_sentiments=reddit_sentiments,
rss_sentiments=[],
tweets_with_timestamps=[]
)
# Verify result
assert result['energy_score'] == 75.5
assert result['confidence'] == 0.82
assert result['sources_used'] == ['twitter', 'reddit']
assert result['status'] == 'success'
@patch('app.workers.energy_worker.calculate_energy_score')
def test_calculate_mock_energy_error(self, mock_calculate):
"""Test error handling in mock energy calculation."""
worker = EnergyWorker()
# Mock calculation error
mock_calculate.side_effect = Exception("Calculation error")
# Calculate mock energy
result = worker.calculate_mock_energy(
twitter_sentiments=[],
reddit_sentiments=[]
)
# Verify error handling
assert result['energy_score'] == 0.0
assert result['confidence'] == 0.0
assert result['sources_used'] == []
assert result['status'] == 'error'
assert 'error' in result
@patch('app.workers.energy_worker.calculate_energy_score')
def test_calculate_mock_energy_with_all_sources(self, mock_calculate):
"""Test mock energy calculation with all sources."""
worker = EnergyWorker()
# Mock calculation
mock_calculate.return_value = {
'score': 80.0,
'confidence': 0.85,
'sources_used': ['twitter', 'reddit', 'rss']
}
# Calculate mock energy with all sources
twitter_sentiments = [
{'compound': 0.6, 'sentiment': 'positive'}
]
reddit_sentiments = [
{'compound': 0.7, 'sentiment': 'positive'}
]
rss_sentiments = [
{'compound': 0.5, 'sentiment': 'positive'}
]
tweets_with_timestamps = [
{'timestamp': '2026-01-17T10:00:00', 'text': 'Great match!'}
]
result = worker.calculate_mock_energy(
twitter_sentiments=twitter_sentiments,
reddit_sentiments=reddit_sentiments,
rss_sentiments=rss_sentiments,
tweets_with_timestamps=tweets_with_timestamps
)
# Verify calculation called with all sources
mock_calculate.assert_called_once_with(
match_id=0,
team_id=0,
twitter_sentiments=twitter_sentiments,
reddit_sentiments=reddit_sentiments,
rss_sentiments=rss_sentiments,
tweets_with_timestamps=tweets_with_timestamps
)
# Verify result
assert result['energy_score'] == 80.0
assert result['confidence'] == 0.85
assert result['sources_used'] == ['twitter', 'reddit', 'rss']
assert result['status'] == 'success'
class TestCreateEnergyWorker:
"""Tests for create_energy_worker factory function."""
def test_create_energy_worker(self):
"""Test creating an energy worker."""
worker = create_energy_worker()
assert isinstance(worker, EnergyWorker)