|
|
|
|
|
"""Tests for MVP3 Sprint 2 Execute Button functionality.""" |
|
|
|
|
|
from unittest.mock import patch |
|
|
|
|
|
from app import handle_execute_plan |
|
|
from kg_services.ontology import MCPPrompt, MCPTool, PlannedStep |
|
|
|
|
|
|
|
|
class TestExecuteButton: |
|
|
"""Test cases for the execute button functionality.""" |
|
|
|
|
|
def test_execute_button_with_valid_inputs(self): |
|
|
"""Test execute button with valid query and inputs.""" |
|
|
|
|
|
with ( |
|
|
patch("app.planner_agent") as mock_planner, |
|
|
patch("app.executor_agent") as mock_executor, |
|
|
): |
|
|
|
|
|
mock_tool = MCPTool( |
|
|
tool_id="test-tool", |
|
|
name="Test Tool", |
|
|
description="A test MCP tool", |
|
|
tags=["test"], |
|
|
invocation_command_stub="test_command", |
|
|
) |
|
|
|
|
|
mock_prompt = MCPPrompt( |
|
|
prompt_id="test-prompt", |
|
|
name="Test Prompt", |
|
|
description="A test prompt", |
|
|
target_tool_id="test-tool", |
|
|
template_string="Test template with {var1}", |
|
|
input_variables=["var1"], |
|
|
) |
|
|
|
|
|
mock_plan = PlannedStep(tool=mock_tool, prompt=mock_prompt) |
|
|
mock_planner.generate_plan.return_value = [mock_plan] |
|
|
|
|
|
|
|
|
mock_executor.simulate_execution.return_value = { |
|
|
"status": "simulated_success", |
|
|
"step": { |
|
|
"tool": { |
|
|
"name": "Test Tool", |
|
|
"description": "A test MCP tool", |
|
|
"id": "test-tool", |
|
|
}, |
|
|
"prompt": { |
|
|
"name": "Test Prompt", |
|
|
"description": "A test prompt", |
|
|
"template_string": "Test template with {var1}", |
|
|
"template_variables": ["var1"], |
|
|
}, |
|
|
"inputs": {"var1": "test input"}, |
|
|
"output": "**Test Output**", |
|
|
"confidence": 0.95, |
|
|
"execution_details": { |
|
|
"processing_time_ms": 1250, |
|
|
"model_used": "test-model", |
|
|
"tokens": {"input": 25, "output": 15}, |
|
|
}, |
|
|
}, |
|
|
"metadata": {"simulation_version": "MVP3_Sprint4"}, |
|
|
} |
|
|
|
|
|
|
|
|
result = handle_execute_plan("test query", "test input") |
|
|
|
|
|
|
|
|
assert "Execution Complete" in result |
|
|
assert "Test Tool" in result |
|
|
assert "Simulated Success" in result |
|
|
|
|
|
def test_execute_button_with_empty_query(self): |
|
|
"""Test execute button with empty query.""" |
|
|
with ( |
|
|
patch("app.planner_agent"), |
|
|
patch("app.executor_agent"), |
|
|
): |
|
|
result = handle_execute_plan("", "test input") |
|
|
|
|
|
assert "Error" in result |
|
|
assert "Original query is missing" in result |
|
|
|
|
|
def test_execute_button_with_no_planner(self): |
|
|
"""Test execute button when planner is not available.""" |
|
|
with ( |
|
|
patch("app.planner_agent", None), |
|
|
patch("app.executor_agent"), |
|
|
): |
|
|
result = handle_execute_plan("test query", "test input") |
|
|
|
|
|
assert "Error" in result |
|
|
assert "Planner service not available" in result |
|
|
|
|
|
def test_execute_button_with_no_executor(self): |
|
|
"""Test execute button when executor is not available.""" |
|
|
with ( |
|
|
patch("app.planner_agent"), |
|
|
patch("app.executor_agent", None), |
|
|
): |
|
|
result = handle_execute_plan("test query", "test input") |
|
|
|
|
|
assert "Error" in result |
|
|
assert "Executor service not available" in result |
|
|
|
|
|
def test_execute_button_with_no_plan_generated(self): |
|
|
"""Test execute button when no plan can be generated.""" |
|
|
with ( |
|
|
patch("app.planner_agent") as mock_planner, |
|
|
patch("app.executor_agent"), |
|
|
): |
|
|
|
|
|
mock_planner.generate_plan.return_value = [] |
|
|
|
|
|
result = handle_execute_plan("test query", "test input") |
|
|
|
|
|
assert "Error" in result |
|
|
assert "Could not retrieve the current action plan" in result |
|
|
|
|
|
def test_execute_button_with_multiple_inputs(self): |
|
|
"""Test execute button with multiple input values.""" |
|
|
with ( |
|
|
patch("app.planner_agent") as mock_planner, |
|
|
patch("app.executor_agent") as mock_executor, |
|
|
): |
|
|
|
|
|
mock_tool = MCPTool( |
|
|
tool_id="test-tool", |
|
|
name="Test Tool", |
|
|
description="A test MCP tool", |
|
|
tags=["test"], |
|
|
invocation_command_stub="test_command", |
|
|
) |
|
|
|
|
|
mock_prompt = MCPPrompt( |
|
|
prompt_id="test-prompt", |
|
|
name="Test Prompt", |
|
|
description="A test prompt", |
|
|
target_tool_id="test-tool", |
|
|
template_string="Test template with {var1} and {var2}", |
|
|
input_variables=["var1", "var2"], |
|
|
) |
|
|
|
|
|
mock_plan = PlannedStep(tool=mock_tool, prompt=mock_prompt) |
|
|
mock_planner.generate_plan.return_value = [mock_plan] |
|
|
|
|
|
|
|
|
mock_executor.simulate_execution.return_value = { |
|
|
"status": "simulated_success", |
|
|
"step": {}, |
|
|
"metadata": {"simulation_version": "MVP3_Sprint4"}, |
|
|
} |
|
|
|
|
|
|
|
|
handle_execute_plan("test query", "input1", "input2") |
|
|
|
|
|
|
|
|
mock_executor.simulate_execution.assert_called_once() |
|
|
call_args = mock_executor.simulate_execution.call_args |
|
|
inputs_dict = call_args[0][1] |
|
|
|
|
|
assert inputs_dict["var1"] == "input1" |
|
|
assert inputs_dict["var2"] == "input2" |
|
|
|
|
|
def test_execute_button_error_handling(self): |
|
|
"""Test execute button error handling.""" |
|
|
with ( |
|
|
patch("app.planner_agent") as mock_planner, |
|
|
patch("app.executor_agent"), |
|
|
): |
|
|
|
|
|
mock_planner.generate_plan.side_effect = Exception("Test error") |
|
|
|
|
|
result = handle_execute_plan("test query", "test input") |
|
|
|
|
|
assert "Execution Error" in result |
|
|
assert "Test error" in result |
|
|
|
|
|
def test_execute_button_performance(self): |
|
|
"""Test that execute button handler responds quickly.""" |
|
|
import time |
|
|
|
|
|
with ( |
|
|
patch("app.planner_agent") as mock_planner, |
|
|
patch("app.executor_agent") as mock_executor, |
|
|
): |
|
|
|
|
|
mock_tool = MCPTool( |
|
|
tool_id="test-tool", |
|
|
name="Test Tool", |
|
|
description="A test MCP tool", |
|
|
tags=["test"], |
|
|
invocation_command_stub="test_command", |
|
|
) |
|
|
|
|
|
mock_prompt = MCPPrompt( |
|
|
prompt_id="test-prompt", |
|
|
name="Test Prompt", |
|
|
description="A test prompt", |
|
|
target_tool_id="test-tool", |
|
|
template_string="Test template", |
|
|
input_variables=[], |
|
|
) |
|
|
|
|
|
mock_plan = PlannedStep(tool=mock_tool, prompt=mock_prompt) |
|
|
mock_planner.generate_plan.return_value = [mock_plan] |
|
|
|
|
|
mock_executor.simulate_execution.return_value = { |
|
|
"status": "simulated_success", |
|
|
"step": { |
|
|
"tool": {"name": "Test Tool", "description": "A test MCP tool"}, |
|
|
"prompt": {"name": "Test Prompt", "description": "A test prompt"}, |
|
|
"inputs": {}, |
|
|
"output": "Quick response", |
|
|
}, |
|
|
"metadata": {"simulation_version": "MVP3_Sprint4"}, |
|
|
} |
|
|
|
|
|
|
|
|
start_time = time.time() |
|
|
result = handle_execute_plan("test query", "test input") |
|
|
end_time = time.time() |
|
|
|
|
|
execution_time_ms = (end_time - start_time) * 1000 |
|
|
|
|
|
|
|
|
assert execution_time_ms < 1000 |
|
|
assert "Execution Complete" in result |
|
|
|
|
|
def test_execute_button_result_formatting(self): |
|
|
"""Test that execute button results are properly formatted.""" |
|
|
with ( |
|
|
patch("app.planner_agent") as mock_planner, |
|
|
patch("app.executor_agent") as mock_executor, |
|
|
): |
|
|
|
|
|
mock_tool = MCPTool( |
|
|
tool_id="test-tool", |
|
|
name="Test Tool", |
|
|
description="A test MCP tool", |
|
|
tags=["test"], |
|
|
invocation_command_stub="test_command", |
|
|
) |
|
|
|
|
|
mock_prompt = MCPPrompt( |
|
|
prompt_id="test-prompt", |
|
|
name="Test Prompt", |
|
|
description="A test prompt", |
|
|
target_tool_id="test-tool", |
|
|
template_string="Test template", |
|
|
input_variables=[], |
|
|
) |
|
|
|
|
|
mock_plan = PlannedStep(tool=mock_tool, prompt=mock_prompt) |
|
|
mock_planner.generate_plan.return_value = [mock_plan] |
|
|
|
|
|
mock_executor.simulate_execution.return_value = { |
|
|
"status": "simulated_success", |
|
|
"step": { |
|
|
"tool": { |
|
|
"name": "Test Tool", |
|
|
"description": "A test MCP tool", |
|
|
"id": "test-tool", |
|
|
}, |
|
|
"prompt": { |
|
|
"name": "Test Prompt", |
|
|
"description": "A test prompt", |
|
|
"template_string": "Test template", |
|
|
}, |
|
|
"inputs": {}, |
|
|
"output": "**Test Output**", |
|
|
"confidence": 0.95, |
|
|
"execution_details": { |
|
|
"processing_time_ms": 1250, |
|
|
"model_used": "test-model", |
|
|
"tokens": {"input": 25, "output": 15}, |
|
|
}, |
|
|
}, |
|
|
} |
|
|
|
|
|
result = handle_execute_plan("test query") |
|
|
|
|
|
|
|
|
assert result.startswith("# π **Execution Complete!**") |
|
|
assert "## π§ **Tool & Prompt Information**" in result |
|
|
assert "Test Tool" in result |
|
|
assert "Simulated Success" in result |
|
|
|