refactor: Enhance cleanup and error handling in ExportManager, GraphManager, and Logger for improved test reliability

This commit is contained in:
2025-08-10 10:53:08 -07:00
parent 7c7d892150
commit 7208a689bd
4 changed files with 55 additions and 16 deletions
+15 -9
View File
@@ -11,10 +11,12 @@ from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from medicine_manager import MedicineManager
from pathology_manager import PathologyManager
# Provide a module alias for tests that patch 'graph_manager.*' symbols while
# importing from 'src.graph_manager'. This makes both names refer to the same
# module object.
sys.modules.setdefault("graph_manager", sys.modules[__name__])
# Ensure both import styles ('graph_manager' and 'src.graph_manager') refer to
# the same module object so test patches apply reliably regardless of import
# order across the suite.
_this_mod = sys.modules.get(__name__)
sys.modules["graph_manager"] = _this_mod
sys.modules["src.graph_manager"] = _this_mod
def _build_default_medicine_manager():
@@ -183,10 +185,14 @@ class GraphManager:
# call signature. Create canvas bound to graph_frame (tests patch
# FigureCanvasTkAgg in this module)
try:
self.canvas = FigureCanvasTkAgg(figure=self.fig, master=self.graph_frame)
# Draw idle for better performance
self.canvas.draw_idle()
except (tk.TclError, RuntimeError):
# Important: use the class from this module's namespace so tests
# patching 'graph_manager.FigureCanvasTkAgg' affect this call.
CanvasClass = globals().get("FigureCanvasTkAgg", FigureCanvasTkAgg)
self.canvas = CanvasClass(figure=self.fig, master=self.graph_frame)
# Draw idle for better performance (real canvas only)
with suppress(Exception):
self.canvas.draw_idle()
except (tk.TclError, RuntimeError, TypeError):
# Fallback dummy canvas for environments where FigureCanvasTkAgg
# interacts poorly with mocks or missing Tk resources.
class _DummyCanvas:
@@ -343,7 +349,7 @@ class GraphManager:
self.canvas.draw()
except Exception:
# Fallback to draw_idle in real canvas
with plt.ioff():
with plt.ioff(), suppress(Exception):
self.canvas.draw_idle()
def _preprocess_data(self, df: pd.DataFrame) -> pd.DataFrame: