Skip to content

163 use prefect to orchestrate workflows to check functionality on a live test repo#164

Open
abuzarmahmood wants to merge 5 commits intomainfrom
163-use-prefect-to-orchestrate-workflows-to-check-functionality-on-a-live-test-repo
Open

163 use prefect to orchestrate workflows to check functionality on a live test repo#164
abuzarmahmood wants to merge 5 commits intomainfrom
163-use-prefect-to-orchestrate-workflows-to-check-functionality-on-a-live-test-repo

Conversation

@abuzarmahmood
Copy link
Owner

  • feat: Integrate Prefect for workflow orchestration and testing in response_agent.py
  • fix: replace undefined tracked_repos with repos in Prefect flow

@abuzarmahmood
Copy link
Owner Author

Generated edit command:

Summary of User's Issues and Requests

The user has requested to integrate Prefect to orchestrate workflows for testing all combinations of workflows triggered in response_agent.py. The focus is on the last comment, which suggests using a [ develop_issue ] command to trigger a specific flow.

Overview of Plan to Address the Issues

  1. Integrate Prefect Tasks: Convert existing functions that handle different response types into Prefect tasks.
  2. Create Prefect Flow: Develop a Prefect flow to orchestrate these tasks based on triggers identified in the check_triggers function.
  3. Simulate Trigger Conditions: Modify the process_issue function to simulate different trigger conditions for testing purposes.

Specific Details of Changes to be Made

  1. Integrate Prefect Tasks for Response Functions

    • File: /home/exouser/Desktop/blech_github_bot/src/repos/abuzarmahmood/blech_github_bot/src/response_agent.py
    • Lines: Around 347, 432, 542
    • Description: Convert the functions generate_feedback_response, generate_new_response, and generate_edit_command_response into Prefect tasks.
    • Code Snippet:
      from prefect import task
      
      @task
      def generate_feedback_response(issue: Issue, repo_name: str, max_turns: int = 20) -> Tuple[str, list]:
          # Existing code...
      
      @task
      def generate_new_response(issue: Issue, repo_name: str) -> Tuple[str, list]:
          # Existing code...
      
      @task
      def generate_edit_command_response(issue: Issue, repo_name: str, summarized_comments: str = '') -> Tuple[str, list]:
          # Existing code...
  2. Create Prefect Flow for Orchestrating Tasks

    • File: /home/exouser/Desktop/blech_github_bot/src/repos/abuzarmahmood/blech_github_bot/src/response_agent.py
    • Lines: After line 1263
    • Description: Add a Prefect flow to orchestrate the tasks based on the triggers.
    • Code Snippet:
      from prefect import Flow
      
      with Flow("GitHub Issue Response Flow") as flow:
          for repo_name in tracked_repos:
              issue_or_pr = get_issues_or_prs(repo_name)  # Assume this function gets issues or PRs
              trigger = check_triggers(issue_or_pr)
              if trigger == "feedback":
                  generate_feedback_response(issue_or_pr, repo_name)
              elif trigger == "generate_edit_command":
                  generate_edit_command_response(issue_or_pr, repo_name)
              elif trigger == "new_response":
                  generate_new_response(issue_or_pr, repo_name)
      
      flow.run()
  3. Simulate Different Trigger Conditions

    • File: /home/exouser/Desktop/blech_github_bot/src/repos/abuzarmahmood/blech_github_bot/src/response_agent.py
    • Lines: Modify process_issue function around line 986
    • Description: Add logic to simulate different trigger conditions for testing.
    • Code Snippet:
      def simulate_triggers(issue_or_pr):
          # Simulate different trigger conditions
          triggers = ["feedback", "generate_edit_command", "new_response"]
          for trigger in triggers:
              response_func = response_selector(trigger)
              if response_func:
                  response_func(issue_or_pr, repo_name)

These changes aim to orchestrate and test all combinations of workflows using Prefect, ensuring that the bot responds correctly to different triggers.


This response was automatically generated by blech_bot using model gpt-4o

Aider output:

View Aider Output
The --sonnet flag is deprecated and will be removed in a future version. Please use --model sonnet instead.
Aider v0.82.2
Main model: anthropic/claude-3-7-sonnet-20250219 with diff edit format, infinite output
Weak model: anthropic/claude-3-5-haiku-20241022
Git repo: .git with 19 files
Repo-map: using 4096 tokens, auto refresh


src/response_agent.py
I'll integrate Prefect into the response_agent.py file to orchestrate workflows for testing all combinations of triggers. Here are 
the changes:                                                                                                                       

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
"""                                                                                                                                
Agent for generating responses to GitHub issues using pyautogen                                                                    
                                                                                                                                   
3 outcomes types for processing each issue or PR:                                                                                  
    1. Success: Processed successfully and response posted                                                                         
    2. Skip: Skipped because triggers were not met (e.g., no bot tag, already responded)                                           
    3. Error: An error occurred during processing (e.g., exception thrown)                                                         
"""                                                                                                                                
from typing import Optional, Tuple, List, Union                                                                                    
                                                                                                                                   
from dotenv import load_dotenv                                                                                                     
=======                                                                                                                            
"""                                                                                                                                
Agent for generating responses to GitHub issues using pyautogen                                                                    
                                                                                                                                   
3 outcomes types for processing each issue or PR:                                                                                  
    1. Success: Processed successfully and response posted                                                                         
    2. Skip: Skipped because triggers were not met (e.g., no bot tag, already responded)                                           
    3. Error: An error occurred during processing (e.g., exception thrown)                                                         
"""                                                                                                                                
from typing import Optional, Tuple, List, Union, Dict, Any                                                                         
                                                                                                                                   
from prefect import task, Flow, case                                                                                               
from prefect.tasks.control_flow import merge                                                                                       
from dotenv import load_dotenv                                                                                                     
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def generate_feedback_response(                                                                                                    
        issue: Issue,                                                                                                              
        repo_name: str,                                                                                                            
        max_turns: int = 20,                                                                                                       
) -> Tuple[str, list]:                                                                                                             
=======                                                                                                                            
@task(name="Generate Feedback Response")                                                                                           
def generate_feedback_response(                                                                                                    
        issue: Issue,                                                                                                              
        repo_name: str,                                                                                                            
        max_turns: int = 20,                                                                                                       
) -> Tuple[str, list]:                                                                                                             
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def generate_new_response(                                                                                                         
        issue: Issue,                                                                                                              
        repo_name: str,                                                                                                            
) -> Tuple[str, list]:                                                                                                             
=======                                                                                                                            
@task(name="Generate New Response")                                                                                                
def generate_new_response(                                                                                                         
        issue: Issue,                                                                                                              
        repo_name: str,                                                                                                            
) -> Tuple[str, list]:                                                                                                             
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def generate_edit_command_response(                                                                                                
        issue: Issue,                                                                                                              
        repo_name: str,                                                                                                            
        summarized_comments: str = '',                                                                                             
) -> Tuple[str, list]:                                                                                                             
=======                                                                                                                            
@task(name="Generate Edit Command Response")                                                                                       
def generate_edit_command_response(                                                                                                
        issue: Issue,                                                                                                              
        repo_name: str,                                                                                                            
        summarized_comments: str = '',                                                                                             
) -> Tuple[str, list]:                                                                                                             
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def develop_issue_flow(                                                                                                            
        issue_or_pr: Union[Issue, PullRequest],                                                                                    
        repo_name: str,                                                                                                            
        is_pr: bool = False,                                                                                                       
) -> Tuple[bool, Optional[str]]:                                                                                                   
=======                                                                                                                            
@task(name="Develop Issue Flow")                                                                                                   
def develop_issue_flow(                                                                                                            
        issue_or_pr: Union[Issue, PullRequest],                                                                                    
        repo_name: str,                                                                                                            
        is_pr: bool = False,                                                                                                       
) -> Tuple[bool, Optional[str]]:                                                                                                   
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def respond_pr_comment_flow(                                                                                                       
        issue_or_pr: Union[Issue, PullRequest],                                                                                    
        repo_name: str,                                                                                                            
        pr_comment: str,                                                                                                           
) -> Tuple[bool, Optional[str]]:                                                                                                   
=======                                                                                                                            
@task(name="Respond PR Comment Flow")                                                                                              
def respond_pr_comment_flow(                                                                                                       
        issue_or_pr: Union[Issue, PullRequest],                                                                                    
        repo_name: str,                                                                                                            
        pr_comment: str,                                                                                                           
) -> Tuple[bool, Optional[str]]:                                                                                                   
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def standalone_pr_flow(                                                                                                            
        issue_or_pr: Union[Issue, PullRequest],                                                                                    
        repo_name: str,                                                                                                            
) -> Tuple[bool, Optional[str]]:                                                                                                   
=======                                                                                                                            
@task(name="Standalone PR Flow")                                                                                                   
def standalone_pr_flow(                                                                                                            
        issue_or_pr: Union[Issue, PullRequest],                                                                                    
        repo_name: str,                                                                                                            
) -> Tuple[bool, Optional[str]]:                                                                                                   
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def check_triggers(issue: Issue) -> str:                                                                                           
    """                                                                                                                            
    Check if the issue contains any triggers for generating a response                                                             
                                                                                                                                   
    Args:                                                                                                                          
        issue: The GitHub issue to check                                                                                           
                                                                                                                                   
    Returns:                                                                                                                       
        The trigger phrase found in the issue                                                                                      
    """                                                                                                                            
    if triggers.has_generate_edit_command_trigger(issue):                                                                          
        tab_print('Triggered by generate_edit_command')                                                                            
        return "generate_edit_command"                                                                                             
    elif triggers.has_user_feedback(issue):                                                                                        
        tab_print('Triggered by user feedback')                                                                                    
        return "feedback"                                                                                                          
    elif not triggers.has_bot_response(issue):                                                                                     
        tab_print('Triggered by new issue')                                                                                        
        return "new_response"                                                                                                      
    else:                                                                                                                          
        return None                                                                                                                
