diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index 31ad2bd9..9f34718a 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -204,7 +204,8 @@ class PRCodeSuggestions: self.git_provider.remove_comment(self.progress_response) else: get_logger().info('Code suggestions generated for PR, but not published since publish_output is False.') - get_settings().data = {"artifact": data} + pr_body = self.generate_summarized_suggestions(data) + get_settings().data = {"artifact": pr_body} return except Exception as e: get_logger().error(f"Failed to generate code suggestions for PR, error: {e}", diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py index e5cfea2f..0b4e19cd 100644 --- a/pr_agent/tools/pr_description.py +++ b/pr_agent/tools/pr_description.py @@ -171,6 +171,10 @@ class PRDescription: update_comment = f"**[PR Description]({pr_url})** updated to latest commit ({latest_commit_url})" self.git_provider.publish_comment(update_comment) self.git_provider.remove_initial_comment() + else: + get_logger().info('PR description, but not published since publish_output is False.') + get_settings().data = {"artifact": pr_body} + return except Exception as e: get_logger().error(f"Error generating PR description {self.pr_id}: {e}") diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index e008703e..c49155e4 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -170,6 +170,10 @@ class PRReviewer: self.git_provider.remove_initial_comment() if get_settings().pr_reviewer.inline_code_comments: self._publish_inline_code_comments() + else: + get_logger().info("Review output is not published") + get_settings().data = {"artifact": pr_review} + return except Exception as e: get_logger().error(f"Failed to review PR: {e}") diff --git a/tests/health_test/main.py b/tests/health_test/main.py new file mode 100644 index 00000000..15030565 --- /dev/null +++ b/tests/health_test/main.py @@ -0,0 +1,70 @@ +import argparse +import asyncio +import copy +import os +from pathlib import Path + +from starlette_context import request_cycle_context, context + +from pr_agent.cli import run_command +from pr_agent.config_loader import get_settings, global_settings + +from pr_agent.agent.pr_agent import PRAgent, commands +from pr_agent.log import get_logger, setup_logger +from tests.e2e_tests import e2e_utils + +log_level = os.environ.get("LOG_LEVEL", "INFO") +setup_logger(log_level) + + +async def run_async(): + pr_url = "https://github.com/Codium-ai/pr-agent/pull/1385" # A small PR to test the agent + + get_settings().set("config.git_provider", "github") + get_settings().set("config.publish_output", False) + get_settings().set("config.fallback_models", []) + + agent = PRAgent() + try: + # Run the 'describe' command + get_logger().info(f"\nSanity check for the 'describe' command...") + original_settings = copy.deepcopy(get_settings()) + await agent.handle_request(pr_url, ['describe']) + pr_header_body = dict(get_settings().data)['artifact'] + assert pr_header_body.startswith('###') and 'PR Type' in pr_header_body and 'Description' in pr_header_body + context['settings'] = copy.deepcopy(original_settings) # Restore settings state after each test to prevent test interference + get_logger().info("PR description generated successfully\n") + + # Run the 'review' command + get_logger().info(f"\nSanity check for the 'review' command...") + original_settings = copy.deepcopy(get_settings()) + await agent.handle_request(pr_url, ['review']) + pr_review_body = dict(get_settings().data)['artifact'] + assert pr_review_body.startswith('##') and 'PR Reviewer Guide' in pr_review_body + context['settings'] = copy.deepcopy(original_settings) # Restore settings state after each test to prevent test interference + get_logger().info("PR review generated successfully\n") + + # Run the 'improve' command + get_logger().info(f"\nSanity check for the 'improve' command...") + original_settings = copy.deepcopy(get_settings()) + await agent.handle_request(pr_url, ['improve']) + pr_improve_body = dict(get_settings().data)['artifact'] + assert pr_improve_body.startswith('##') and 'PR Code Suggestions' in pr_improve_body + context['settings'] = copy.deepcopy(original_settings) # Restore settings state after each test to prevent test interference + get_logger().info("PR improvements generated successfully\n") + + get_logger().info(f"\n\n========\nHealth test passed successfully\n========") + + except Exception as e: + get_logger().exception(f"\n\n========\nHealth test failed\n========") + raise e + + +def run(): + with request_cycle_context({}): + context['settings'] = copy.deepcopy(global_settings) + asyncio.run(run_async()) + + +if __name__ == '__main__': + run()