#!/usr/bin/env python3 """ Automated test to simulate multiple punch button clicks and identify the accumulation issue. """ import os import sys import tkinter as tk sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src")) import logging from ui_manager import UIManager def test_automated_multiple_punches(): """Automatically simulate multiple punch button clicks.""" print("šŸ¤– Automated Multiple Punch Test") print("=" * 40) root = tk.Tk() root.title("Auto Multi-Punch Test") root.geometry("800x600") logger = logging.getLogger("auto_punch") ui_manager = UIManager(root, logger) sample_values = ( "07/29/2025", 5, 3, 7, 6, 1, "", 0, "", 0, "", 0, "", "Auto multi-punch test", ) punch_results = [] save_result = None def capture_save(*args): nonlocal save_result save_result = args[-1] if len(args) >= 12 else {} print("\nšŸ’¾ Save triggered, closing window...") if args and hasattr(args[0], "destroy"): args[0].destroy() callbacks = {"save": capture_save, "delete": lambda x: x.destroy()} try: edit_window = ui_manager.create_edit_window(sample_values, callbacks) # Find the dose widgets we need def find_widgets(widget, widget_list=None): if widget_list is None: widget_list = [] widget_list.append(widget) for child in widget.winfo_children(): find_widgets(child, widget_list) return widget_list all_widgets = find_widgets(edit_window) # Find bupropion dose entry and text widgets entry_widgets = [w for w in all_widgets if isinstance(w, tk.Entry)] text_widgets = [w for w in all_widgets if isinstance(w, tk.Text)] buttons = [w for w in all_widgets if isinstance(w, tk.ttk.Button)] # Find the specific widgets for bupropion bupropion_entry = None bupropion_text = None bupropion_button = None # The first text widget should be bupropion (based on order in # _add_dose_display_to_edit) if len(text_widgets) >= 1: bupropion_text = text_widgets[0] # Find the entry widget and button for bupropion for button in buttons: try: if "Take Bupropion" in button.cget("text"): bupropion_button = button break except Exception: pass # Find the entry widget near the bupropion button # This is tricky - let's use the first few entry widgets if len(entry_widgets) >= 6: # Skip the first 5 (date, symptoms) bupropion_entry = entry_widgets[5] # Should be first dose entry if not all([bupropion_entry, bupropion_text, bupropion_button]): print("āŒ Could not find required widgets:") print(f" Entry: {bupropion_entry is not None}") print(f" Text: {bupropion_text is not None}") print(f" Button: {bupropion_button is not None}") edit_window.destroy() return False print("āœ… Found bupropion widgets, starting automated test...") # Test sequence: Add 3 doses doses = ["100mg", "200mg", "300mg"] for i, dose in enumerate(doses, 1): print(f"\nšŸ”„ Punch {i}: Adding {dose}") # Get content before before_content = bupropion_text.get(1.0, tk.END).strip() print(f" Content before: '{before_content}'") # Set the dose in entry bupropion_entry.delete(0, tk.END) bupropion_entry.insert(0, dose) # Click the punch button bupropion_button.invoke() # Allow UI to update root.update() # Get content after after_content = bupropion_text.get(1.0, tk.END).strip() print(f" Content after: '{after_content}'") # Count lines lines = len([line for line in after_content.split("\n") if line.strip()]) print(f" Lines in text: {lines}") punch_results.append( { "dose": dose, "before": before_content, "after": after_content, "lines": lines, } ) # Small delay root.after(100) root.update() # Now trigger save print("\nšŸ’¾ Triggering save...") save_button = None for button in buttons: try: if "Save" in button.cget("text"): save_button = button break except Exception: pass if save_button: save_button.invoke() root.update() else: print("āŒ Could not find Save button") edit_window.destroy() # Wait a moment for save to complete root.after(100) root.update() # Analyze results print("\nšŸ“Š RESULTS ANALYSIS:") final_lines = punch_results[-1]["lines"] if punch_results else 0 print(f" Total punches: {len(punch_results)}") print(f" Final content lines: {final_lines}") print(f" Expected lines: {len(doses)}") if save_result: bup_doses = save_result.get("bupropion", "") if bup_doses: saved_dose_count = len(bup_doses.split("|")) print(f" Saved dose count: {saved_dose_count}") print(f" Saved doses: {bup_doses}") # Check if all doses were saved if saved_dose_count == len(doses): print("āœ… All doses were saved correctly!") return True else: print("āŒ Not all doses were saved!") return False else: print("āŒ No doses were saved!") return False else: print("āŒ Save was not called!") return False except Exception as e: print(f"āŒ Error during test: {e}") import traceback traceback.print_exc() return False finally: import contextlib with contextlib.suppress(Exception): root.destroy() if __name__ == "__main__": os.chdir("/home/will/Code/thechart") success = test_automated_multiple_punches() if success: print("\nšŸŽÆ Automated test PASSED - multiple doses work correctly!") else: print("\n🚨 Automated test FAILED - multiple dose issue confirmed!")