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:
+86
-42
@@ -13,6 +13,8 @@ from graph_manager import GraphManager
|
||||
from init import logger
|
||||
from medicine_management_window import MedicineManagementWindow
|
||||
from medicine_manager import MedicineManager
|
||||
from pathology_management_window import PathologyManagementWindow
|
||||
from pathology_manager import PathologyManager
|
||||
from ui_manager import UIManager
|
||||
|
||||
|
||||
@@ -45,9 +47,12 @@ class MedTrackerApp:
|
||||
|
||||
# Initialize managers
|
||||
self.medicine_manager: MedicineManager = MedicineManager(logger=logger)
|
||||
self.ui_manager: UIManager = UIManager(root, logger, self.medicine_manager)
|
||||
self.pathology_manager: PathologyManager = PathologyManager(logger=logger)
|
||||
self.ui_manager: UIManager = UIManager(
|
||||
root, logger, self.medicine_manager, self.pathology_manager
|
||||
)
|
||||
self.data_manager: DataManager = DataManager(
|
||||
self.filename, logger, self.medicine_manager
|
||||
self.filename, logger, self.medicine_manager, self.pathology_manager
|
||||
)
|
||||
|
||||
# Set up application icon
|
||||
@@ -83,13 +88,13 @@ class MedTrackerApp:
|
||||
# --- Create Graph Frame ---
|
||||
graph_frame: ttk.Frame = self.ui_manager.create_graph_frame(main_frame)
|
||||
self.graph_manager: GraphManager = GraphManager(
|
||||
graph_frame, self.medicine_manager
|
||||
graph_frame, self.medicine_manager, self.pathology_manager
|
||||
)
|
||||
|
||||
# --- Create Input Frame ---
|
||||
input_ui: dict[str, Any] = self.ui_manager.create_input_frame(main_frame)
|
||||
self.input_frame: ttk.Frame = input_ui["frame"]
|
||||
self.symptom_vars: dict[str, tk.IntVar] = input_ui["symptom_vars"]
|
||||
self.pathology_vars: dict[str, tk.IntVar] = input_ui["pathology_vars"]
|
||||
self.medicine_vars: dict[str, tuple[tk.IntVar, str]] = input_ui["medicine_vars"]
|
||||
self.note_var: tk.StringVar = input_ui["note_var"]
|
||||
self.date_var: tk.StringVar = input_ui["date_var"]
|
||||
@@ -124,24 +129,34 @@ class MedTrackerApp:
|
||||
# Tools menu
|
||||
tools_menu = tk.Menu(menubar, tearoff=0)
|
||||
menubar.add_cascade(label="Tools", menu=tools_menu)
|
||||
tools_menu.add_command(
|
||||
label="Manage Pathologies...", command=self._open_pathology_manager
|
||||
)
|
||||
tools_menu.add_command(
|
||||
label="Manage Medicines...", command=self._open_medicine_manager
|
||||
)
|
||||
|
||||
def _open_pathology_manager(self) -> None:
|
||||
"""Open the pathology management window."""
|
||||
PathologyManagementWindow(
|
||||
self.root, self.pathology_manager, self._refresh_ui_after_config_change
|
||||
)
|
||||
|
||||
def _open_medicine_manager(self) -> None:
|
||||
"""Open the medicine management window."""
|
||||
MedicineManagementWindow(
|
||||
self.root, self.medicine_manager, self._refresh_ui_after_medicine_change
|
||||
self.root, self.medicine_manager, self._refresh_ui_after_config_change
|
||||
)
|
||||
|
||||
def _refresh_ui_after_medicine_change(self) -> None:
|
||||
"""Refresh UI components after medicine configuration changes."""
|
||||
# Recreate the input frame with new medicines
|
||||
def _refresh_ui_after_config_change(self) -> None:
|
||||
"""Refresh UI components after pathology or medicine configuration changes."""
|
||||
# Recreate the input frame with new pathologies and medicines
|
||||
self.input_frame.destroy()
|
||||
input_ui: dict[str, Any] = self.ui_manager.create_input_frame(
|
||||
self.input_frame.master
|
||||
)
|
||||
self.input_frame: ttk.Frame = input_ui["frame"]
|
||||
self.pathology_vars: dict[str, tk.IntVar] = input_ui["pathology_vars"]
|
||||
self.medicine_vars: dict[str, tuple[tk.IntVar, str]] = input_ui["medicine_vars"]
|
||||
|
||||
# Add buttons to input frame
|
||||
@@ -187,13 +202,14 @@ class MedTrackerApp:
|
||||
if not df.empty and original_date in df["date"].values:
|
||||
full_row = df[df["date"] == original_date].iloc[0]
|
||||
# Convert to tuple in the expected order for the edit window
|
||||
full_values = [
|
||||
full_row["date"],
|
||||
full_row["depression"],
|
||||
full_row["anxiety"],
|
||||
full_row["sleep"],
|
||||
full_row["appetite"],
|
||||
]
|
||||
full_values = [full_row["date"]]
|
||||
|
||||
# Add pathology data dynamically
|
||||
for pathology_key in self.pathology_manager.get_pathology_keys():
|
||||
if pathology_key in full_row:
|
||||
full_values.append(full_row[pathology_key])
|
||||
else:
|
||||
full_values.append(0)
|
||||
|
||||
# Add medicine data dynamically
|
||||
for medicine_key in self.medicine_manager.get_medicine_keys():
|
||||
@@ -222,27 +238,57 @@ class MedTrackerApp:
|
||||
self,
|
||||
edit_win: tk.Toplevel,
|
||||
original_date: str,
|
||||
date: str,
|
||||
dep: int,
|
||||
anx: int,
|
||||
slp: int,
|
||||
app: int,
|
||||
medicine_values: dict[str, int],
|
||||
note: str,
|
||||
dose_data: dict[str, str],
|
||||
*args,
|
||||
) -> None:
|
||||
"""Save the edited data to the CSV file."""
|
||||
values: list[str | int] = [
|
||||
date,
|
||||
dep,
|
||||
anx,
|
||||
slp,
|
||||
app,
|
||||
]
|
||||
"""Save edited data to CSV file with dynamic pathology/medicine support."""
|
||||
# Parse dynamic arguments
|
||||
# Format: date, pathology1, pathology2, ..., medicine1, medicine2,
|
||||
# ..., note, dose_data
|
||||
|
||||
if len(args) < 2: # At minimum need date and note
|
||||
messagebox.showerror("Error", "Invalid save data format", parent=edit_win)
|
||||
return
|
||||
|
||||
# Extract arguments
|
||||
date = args[0]
|
||||
|
||||
# Get pathology count to extract values
|
||||
pathology_keys = self.pathology_manager.get_pathology_keys()
|
||||
medicine_keys = self.medicine_manager.get_medicine_keys()
|
||||
|
||||
# Expected format: date, pathology_values..., medicine_values...,
|
||||
# note, dose_data
|
||||
expected_pathology_count = len(pathology_keys)
|
||||
expected_medicine_count = len(medicine_keys)
|
||||
|
||||
# Extract pathology values
|
||||
pathology_values = []
|
||||
for i in range(expected_pathology_count):
|
||||
if i + 1 < len(args):
|
||||
pathology_values.append(args[i + 1])
|
||||
else:
|
||||
pathology_values.append(0)
|
||||
|
||||
# Extract medicine values
|
||||
medicine_values = []
|
||||
medicine_start_idx = 1 + expected_pathology_count
|
||||
for i in range(expected_medicine_count):
|
||||
if medicine_start_idx + i < len(args):
|
||||
medicine_values.append(args[medicine_start_idx + i])
|
||||
else:
|
||||
medicine_values.append(0)
|
||||
|
||||
# Extract note and dose data (last two arguments)
|
||||
note = args[-2] if len(args) >= 2 else ""
|
||||
dose_data = args[-1] if len(args) >= 1 else {}
|
||||
|
||||
# Build the values list for data manager
|
||||
values = [date]
|
||||
values.extend(pathology_values)
|
||||
|
||||
# Add medicine data dynamically
|
||||
for medicine_key in self.medicine_manager.get_medicine_keys():
|
||||
values.append(medicine_values.get(medicine_key, 0))
|
||||
for i, medicine_key in enumerate(medicine_keys):
|
||||
values.append(medicine_values[i] if i < len(medicine_values) else 0)
|
||||
values.append(dose_data.get(medicine_key, ""))
|
||||
|
||||
values.append(note)
|
||||
@@ -293,13 +339,11 @@ class MedTrackerApp:
|
||||
dose_values[f"{medicine_key}_doses"] = ""
|
||||
|
||||
# Build entry dynamically
|
||||
entry: list[str | int] = [
|
||||
self.date_var.get(),
|
||||
self.symptom_vars["depression"].get(),
|
||||
self.symptom_vars["anxiety"].get(),
|
||||
self.symptom_vars["sleep"].get(),
|
||||
self.symptom_vars["appetite"].get(),
|
||||
]
|
||||
entry: list[str | int] = [self.date_var.get()]
|
||||
|
||||
# Add pathology data dynamically
|
||||
for pathology_key in self.pathology_manager.get_pathology_keys():
|
||||
entry.append(self.pathology_vars[pathology_key].get())
|
||||
|
||||
# Add medicine data
|
||||
for medicine_key in self.medicine_manager.get_medicine_keys():
|
||||
@@ -358,8 +402,8 @@ class MedTrackerApp:
|
||||
"""Clear all input fields."""
|
||||
logger.debug("Clearing input fields.")
|
||||
self.date_var.set("")
|
||||
for key in self.symptom_vars:
|
||||
self.symptom_vars[key].set(0)
|
||||
for key in self.pathology_vars:
|
||||
self.pathology_vars[key].set(0)
|
||||
for key in self.medicine_vars:
|
||||
self.medicine_vars[key][0].set(0)
|
||||
self.note_var.set("")
|
||||
|
||||
Reference in New Issue
Block a user