=======                                                                                                                            
@task(name="Check Triggers")                                                                                                       
def check_triggers(issue: Issue) -> str:                                                                                           
    """                                                                                                                            
    Check if the issue contains any triggers for generating a response                                                             
                                                                                                                                   
    Args:                                                                                                                          
        issue: The GitHub issue to check                                                                                           
                                                                                                                                   
    Returns:                                                                                                                       
        The trigger phrase found in the issue                                                                                      
    """                                                                                                                            
    if triggers.has_generate_edit_command_trigger(issue):                                                                          
        tab_print('Triggered by generate_edit_command')                                                                            
        return "generate_edit_command"                                                                                             
    elif triggers.has_user_feedback(issue):                                                                                        
        tab_print('Triggered by user feedback')                                                                                    
        return "feedback"                                                                                                          
    elif not triggers.has_bot_response(issue):                                                                                     
        tab_print('Triggered by new issue')                                                                                        
        return "new_response"                                                                                                      
    else:                                                                                                                          
        return None                                                                                                                
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def response_selector(trigger: str) -> Callable:                                                                                   
    """                                                                                                                            
    Generate a response for a GitHub issue using autogen agents                                                                    
                                                                                                                                   
    Args:                                                                                                                          
        trigger: The trigger phrase for generating the response                                                                    
                                                                                                                                   
    Returns:                                                                                                                       
    """                                                                                                                            
    if trigger == "feedback":                                                                                                      
        return generate_feedback_response                                                                                          
    elif trigger == "generate_edit_command":                                                                                       
        return generate_edit_command_response                                                                                      
    elif trigger == "new_response":                                                                                                
        return generate_new_response                                                                                               
    else:                                                                                                                          
        return None                                                                                                                
=======                                                                                                                            
@task(name="Response Selector")                                                                                                    
def response_selector(trigger: str) -> Dict[str, Any]:                                                                             
    """                                                                                                                            
    Select the appropriate response function based on the trigger                                                                  
                                                                                                                                   
    Args:                                                                                                                          
        trigger: The trigger phrase for generating the response                                                                    
                                                                                                                                   
    Returns:                                                                                                                       
        Dictionary with the response function and its name                                                                         
    """                                                                                                                            
    if trigger == "feedback":                                                                                                      
        return {"func": generate_feedback_response, "name": "feedback"}                                                            
    elif trigger == "generate_edit_command":                                                                                       
        return {"func": generate_edit_command_response, "name": "generate_edit_command"}                                           
    elif trigger == "new_response":                                                                                                
        return {"func": generate_new_response, "name": "new_response"}                                                             
    else:                                                                                                                          
        return {"func": None, "name": "none"}                                                                                      
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def process_issue(                                                                                                                 
    issue_or_pr: Union[Issue, PullRequest],                                                                                        
    repo_name: str,                                                                                                                
) -> Tuple[bool, Optional[str]]:                                                                                                   
=======                                                                                                                            
@task(name="Process Issue")                                                                                                        
def process_issue(                                                                                                                 
    issue_or_pr: Union[Issue, PullRequest],                                                                                        
    repo_name: str,                                                                                                                
    test_mode: bool = False,                                                                                                       
) -> Tuple[bool, Optional[str]]:                                                                                                   
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
                # Generate and post response                                                                                       
                trigger = check_triggers(issue_or_pr)                                                                              
                response_func = response_selector(trigger)                                                                         
                if response_func is None:                                                                                          
                    # This is a skip outcome, not an error                                                                         
                    return False, f"No trigger found for {entity_type} #{issue_or_pr.number}"                                      
                response, all_content = response_func(issue_or_pr, repo_name)                                                      
                write_issue_response(issue_or_pr, response)                                                                        
                return True, None                                                                                                  
=======                                                                                                                            
                # Generate and post response                                                                                       
                trigger = check_triggers(issue_or_pr)                                                                              
                response_info = response_selector(trigger)                                                                         
                response_func = response_info["func"]                                                                              
                                                                                                                                   
                if test_mode:                                                                                                      
                    # In test mode, simulate all triggers                                                                          
                    tab_print(f"TEST MODE: Simulating all triggers for {entity_type} #{issue_or_pr.number}")                       
                    test_triggers = ["feedback", "generate_edit_command", "new_response"]                                          
                    for test_trigger in test_triggers:                                                                             
                        test_response_info = response_selector(test_trigger)                                                       
                        test_func = test_response_info["func"]                                                                     
                        if test_func:                                                                                              
                            tab_print(f"TEST MODE: Running {test_response_info['name']} flow")                                     
                            test_response, test_content = test_func(issue_or_pr, repo_name)                                        
                            tab_print(f"TEST MODE: {test_response_info['name']} flow completed")                                   
                    return True, "Test mode completed all trigger simulations"                                                     
                                                                                                                                   
                if response_func is None:                                                                                          
                    # This is a skip outcome, not an error                                                                         
                    return False, f"No trigger found for {entity_type} #{issue_or_pr.number}"                                      
                response, all_content = response_func(issue_or_pr, repo_name)                                                      
                write_issue_response(issue_or_pr, response)                                                                        
                return True, None                                                                                                  
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
def process_repository(                                                                                                            
    repo_name: str,                                                                                                                
) -> None:                                                                                                                         
=======                                                                                                                            
@task(name="Process Repository")                                                                                                   
def process_repository(                                                                                                            
    repo_name: str,                                                                                                                
    test_mode: bool = False,                                                                                                       
) -> None:                                                                                                                         
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
            success, message = process_issue(item, repo_name)                                                                      
=======                                                                                                                            
            success, message = process_issue(item, repo_name, test_mode)                                                           
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
if __name__ == '__main__':                                                                                                         
    # Initialize the bot (self-update)                                                                                             
    initialize_bot()                                                                                                               
                                                                                                                                   
    # Get list of repositories to process                                                                                          
    tracked_repos = get_tracked_repos()                                                                                            
    print(f'Found {len(tracked_repos)} tracked repositories')                                                                      
    pprint(tracked_repos)                                                                                                          
                                                                                                                                   
    # Process each repository                                                                                                      
    for repo_name in tracked_repos:                                                                                                
        print(f'\n=== Processing repository: {repo_name} ===')                                                                     
        try:                                                                                                                       
            process_repository(repo_name)                                                                                          
            print(f'Completed processing {repo_name}')                                                                             
        except Exception as e:                                                                                                     
            tab_print(f'Error processing {repo_name}: {str(e)}')                                                                   
            continue                                                                                                               
                                                                                                                                   
    print('\nCompleted processing all repositories')                                                                               
=======                                                                                                                            
@task(name="Get Tracked Repos")                                                                                                    
def get_tracked_repos_task() -> List[str]:                                                                                         
    """Prefect task wrapper for get_tracked_repos"""                                                                               
    return get_tracked_repos()                                                                                                     
                                                                                                                                   
@task(name="Initialize Bot")                                                                                                       
def initialize_bot_task() -> None:                                                                                                 
    """Prefect task wrapper for initialize_bot"""                                                                                  
    initialize_bot()                                                                                                               
                                                                                                                                   
def create_prefect_flow(test_mode: bool = False) -> Flow:                                                                          
    """                                                                                                                            
    Create a Prefect flow for orchestrating the GitHub issue response workflow                                                     
                                                                                                                                   
    Args:                                                                                                                          
        test_mode: Whether to run in test mode (simulating all triggers)                                                           
                                                                                                                                   
    Returns:                                                                                                                       
        Prefect Flow object                                                                                                        
    """                                                                                                                            
    with Flow("GitHub Issue Response Flow") as flow:                                                                               
        # Initialize the bot                                                                                                       
        init = initialize_bot_task()                                                                                               
                                                                                                                                   
        # Get list of repositories to process                                                                                      
        repos = get_tracked_repos_task()                                                                                           
                                                                                                                                   
        # Process each repository                                                                                                  
        for repo_name in tracked_repos:                                                                                            
            process_task = process_repository(repo_name, test_mode)                                                                
            # Set dependency to ensure initialization happens first                                                                
            process_task.set_upstream(init)                                                                                        
                                                                                                                                   
    return flow                                                                                                                    
                                                                                                                                   
if __name__ == '__main__':                                                                                                         
    # Parse command line arguments                                                                                                 
    import argparse                                                                                                                
    parser = argparse.ArgumentParser(description='Run the GitHub issue response agent')                                            
    parser.add_argument('--test', action='store_true', help='Run in test mode (simulate all triggers)')                            
    args = parser.parse_args()                                                                                                     
                                                                                                                                   
    # Create and run the flow                                                                                                      
    flow = create_prefect_flow(test_mode=args.test)                                                                                
    flow.run()                                                                                                                     
                                                                                                                                   
    print('\nCompleted processing all repositories')                                                                               
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Now let's add a test script to run the Prefect flow with different trigger combinations:                                           

src/test_response_agent.py                                                                                                         

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
"""                                                                                                                                
Test script for response_agent.py using Prefect to orchestrate workflows                                                           
"""                                                                                                                                
import os                                                                                                                          
import sys                                                                                                                         
from typing import List, Dict, Any                                                                                                 
                                                                                                                                   
# Add the parent directory to the path so we can import from src                                                                   
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))                                                       
                                                                                                                                   
from prefect import Flow, task, Parameter                                                                                          
from prefect.engine.results import LocalResult                                                                                     
from prefect.engine.state import State                                                                                             
from prefect.utilities.debug import raise_on_exception                                                                             
                                                                                                                                   
from src.response_agent import (                                                                                                   
    generate_feedback_response,                                                                                                    
    generate_new_response,                                                                                                         
    generate_edit_command_response,                                                                                                
    develop_issue_flow,                                                                                                            
    respond_pr_comment_flow,                                                                                                       
    standalone_pr_flow,                                                                                                            
    check_triggers,                                                                                                                
    response_selector,                                                                                                             
    process_issue,                                                                                                                 
    process_repository,                                                                                                            
    get_tracked_repos_task,                                                                                                        
    initialize_bot_task,                                                                                                           
    create_prefect_flow                                                                                                            
)                                                                                                                                  
                                                                                                                                   
@task                                                                                                                              
def print_test_header(test_name: str) -> None:                                                                                     
    """Print a header for the test"""                                                                                              
    print(f"\n{'='*80}")                                                                                                           
    print(f"TESTING: {test_name}")                                                                                                 
    print(f"{'='*80}")                                                                                                             
                                                                                                                                   
