Add comprehensive tests for dose tracking functionality

- Implemented `test_dose_parsing_simple.py` to validate the dose parsing workflow.
- Created `test_dose_save.py` to verify the saving functionality of dose tracking.
- Added `test_dose_save_simple.py` for programmatic testing of dose saving without UI interaction.
- Developed `test_final_workflow.py` to test the complete dose tracking workflow, ensuring doses are preserved during edits.
- Enhanced `conftest.py` with a mock pathology manager for testing.
- Updated `test_data_manager.py` to include pathology manager in DataManager tests and ensure compatibility with new features.
This commit is contained in:
William Valentin
2025-07-31 09:50:45 -07:00
parent b8600ae57a
commit c755f0affc
22 changed files with 2801 additions and 394 deletions

View File

@@ -14,21 +14,21 @@ from src.data_manager import DataManager
class TestDataManager:
"""Test cases for the DataManager class."""
def test_init(self, temp_csv_file, mock_logger, mock_medicine_manager):
def test_init(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test DataManager initialization."""
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
assert dm.filename == temp_csv_file
assert dm.logger == mock_logger
assert dm.medicine_manager == mock_medicine_manager
assert os.path.exists(temp_csv_file)
def test_initialize_csv_creates_file_with_headers(self, temp_csv_file, mock_logger, mock_medicine_manager):
def test_initialize_csv_creates_file_with_headers(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test that initialize_csv creates a file with proper headers."""
# Remove the file if it exists
if os.path.exists(temp_csv_file):
os.unlink(temp_csv_file)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
# Check file exists and has correct headers
assert os.path.exists(temp_csv_file)
@@ -43,33 +43,33 @@ class TestDataManager:
]
assert headers == expected_headers
def test_initialize_csv_does_not_overwrite_existing_file(self, temp_csv_file, mock_logger, mock_medicine_manager):
def test_initialize_csv_does_not_overwrite_existing_file(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test that initialize_csv does not overwrite existing file."""
# Write some data to the file first
with open(temp_csv_file, 'w') as f:
f.write("existing,data\n1,2\n")
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
# Check that existing data is preserved
with open(temp_csv_file, 'r') as f:
content = f.read()
assert "existing,data" in content
def test_load_data_empty_file(self, temp_csv_file, mock_logger, mock_medicine_manager):
def test_load_data_empty_file(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test loading data from an empty file."""
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
df = dm.load_data()
assert df.empty
def test_load_data_nonexistent_file(self, mock_logger, mock_medicine_manager):
def test_load_data_nonexistent_file(self, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test loading data from a nonexistent file."""
dm = DataManager("nonexistent.csv", mock_logger, mock_medicine_manager)
dm = DataManager("nonexistent.csv", mock_logger, mock_medicine_manager, mock_pathology_manager)
df = dm.load_data()
assert df.empty
mock_logger.warning.assert_called()
def test_load_data_with_valid_data(self, temp_csv_file, mock_logger, mock_medicine_manager, sample_data):
def test_load_data_with_valid_data(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager, sample_data):
"""Test loading valid data from CSV file."""
# Write sample data to file
with open(temp_csv_file, 'w', newline='') as f:
@@ -84,7 +84,7 @@ class TestDataManager:
# Write sample data
writer.writerows(sample_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
df = dm.load_data()
assert not df.empty
@@ -100,7 +100,7 @@ class TestDataManager:
assert df["anxiety"].dtype == int
assert df["note"].dtype == object
def test_load_data_sorted_by_date(self, temp_csv_file, mock_logger, mock_medicine_manager):
def test_load_data_sorted_by_date(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test that loaded data is sorted by date."""
# Write data in random order
unsorted_data = [
@@ -119,7 +119,7 @@ class TestDataManager:
])
writer.writerows(unsorted_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
df = dm.load_data()
# Check that data is sorted by date
@@ -127,10 +127,10 @@ class TestDataManager:
assert df.iloc[1]["note"] == "second"
assert df.iloc[2]["note"] == "third"
def test_add_entry_success(self, temp_csv_file, mock_logger, mock_medicine_manager):
def test_add_entry_success(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test successfully adding an entry."""
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
entry = ["2024-01-01", 3, 2, 4, 3, 1, 0, 2, 1, "Test note"]
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
entry = ["2024-01-01", 3, 2, 4, 3, 1, "", 0, "", 2, "", 1, "", 0, "", "Test note"]
result = dm.add_entry(entry)
assert result is True
@@ -141,7 +141,7 @@ class TestDataManager:
assert df.iloc[0]["date"] == "2024-01-01"
assert df.iloc[0]["note"] == "Test note"
def test_add_entry_duplicate_date(self, temp_csv_file, mock_logger, mock_medicine_manager, sample_data):
def test_add_entry_duplicate_date(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager, sample_data):
"""Test adding entry with duplicate date."""
# Add initial data
with open(temp_csv_file, 'w', newline='') as f:
@@ -154,7 +154,7 @@ class TestDataManager:
])
writer.writerows(sample_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
# Try to add entry with existing date
duplicate_entry = ["2024-01-01", 5, 5, 5, 5, 1, "", 1, "", 1, "", 1, "", 0, "", "Duplicate"]
@@ -162,7 +162,7 @@ class TestDataManager:
assert result is False
mock_logger.warning.assert_called_with("Entry with date 2024-01-01 already exists.")
def test_update_entry_success(self, temp_csv_file, mock_logger, mock_medicine_manager, sample_data):
def test_update_entry_success(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager, sample_data):
"""Test successfully updating an entry."""
# Add initial data
with open(temp_csv_file, 'w', newline='') as f:
@@ -175,7 +175,7 @@ class TestDataManager:
])
writer.writerows(sample_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
updated_values = ["2024-01-01", 5, 5, 5, 5, 2, "", 2, "", 2, "", 2, "", 1, "", "Updated note"]
result = dm.update_entry("2024-01-01", updated_values)
@@ -187,7 +187,7 @@ class TestDataManager:
assert updated_row["depression"] == 5
assert updated_row["note"] == "Updated note"
def test_update_entry_change_date(self, temp_csv_file, mock_logger, mock_medicine_manager, sample_data):
def test_update_entry_change_date(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager, sample_data):
"""Test updating an entry with a date change."""
# Add initial data
with open(temp_csv_file, 'w', newline='') as f:
@@ -200,7 +200,7 @@ class TestDataManager:
])
writer.writerows(sample_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
updated_values = ["2024-01-05", 5, 5, 5, 5, 2, "", 2, "", 2, "", 2, "", 1, "", "Updated note"]
result = dm.update_entry("2024-01-01", updated_values)
@@ -211,7 +211,7 @@ class TestDataManager:
assert not any(df["date"] == "2024-01-01")
assert any(df["date"] == "2024-01-05")
def test_update_entry_duplicate_date(self, temp_csv_file, mock_logger, mock_medicine_manager, sample_data):
def test_update_entry_duplicate_date(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager, sample_data):
"""Test updating entry to a date that already exists."""
# Add initial data
with open(temp_csv_file, 'w', newline='') as f:
@@ -224,7 +224,7 @@ class TestDataManager:
])
writer.writerows(sample_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
# Try to change date to one that already exists
updated_values = ["2024-01-02", 5, 5, 5, 5, 2, "", 2, "", 2, "", 2, "", 1, "", "Updated note"]
@@ -234,7 +234,7 @@ class TestDataManager:
"Cannot update: entry with date 2024-01-02 already exists."
)
def test_delete_entry_success(self, temp_csv_file, mock_logger, mock_medicine_manager, sample_data):
def test_delete_entry_success(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager, sample_data):
"""Test successfully deleting an entry."""
# Add initial data
with open(temp_csv_file, 'w', newline='') as f:
@@ -247,7 +247,7 @@ class TestDataManager:
])
writer.writerows(sample_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
result = dm.delete_entry("2024-01-02")
assert result is True
@@ -257,7 +257,7 @@ class TestDataManager:
assert len(df) == 2
assert not any(df["date"] == "2024-01-02")
def test_delete_entry_nonexistent(self, temp_csv_file, mock_logger, mock_medicine_manager, sample_data):
def test_delete_entry_nonexistent(self, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager, sample_data):
"""Test deleting a nonexistent entry."""
# Add initial data
with open(temp_csv_file, 'w', newline='') as f:
@@ -270,7 +270,7 @@ class TestDataManager:
])
writer.writerows(sample_data)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
result = dm.delete_entry("2024-01-10")
assert result is True # Should return True even if no matching entry
@@ -280,22 +280,22 @@ class TestDataManager:
assert len(df) == 3
@patch('pandas.read_csv')
def test_load_data_exception_handling(self, mock_read_csv, temp_csv_file, mock_logger, mock_medicine_manager):
def test_load_data_exception_handling(self, mock_read_csv, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test exception handling in load_data."""
mock_read_csv.side_effect = Exception("Test error")
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
df = dm.load_data()
assert df.empty
mock_logger.error.assert_called_with("Error loading data: Test error")
@patch('builtins.open')
def test_add_entry_exception_handling(self, mock_open, temp_csv_file, mock_logger, mock_medicine_manager):
def test_add_entry_exception_handling(self, mock_open, temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager):
"""Test exception handling in add_entry."""
mock_open.side_effect = Exception("Test error")
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager)
dm = DataManager(temp_csv_file, mock_logger, mock_medicine_manager, mock_pathology_manager)
entry = ["2024-01-01", 3, 2, 4, 3, 1, 0, 2, 1, "Test note"]
result = dm.add_entry(entry)