#!/usr/bin/env python3 """ Test that programmatically clicks punch buttons to verify functionality. """ import os import sys import tkinter as tk from datetime import datetime sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src")) import logging from ui_manager import UIManager def test_programmatic_punch(): """Test punch buttons programmatically.""" print("šŸ¤– Programmatic Punch Button Test") print("=" * 40) root = tk.Tk() root.title("Auto 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 punch test", ) save_called = False saved_doses = None def capture_save(*args): nonlocal save_called, saved_doses save_called = True if len(args) >= 12: saved_doses = args[-1] print("šŸ’¾ Save captured doses:") for med, doses in saved_doses.items(): if doses: count = len(doses.split("|")) if "|" in doses else 1 print(f" {med}: {count} dose(s) - {doses}") else: print(f" {med}: No doses") 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 variables that were created # We need to access them through the ui_manager somehow print("šŸ” Attempting to find dose widgets...") # Let's manually trigger the punch button functionality # by calling the _punch_dose_in_edit method directly # Find the text widgets in the edit window 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 Text widgets and Entry widgets text_widgets = [w for w in all_widgets if isinstance(w, tk.Text)] entry_widgets = [w for w in all_widgets if isinstance(w, tk.Entry)] print( f"Found {len(text_widgets)} Text widgets and " f"{len(entry_widgets)} Entry widgets" ) if len(text_widgets) >= 4: # Should have 4 dose text widgets # Let's manually add doses to the first text widget (bupropion) bupropion_text = text_widgets[0] print("šŸ“ Manually adding doses to bupropion text widget...") # Clear and add multiple doses bupropion_text.delete(1.0, tk.END) now = datetime.now() time1 = now.strftime("%H:%M") time2 = (now.replace(minute=now.minute + 1)).strftime("%H:%M") time3 = (now.replace(minute=now.minute + 2)).strftime("%H:%M") dose_content = f"{time1}: 100mg\n{time2}: 200mg\n{time3}: 300mg" bupropion_text.insert(1.0, dose_content) print(f"Added content: {dose_content}") # Verify content was added actual_content = bupropion_text.get(1.0, tk.END).strip() print(f"Actual content in widget: '{actual_content}'") # Now trigger save print("šŸ”„ Triggering save...") # We need to find the save button buttons = [w for w in all_widgets if isinstance(w, tk.ttk.Button)] save_button = None for button in buttons: try: if "Save" in button.cget("text"): save_button = button break except Exception: pass if save_button: print("šŸ’¾ Found Save button, clicking it...") save_button.invoke() else: print("āŒ Could not find Save button") edit_window.destroy() else: print("āŒ Could not find expected Text widgets") edit_window.destroy() # Wait for save to complete root.update() if save_called: return True else: print("āŒ Save was not called") return False except Exception as e: print(f"āŒ Error: {e}") import traceback traceback.print_exc() return False finally: root.destroy() if __name__ == "__main__": os.chdir("/home/will/Code/thechart") success = test_programmatic_punch() if success: print("\nāœ… Programmatic test completed successfully!") else: print("\nāŒ Programmatic test failed!")