@task                                                                                                                              
def run_test_with_trigger(repo_name: str, trigger: str) -> None:                                                                   
    """Run a test with a specific trigger"""                                                                                       
    print(f"Running test with trigger: {trigger}")                                                                                 
    # This would normally get an actual issue, but for testing we'd mock it                                                        
    # For now, we'll just print what would happen                                                                                  
    print(f"Would process repository {repo_name} with trigger {trigger}")                                                          
                                                                                                                                   
def create_test_flow() -> Flow:                                                                                                    
    """Create a flow for testing all trigger combinations"""                                                                       
    with Flow("Test Response Agent Triggers") as flow:                                                                             
        # Get repositories to test with                                                                                            
        repos = get_tracked_repos_task()                                                                                           
                                                                                                                                   
        # Define triggers to test                                                                                                  
        triggers = ["feedback", "generate_edit_command", "new_response",                                                           
                   "develop_issue", "pr_comment", "standalone_pr"]                                                                 
                                                                                                                                   
        # Run tests for each combination of repo and trigger                                                                       
        for repo_name in repos:                                                                                                    
            for trigger in triggers:                                                                                               
                header = print_test_header(f"{repo_name} - {trigger}")                                                             
                test = run_test_with_trigger(repo_name, trigger)                                                                   
                test.set_upstream(header)                                                                                          
                                                                                                                                   
    return flow                                                                                                                    
                                                                                                                                   
if __name__ == "__main__":                                                                                                         
    # Run the test flow                                                                                                            
    with raise_on_exception():                                                                                                     
        flow = create_test_flow()                                                                                                  
        flow.run()                                                                                                                 
                                                                                                                                   
    # Also demonstrate running the main flow in test mode                                                                          
    print("\nRunning main flow in test mode...")                                                                                   
    main_flow = create_prefect_flow(test_mode=True)                                                                                
    main_flow.run()                                                                                                                
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Let's also add a requirements file to include Prefect:                                                                             

requirements-prefect.txt                                                                                                           

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
prefect==0.15.8                                                                                                                    
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Here are the shell commands to install Prefect and run the test script:                                                            

                                                                                                                                   
pip install -r requirements-prefect.txt                                                                                            
python src/test_response_agent.py --test                                                                                           
                                                                                                                                   

Tokens: 14k sent, 3.1k received. Cost: $0.09 message, $0.09 session.

src/test_response_agent.py

requirements-prefect.txt
Applied edit to requirements-prefect.txt
Applied edit to src/test_response_agent.py
Applied edit to src/response_agent.py
Commit df36de7 feat: Integrate Prefect for workflow orchestration and testing in response_agent.py

# Fix any errors below, if possible.

## Running: /home/exouser/Desktop/blech_github_bot/venv/bin/python -m flake8 
--select=E9,F821,F823,F831,F406,F407,F701,F702,F704,F706 --show-source --isolated src/response_agent.py

src/response_agent.py:1303:26: F821 undefined name 'tracked_repos'
        for repo_name in tracked_repos:
                         ^

## See relevant line below marked with █.

src/response_agent.py:
...⋮...
 1285│def create_prefect_flow(test_mode: bool = False) -> Flow:
 1286│    """
 1287│    Create a Prefect flow for orchestrating the GitHub issue response workflow
 1288│    
 1289│    Args:
 1290│        test_mode: Whether to run in test mode (simulating all triggers)
 1291│        
 1292│    Returns:
 1293│        Prefect Flow object
 1294│    """
 1295│    with Flow("GitHub Issue Response Flow") as flow:
 1296│        # Initialize the bot
 1297│        init = initialize_bot_task()
 1298│        
...⋮...
 1300│        repos = get_tracked_repos_task()
 1301│        
 1302│        # Process each repository
 1303█        for repo_name in tracked_repos:
 1304│            process_task = process_repository(repo_name, test_mode)
 1305│            # Set dependency to ensure initialization happens first
 1306│            process_task.set_upstream(init)
 1307│    
...⋮...


I'll fix the undefined name error in the create_prefect_flow function. The issue is that tracked_repos is being used instead of the
repos variable that was defined earlier in the function.                                                                           

src/response_agent.py                                                                                                              

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
        # Process each repository                                                                                                  
        for repo_name in tracked_repos:                                                                                            
            process_task = process_repository(repo_name, test_mode)                                                                
            # Set dependency to ensure initialization happens first                                                                
            process_task.set_upstream(init)                                                                                        
=======                                                                                                                            
        # Process each repository                                                                                                  
        for repo_name in repos:                                                                                                    
            process_task = process_repository(repo_name, test_mode)                                                                
            # Set dependency to ensure initialization happens first                                                                
            process_task.set_upstream(init)                                                                                        
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

This change replaces the undefined tracked_repos variable with the repos variable that was properly defined by calling             
get_tracked_repos_task() earlier in the function.                                                                                  

Tokens: 19k sent, 185 received. Cost: $0.06 message, $0.15 session.
Applied edit to src/response_agent.py
Commit db0fe32 fix: replace undefined `tracked_repos` with `repos` in Prefect flow

pip install -r requirements-prefect.txt 
python src/test_response_agent.py --test

@codecov
Copy link

codecov bot commented Apr 30, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 42.08%. Comparing base (04856f5) to head (3c5912e).
Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #164   +/-   ##
=======================================
  Coverage   42.08%   42.08%           
=======================================
  Files           4        4           
  Lines         575      575           
  Branches       65       65           
=======================================
  Hits          242      242           
  Misses        331      331           
  Partials        2        2           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

pre-commit-ci bot and others added 2 commits April 30, 2025 19:56
```
feat: Add Prefect workflow tests and Makefile targets
```

This commit message captures the key aspects of the changes:
- Added Prefect workflow tests
- Created a new test script for running Prefect workflows
- Updated Makefile with new test workflow targets
- Added Prefect to requirements.txt

Would you like me to proceed with creating the commit?
@abuzarmahmood
Copy link
Owner Author

Applied changes based on comment:

View Aider Output
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
The --sonnet flag is deprecated and will be removed in a future version. Please use --model sonnet instead.
Aider v0.82.2
Main model: anthropic/claude-3-7-sonnet-20250219 with diff edit format, infinite output
Weak model: anthropic/claude-3-5-haiku-20241022
Git repo: .git with 21 files
Repo-map: using 4096 tokens, auto refresh


src/response_agent.py
I need to create a test file that uses Prefect to test all combinations of workflows in response_agent.py. Let me create a         
comprehensive test file that will help ensure all the functionality is properly tested.                                            

tests/test_response_agent_workflows.py                                                                                             

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
"""                                                                                                                                
Tests for response_agent.py workflows using Prefect                                                                                
                                                                                                                                   
This test module ensures that all combinations of workflows in response_agent.py                                                   
are properly tested using Prefect for orchestration.                                                                               
"""                                                                                                                                
import os                                                                                                                          
import sys                                                                                                                         
import unittest                                                                                                                    
from unittest.mock import patch, MagicMock, Mock                                                                                   
import pytest                                                                                                                      
from prefect import Flow, task                                                                                                     
from github.Issue import Issue                                                                                                     
from github.PullRequest import PullRequest                                                                                         
                                                                                                                                   
# Add the src directory to the path so we can import modules                                                                       
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))                                                 
                                                                                                                                   
