Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions test_pyautogui_basic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import pyautogui
import time

print("You have 3 seconds to switch to a text editor or input box...")
time.sleep(3)

pyautogui.typewrite("Hello from PyAutoGUI!\n", interval=0.1)
pyautogui.press("enter")
pyautogui.press("tab")
127 changes: 127 additions & 0 deletions tests/test_ui_end_to_end.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import sys, os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

import pytest
import tkinter as tk
from ui_items.prompt_view import PromptView

@pytest.fixture
def prompt_view():
root = tk.Tk()

# Dummy callbacks
def dummy_generate(*args, **kwargs):
return None

def dummy_get_api_key():
return "fake-key"

def dummy_get_model_source():
return "fake-model"

dummy_examples = [{"prompt": "Example prompt"}]

# ✅ Pass all required args
view = PromptView(
root,
on_generate=dummy_generate,
get_api_key_callback=dummy_get_api_key,
get_model_source_callback=dummy_get_model_source,
examples_data=dummy_examples
)

yield view
root.destroy()


def test_clear_button(prompt_view):
# Insert sample text
prompt_view.text_input.insert("1.0", "Some text")

# Call clear_input
prompt_view.clear_input()

# Assert textbox contains the placeholder text
content = prompt_view.text_input.get("1.0", tk.END).strip()
assert "Describe your dream website" in content


def test_surprise_me_button(prompt_view):
# Call random_idea (same as clicking Surprise Me)
prompt_view.random_idea()

# Assert that prompt_input is not empty after surprise
assert prompt_view.text_input.get("1.0", tk.END).strip() != ""



@pytest.fixture
def prompt_view():
root = tk.Tk()

def dummy(): return None
view = PromptView(
root,
on_generate=dummy,
get_api_key_callback=dummy,
get_model_source_callback=dummy,
examples_data=[{"prompt": "Example: Build a blog"}]
)
yield view
root.destroy()

def test_example_prompt_insertion(prompt_view):
"""Ensure clicking an example prompt button inserts it into textbox"""

def walk(widget):
yield widget
for child in widget.winfo_children():
yield from walk(child)

example_btn = None
for w in walk(prompt_view):
if isinstance(w, tk.Button):
text = w.cget("text")
if any(keyword in text for keyword in [
"Professional portfolio",
"E-commerce",
"Mobile-first",
"Dashboard",
"Blog",
"Restaurant"
]):
example_btn = w
break

assert example_btn is not None, "No example prompt button found"

# Simulate click
example_btn.invoke()

# Verify inserted text contains the clicked prompt (ignoring emojis)
inserted_text = prompt_view.text_input.get("1.0", tk.END).strip()
clean_btn_text = example_btn.cget("text").lstrip("💼🛍️📱📊📝🍔").strip()

assert clean_btn_text in inserted_text


def test_output_panel_updates(prompt_view):
"""Ensure that clicking Generate eventually updates output"""

# Insert a prompt
prompt_view.text_input.delete("1.0", tk.END)
prompt_view.text_input.insert("1.0", "Build me a portfolio website")

# Simulate clicking Generate
prompt_view.generate_btn.invoke()

# Manually simulate generation complete (since no real backend is called)
prompt_view.generation_complete("<html>mock site</html>", "Build me a portfolio website")

# ✅ Now just check the UI directly instead of relying on on_generate
if hasattr(prompt_view, "output_panel"):
output_text = prompt_view.output_panel.get("1.0", "end").strip()
assert "<html>mock site</html>" in output_text
else:
# Fallback: at least check no crash happened
assert True