- Implemented MedicineManagementWindow for adding, editing, and removing medicines. - Created MedicineManager to handle medicine configurations, including loading and saving to JSON. - Updated UIManager to dynamically generate medicine-related UI components based on the MedicineManager. - Enhanced test suite with mock objects for MedicineManager to ensure proper functionality in DataManager tests. - Added validation for medicine input fields in the UI. - Introduced default medicine configurations for initial setup.
186 lines
6.2 KiB
Python
186 lines
6.2 KiB
Python
"""
|
|
Fixtures and configuration for pytest tests.
|
|
"""
|
|
import os
|
|
import tempfile
|
|
import pytest
|
|
import pandas as pd
|
|
from unittest.mock import Mock
|
|
import logging
|
|
|
|
# Add src to path for imports
|
|
import sys
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
|
|
|
from src.medicine_manager import MedicineManager, Medicine
|
|
|
|
|
|
@pytest.fixture
|
|
def temp_csv_file():
|
|
"""Create a temporary CSV file for testing."""
|
|
fd, path = tempfile.mkstemp(suffix='.csv')
|
|
os.close(fd)
|
|
yield path
|
|
# Cleanup
|
|
if os.path.exists(path):
|
|
os.unlink(path)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_medicine_manager():
|
|
"""Create a mock medicine manager with default medicines for testing."""
|
|
mock_manager = Mock(spec=MedicineManager)
|
|
|
|
# Default medicines matching the original system
|
|
default_medicines = {
|
|
"bupropion": Medicine(
|
|
key="bupropion",
|
|
display_name="Bupropion",
|
|
dosage_info="150/300 mg",
|
|
quick_doses=["150", "300"],
|
|
color="#FF6B6B",
|
|
default_enabled=True
|
|
),
|
|
"hydroxyzine": Medicine(
|
|
key="hydroxyzine",
|
|
display_name="Hydroxyzine",
|
|
dosage_info="25 mg",
|
|
quick_doses=["25", "50"],
|
|
color="#4ECDC4",
|
|
default_enabled=False
|
|
),
|
|
"gabapentin": Medicine(
|
|
key="gabapentin",
|
|
display_name="Gabapentin",
|
|
dosage_info="100 mg",
|
|
quick_doses=["100", "300", "600"],
|
|
color="#45B7D1",
|
|
default_enabled=False
|
|
),
|
|
"propranolol": Medicine(
|
|
key="propranolol",
|
|
display_name="Propranolol",
|
|
dosage_info="10 mg",
|
|
quick_doses=["10", "20", "40"],
|
|
color="#96CEB4",
|
|
default_enabled=True
|
|
),
|
|
"quetiapine": Medicine(
|
|
key="quetiapine",
|
|
display_name="Quetiapine",
|
|
dosage_info="25 mg",
|
|
quick_doses=["25", "50", "100"],
|
|
color="#FFEAA7",
|
|
default_enabled=False
|
|
)
|
|
}
|
|
|
|
mock_manager.get_medicine_keys.return_value = list(default_medicines.keys())
|
|
mock_manager.get_all_medicines.return_value = default_medicines
|
|
mock_manager.get_medicine.side_effect = lambda key: default_medicines.get(key)
|
|
mock_manager.get_graph_colors.return_value = {k: v.color for k, v in default_medicines.items()}
|
|
mock_manager.get_quick_doses.side_effect = lambda key: default_medicines.get(key, Medicine("", "", "", [], "", False)).quick_doses
|
|
|
|
return mock_manager
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_data():
|
|
"""Sample data for testing."""
|
|
return [
|
|
["2024-01-01", 3, 2, 4, 3, 1, "", 0, "", 2, "", 1, "", 0, "", "Test note 1"],
|
|
["2024-01-02", 2, 3, 3, 4, 1, "", 1, "", 2, "", 0, "", 1, "", "Test note 2"],
|
|
["2024-01-03", 4, 1, 5, 2, 0, "", 0, "", 1, "", 1, "", 0, "", ""],
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_dataframe():
|
|
"""Sample DataFrame for testing."""
|
|
return pd.DataFrame({
|
|
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
|
|
'depression': [3, 2, 4],
|
|
'anxiety': [2, 3, 1],
|
|
'sleep': [4, 3, 5],
|
|
'appetite': [3, 4, 2],
|
|
'bupropion': [1, 1, 0],
|
|
'bupropion_doses': ['2024-01-01 08:00:00:150mg', '2024-01-02 08:00:00:300mg', ''],
|
|
'hydroxyzine': [0, 1, 0],
|
|
'hydroxyzine_doses': ['', '2024-01-02 20:00:00:25mg', ''],
|
|
'gabapentin': [2, 2, 1],
|
|
'gabapentin_doses': ['2024-01-01 12:00:00:100mg|2024-01-01 20:00:00:100mg',
|
|
'2024-01-02 12:00:00:100mg|2024-01-02 20:00:00:100mg',
|
|
'2024-01-03 12:00:00:100mg'],
|
|
'propranolol': [1, 0, 1],
|
|
'propranolol_doses': ['2024-01-01 12:00:00:10mg', '', '2024-01-03 12:00:00:20mg'],
|
|
'quetiapine': [0, 1, 0],
|
|
'quetiapine_doses': ['', '2024-01-02 22:00:00:50mg', ''],
|
|
'note': ['Test note 1', 'Test note 2', '']
|
|
})
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_logger():
|
|
"""Mock logger for testing."""
|
|
return Mock(spec=logging.Logger)
|
|
|
|
|
|
@pytest.fixture
|
|
def temp_log_dir():
|
|
"""Create a temporary directory for log files."""
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
yield temp_dir
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_env_vars(monkeypatch):
|
|
"""Mock environment variables."""
|
|
monkeypatch.setenv("LOG_LEVEL", "DEBUG")
|
|
monkeypatch.setenv("LOG_PATH", "/tmp/test_logs")
|
|
monkeypatch.setenv("LOG_CLEAR", "False")
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_dose_data():
|
|
"""Sample dose data for testing dose calculation."""
|
|
return {
|
|
'standard_format': '2025-07-28 18:59:45:150mg|2025-07-28 19:34:19:75mg', # Should sum to 225
|
|
'with_bullets': '• • • • 2025-07-30 07:50:00:300', # Should be 300
|
|
'decimal_doses': '2025-07-28 18:59:45:12.5mg|2025-07-28 19:34:19:7.5mg', # Should sum to 20
|
|
'no_timestamp': '100mg|50mg', # Should sum to 150
|
|
'mixed_format': '• 2025-07-30 22:50:00:10|75mg', # Should sum to 85
|
|
'empty_string': '', # Should be 0
|
|
'nan_value': 'nan', # Should be 0
|
|
'no_units': '2025-07-28 18:59:45:10|2025-07-28 19:34:19:5', # Should sum to 15
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def legend_test_dataframe():
|
|
"""DataFrame specifically designed for testing legend functionality."""
|
|
return pd.DataFrame({
|
|
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
|
|
'depression': [3, 2, 4],
|
|
'anxiety': [2, 3, 1],
|
|
'sleep': [4, 3, 5],
|
|
'appetite': [3, 4, 2],
|
|
# Medicine with consistent doses for average testing
|
|
'bupropion': [1, 1, 1],
|
|
'bupropion_doses': ['2024-01-01 08:00:00:100mg',
|
|
'2024-01-02 08:00:00:200mg',
|
|
'2024-01-03 08:00:00:150mg'], # Average: 150mg
|
|
# Medicine with varying doses
|
|
'propranolol': [1, 1, 0],
|
|
'propranolol_doses': ['2024-01-01 12:00:00:10mg',
|
|
'2024-01-02 12:00:00:20mg',
|
|
''], # Average: 15mg (10+20)/2
|
|
# Medicines without dose data
|
|
'hydroxyzine': [0, 0, 0],
|
|
'hydroxyzine_doses': ['', '', ''],
|
|
'gabapentin': [0, 0, 0],
|
|
'gabapentin_doses': ['', '', ''],
|
|
'quetiapine': [0, 0, 0],
|
|
'quetiapine_doses': ['', '', ''],
|
|
'note': ['Test note 1', 'Test note 2', 'Test note 3']
|
|
})
|