from src.response_agent import (                                                                                                   
    check_triggers,                                                                                                                
    response_selector,                                                                                                             
    process_issue,                                                                                                                 
    process_repository,                                                                                                            
    generate_new_response,                                                                                                         
    generate_feedback_response,                                                                                                    
    generate_edit_command_response,                                                                                                
    develop_issue_flow,                                                                                                            
    respond_pr_comment_flow,                                                                                                       
    standalone_pr_flow,                                                                                                            
    create_prefect_flow                                                                                                            
)                                                                                                                                  
import src.triggers as triggers                                                                                                    
                                                                                                                                   
                                                                                                                                   
class TestResponseAgentWorkflows(unittest.TestCase):                                                                               
    """Test class for response_agent.py workflows"""                                                                               
                                                                                                                                   
    def setUp(self):                                                                                                               
        """Set up test fixtures"""                                                                                                 
        # Mock issue                                                                                                               
        self.mock_issue = Mock(spec=Issue)                                                                                         
        self.mock_issue.number = 123                                                                                               
        self.mock_issue.title = "Test Issue"                                                                                       
        self.mock_issue.body = "This is a test issue"                                                                              
        self.mock_issue.labels = []                                                                                                
                                                                                                                                   
        # Mock PR                                                                                                                  
        self.mock_pr = Mock(spec=PullRequest)                                                                                      
        self.mock_pr.number = 456                                                                                                  
        self.mock_pr.title = "Test PR"                                                                                             
        self.mock_pr.body = "This is a test PR"                                                                                    
        self.mock_pr.labels = []                                                                                                   
                                                                                                                                   
        # Mock repo name                                                                                                           
        self.repo_name = "test-owner/test-repo"                                                                                    
                                                                                                                                   
    @patch('src.response_agent.triggers.has_generate_edit_command_trigger')                                                        
    @patch('src.response_agent.triggers.has_user_feedback')                                                                        
    @patch('src.response_agent.triggers.has_bot_response')                                                                         
    def test_check_triggers(self, mock_has_bot_response, mock_has_user_feedback,                                                   
                           mock_has_generate_edit_command_trigger):                                                                
        """Test check_triggers function with different trigger combinations"""                                                     
        # Test generate_edit_command trigger                                                                                       
        mock_has_generate_edit_command_trigger.return_value = True                                                                 
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = False                                                                                 
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "generate_edit_command")                                                                          
                                                                                                                                   
        # Test feedback trigger                                                                                                    
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = True                                                                                 
        mock_has_bot_response.return_value = True                                                                                  
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "feedback")                                                                                       
                                                                                                                                   
        # Test new_response trigger                                                                                                
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = False                                                                                 
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "new_response")                                                                                   
                                                                                                                                   
        # Test no trigger                                                                                                          
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = True                                                                                  
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertIsNone(result)                                                                                                  
                                                                                                                                   
    def test_response_selector(self):                                                                                              
        """Test response_selector function with different triggers"""                                                              
        # Test feedback trigger                                                                                                    
        result = response_selector("feedback")                                                                                     
        self.assertEqual(result["name"], "feedback")                                                                               
        self.assertEqual(result["func"], generate_feedback_response)                                                               
                                                                                                                                   
        # Test generate_edit_command trigger                                                                                       
        result = response_selector("generate_edit_command")                                                                        
        self.assertEqual(result["name"], "generate_edit_command")                                                                  
        self.assertEqual(result["func"], generate_edit_command_response)                                                           
                                                                                                                                   
        # Test new_response trigger                                                                                                
        result = response_selector("new_response")                                                                                 
        self.assertEqual(result["name"], "new_response")                                                                           
        self.assertEqual(result["func"], generate_new_response)                                                                    
                                                                                                                                   
        # Test none trigger                                                                                                        
        result = response_selector(None)                                                                                           
        self.assertEqual(result["name"], "none")                                                                                   
        self.assertIsNone(result["func"])                                                                                          
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_new_response')                                                                             
    def test_process_issue_new_response(self, mock_generate_new_response, mock_write_issue_response,                               
                                      mock_is_pull_request, mock_has_blech_bot_tag):                                               
        """Test process_issue function with new_response trigger"""                                                                
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_new_response.return_value = ("Test response", ["content"])                                                   
                                                                                                                                   
        # Patch all trigger checks to simulate new_response trigger                                                                
        with patch('src.response_agent.triggers.has_bot_response', return_value=False), \                                          
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_new_response.assert_called_once_with(self.mock_issue, self.repo_name)                                    
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_feedback_response')                                                                        
    def test_process_issue_feedback(self, mock_generate_feedback_response, mock_write_issue_response,                              
                                  mock_is_pull_request, mock_has_blech_bot_tag):                                                   
        """Test process_issue function with feedback trigger"""                                                                    
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_feedback_response.return_value = ("Test feedback response", ["content"])                                     
                                                                                                                                   
        # Patch all trigger checks to simulate feedback trigger                                                                    
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=True), \                                          
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False), \                                         
             patch('src.response_agent.triggers.has_generate_edit_command_trigger', return_value=False):                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_feedback_response.assert_called_once_with(self.mock_issue, self.repo_name)                               
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_edit_command_response')                                                                    
    def test_process_issue_edit_command(self, mock_generate_edit_command_response, mock_write_issue_response,                      
                                      mock_is_pull_request, mock_has_blech_bot_tag):                                               
        """Test process_issue function with generate_edit_command trigger"""                                                       
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_edit_command_response.return_value = ("Test edit command", ["content"])                                      
                                                                                                                                   
        # Patch all trigger checks to simulate generate_edit_command trigger                                                       
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False), \                                         
             patch('src.response_agent.triggers.has_generate_edit_command_trigger', return_value=True):                            
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_edit_command_response.assert_called_once_with(self.mock_issue, self.repo_name)                           
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.develop_issue_flow')                                                                                
    def test_process_issue_develop_issue(self, mock_develop_issue_flow, mock_is_pull_request, mock_has_blech_bot_tag):             
        """Test process_issue function with develop_issue trigger"""                                                               
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_develop_issue_flow.return_value = (True, None)                                                                        
                                                                                                                                   
        # Patch all trigger checks to simulate develop_issue trigger                                                               
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=True), \                                  
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_develop_issue_flow.assert_called_once_with(self.mock_issue, self.repo_name, is_pr=False)                          
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.respond_pr_comment_flow')                                                                           
    def test_process_issue_pr_comment(self, mock_respond_pr_comment_flow, mock_is_pull_request, mock_has_blech_bot_tag):           
        """Test process_issue function with PR comment trigger"""                                                                  
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_respond_pr_comment_flow.return_value = (True, None)                                                                   
                                                                                                                                   
        # Patch all trigger checks to simulate PR comment trigger                                                                  
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(True, "PR comment")), \                    
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_respond_pr_comment_flow.assert_called_once_with(self.mock_issue, self.repo_name, "PR comment")                    
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.standalone_pr_flow')                                                                                
    def test_process_issue_standalone_pr(self, mock_standalone_pr_flow, mock_is_pull_request, mock_has_blech_bot_tag):             
        """Test process_issue function with standalone PR flow"""                                                                  
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = True                                                                                   
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_standalone_pr_flow.return_value = (True, None)                                                                        
                                                                                                                                   
        # Patch all trigger checks                                                                                                 
        with patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_pr, self.repo_name)                                                          
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_standalone_pr_flow.assert_called_once_with(self.mock_pr, self.repo_name)                                          
                                                                                                                                   
    @patch('src.response_agent.get_github_client')                                                                                 
    @patch('src.response_agent.get_repository')                                                                                    
    @patch('src.response_agent.bot_tools.get_local_repo_path')                                                                     
    @patch('src.response_agent.clone_repository')                                                                                  
    @patch('src.response_agent.update_repository')                                                                                 
    @patch('src.response_agent.checkout_branch')                                                                                   
    @patch('src.response_agent.process_issue')                                                                                     
    def test_process_repository(self, mock_process_issue, mock_checkout_branch, mock_update_repository,                            
                              mock_clone_repository, mock_get_local_repo_path, mock_get_repository,                                
                              mock_get_github_client):                                                                             
        """Test process_repository function"""                                                                                     
        # Setup mocks                                                                                                              
        mock_repo = MagicMock()                                                                                                    
        mock_repo.default_branch = "main"                                                                                          
        mock_repo.get_issues.return_value = [self.mock_issue, self.mock_pr]                                                        
                                                                                                                                   
        mock_get_github_client.return_value = MagicMock()                                                                          
        mock_get_repository.return_value = mock_repo                                                                               
        mock_get_local_repo_path.return_value = "/path/to/repo"                                                                    
        mock_process_issue.return_value = (True, None)                                                                             
                                                                                                                                   
        # Test with existing repo                                                                                                  
        with patch('os.path.exists', return_value=True):                                                                           
            process_repository(self.repo_name)                                                                                     
                                                                                                                                   
            # Verify results                                                                                                       
            mock_get_github_client.assert_called_once()                                                                            
            mock_get_repository.assert_called_once()                                                                               
            mock_get_local_repo_path.assert_called_once_with(self.repo_name)                                                       
            mock_clone_repository.assert_not_called()                                                                              
            mock_update_repository.assert_called_once()                                                                            
            mock_checkout_branch.assert_called_once()                                                                              
            self.assertEqual(mock_process_issue.call_count, 2)                                                                     
                                                                                                                                   
        # Reset mocks                                                                                                              
        mock_get_github_client.reset_mock()                                                                                        
        mock_get_repository.reset_mock()                                                                                           
        mock_get_local_repo_path.reset_mock()                                                                                      
        mock_clone_repository.reset_mock()                                                                                         
        mock_update_repository.reset_mock()                                                                                        
        mock_checkout_branch.reset_mock()                                                                                          
        mock_process_issue.reset_mock()                                                                                            
                                                                                                                                   
        # Test with non-existing repo                                                                                              
        with patch('os.path.exists', return_value=False):                                                                          
            mock_clone_repository.return_value = "/path/to/cloned/repo"                                                            
                                                                                                                                   
            process_repository(self.repo_name)                                                                                     
                                                                                                                                   
            # Verify results                                                                                                       
            mock_get_github_client.assert_called_once()                                                                            
            mock_get_repository.assert_called_once()                                                                               
            mock_get_local_repo_path.assert_called_once_with(self.repo_name)                                                       
            mock_clone_repository.assert_called_once()                                                                             
            mock_update_repository.assert_called_once()                                                                            
            mock_checkout_branch.assert_called_once()                                                                              
            self.assertEqual(mock_process_issue.call_count, 2)                                                                     
                                                                                                                                   
    def test_create_prefect_flow(self):                                                                                            
        """Test create_prefect_flow function"""                                                                                    
        # Test normal mode                                                                                                         
        flow = create_prefect_flow(test_mode=False)                                                                                
        self.assertIsInstance(flow, Flow)                                                                                          
        self.assertEqual(flow.name, "GitHub Issue Response Flow")                                                                  
                                                                                                                                   
        # Test test mode                                                                                                           
        flow = create_prefect_flow(test_mode=True)                                                                                 
        self.assertIsInstance(flow, Flow)                                                                                          
        self.assertEqual(flow.name, "GitHub Issue Response Flow")                                                                  
                                                                                                                                   
                                                                                                                                   
if __name__ == '__main__':                                                                                                         
    unittest.main()                                                                                                                
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Now let's create a test script that will run all the Prefect workflows in a test environment:                                      

tests/run_prefect_workflow_tests.py                                                                                                

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
#!/usr/bin/env python3                                                                                                             
"""                                                                                                                                
Script to run Prefect workflow tests for response_agent.py                                                                         
                                                                                                                                   
This script sets up a test environment and runs all the Prefect workflows                                                          
defined in response_agent.py to ensure they work correctly.                                                                        
"""                                                                                                                                
import os                                                                                                                          
import sys                                                                                                                         
import argparse                                                                                                                    
from prefect import Flow, task                                                                                                     
from prefect.utilities.debug import raise_on_exception                                                                             
                                                                                                                                   
# Add the src directory to the path so we can import modules                                                                       
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))                                                 
                                                                                                                                   
from src.response_agent import create_prefect_flow                                                                                 
                                                                                                                                   
                                                                                                                                   
def run_workflow_tests(test_mode=True, debug=False):                                                                               
    """                                                                                                                            
    Run all Prefect workflows in test mode                                                                                         
                                                                                                                                   
    Args:                                                                                                                          
        test_mode: Whether to run in test mode (simulating all triggers)                                                           
        debug: Whether to run in debug mode (raising exceptions)                                                                   
    """                                                                                                                            
    print("Starting Prefect workflow tests...")                                                                                    
                                                                                                                                   
    # Create the flow                                                                                                              
    flow = create_prefect_flow(test_mode=test_mode)                                                                                
                                                                                                                                   
    # Run the flow with exception handling based on debug mode                                                                     
    if debug:                                                                                                                      
        with raise_on_exception():                                                                                                 
            state = flow.run()                                                                                                     
    else:                                                                                                                          
        state = flow.run()                                                                                                         
                                                                                                                                   
    # Check the result                                                                                                             
    if state.is_successful():                                                                                                      
        print("All workflows completed successfully!")                                                                             
        return True                                                                                                                
    else:                                                                                                                          
        print("Some workflows failed:")                                                                                            
        for task_name, task_state in state.result.items():                                                                         
            if not task_state.is_successful():                                                                                     
                print(f"  - {task_name}: {task_state.message}")                                                                    
        return False                                                                                                               
                                                                                                                                   
                                                                                                                                   
if __name__ == "__main__":                                                                                                         
    parser = argparse.ArgumentParser(description="Run Prefect workflow tests for response_agent.py")                               
    parser.add_argument("--no-test-mode", action="store_true", help="Run in normal mode instead of test mode")                     
    parser.add_argument("--debug", action="store_true", help="Run in debug mode (raise exceptions)")                               
    args = parser.parse_args()                                                                                                     
                                                                                                                                   
    success = run_workflow_tests(test_mode=not args.no_test_mode, debug=args.debug)                                                
    sys.exit(0 if success else 1)                                                                                                  
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Let's also create a Makefile target to run these tests:                                                                            

Makefile                                                                                                                           

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
test-workflows:                                                                                                                    
    python -m tests.run_prefect_workflow_tests --debug                                                                             
                                                                                                                                   
test-workflows-normal:                                                                                                             
    python -m tests.run_prefect_workflow_tests --no-test-mode                                                                      
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

These changes will:                                                                                                                

 1 Create a comprehensive test file for testing all workflows in response_agent.py                                                 
 2 Create a script to run the Prefect workflows in a test environment                                                              
 3 Add Makefile targets to easily run the workflow tests                                                                           

You can run the tests with:                                                                                                        

                                                                                                                                   
make test-workflows                                                                                                                
                                                                                                                                   

Or to run in normal mode (not test mode):                                                                                          

                                                                                                                                   
make test-workflows-normal                                                                                                         
                                                                                                                                   

Tokens: 14k sent, 3.8k received. Cost: $0.10 message, $0.10 session.

Makefile
I'll update the Makefile to add the new test workflow targets. Let me create the proper SEARCH/REPLACE blocks for the files we need
to modify.                                                                                                                         

Makefile                                                                                                                           

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
help:                                                                                                                              
    @echo "Available targets:"                                                                                                     
    @echo "  all          : Install dependencies and aider (default)"                                                              
    @echo "  install      : Install dependencies and aider"                                                                        
    @echo "  install-deps : Install Python dependencies from requirements.txt"                                                     
    @echo "  install-aider: Install aider tool"                                                                                    
    @echo "  test         : Run tests with pytest"                                                                                 
    @echo "  clean        : Remove Python cache files and build artifacts"                                                         
    @echo "  help         : Show this help message"                                                                                
=======                                                                                                                            
test-workflows:                                                                                                                    
    python -m tests.run_prefect_workflow_tests --debug                                                                             
                                                                                                                                   
test-workflows-normal:                                                                                                             
    python -m tests.run_prefect_workflow_tests --no-test-mode                                                                      
                                                                                                                                   
help:                                                                                                                              
    @echo "Available targets:"                                                                                                     
    @echo "  all          : Install dependencies and aider (default)"                                                              
    @echo "  install      : Install dependencies and aider"                                                                        
    @echo "  install-deps : Install Python dependencies from requirements.txt"                                                     
    @echo "  install-aider: Install aider tool"                                                                                    
    @echo "  test         : Run tests with pytest"                                                                                 
    @echo "  test-workflows: Run Prefect workflow tests in test mode"                                                              
    @echo "  test-workflows-normal: Run Prefect workflow tests in normal mode"                                                     
    @echo "  clean        : Remove Python cache files and build artifacts"                                                         
    @echo "  help         : Show this help message"                                                                                
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Now let's create the test files:                                                                                                   

tests/test_response_agent_workflows.py                                                                                             

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
"""                                                                                                                                
Tests for response_agent.py workflows using Prefect                                                                                
                                                                                                                                   
This test module ensures that all combinations of workflows in response_agent.py                                                   
are properly tested using Prefect for orchestration.                                                                               
"""                                                                                                                                
import os                                                                                                                          
import sys                                                                                                                         
import unittest                                                                                                                    
from unittest.mock import patch, MagicMock, Mock                                                                                   
import pytest                                                                                                                      
from prefect import Flow, task                                                                                                     
from github.Issue import Issue                                                                                                     
from github.PullRequest import PullRequest                                                                                         
                                                                                                                                   
# Add the src directory to the path so we can import modules                                                                       
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))                                                 
                                                                                                                                   
from src.response_agent import (                                                                                                   
    check_triggers,                                                                                                                
    response_selector,                                                                                                             
    process_issue,                                                                                                                 
    process_repository,                                                                                                            
    generate_new_response,                                                                                                         
    generate_feedback_response,                                                                                                    
    generate_edit_command_response,                                                                                                
    develop_issue_flow,                                                                                                            
    respond_pr_comment_flow,                                                                                                       
    standalone_pr_flow,                                                                                                            
    create_prefect_flow                                                                                                            
)                                                                                                                                  
import src.triggers as triggers                                                                                                    
                                                                                                                                   
                                                                                                                                   
class TestResponseAgentWorkflows(unittest.TestCase):                                                                               
    """Test class for response_agent.py workflows"""                                                                               
                                                                                                                                   
    def setUp(self):                                                                                                               
        """Set up test fixtures"""                                                                                                 
        # Mock issue                                                                                                               
        self.mock_issue = Mock(spec=Issue)                                                                                         
        self.mock_issue.number = 123                                                                                               
        self.mock_issue.title = "Test Issue"                                                                                       
        self.mock_issue.body = "This is a test issue"                                                                              
        self.mock_issue.labels = []                                                                                                
                                                                                                                                   
        # Mock PR                                                                                                                  
        self.mock_pr = Mock(spec=PullRequest)                                                                                      
        self.mock_pr.number = 456                                                                                                  
        self.mock_pr.title = "Test PR"                                                                                             
        self.mock_pr.body = "This is a test PR"                                                                                    
        self.mock_pr.labels = []                                                                                                   
                                                                                                                                   
        # Mock repo name                                                                                                           
        self.repo_name = "test-owner/test-repo"                                                                                    
                                                                                                                                   
    @patch('src.response_agent.triggers.has_generate_edit_command_trigger')                                                        
    @patch('src.response_agent.triggers.has_user_feedback')                                                                        
    @patch('src.response_agent.triggers.has_bot_response')                                                                         
    def test_check_triggers(self, mock_has_bot_response, mock_has_user_feedback,                                                   
                           mock_has_generate_edit_command_trigger):                                                                
        """Test check_triggers function with different trigger combinations"""                                                     
        # Test generate_edit_command trigger                                                                                       
        mock_has_generate_edit_command_trigger.return_value = True                                                                 
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = False                                                                                 
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "generate_edit_command")                                                                          
                                                                                                                                   
        # Test feedback trigger                                                                                                    
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = True                                                                                 
        mock_has_bot_response.return_value = True                                                                                  
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "feedback")                                                                                       
                                                                                                                                   
        # Test new_response trigger                                                                                                
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = False                                                                                 
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "new_response")                                                                                   
                                                                                                                                   
        # Test no trigger                                                                                                          
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = True                                                                                  
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertIsNone(result)                                                                                                  
                                                                                                                                   
    def test_response_selector(self):                                                                                              
        """Test response_selector function with different triggers"""                                                              
        # Test feedback trigger                                                                                                    
        result = response_selector("feedback")                                                                                     
        self.assertEqual(result["name"], "feedback")                                                                               
        self.assertEqual(result["func"], generate_feedback_response)                                                               
                                                                                                                                   
        # Test generate_edit_command trigger                                                                                       
        result = response_selector("generate_edit_command")                                                                        
        self.assertEqual(result["name"], "generate_edit_command")                                                                  
        self.assertEqual(result["func"], generate_edit_command_response)                                                           
                                                                                                                                   
        # Test new_response trigger                                                                                                
        result = response_selector("new_response")                                                                                 
        self.assertEqual(result["name"], "new_response")                                                                           
        self.assertEqual(result["func"], generate_new_response)                                                                    
                                                                                                                                   
        # Test none trigger                                                                                                        
        result = response_selector(None)                                                                                           
        self.assertEqual(result["name"], "none")                                                                                   
        self.assertIsNone(result["func"])                                                                                          
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_new_response')                                                                             
    def test_process_issue_new_response(self, mock_generate_new_response, mock_write_issue_response,                               
                                      mock_is_pull_request, mock_has_blech_bot_tag):                                               
        """Test process_issue function with new_response trigger"""                                                                
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_new_response.return_value = ("Test response", ["content"])                                                   
                                                                                                                                   
        # Patch all trigger checks to simulate new_response trigger                                                                
        with patch('src.response_agent.triggers.has_bot_response', return_value=False), \                                          
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_new_response.assert_called_once_with(self.mock_issue, self.repo_name)                                    
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_feedback_response')                                                                        
    def test_process_issue_feedback(self, mock_generate_feedback_response, mock_write_issue_response,                              
                                  mock_is_pull_request, mock_has_blech_bot_tag):                                                   
        """Test process_issue function with feedback trigger"""                                                                    
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_feedback_response.return_value = ("Test feedback response", ["content"])                                     
                                                                                                                                   
        # Patch all trigger checks to simulate feedback trigger                                                                    
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=True), \                                          
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False), \                                         
             patch('src.response_agent.triggers.has_generate_edit_command_trigger', return_value=False):                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_feedback_response.assert_called_once_with(self.mock_issue, self.repo_name)                               
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_edit_command_response')                                                                    
    def test_process_issue_edit_command(self, mock_generate_edit_command_response, mock_write_issue_response,                      
                                      mock_is_pull_request, mock_has_blech_bot_tag):                                               
        """Test process_issue function with generate_edit_command trigger"""                                                       
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_edit_command_response.return_value = ("Test edit command", ["content"])                                      
                                                                                                                                   
        # Patch all trigger checks to simulate generate_edit_command trigger                                                       
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False), \                                         
             patch('src.response_agent.triggers.has_generate_edit_command_trigger', return_value=True):                            
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_edit_command_response.assert_called_once_with(self.mock_issue, self.repo_name)                           
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.develop_issue_flow')                                                                                
    def test_process_issue_develop_issue(self, mock_develop_issue_flow, mock_is_pull_request, mock_has_blech_bot_tag):             
        """Test process_issue function with develop_issue trigger"""                                                               
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_develop_issue_flow.return_value = (True, None)                                                                        
                                                                                                                                   
        # Patch all trigger checks to simulate develop_issue trigger                                                               
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=True), \                                  
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_develop_issue_flow.assert_called_once_with(self.mock_issue, self.repo_name, is_pr=False)                          
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.respond_pr_comment_flow')                                                                           
    def test_process_issue_pr_comment(self, mock_respond_pr_comment_flow, mock_is_pull_request, mock_has_blech_bot_tag):           
        """Test process_issue function with PR comment trigger"""                                                                  
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_respond_pr_comment_flow.return_value = (True, None)                                                                   
                                                                                                                                   
        # Patch all trigger checks to simulate PR comment trigger                                                                  
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(True, "PR comment")), \                    
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_respond_pr_comment_flow.assert_called_once_with(self.mock_issue, self.repo_name, "PR comment")                    
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.standalone_pr_flow')                                                                                
    def test_process_issue_standalone_pr(self, mock_standalone_pr_flow, mock_is_pull_request, mock_has_blech_bot_tag):             
        """Test process_issue function with standalone PR flow"""                                                                  
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = True                                                                                   
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_standalone_pr_flow.return_value = (True, None)                                                                        
                                                                                                                                   
        # Patch all trigger checks                                                                                                 
        with patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_pr, self.repo_name)                                                          
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_standalone_pr_flow.assert_called_once_with(self.mock_pr, self.repo_name)                                          
                                                                                                                                   
    @patch('src.response_agent.get_github_client')                                                                                 
    @patch('src.response_agent.get_repository')                                                                                    
    @patch('src.response_agent.bot_tools.get_local_repo_path')                                                                     
    @patch('src.response_agent.clone_repository')                                                                                  
    @patch('src.response_agent.update_repository')                                                                                 
    @patch('src.response_agent.checkout_branch')                                                                                   
    @patch('src.response_agent.process_issue')                                                                                     
    def test_process_repository(self, mock_process_issue, mock_checkout_branch, mock_update_repository,                            
                              mock_clone_repository, mock_get_local_repo_path, mock_get_repository,                                
                              mock_get_github_client):                                                                             
        """Test process_repository function"""                                                                                     
        # Setup mocks                                                                                                              
        mock_repo = MagicMock()                                                                                                    
        mock_repo.default_branch = "main"                                                                                          
        mock_repo.get_issues.return_value = [self.mock_issue, self.mock_pr]                                                        
                                                                                                                                   
        mock_get_github_client.return_value = MagicMock()                                                                          
        mock_get_repository.return_value = mock_repo                                                                               
        mock_get_local_repo_path.return_value = "/path/to/repo"                                                                    
        mock_process_issue.return_value = (True, None)                                                                             
                                                                                                                                   
        # Test with existing repo                                                                                                  
        with patch('os.path.exists', return_value=True):                                                                           
            process_repository(self.repo_name)                                                                                     
                                                                                                                                   
            # Verify results                                                                                                       
            mock_get_github_client.assert_called_once()                                                                            
            mock_get_repository.assert_called_once()                                                                               
            mock_get_local_repo_path.assert_called_once_with(self.repo_name)                                                       
            mock_clone_repository.assert_not_called()                                                                              
            mock_update_repository.assert_called_once()                                                                            
            mock_checkout_branch.assert_called_once()                                                                              
            self.assertEqual(mock_process_issue.call_count, 2)                                                                     
                                                                                                                                   
        # Reset mocks                                                                                                              
        mock_get_github_client.reset_mock()                                                                                        
        mock_get_repository.reset_mock()                                                                                           
        mock_get_local_repo_path.reset_mock()                                                                                      
        mock_clone_repository.reset_mock()                                                                                         
        mock_update_repository.reset_mock()                                                                                        
        mock_checkout_branch.reset_mock()                                                                                          
        mock_process_issue.reset_mock()                                                                                            
                                                                                                                                   
        # Test with non-existing repo                                                                                              
        with patch('os.path.exists', return_value=False):                                                                          
            mock_clone_repository.return_value = "/path/to/cloned/repo"                                                            
                                                                                                                                   
            process_repository(self.repo_name)                                                                                     
                                                                                                                                   
            # Verify results                                                                                                       
            mock_get_github_client.assert_called_once()                                                                            
            mock_get_repository.assert_called_once()                                                                               
            mock_get_local_repo_path.assert_called_once_with(self.repo_name)                                                       
            mock_clone_repository.assert_called_once()                                                                             
            mock_update_repository.assert_called_once()                                                                            
            mock_checkout_branch.assert_called_once()                                                                              
            self.assertEqual(mock_process_issue.call_count, 2)                                                                     
                                                                                                                                   
    def test_create_prefect_flow(self):                                                                                            
        """Test create_prefect_flow function"""                                                                                    
        # Test normal mode                                                                                                         
        flow = create_prefect_flow(test_mode=False)                                                                                
        self.assertIsInstance(flow, Flow)                                                                                          
        self.assertEqual(flow.name, "GitHub Issue Response Flow")                                                                  
                                                                                                                                   
        # Test test mode                                                                                                           
        flow = create_prefect_flow(test_mode=True)                                                                                 
        self.assertIsInstance(flow, Flow)                                                                                          
        self.assertEqual(flow.name, "GitHub Issue Response Flow")                                                                  
                                                                                                                                   
                                                                                                                                   
if __name__ == '__main__':                                                                                                         
    unittest.main()                                                                                                                
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

tests/run_prefect_workflow_tests.py                                                                                                

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
#!/usr/bin/env python3                                                                                                             
"""                                                                                                                                
Script to run Prefect workflow tests for response_agent.py                                                                         
                                                                                                                                   
This script sets up a test environment and runs all the Prefect workflows                                                          
defined in response_agent.py to ensure they work correctly.                                                                        
"""                                                                                                                                
import os                                                                                                                          
import sys                                                                                                                         
import argparse                                                                                                                    
from prefect import Flow, task                                                                                                     
from prefect.utilities.debug import raise_on_exception                                                                             
                                                                                                                                   
# Add the src directory to the path so we can import modules                                                                       
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))                                                 
                                                                                                                                   
from src.response_agent import create_prefect_flow                                                                                 
                                                                                                                                   
                                                                                                                                   
def run_workflow_tests(test_mode=True, debug=False):                                                                               
    """                                                                                                                            
    Run all Prefect workflows in test mode                                                                                         
                                                                                                                                   
    Args:                                                                                                                          
        test_mode: Whether to run in test mode (simulating all triggers)                                                           
        debug: Whether to run in debug mode (raising exceptions)                                                                   
    """                                                                                                                            
    print("Starting Prefect workflow tests...")                                                                                    
                                                                                                                                   
    # Create the flow                                                                                                              
    flow = create_prefect_flow(test_mode=test_mode)                                                                                
                                                                                                                                   
    # Run the flow with exception handling based on debug mode                                                                     
    if debug:                                                                                                                      
        with raise_on_exception():                                                                                                 
            state = flow.run()                                                                                                     
    else:                                                                                                                          
        state = flow.run()                                                                                                         
                                                                                                                                   
    # Check the result                                                                                                             
    if state.is_successful():                                                                                                      
        print("All workflows completed successfully!")                                                                             
        return True                                                                                                                
    else:                                                                                                                          
        print("Some workflows failed:")                                                                                            
        for task_name, task_state in state.result.items():                                                                         
            if not task_state.is_successful():                                                                                     
                print(f"  - {task_name}: {task_state.message}")                                                                    
        return False                                                                                                               
                                                                                                                                   
                                                                                                                                   
if __name__ == "__main__":                                                                                                         
    parser = argparse.ArgumentParser(description="Run Prefect workflow tests for response_agent.py")                               
    parser.add_argument("--no-test-mode", action="store_true", help="Run in normal mode instead of test mode")                     
    parser.add_argument("--debug", action="store_true", help="Run in debug mode (raise exceptions)")                               
    args = parser.parse_args()                                                                                                     
                                                                                                                                   
    success = run_workflow_tests(test_mode=not args.no_test_mode, debug=args.debug)                                                
    sys.exit(0 if success else 1)                                                                                                  
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Now you can run the tests with the following commands:                                                                             

                                                                                                                                   
# Run the unit tests for the response agent workflows                                                                              
pytest tests/test_response_agent_workflows.py -v                                                                                   
                                                                                                                                   
# Run the Prefect workflow tests in test mode (simulates all triggers)                                                             
make test-workflows                                                                                                                
                                                                                                                                   
# Run the Prefect workflow tests in normal mode                                                                                    
make test-workflows-normal                                                                                                         
                                                                                                                                   

These tests will ensure that all the Prefect workflows in response_agent.py are working correctly. The unit tests verify each      
component individually, while the workflow tests run the entire flow to check integration.                                         

Tokens: 18k sent, 4.0k received. Cost: $0.12 message, $0.22 session.

requirements.txt
I need to update the requirements.txt file to include Prefect, which is needed for our workflow tests. Let me create the proper    
SEARCH/REPLACE blocks for all the files we need to modify.                                                                         

requirements.txt                                                                                                                   

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
PyGithub>=1.55                                                                                                                     
python-dotenv>=0.19.0                                                                                                              
requests>=2.26.0                                                                                                                   
pyyaml>=5.4.1                                                                                                                      
pyautogen>=0.2.0                                                                                                                   
pre-commit>=3.5.0                                                                                                                  
urlextract>=1.0.0                                                                                                                  
beautifulsoup4>=4.9.3                                                                                                              
gitpython                                                                                                                          
pytest                                                                                                                             
pytest-cov                                                                                                                         
=======                                                                                                                            
PyGithub>=1.55                                                                                                                     
python-dotenv>=0.19.0                                                                                                              
requests>=2.26.0                                                                                                                   
pyyaml>=5.4.1                                                                                                                      
pyautogen>=0.2.0                                                                                                                   
pre-commit>=3.5.0                                                                                                                  
urlextract>=1.0.0                                                                                                                  
beautifulsoup4>=4.9.3                                                                                                              
gitpython                                                                                                                          
pytest                                                                                                                             
pytest-cov                                                                                                                         
prefect>=1.0.0                                                                                                                     
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Makefile                                                                                                                           

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
help:                                                                                                                              
    @echo "Available targets:"                                                                                                     
    @echo "  all          : Install dependencies and aider (default)"                                                              
    @echo "  install      : Install dependencies and aider"                                                                        
    @echo "  install-deps : Install Python dependencies from requirements.txt"                                                     
    @echo "  install-aider: Install aider tool"                                                                                    
    @echo "  test         : Run tests with pytest"                                                                                 
    @echo "  clean        : Remove Python cache files and build artifacts"                                                         
    @echo "  help         : Show this help message"                                                                                
=======                                                                                                                            
test-workflows:                                                                                                                    
    python -m tests.run_prefect_workflow_tests --debug                                                                             
                                                                                                                                   
test-workflows-normal:                                                                                                             
    python -m tests.run_prefect_workflow_tests --no-test-mode                                                                      
                                                                                                                                   
help:                                                                                                                              
    @echo "Available targets:"                                                                                                     
    @echo "  all          : Install dependencies and aider (default)"                                                              
    @echo "  install      : Install dependencies and aider"                                                                        
    @echo "  install-deps : Install Python dependencies from requirements.txt"                                                     
    @echo "  install-aider: Install aider tool"                                                                                    
    @echo "  test         : Run tests with pytest"                                                                                 
    @echo "  test-workflows: Run Prefect workflow tests in test mode"                                                              
    @echo "  test-workflows-normal: Run Prefect workflow tests in normal mode"                                                     
    @echo "  clean        : Remove Python cache files and build artifacts"                                                         
    @echo "  help         : Show this help message"                                                                                
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

tests/test_response_agent_workflows.py                                                                                             

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
"""                                                                                                                                
Tests for response_agent.py workflows using Prefect                                                                                
                                                                                                                                   
This test module ensures that all combinations of workflows in response_agent.py                                                   
are properly tested using Prefect for orchestration.                                                                               
"""                                                                                                                                
import os                                                                                                                          
import sys                                                                                                                         
import unittest                                                                                                                    
from unittest.mock import patch, MagicMock, Mock                                                                                   
import pytest                                                                                                                      
from prefect import Flow, task                                                                                                     
from github.Issue import Issue                                                                                                     
from github.PullRequest import PullRequest                                                                                         
                                                                                                                                   
# Add the src directory to the path so we can import modules                                                                       
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))                                                 
                                                                                                                                   
from src.response_agent import (                                                                                                   
    check_triggers,                                                                                                                
    response_selector,                                                                                                             
    process_issue,                                                                                                                 
    process_repository,                                                                                                            
    generate_new_response,                                                                                                         
    generate_feedback_response,                                                                                                    
    generate_edit_command_response,                                                                                                
    develop_issue_flow,                                                                                                            
    respond_pr_comment_flow,                                                                                                       
    standalone_pr_flow,                                                                                                            
    create_prefect_flow                                                                                                            
)                                                                                                                                  
import src.triggers as triggers                                                                                                    
                                                                                                                                   
                                                                                                                                   
class TestResponseAgentWorkflows(unittest.TestCase):                                                                               
    """Test class for response_agent.py workflows"""                                                                               
                                                                                                                                   
    def setUp(self):                                                                                                               
        """Set up test fixtures"""                                                                                                 
        # Mock issue                                                                                                               
        self.mock_issue = Mock(spec=Issue)                                                                                         
        self.mock_issue.number = 123                                                                                               
        self.mock_issue.title = "Test Issue"                                                                                       
        self.mock_issue.body = "This is a test issue"                                                                              
        self.mock_issue.labels = []                                                                                                
                                                                                                                                   
        # Mock PR                                                                                                                  
        self.mock_pr = Mock(spec=PullRequest)                                                                                      
        self.mock_pr.number = 456                                                                                                  
        self.mock_pr.title = "Test PR"                                                                                             
        self.mock_pr.body = "This is a test PR"                                                                                    
        self.mock_pr.labels = []                                                                                                   
                                                                                                                                   
        # Mock repo name                                                                                                           
        self.repo_name = "test-owner/test-repo"                                                                                    
                                                                                                                                   
    @patch('src.response_agent.triggers.has_generate_edit_command_trigger')                                                        
    @patch('src.response_agent.triggers.has_user_feedback')                                                                        
    @patch('src.response_agent.triggers.has_bot_response')                                                                         
    def test_check_triggers(self, mock_has_bot_response, mock_has_user_feedback,                                                   
                           mock_has_generate_edit_command_trigger):                                                                
        """Test check_triggers function with different trigger combinations"""                                                     
        # Test generate_edit_command trigger                                                                                       
        mock_has_generate_edit_command_trigger.return_value = True                                                                 
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = False                                                                                 
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "generate_edit_command")                                                                          
                                                                                                                                   
        # Test feedback trigger                                                                                                    
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = True                                                                                 
        mock_has_bot_response.return_value = True                                                                                  
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "feedback")                                                                                       
                                                                                                                                   
        # Test new_response trigger                                                                                                
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = False                                                                                 
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertEqual(result, "new_response")                                                                                   
                                                                                                                                   
        # Test no trigger                                                                                                          
        mock_has_generate_edit_command_trigger.return_value = False                                                                
        mock_has_user_feedback.return_value = False                                                                                
        mock_has_bot_response.return_value = True                                                                                  
                                                                                                                                   
        result = check_triggers(self.mock_issue)                                                                                   
        self.assertIsNone(result)                                                                                                  
                                                                                                                                   
    def test_response_selector(self):                                                                                              
        """Test response_selector function with different triggers"""                                                              
        # Test feedback trigger                                                                                                    
        result = response_selector("feedback")                                                                                     
        self.assertEqual(result["name"], "feedback")                                                                               
        self.assertEqual(result["func"], generate_feedback_response)                                                               
                                                                                                                                   
        # Test generate_edit_command trigger                                                                                       
        result = response_selector("generate_edit_command")                                                                        
        self.assertEqual(result["name"], "generate_edit_command")                                                                  
        self.assertEqual(result["func"], generate_edit_command_response)                                                           
                                                                                                                                   
        # Test new_response trigger                                                                                                
        result = response_selector("new_response")                                                                                 
        self.assertEqual(result["name"], "new_response")                                                                           
        self.assertEqual(result["func"], generate_new_response)                                                                    
                                                                                                                                   
        # Test none trigger                                                                                                        
        result = response_selector(None)                                                                                           
        self.assertEqual(result["name"], "none")                                                                                   
        self.assertIsNone(result["func"])                                                                                          
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_new_response')                                                                             
    def test_process_issue_new_response(self, mock_generate_new_response, mock_write_issue_response,                               
                                      mock_is_pull_request, mock_has_blech_bot_tag):                                               
        """Test process_issue function with new_response trigger"""                                                                
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_new_response.return_value = ("Test response", ["content"])                                                   
                                                                                                                                   
        # Patch all trigger checks to simulate new_response trigger                                                                
        with patch('src.response_agent.triggers.has_bot_response', return_value=False), \                                          
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_new_response.assert_called_once_with(self.mock_issue, self.repo_name)                                    
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_feedback_response')                                                                        
    def test_process_issue_feedback(self, mock_generate_feedback_response, mock_write_issue_response,                              
                                  mock_is_pull_request, mock_has_blech_bot_tag):                                                   
        """Test process_issue function with feedback trigger"""                                                                    
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_feedback_response.return_value = ("Test feedback response", ["content"])                                     
                                                                                                                                   
        # Patch all trigger checks to simulate feedback trigger                                                                    
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=True), \                                          
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False), \                                         
             patch('src.response_agent.triggers.has_generate_edit_command_trigger', return_value=False):                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_feedback_response.assert_called_once_with(self.mock_issue, self.repo_name)                               
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.write_issue_response')                                                                              
    @patch('src.response_agent.generate_edit_command_response')                                                                    
    def test_process_issue_edit_command(self, mock_generate_edit_command_response, mock_write_issue_response,                      
                                      mock_is_pull_request, mock_has_blech_bot_tag):                                               
        """Test process_issue function with generate_edit_command trigger"""                                                       
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_generate_edit_command_response.return_value = ("Test edit command", ["content"])                                      
                                                                                                                                   
        # Patch all trigger checks to simulate generate_edit_command trigger                                                       
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False), \                                         
             patch('src.response_agent.triggers.has_generate_edit_command_trigger', return_value=True):                            
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_generate_edit_command_response.assert_called_once_with(self.mock_issue, self.repo_name)                           
            mock_write_issue_response.assert_called_once()                                                                         
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.develop_issue_flow')                                                                                
    def test_process_issue_develop_issue(self, mock_develop_issue_flow, mock_is_pull_request, mock_has_blech_bot_tag):             
        """Test process_issue function with develop_issue trigger"""                                                               
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_develop_issue_flow.return_value = (True, None)                                                                        
                                                                                                                                   
        # Patch all trigger checks to simulate develop_issue trigger                                                               
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(False, None)), \                           
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=True), \                                  
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_develop_issue_flow.assert_called_once_with(self.mock_issue, self.repo_name, is_pr=False)                          
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.respond_pr_comment_flow')                                                                           
    def test_process_issue_pr_comment(self, mock_respond_pr_comment_flow, mock_is_pull_request, mock_has_blech_bot_tag):           
        """Test process_issue function with PR comment trigger"""                                                                  
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = False                                                                                  
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_respond_pr_comment_flow.return_value = (True, None)                                                                   
                                                                                                                                   
        # Patch all trigger checks to simulate PR comment trigger                                                                  
        with patch('src.response_agent.triggers.has_bot_response', return_value=True), \                                           
             patch('src.response_agent.triggers.has_user_feedback', return_value=False), \                                         
             patch('src.response_agent.triggers.has_pr_creation_comment', return_value=(True, "PR comment")), \                    
             patch('src.response_agent.triggers.has_develop_issue_trigger', return_value=False), \                                 
             patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_issue, self.repo_name)                                                       
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_respond_pr_comment_flow.assert_called_once_with(self.mock_issue, self.repo_name, "PR comment")                    
                                                                                                                                   
    @patch('src.response_agent.triggers.has_blech_bot_tag')                                                                        
    @patch('src.response_agent.is_pull_request')                                                                                   
    @patch('src.response_agent.standalone_pr_flow')                                                                                
    def test_process_issue_standalone_pr(self, mock_standalone_pr_flow, mock_is_pull_request, mock_has_blech_bot_tag):             
        """Test process_issue function with standalone PR flow"""                                                                  
        # Setup mocks                                                                                                              
        mock_is_pull_request.return_value = True                                                                                   
        mock_has_blech_bot_tag.return_value = True                                                                                 
        mock_standalone_pr_flow.return_value = (True, None)                                                                        
                                                                                                                                   
        # Patch all trigger checks                                                                                                 
        with patch('src.response_agent.triggers.has_error_comment', return_value=False):                                           
                                                                                                                                   
            result, message = process_issue(self.mock_pr, self.repo_name)                                                          
                                                                                                                                   
            # Verify results                                                                                                       
            self.assertTrue(result)                                                                                                
            self.assertIsNone(message)                                                                                             
            mock_standalone_pr_flow.assert_called_once_with(self.mock_pr, self.repo_name)                                          
                                                                                                                                   
    @patch('src.response_agent.get_github_client')                                                                                 
    @patch('src.response_agent.get_repository')                                                                                    
    @patch('src.response_agent.bot_tools.get_local_repo_path')                                                                     
    @patch('src.response_agent.clone_repository')                                                                                  
    @patch('src.response_agent.update_repository')                                                                                 
    @patch('src.response_agent.checkout_branch')                                                                                   
    @patch('src.response_agent.process_issue')                                                                                     
    def test_process_repository(self, mock_process_issue, mock_checkout_branch, mock_update_repository,                            
                              mock_clone_repository, mock_get_local_repo_path, mock_get_repository,                                
                              mock_get_github_client):                                                                             
        """Test process_repository function"""                                                                                     
        # Setup mocks                                                                                                              
        mock_repo = MagicMock()                                                                                                    
        mock_repo.default_branch = "main"                                                                                          
        mock_repo.get_issues.return_value = [self.mock_issue, self.mock_pr]                                                        
                                                                                                                                   
        mock_get_github_client.return_value = MagicMock()                                                                          
        mock_get_repository.return_value = mock_repo                                                                               
        mock_get_local_repo_path.return_value = "/path/to/repo"                                                                    
        mock_process_issue.return_value = (True, None)                                                                             
                                                                                                                                   
        # Test with existing repo                                                                                                  
        with patch('os.path.exists', return_value=True):                                                                           
            process_repository(self.repo_name)                                                                                     
                                                                                                                                   
            # Verify results                                                                                                       
            mock_get_github_client.assert_called_once()                                                                            
            mock_get_repository.assert_called_once()                                                                               
            mock_get_local_repo_path.assert_called_once_with(self.repo_name)                                                       
            mock_clone_repository.assert_not_called()                                                                              
            mock_update_repository.assert_called_once()                                                                            
            mock_checkout_branch.assert_called_once()                                                                              
            self.assertEqual(mock_process_issue.call_count, 2)                                                                     
                                                                                                                                   
        # Reset mocks                                                                                                              
        mock_get_github_client.reset_mock()                                                                                        
        mock_get_repository.reset_mock()                                                                                           
        mock_get_local_repo_path.reset_mock()                                                                                      
        mock_clone_repository.reset_mock()                                                                                         
        mock_update_repository.reset_mock()                                                                                        
        mock_checkout_branch.reset_mock()                                                                                          
        mock_process_issue.reset_mock()                                                                                            
                                                                                                                                   
        # Test with non-existing repo                                                                                              
        with patch('os.path.exists', return_value=False):                                                                          
            mock_clone_repository.return_value = "/path/to/cloned/repo"                                                            
                                                                                                                                   
            process_repository(self.repo_name)                                                                                     
                                                                                                                                   
            # Verify results                                                                                                       
            mock_get_github_client.assert_called_once()                                                                            
            mock_get_repository.assert_called_once()                                                                               
            mock_get_local_repo_path.assert_called_once_with(self.repo_name)                                                       
            mock_clone_repository.assert_called_once()                                                                             
            mock_update_repository.assert_called_once()                                                                            
            mock_checkout_branch.assert_called_once()                                                                              
            self.assertEqual(mock_process_issue.call_count, 2)                                                                     
                                                                                                                                   
    def test_create_prefect_flow(self):                                                                                            
        """Test create_prefect_flow function"""                                                                                    
        # Test normal mode                                                                                                         
        flow = create_prefect_flow(test_mode=False)                                                                                
        self.assertIsInstance(flow, Flow)                                                                                          
        self.assertEqual(flow.name, "GitHub Issue Response Flow")                                                                  
                                                                                                                                   
        # Test test mode                                                                                                           
        flow = create_prefect_flow(test_mode=True)                                                                                 
        self.assertIsInstance(flow, Flow)                                                                                          
        self.assertEqual(flow.name, "GitHub Issue Response Flow")                                                                  
                                                                                                                                   
                                                                                                                                   
if __name__ == '__main__':                                                                                                         
    unittest.main()                                                                                                                
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

tests/run_prefect_workflow_tests.py                                                                                                

                                                                                                                                   
<<<<<<< SEARCH                                                                                                                     
=======                                                                                                                            
#!/usr/bin/env python3                                                                                                             
"""                                                                                                                                
Script to run Prefect workflow tests for response_agent.py                                                                         
                                                                                                                                   
This script sets up a test environment and runs all the Prefect workflows                                                          
defined in response_agent.py to ensure they work correctly.                                                                        
"""                                                                                                                                
import os                                                                                                                          
import sys                                                                                                                         
import argparse                                                                                                                    
from prefect import Flow, task                                                                                                     
from prefect.utilities.debug import raise_on_exception                                                                             
                                                                                                                                   
# Add the src directory to the path so we can import modules                                                                       
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))                                                 
                                                                                                                                   
from src.response_agent import create_prefect_flow                                                                                 
                                                                                                                                   
                                                                                                                                   
def run_workflow_tests(test_mode=True, debug=False):                                                                               
    """                                                                                                                            
    Run all Prefect workflows in test mode                                                                                         
                                                                                                                                   
    Args:                                                                                                                          
        test_mode: Whether to run in test mode (simulating all triggers)                                                           
        debug: Whether to run in debug mode (raising exceptions)                                                                   
    """                                                                                                                            
    print("Starting Prefect workflow tests...")                                                                                    
                                                                                                                                   
    # Create the flow                                                                                                              
    flow = create_prefect_flow(test_mode=test_mode)                                                                                
                                                                                                                                   
    # Run the flow with exception handling based on debug mode                                                                     
    if debug:                                                                                                                      
        with raise_on_exception():                                                                                                 
            state = flow.run()                                                                                                     
    else:                                                                                                                          
        state = flow.run()                                                                                                         
                                                                                                                                   
    # Check the result                                                                                                             
    if state.is_successful():                                                                                                      
        print("All workflows completed successfully!")                                                                             
        return True                                                                                                                
    else:                                                                                                                          
        print("Some workflows failed:")                                                                                            
        for task_name, task_state in state.result.items():                                                                         
            if not task_state.is_successful():                                                                                     
                print(f"  - {task_name}: {task_state.message}")                                                                    
        return False                                                                                                               
                                                                                                                                   
                                                                                                                                   
if __name__ == "__main__":                                                                                                         
    parser = argparse.ArgumentParser(description="Run Prefect workflow tests for response_agent.py")                               
    parser.add_argument("--no-test-mode", action="store_true", help="Run in normal mode instead of test mode")                     
    parser.add_argument("--debug", action="store_true", help="Run in debug mode (raise exceptions)")                               
    args = parser.parse_args()                                                                                                     
                                                                                                                                   
    success = run_workflow_tests(test_mode=not args.no_test_mode, debug=args.debug)                                                
    sys.exit(0 if success else 1)                                                                                                  
>>>>>>> REPLACE                                                                                                                    
                                                                                                                                   

Now you can run the tests with the following commands:                                                                             

                                                                                                                                   
# Install the updated dependencies including Prefect                                                                               
pip install -r requirements.txt                                                                                                    
                                                                                                                                   
# Run the unit tests for the response agent workflows                                                                              
pytest tests/test_response_agent_workflows.py -v                                                                                   
                                                                                                                                   
# Run the Prefect workflow tests in test mode (simulates all triggers)                                                             
make test-workflows                                                                                                                
                                                                                                                                   
# Run the Prefect workflow tests in normal mode                                                                                    
make test-workflows-normal                                                                                                         
                                                                                                                                   

These tests will ensure that all the Prefect workflows in response_agent.py are working correctly. The unit tests verify each      
component individually, while the workflow tests run the entire flow to check integration.                                         

Tokens: 23k sent, 4.2k received. Cost: $0.13 message, $0.35 session.

tests/test_response_agent_workflows.py

tests/run_prefect_workflow_tests.py
Applied edit to Makefile
Applied edit to requirements.txt
Applied edit to tests/run_prefect_workflow_tests.py
Applied edit to tests/test_response_agent_workflows.py
Commit be00d30 I'll generate a concise commit message for these changes:

feat: Add Prefect workflow tests and Makefile targets


This commit message captures the key aspects of the changes:
- Added Prefect workflow tests
- Created a new test script for running Prefect workflows
- Updated Makefile with new test workflow targets
- Added Prefect to requirements.txt

Would you like me to proceed with creating the commit?

# Install the updated dependencies including Prefect                  
pip install -r requirements.txt                                       
                                                                      
# Run the unit tests for the response agent workflows                 
pytest tests/test_response_agent_workflows.py -v                      
                                                                      
# Run the Prefect workflow tests in test mode (simulates all triggers)
make test-workflows                                                   
                                                                      
# Run the Prefect workflow tests in normal mode                       
make test-workflows-normal                                            
Summarization failed for model anthropic/claude-3-5-haiku-20241022: cannot schedule new futures after shutdown
Summarization failed for model anthropic/claude-3-7-sonnet-20250219: cannot schedule new futures after shutdown
summarizer unexpectedly failed for all models


This response was automatically generated by blech_bot using model gpt-4o

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Use prefect to orchestrate workflows to check functionality on a live test repo

1 participant