Merge 6508d3e53b into d1cb8a6da2
commit
9a80bb2029
@ -0,0 +1,20 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_base_swarm_module_can_be_imported():
|
||||
"""Test that base_swarm module can be imported"""
|
||||
from swarms.structs import base_swarm
|
||||
assert base_swarm is not None
|
||||
|
||||
|
||||
def test_base_swarm_class_exists():
|
||||
"""Test that BaseSwarm class exists"""
|
||||
from swarms.structs.base_swarm import BaseSwarm
|
||||
assert BaseSwarm is not None
|
||||
|
||||
|
||||
def test_base_swarm_is_abstract():
|
||||
"""Test that BaseSwarm is an abstract base class"""
|
||||
from swarms.structs.base_swarm import BaseSwarm
|
||||
from abc import ABC
|
||||
assert issubclass(BaseSwarm, ABC)
|
||||
@ -0,0 +1,17 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_base_swarm_module_imports():
|
||||
"""Test that base_swarm module can be imported"""
|
||||
try:
|
||||
from swarms.structs import base_swarm
|
||||
assert base_swarm is not None
|
||||
except ImportError:
|
||||
pytest.skip("base_swarm module not found")
|
||||
|
||||
|
||||
def test_base_swarm_placeholder():
|
||||
"""Placeholder test for base_swarm - primarily contains classes"""
|
||||
# base_swarm.py contains primarily class definitions
|
||||
# Tests for class-based code would require more complex setup
|
||||
assert True
|
||||
@ -0,0 +1,104 @@
|
||||
import pytest
|
||||
from swarms.structs.collaborative_utils import talk_to_agent
|
||||
from swarms.structs.agent import Agent
|
||||
|
||||
|
||||
def create_test_agent(name: str, description: str = "Test agent") -> Agent:
|
||||
"""Create a real Agent instance for testing"""
|
||||
return Agent(
|
||||
agent_name=name,
|
||||
agent_description=description,
|
||||
system_prompt=f"You are {name}, a helpful test assistant.",
|
||||
model_name="gpt-4o-mini",
|
||||
max_loops=1,
|
||||
verbose=False,
|
||||
)
|
||||
|
||||
|
||||
def test_talk_to_agent_success():
|
||||
"""Test successful agent-to-agent communication"""
|
||||
current_agent = create_test_agent("CurrentAgent")
|
||||
target_agent = create_test_agent("TargetAgent")
|
||||
|
||||
agents = [current_agent, target_agent]
|
||||
|
||||
result = talk_to_agent(
|
||||
current_agent=current_agent,
|
||||
agents=agents,
|
||||
task="What is 2+2?",
|
||||
agent_name="TargetAgent",
|
||||
max_loops=1
|
||||
)
|
||||
|
||||
assert result is not None
|
||||
# Result should be a list or string from the debate
|
||||
assert len(str(result)) > 0
|
||||
|
||||
|
||||
def test_talk_to_agent_not_found():
|
||||
"""Test error when target agent not found"""
|
||||
current_agent = create_test_agent("CurrentAgent")
|
||||
|
||||
agents = [current_agent]
|
||||
|
||||
with pytest.raises(ValueError, match="Agent 'NonExistent' not found"):
|
||||
talk_to_agent(
|
||||
current_agent=current_agent,
|
||||
agents=agents,
|
||||
task="Test task",
|
||||
agent_name="NonExistent"
|
||||
)
|
||||
|
||||
|
||||
def test_talk_to_agent_with_max_loops():
|
||||
"""Test talk_to_agent with custom max_loops"""
|
||||
current_agent = create_test_agent("CurrentAgent")
|
||||
target_agent = create_test_agent("TargetAgent")
|
||||
|
||||
agents = [current_agent, target_agent]
|
||||
|
||||
result = talk_to_agent(
|
||||
current_agent=current_agent,
|
||||
agents=agents,
|
||||
task="Discuss the weather briefly",
|
||||
agent_name="TargetAgent",
|
||||
max_loops=2
|
||||
)
|
||||
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_talk_to_agent_no_agent_name_attribute():
|
||||
"""Test when target agent is not found by name"""
|
||||
current_agent = create_test_agent("CurrentAgent")
|
||||
# Create another agent with different name
|
||||
other_agent = create_test_agent("OtherAgent")
|
||||
|
||||
agents = [current_agent, other_agent]
|
||||
|
||||
with pytest.raises(ValueError, match="Agent 'TargetAgent' not found"):
|
||||
talk_to_agent(
|
||||
current_agent=current_agent,
|
||||
agents=agents,
|
||||
task="Test",
|
||||
agent_name="TargetAgent"
|
||||
)
|
||||
|
||||
|
||||
def test_talk_to_agent_output_type():
|
||||
"""Test talk_to_agent with custom output_type"""
|
||||
current_agent = create_test_agent("CurrentAgent")
|
||||
target_agent = create_test_agent("TargetAgent")
|
||||
|
||||
agents = [current_agent, target_agent]
|
||||
|
||||
result = talk_to_agent(
|
||||
current_agent=current_agent,
|
||||
agents=agents,
|
||||
task="Say hello",
|
||||
agent_name="TargetAgent",
|
||||
output_type="str",
|
||||
max_loops=1
|
||||
)
|
||||
|
||||
assert result is not None
|
||||
@ -0,0 +1,68 @@
|
||||
import pytest
|
||||
from swarms.structs.concat import concat_strings
|
||||
|
||||
|
||||
def test_concat_strings_basic():
|
||||
"""Test basic string concatenation"""
|
||||
result = concat_strings(["hello", " ", "world"])
|
||||
assert result == "hello world"
|
||||
|
||||
|
||||
def test_concat_strings_empty_list():
|
||||
"""Test concatenation with empty list"""
|
||||
result = concat_strings([])
|
||||
assert result == ""
|
||||
|
||||
|
||||
def test_concat_strings_single_element():
|
||||
"""Test concatenation with single element"""
|
||||
result = concat_strings(["hello"])
|
||||
assert result == "hello"
|
||||
|
||||
|
||||
def test_concat_strings_multiple_elements():
|
||||
"""Test concatenation with multiple elements"""
|
||||
result = concat_strings(["a", "b", "c", "d", "e"])
|
||||
assert result == "abcde"
|
||||
|
||||
|
||||
def test_concat_strings_with_special_characters():
|
||||
"""Test concatenation with special characters"""
|
||||
result = concat_strings(["hello", "\n", "world", "\t", "!"])
|
||||
assert result == "hello\nworld\t!"
|
||||
|
||||
|
||||
def test_concat_strings_not_list_raises_typeerror():
|
||||
"""Test that non-list input raises TypeError"""
|
||||
with pytest.raises(TypeError, match="Input must be a list of strings"):
|
||||
concat_strings("not a list")
|
||||
|
||||
|
||||
def test_concat_strings_non_string_element_raises_typeerror():
|
||||
"""Test that list with non-string elements raises TypeError"""
|
||||
with pytest.raises(TypeError, match="All elements in the list must be strings"):
|
||||
concat_strings(["hello", 123, "world"])
|
||||
|
||||
|
||||
def test_concat_strings_mixed_types_raises_typeerror():
|
||||
"""Test that list with mixed types raises TypeError"""
|
||||
with pytest.raises(TypeError, match="All elements in the list must be strings"):
|
||||
concat_strings(["hello", None, "world"])
|
||||
|
||||
|
||||
def test_concat_strings_with_numbers_raises_typeerror():
|
||||
"""Test that list containing numbers raises TypeError"""
|
||||
with pytest.raises(TypeError, match="All elements in the list must be strings"):
|
||||
concat_strings([1, 2, 3])
|
||||
|
||||
|
||||
def test_concat_strings_empty_strings():
|
||||
"""Test concatenation with empty strings"""
|
||||
result = concat_strings(["", "", ""])
|
||||
assert result == ""
|
||||
|
||||
|
||||
def test_concat_strings_unicode():
|
||||
"""Test concatenation with unicode characters"""
|
||||
result = concat_strings(["Hello", " ", "世界", " ", "🌍"])
|
||||
assert result == "Hello 世界 🌍"
|
||||
@ -0,0 +1,189 @@
|
||||
import pytest
|
||||
from swarms.structs.council_as_judge import (
|
||||
EvaluationError,
|
||||
DimensionEvaluationError,
|
||||
AggregationError,
|
||||
EVAL_DIMENSIONS,
|
||||
judge_system_prompt,
|
||||
build_judge_prompt,
|
||||
aggregator_system_prompt,
|
||||
build_aggregation_prompt,
|
||||
)
|
||||
|
||||
|
||||
def test_evaluation_error_is_exception():
|
||||
"""Test that EvaluationError is an Exception subclass"""
|
||||
assert issubclass(EvaluationError, Exception)
|
||||
|
||||
|
||||
def test_dimension_evaluation_error_is_evaluation_error():
|
||||
"""Test that DimensionEvaluationError is an EvaluationError subclass"""
|
||||
assert issubclass(DimensionEvaluationError, EvaluationError)
|
||||
|
||||
|
||||
def test_aggregation_error_is_evaluation_error():
|
||||
"""Test that AggregationError is an EvaluationError subclass"""
|
||||
assert issubclass(AggregationError, EvaluationError)
|
||||
|
||||
|
||||
def test_eval_dimensions_exists():
|
||||
"""Test that EVAL_DIMENSIONS dictionary exists"""
|
||||
assert isinstance(EVAL_DIMENSIONS, dict)
|
||||
assert len(EVAL_DIMENSIONS) > 0
|
||||
|
||||
|
||||
def test_eval_dimensions_contains_expected_keys():
|
||||
"""Test that EVAL_DIMENSIONS contains expected evaluation dimensions"""
|
||||
expected_dimensions = [
|
||||
"accuracy",
|
||||
"helpfulness",
|
||||
"harmlessness",
|
||||
"coherence",
|
||||
"conciseness",
|
||||
"instruction_adherence",
|
||||
]
|
||||
for dimension in expected_dimensions:
|
||||
assert dimension in EVAL_DIMENSIONS
|
||||
|
||||
|
||||
def test_eval_dimensions_values_are_strings():
|
||||
"""Test that all EVAL_DIMENSIONS values are strings"""
|
||||
for dimension, description in EVAL_DIMENSIONS.items():
|
||||
assert isinstance(description, str)
|
||||
assert len(description) > 0
|
||||
|
||||
|
||||
def test_judge_system_prompt_returns_string():
|
||||
"""Test that judge_system_prompt returns a string"""
|
||||
result = judge_system_prompt()
|
||||
assert isinstance(result, str)
|
||||
assert len(result) > 0
|
||||
|
||||
|
||||
def test_judge_system_prompt_contains_key_phrases():
|
||||
"""Test that judge_system_prompt contains expected content"""
|
||||
result = judge_system_prompt()
|
||||
assert "evaluator" in result.lower()
|
||||
assert "feedback" in result.lower()
|
||||
|
||||
|
||||
def test_build_judge_prompt_valid_dimension():
|
||||
"""Test build_judge_prompt with valid dimension"""
|
||||
result = build_judge_prompt(
|
||||
dimension_name="accuracy",
|
||||
task="Test task",
|
||||
task_response="Test response"
|
||||
)
|
||||
assert isinstance(result, str)
|
||||
assert "accuracy" in result.lower()
|
||||
assert "Test task" in result
|
||||
assert "Test response" in result
|
||||
|
||||
|
||||
def test_build_judge_prompt_invalid_dimension_raises_error():
|
||||
"""Test that build_judge_prompt raises KeyError for invalid dimension"""
|
||||
with pytest.raises(KeyError, match="Unknown evaluation dimension"):
|
||||
build_judge_prompt(
|
||||
dimension_name="invalid_dimension",
|
||||
task="Test task",
|
||||
task_response="Test response"
|
||||
)
|
||||
|
||||
|
||||
def test_build_judge_prompt_includes_evaluation_focus():
|
||||
"""Test that build_judge_prompt includes evaluation focus from EVAL_DIMENSIONS"""
|
||||
result = build_judge_prompt(
|
||||
dimension_name="helpfulness",
|
||||
task="Test task",
|
||||
task_response="Test response"
|
||||
)
|
||||
# Should contain some content from EVAL_DIMENSIONS["helpfulness"]
|
||||
assert "helpfulness" in result.lower()
|
||||
|
||||
|
||||
def test_aggregator_system_prompt_returns_string():
|
||||
"""Test that aggregator_system_prompt returns a string"""
|
||||
result = aggregator_system_prompt()
|
||||
assert isinstance(result, str)
|
||||
assert len(result) > 0
|
||||
|
||||
|
||||
def test_aggregator_system_prompt_contains_key_phrases():
|
||||
"""Test that aggregator_system_prompt contains expected content"""
|
||||
result = aggregator_system_prompt()
|
||||
assert "synthesizing" in result.lower() or "synthesis" in result.lower()
|
||||
assert "report" in result.lower()
|
||||
|
||||
|
||||
def test_build_aggregation_prompt_basic():
|
||||
"""Test build_aggregation_prompt with basic input"""
|
||||
rationales = {
|
||||
"accuracy": "This response is accurate",
|
||||
"helpfulness": "This response is helpful"
|
||||
}
|
||||
result = build_aggregation_prompt(rationales)
|
||||
assert isinstance(result, str)
|
||||
assert "accuracy" in result.lower()
|
||||
assert "helpfulness" in result.lower()
|
||||
assert "This response is accurate" in result
|
||||
assert "This response is helpful" in result
|
||||
|
||||
|
||||
def test_build_aggregation_prompt_empty_dict():
|
||||
"""Test build_aggregation_prompt with empty dictionary"""
|
||||
result = build_aggregation_prompt({})
|
||||
assert isinstance(result, str)
|
||||
assert len(result) > 0
|
||||
|
||||
|
||||
def test_build_aggregation_prompt_single_dimension():
|
||||
"""Test build_aggregation_prompt with single dimension"""
|
||||
rationales = {"accuracy": "Accuracy analysis"}
|
||||
result = build_aggregation_prompt(rationales)
|
||||
assert "accuracy" in result.lower()
|
||||
assert "Accuracy analysis" in result
|
||||
|
||||
|
||||
def test_build_aggregation_prompt_multiple_dimensions():
|
||||
"""Test build_aggregation_prompt with multiple dimensions"""
|
||||
rationales = {
|
||||
"accuracy": "Accuracy text",
|
||||
"helpfulness": "Helpfulness text",
|
||||
"coherence": "Coherence text"
|
||||
}
|
||||
result = build_aggregation_prompt(rationales)
|
||||
for dim, text in rationales.items():
|
||||
assert dim.upper() in result
|
||||
assert text in result
|
||||
|
||||
|
||||
def test_evaluation_error_can_be_raised():
|
||||
"""Test that EvaluationError can be raised"""
|
||||
with pytest.raises(EvaluationError, match="Test error"):
|
||||
raise EvaluationError("Test error")
|
||||
|
||||
|
||||
def test_dimension_evaluation_error_can_be_raised():
|
||||
"""Test that DimensionEvaluationError can be raised"""
|
||||
with pytest.raises(DimensionEvaluationError, match="Dimension error"):
|
||||
raise DimensionEvaluationError("Dimension error")
|
||||
|
||||
|
||||
def test_aggregation_error_can_be_raised():
|
||||
"""Test that AggregationError can be raised"""
|
||||
with pytest.raises(AggregationError, match="Aggregation error"):
|
||||
raise AggregationError("Aggregation error")
|
||||
|
||||
|
||||
def test_judge_system_prompt_is_cacheable():
|
||||
"""Test that judge_system_prompt can be called multiple times"""
|
||||
result1 = judge_system_prompt()
|
||||
result2 = judge_system_prompt()
|
||||
assert result1 == result2
|
||||
|
||||
|
||||
def test_aggregator_system_prompt_is_cacheable():
|
||||
"""Test that aggregator_system_prompt can be called multiple times"""
|
||||
result1 = aggregator_system_prompt()
|
||||
result2 = aggregator_system_prompt()
|
||||
assert result1 == result2
|
||||
@ -0,0 +1,82 @@
|
||||
import pytest
|
||||
from swarms.structs.cron_job import (
|
||||
CronJobError,
|
||||
CronJobConfigError,
|
||||
CronJobScheduleError,
|
||||
CronJobExecutionError,
|
||||
)
|
||||
|
||||
|
||||
def test_cron_job_error_is_exception():
|
||||
"""Test that CronJobError is an Exception subclass"""
|
||||
assert issubclass(CronJobError, Exception)
|
||||
|
||||
|
||||
def test_cron_job_config_error_is_cron_job_error():
|
||||
"""Test that CronJobConfigError is a CronJobError subclass"""
|
||||
assert issubclass(CronJobConfigError, CronJobError)
|
||||
|
||||
|
||||
def test_cron_job_schedule_error_is_cron_job_error():
|
||||
"""Test that CronJobScheduleError is a CronJobError subclass"""
|
||||
assert issubclass(CronJobScheduleError, CronJobError)
|
||||
|
||||
|
||||
def test_cron_job_execution_error_is_cron_job_error():
|
||||
"""Test that CronJobExecutionError is a CronJobError subclass"""
|
||||
assert issubclass(CronJobExecutionError, CronJobError)
|
||||
|
||||
|
||||
def test_cron_job_error_can_be_raised():
|
||||
"""Test that CronJobError can be raised and caught"""
|
||||
with pytest.raises(CronJobError, match="Test error"):
|
||||
raise CronJobError("Test error")
|
||||
|
||||
|
||||
def test_cron_job_config_error_can_be_raised():
|
||||
"""Test that CronJobConfigError can be raised and caught"""
|
||||
with pytest.raises(CronJobConfigError, match="Config error"):
|
||||
raise CronJobConfigError("Config error")
|
||||
|
||||
|
||||
def test_cron_job_schedule_error_can_be_raised():
|
||||
"""Test that CronJobScheduleError can be raised and caught"""
|
||||
with pytest.raises(CronJobScheduleError, match="Schedule error"):
|
||||
raise CronJobScheduleError("Schedule error")
|
||||
|
||||
|
||||
def test_cron_job_execution_error_can_be_raised():
|
||||
"""Test that CronJobExecutionError can be raised and caught"""
|
||||
with pytest.raises(CronJobExecutionError, match="Execution error"):
|
||||
raise CronJobExecutionError("Execution error")
|
||||
|
||||
|
||||
def test_cron_job_error_inheritance_chain():
|
||||
"""Test that all CronJob errors inherit from CronJobError and Exception"""
|
||||
assert issubclass(CronJobConfigError, Exception)
|
||||
assert issubclass(CronJobScheduleError, Exception)
|
||||
assert issubclass(CronJobExecutionError, Exception)
|
||||
|
||||
|
||||
def test_cron_job_error_with_custom_message():
|
||||
"""Test CronJobError with custom message"""
|
||||
error = CronJobError("Custom error message")
|
||||
assert str(error) == "Custom error message"
|
||||
|
||||
|
||||
def test_cron_job_config_error_with_custom_message():
|
||||
"""Test CronJobConfigError with custom message"""
|
||||
error = CronJobConfigError("Invalid configuration")
|
||||
assert str(error) == "Invalid configuration"
|
||||
|
||||
|
||||
def test_cron_job_schedule_error_with_custom_message():
|
||||
"""Test CronJobScheduleError with custom message"""
|
||||
error = CronJobScheduleError("Scheduling failed")
|
||||
assert str(error) == "Scheduling failed"
|
||||
|
||||
|
||||
def test_cron_job_execution_error_with_custom_message():
|
||||
"""Test CronJobExecutionError with custom message"""
|
||||
error = CronJobExecutionError("Task failed")
|
||||
assert str(error) == "Task failed"
|
||||
@ -0,0 +1,164 @@
|
||||
import pytest
|
||||
from swarms.structs.deep_discussion import one_on_one_debate
|
||||
from swarms.structs.agent import Agent
|
||||
|
||||
|
||||
def create_test_agent(name: str, description: str = "Test agent") -> Agent:
|
||||
"""Create a real Agent instance for testing"""
|
||||
return Agent(
|
||||
agent_name=name,
|
||||
agent_description=description,
|
||||
system_prompt=f"You are {name}, a helpful test assistant. Keep responses brief.",
|
||||
model_name="gpt-4o-mini",
|
||||
max_loops=1,
|
||||
verbose=False,
|
||||
)
|
||||
|
||||
|
||||
def test_one_on_one_debate_requires_two_agents():
|
||||
"""Test that one_on_one_debate requires exactly two agents"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
|
||||
with pytest.raises(ValueError, match="exactly two agents"):
|
||||
one_on_one_debate(agents=[agent1], task="Test")
|
||||
|
||||
|
||||
def test_one_on_one_debate_with_three_agents_raises_error():
|
||||
"""Test that one_on_one_debate raises error with three agents"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
agent3 = create_test_agent("Agent3")
|
||||
|
||||
with pytest.raises(ValueError, match="exactly two agents"):
|
||||
one_on_one_debate(agents=[agent1, agent2, agent3], task="Test")
|
||||
|
||||
|
||||
def test_one_on_one_debate_with_empty_list_raises_error():
|
||||
"""Test that one_on_one_debate raises error with empty agent list"""
|
||||
with pytest.raises(ValueError, match="exactly two agents"):
|
||||
one_on_one_debate(agents=[], task="Test")
|
||||
|
||||
|
||||
def test_one_on_one_debate_basic_execution():
|
||||
"""Test basic execution of one_on_one_debate"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task="What is 2+2?",
|
||||
max_loops=1
|
||||
)
|
||||
|
||||
# Result should exist
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_one_on_one_debate_max_loops():
|
||||
"""Test that one_on_one_debate respects max_loops parameter"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task="Briefly discuss: What makes a good team?",
|
||||
max_loops=2
|
||||
)
|
||||
|
||||
# Result should exist
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_one_on_one_debate_with_img_parameter():
|
||||
"""Test that one_on_one_debate accepts img parameter"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
# Test that the function accepts img parameter without error
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task="Describe briefly",
|
||||
img=None, # Using None to avoid needing actual image
|
||||
max_loops=1
|
||||
)
|
||||
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_one_on_one_debate_alternates_speakers():
|
||||
"""Test that one_on_one_debate produces output from debate"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task="Exchange one brief greeting each",
|
||||
max_loops=2
|
||||
)
|
||||
|
||||
# Verify output was produced
|
||||
assert result is not None
|
||||
assert len(str(result)) > 0
|
||||
|
||||
|
||||
def test_one_on_one_debate_with_zero_loops():
|
||||
"""Test one_on_one_debate with zero max_loops"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task="Task",
|
||||
max_loops=0
|
||||
)
|
||||
|
||||
# With 0 loops, result should still be returned (possibly empty)
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_one_on_one_debate_output_type_parameter():
|
||||
"""Test that one_on_one_debate accepts output_type parameter"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
# Should not raise error with valid output_type
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task="Say hello briefly",
|
||||
max_loops=1,
|
||||
output_type="str"
|
||||
)
|
||||
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_one_on_one_debate_passes_task_to_first_agent():
|
||||
"""Test that initial task is passed and processed"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
initial_task = "What is the capital of France?"
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task=initial_task,
|
||||
max_loops=1
|
||||
)
|
||||
|
||||
# Result should contain some response
|
||||
assert result is not None
|
||||
assert len(str(result)) > 0
|
||||
|
||||
|
||||
def test_one_on_one_debate_produces_output():
|
||||
"""Test that debate executes and produces output"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
result = one_on_one_debate(
|
||||
agents=[agent1, agent2],
|
||||
task="What color is the sky?",
|
||||
max_loops=1
|
||||
)
|
||||
|
||||
# Debate should produce a result
|
||||
assert result is not None
|
||||
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_heavy_swarm_module_can_be_imported():
|
||||
"""Test that heavy_swarm module can be imported"""
|
||||
try:
|
||||
from swarms.structs import heavy_swarm
|
||||
assert heavy_swarm is not None
|
||||
except ImportError:
|
||||
pytest.skip("heavy_swarm module has import dependencies")
|
||||
|
||||
|
||||
def test_heavy_swarm_class_exists():
|
||||
"""Test that HeavySwarm class exists if module is available"""
|
||||
try:
|
||||
from swarms.structs.heavy_swarm import HeavySwarm
|
||||
assert HeavySwarm is not None
|
||||
except (ImportError, AttributeError):
|
||||
pytest.skip("HeavySwarm class not available or has dependencies")
|
||||
@ -0,0 +1,21 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_hierarchical_framework_module_can_be_imported():
|
||||
"""Test that hierarchical_structured_communication_framework module can be imported"""
|
||||
try:
|
||||
from swarms.structs import hierarchical_structured_communication_framework
|
||||
assert hierarchical_structured_communication_framework is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module has import dependencies")
|
||||
|
||||
|
||||
def test_hierarchical_framework_class_exists():
|
||||
"""Test that classes exist in hierarchical framework"""
|
||||
try:
|
||||
from swarms.structs.hierarchical_structured_communication_framework import (
|
||||
HierarchicalSwarmFramework
|
||||
)
|
||||
assert HierarchicalSwarmFramework is not None
|
||||
except (ImportError, AttributeError):
|
||||
pytest.skip("Classes not available or have dependencies")
|
||||
@ -0,0 +1,71 @@
|
||||
import pytest
|
||||
from swarms.structs.image_batch_processor import (
|
||||
ImageProcessingError,
|
||||
InvalidAgentError,
|
||||
)
|
||||
|
||||
|
||||
def test_image_processing_error_is_exception():
|
||||
"""Test that ImageProcessingError is an Exception subclass"""
|
||||
assert issubclass(ImageProcessingError, Exception)
|
||||
|
||||
|
||||
def test_invalid_agent_error_is_exception():
|
||||
"""Test that InvalidAgentError is an Exception subclass"""
|
||||
assert issubclass(InvalidAgentError, Exception)
|
||||
|
||||
|
||||
def test_image_processing_error_can_be_raised():
|
||||
"""Test that ImageProcessingError can be raised and caught"""
|
||||
with pytest.raises(ImageProcessingError, match="Image error"):
|
||||
raise ImageProcessingError("Image error")
|
||||
|
||||
|
||||
def test_invalid_agent_error_can_be_raised():
|
||||
"""Test that InvalidAgentError can be raised and caught"""
|
||||
with pytest.raises(InvalidAgentError, match="Agent error"):
|
||||
raise InvalidAgentError("Agent error")
|
||||
|
||||
|
||||
def test_image_processing_error_with_custom_message():
|
||||
"""Test ImageProcessingError with custom message"""
|
||||
error = ImageProcessingError("Failed to process image")
|
||||
assert str(error) == "Failed to process image"
|
||||
|
||||
|
||||
def test_invalid_agent_error_with_custom_message():
|
||||
"""Test InvalidAgentError with custom message"""
|
||||
error = InvalidAgentError("Invalid agent configuration")
|
||||
assert str(error) == "Invalid agent configuration"
|
||||
|
||||
|
||||
def test_image_processing_error_inheritance():
|
||||
"""Test ImageProcessingError inheritance"""
|
||||
error = ImageProcessingError("Test")
|
||||
assert isinstance(error, Exception)
|
||||
assert isinstance(error, ImageProcessingError)
|
||||
|
||||
|
||||
def test_invalid_agent_error_inheritance():
|
||||
"""Test InvalidAgentError inheritance"""
|
||||
error = InvalidAgentError("Test")
|
||||
assert isinstance(error, Exception)
|
||||
assert isinstance(error, InvalidAgentError)
|
||||
|
||||
|
||||
def test_image_processing_error_can_be_caught_as_exception():
|
||||
"""Test that ImageProcessingError can be caught as Exception"""
|
||||
try:
|
||||
raise ImageProcessingError("Test error")
|
||||
except Exception as e:
|
||||
assert isinstance(e, ImageProcessingError)
|
||||
assert str(e) == "Test error"
|
||||
|
||||
|
||||
def test_invalid_agent_error_can_be_caught_as_exception():
|
||||
"""Test that InvalidAgentError can be caught as Exception"""
|
||||
try:
|
||||
raise InvalidAgentError("Test error")
|
||||
except Exception as e:
|
||||
assert isinstance(e, InvalidAgentError)
|
||||
assert str(e) == "Test error"
|
||||
@ -0,0 +1,173 @@
|
||||
import pytest
|
||||
from swarms.structs.ma_blocks import (
|
||||
aggregator_agent_task_prompt,
|
||||
aggregate,
|
||||
run_agent,
|
||||
find_agent_by_name,
|
||||
)
|
||||
from swarms.structs.agent import Agent
|
||||
from swarms.structs.conversation import Conversation
|
||||
|
||||
|
||||
def create_test_agent(name: str, description: str = "Test agent") -> Agent:
|
||||
"""Create a real Agent instance for testing"""
|
||||
return Agent(
|
||||
agent_name=name,
|
||||
agent_description=description,
|
||||
system_prompt=f"You are {name}, a helpful test assistant. Keep responses brief.",
|
||||
model_name="gpt-4o-mini",
|
||||
max_loops=1,
|
||||
verbose=False,
|
||||
)
|
||||
|
||||
|
||||
def test_aggregator_agent_task_prompt():
|
||||
"""Test aggregator agent task prompt generation"""
|
||||
agent1 = create_test_agent("Agent1", "First test agent")
|
||||
agent2 = create_test_agent("Agent2", "Second test agent")
|
||||
|
||||
workers = [agent1, agent2]
|
||||
|
||||
conversation = Conversation()
|
||||
conversation.add(role="Agent1", content="Hello")
|
||||
conversation.add(role="Agent2", content="Hi")
|
||||
|
||||
result = aggregator_agent_task_prompt(
|
||||
task="Test task",
|
||||
workers=workers,
|
||||
conversation=conversation
|
||||
)
|
||||
|
||||
assert "Test task" in result
|
||||
assert "2" in result # Number of agents
|
||||
assert "Hello" in result or "Hi" in result
|
||||
|
||||
|
||||
def test_aggregate_missing_task_raises_error():
|
||||
"""Test that missing task raises ValueError"""
|
||||
agent = create_test_agent("TestAgent")
|
||||
with pytest.raises(ValueError, match="Task is required"):
|
||||
aggregate(workers=[agent], task=None)
|
||||
|
||||
|
||||
def test_aggregate_missing_workers_raises_error():
|
||||
"""Test that missing workers raises ValueError"""
|
||||
with pytest.raises(ValueError, match="Workers is required"):
|
||||
aggregate(workers=None, task="Test")
|
||||
|
||||
|
||||
def test_aggregate_workers_not_list_raises_error():
|
||||
"""Test that non-list workers raises ValueError"""
|
||||
agent = create_test_agent("TestAgent")
|
||||
with pytest.raises(ValueError, match="Workers must be a list"):
|
||||
aggregate(workers=agent, task="Test")
|
||||
|
||||
|
||||
def test_aggregate_workers_not_callable_raises_error():
|
||||
"""Test that non-callable workers raises ValueError"""
|
||||
with pytest.raises(ValueError, match="Workers must be a list of Callable"):
|
||||
aggregate(workers=["not", "callable"], task="Test")
|
||||
|
||||
|
||||
def test_run_agent_none_agent_raises_error():
|
||||
"""Test that None agent raises ValueError"""
|
||||
with pytest.raises(ValueError, match="Agent cannot be None"):
|
||||
run_agent(agent=None, task="Test")
|
||||
|
||||
|
||||
def test_run_agent_none_task_raises_error():
|
||||
"""Test that None task raises ValueError"""
|
||||
agent = create_test_agent("TestAgent")
|
||||
with pytest.raises(ValueError, match="Task cannot be None"):
|
||||
run_agent(agent=agent, task=None)
|
||||
|
||||
|
||||
def test_run_agent_not_agent_instance_raises_error():
|
||||
"""Test that non-Agent instance raises TypeError"""
|
||||
with pytest.raises(TypeError, match="Agent must be an instance of Agent"):
|
||||
run_agent(agent="not an agent", task="Test")
|
||||
|
||||
|
||||
def test_run_agent_success():
|
||||
"""Test successful agent run"""
|
||||
agent = create_test_agent("TestAgent")
|
||||
|
||||
result = run_agent(agent=agent, task="What is 2+2?")
|
||||
|
||||
assert result is not None
|
||||
assert len(str(result)) > 0
|
||||
|
||||
|
||||
def test_run_agent_with_kwargs():
|
||||
"""Test run_agent with additional kwargs"""
|
||||
agent = create_test_agent("TestAgent")
|
||||
|
||||
result = run_agent(
|
||||
agent=agent,
|
||||
task="Say hello"
|
||||
)
|
||||
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_find_agent_by_name_empty_list_raises_error():
|
||||
"""Test that empty agents list raises ValueError"""
|
||||
with pytest.raises(ValueError, match="Agents list cannot be empty"):
|
||||
find_agent_by_name(agents=[], agent_name="Test")
|
||||
|
||||
|
||||
def test_find_agent_by_name_non_string_raises_error():
|
||||
"""Test that non-string agent_name raises TypeError"""
|
||||
agent = create_test_agent("TestAgent")
|
||||
with pytest.raises(TypeError, match="Agent name must be a string"):
|
||||
find_agent_by_name(agents=[agent], agent_name=123)
|
||||
|
||||
|
||||
def test_find_agent_by_name_empty_string_raises_error():
|
||||
"""Test that empty agent_name raises ValueError"""
|
||||
agent = create_test_agent("TestAgent")
|
||||
with pytest.raises(ValueError, match="Agent name cannot be empty"):
|
||||
find_agent_by_name(agents=[agent], agent_name=" ")
|
||||
|
||||
|
||||
def test_find_agent_by_name_success():
|
||||
"""Test successful agent finding by name"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
# Note: find_agent_by_name looks for 'name' attribute, not 'agent_name'
|
||||
agent1.name = "Agent1"
|
||||
agent2.name = "Agent2"
|
||||
|
||||
result = find_agent_by_name(
|
||||
agents=[agent1, agent2],
|
||||
agent_name="Agent2"
|
||||
)
|
||||
|
||||
assert result == agent2
|
||||
|
||||
|
||||
def test_find_agent_by_name_not_found_raises_error():
|
||||
"""Test that agent not found raises RuntimeError"""
|
||||
agent = create_test_agent("Agent1")
|
||||
agent.name = "Agent1"
|
||||
|
||||
with pytest.raises(RuntimeError, match="Error finding agent"):
|
||||
find_agent_by_name(agents=[agent], agent_name="NonExistent")
|
||||
|
||||
|
||||
def test_find_agent_by_name_agent_with_name_attribute():
|
||||
"""Test finding agent when agent has name attribute"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("TargetAgent")
|
||||
|
||||
# Set the name attribute that find_agent_by_name looks for
|
||||
agent1.name = "Agent1"
|
||||
agent2.name = "TargetAgent"
|
||||
|
||||
result = find_agent_by_name(
|
||||
agents=[agent1, agent2],
|
||||
agent_name="TargetAgent"
|
||||
)
|
||||
|
||||
assert result == agent2
|
||||
@ -0,0 +1,174 @@
|
||||
import pytest
|
||||
from swarms.structs.ma_utils import (
|
||||
list_all_agents,
|
||||
set_random_models_for_agents,
|
||||
create_agent_map,
|
||||
)
|
||||
from swarms.structs.agent import Agent
|
||||
from swarms.structs.conversation import Conversation
|
||||
|
||||
|
||||
def create_test_agent(name: str, description: str = "Test agent") -> Agent:
|
||||
"""Create a real Agent instance for testing"""
|
||||
return Agent(
|
||||
agent_name=name,
|
||||
agent_description=description,
|
||||
system_prompt=f"You are {name}, a helpful test assistant.",
|
||||
model_name="gpt-4o-mini",
|
||||
max_loops=1,
|
||||
verbose=False,
|
||||
)
|
||||
|
||||
|
||||
def test_list_all_agents_basic():
|
||||
"""Test basic listing of agents"""
|
||||
agent1 = create_test_agent("Agent1", "First agent")
|
||||
agent2 = create_test_agent("Agent2", "Second agent")
|
||||
|
||||
result = list_all_agents([agent1, agent2], name="Test Team")
|
||||
|
||||
assert "Test Team" in result
|
||||
assert "Total Agents: 2" in result
|
||||
assert "Agent1" in result
|
||||
assert "Agent2" in result
|
||||
|
||||
|
||||
def test_list_all_agents_with_description():
|
||||
"""Test listing agents with team description"""
|
||||
agent = create_test_agent("TestAgent", "Test description")
|
||||
|
||||
result = list_all_agents(
|
||||
[agent],
|
||||
name="My Team",
|
||||
description="A great team"
|
||||
)
|
||||
|
||||
assert "My Team" in result
|
||||
assert "A great team" in result
|
||||
|
||||
|
||||
def test_list_all_agents_with_conversation():
|
||||
"""Test adding agents to conversation"""
|
||||
agent = create_test_agent("Agent", "Desc")
|
||||
|
||||
conversation = Conversation()
|
||||
|
||||
result = list_all_agents(
|
||||
[agent],
|
||||
conversation=conversation,
|
||||
add_to_conversation=True
|
||||
)
|
||||
|
||||
assert result is None
|
||||
# Conversation should have content added
|
||||
assert len(conversation.conversation_history) > 0
|
||||
|
||||
|
||||
def test_list_all_agents_fallback_to_name():
|
||||
"""Test that agent name uses agent_name attribute"""
|
||||
agent = create_test_agent("TestName", "Test description")
|
||||
|
||||
result = list_all_agents([agent])
|
||||
assert "TestName" in result
|
||||
|
||||
|
||||
def test_list_all_agents_fallback_to_system_prompt():
|
||||
"""Test that description uses agent_description"""
|
||||
agent = create_test_agent("Agent", "Agent description here")
|
||||
|
||||
result = list_all_agents([agent])
|
||||
assert "Agent" in result
|
||||
|
||||
|
||||
def test_set_random_models_for_agents_with_none():
|
||||
"""Test setting random model when agents is None"""
|
||||
result = set_random_models_for_agents(agents=None)
|
||||
assert isinstance(result, str)
|
||||
assert len(result) > 0
|
||||
|
||||
|
||||
def test_set_random_models_for_agents_with_list():
|
||||
"""Test setting random models for list of agents"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
agents = [agent1, agent2]
|
||||
|
||||
result = set_random_models_for_agents(agents=agents)
|
||||
|
||||
assert result == agents
|
||||
assert hasattr(agent1, 'model_name')
|
||||
assert hasattr(agent2, 'model_name')
|
||||
|
||||
|
||||
def test_set_random_models_for_agents_with_single_agent():
|
||||
"""Test setting random model for single agent"""
|
||||
agent = create_test_agent("SingleAgent")
|
||||
|
||||
result = set_random_models_for_agents(agents=agent)
|
||||
|
||||
assert result == agent
|
||||
assert hasattr(agent, 'model_name')
|
||||
|
||||
|
||||
def test_set_random_models_for_agents_custom_models():
|
||||
"""Test setting random models with custom model list"""
|
||||
agent = create_test_agent("CustomAgent")
|
||||
custom_models = ["model1", "model2", "model3"]
|
||||
|
||||
result = set_random_models_for_agents(agents=agent, model_names=custom_models)
|
||||
|
||||
assert hasattr(agent, 'model_name')
|
||||
assert agent.model_name in custom_models
|
||||
|
||||
|
||||
def test_create_agent_map_basic():
|
||||
"""Test creating agent map with basic agents"""
|
||||
agent1 = create_test_agent("Agent1")
|
||||
agent2 = create_test_agent("Agent2")
|
||||
|
||||
result = create_agent_map([agent1, agent2])
|
||||
|
||||
assert "Agent1" in result
|
||||
assert "Agent2" in result
|
||||
assert result["Agent1"] == agent1
|
||||
assert result["Agent2"] == agent2
|
||||
|
||||
|
||||
def test_create_agent_map_with_real_agents():
|
||||
"""Test creating agent map with real Agent instances"""
|
||||
agent1 = create_test_agent("RealAgent1")
|
||||
agent2 = create_test_agent("RealAgent2")
|
||||
|
||||
result = create_agent_map([agent1, agent2])
|
||||
|
||||
assert "RealAgent1" in result
|
||||
assert "RealAgent2" in result
|
||||
assert result["RealAgent1"] == agent1
|
||||
assert result["RealAgent2"] == agent2
|
||||
|
||||
|
||||
def test_create_agent_map_empty_raises_error():
|
||||
"""Test that empty agent list raises ValueError"""
|
||||
with pytest.raises(ValueError, match="Agents list cannot be empty"):
|
||||
create_agent_map([])
|
||||
|
||||
|
||||
def test_create_agent_map_caching():
|
||||
"""Test that agent map is cached for identical inputs"""
|
||||
agent = create_test_agent("CachedAgent")
|
||||
|
||||
agents = [agent]
|
||||
result1 = create_agent_map(agents)
|
||||
result2 = create_agent_map(agents)
|
||||
|
||||
# Should return the same cached result
|
||||
assert result1 == result2
|
||||
|
||||
|
||||
def test_list_all_agents_no_collaboration_prompt():
|
||||
"""Test list_all_agents without collaboration prompt"""
|
||||
agent = create_test_agent("Agent", "Description")
|
||||
|
||||
result = list_all_agents([agent], add_collaboration_prompt=False)
|
||||
|
||||
assert "Agent" in result
|
||||
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_multi_agent_debates_module_can_be_imported():
|
||||
"""Test that multi_agent_debates module can be imported"""
|
||||
try:
|
||||
from swarms.structs import multi_agent_debates
|
||||
assert multi_agent_debates is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module has import dependencies")
|
||||
|
||||
|
||||
def test_multi_agent_debates_class_exists():
|
||||
"""Test that MultiAgentDebate class exists"""
|
||||
try:
|
||||
from swarms.structs.multi_agent_debates import MultiAgentDebate
|
||||
assert MultiAgentDebate is not None
|
||||
except (ImportError, AttributeError):
|
||||
pytest.skip("Class not available or has dependencies")
|
||||
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_multi_model_gpu_manager_module_can_be_imported():
|
||||
"""Test that multi_model_gpu_manager module can be imported"""
|
||||
try:
|
||||
from swarms.structs import multi_model_gpu_manager
|
||||
assert multi_model_gpu_manager is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module has import dependencies or GPU requirements")
|
||||
|
||||
|
||||
def test_multi_model_gpu_manager_class_exists():
|
||||
"""Test that MultiModelGPUManager class exists"""
|
||||
try:
|
||||
from swarms.structs.multi_model_gpu_manager import MultiModelGPUManager
|
||||
assert MultiModelGPUManager is not None
|
||||
except (ImportError, AttributeError):
|
||||
pytest.skip("Class not available or has GPU dependencies")
|
||||
@ -0,0 +1,82 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_heavy_swarm_module_imports():
|
||||
"""Test that heavy_swarm module can be imported"""
|
||||
try:
|
||||
from swarms.structs import heavy_swarm
|
||||
assert heavy_swarm is not None
|
||||
except ImportError:
|
||||
pytest.skip("heavy_swarm module not found or contains import errors")
|
||||
|
||||
|
||||
def test_hierarchical_structured_communication_framework_module_imports():
|
||||
"""Test that hierarchical_structured_communication_framework module can be imported"""
|
||||
try:
|
||||
from swarms.structs import hierarchical_structured_communication_framework
|
||||
assert hierarchical_structured_communication_framework is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module not found or contains import errors")
|
||||
|
||||
|
||||
def test_multi_agent_debates_module_imports():
|
||||
"""Test that multi_agent_debates module can be imported"""
|
||||
try:
|
||||
from swarms.structs import multi_agent_debates
|
||||
assert multi_agent_debates is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module not found or contains import errors")
|
||||
|
||||
|
||||
def test_multi_model_gpu_manager_module_imports():
|
||||
"""Test that multi_model_gpu_manager module can be imported"""
|
||||
try:
|
||||
from swarms.structs import multi_model_gpu_manager
|
||||
assert multi_model_gpu_manager is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module not found or contains import errors")
|
||||
|
||||
|
||||
def test_social_algorithms_module_imports():
|
||||
"""Test that social_algorithms module can be imported"""
|
||||
try:
|
||||
from swarms.structs import social_algorithms
|
||||
assert social_algorithms is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module not found or contains import errors")
|
||||
|
||||
|
||||
def test_swarm_templates_module_imports():
|
||||
"""Test that swarm_templates module can be imported"""
|
||||
try:
|
||||
from swarms.structs import swarm_templates
|
||||
assert swarm_templates is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module not found or contains import errors")
|
||||
|
||||
|
||||
def test_swarming_architectures_module_imports():
|
||||
"""Test that swarming_architectures module can be imported"""
|
||||
try:
|
||||
from swarms.structs import swarming_architectures
|
||||
assert swarming_architectures is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module not found or contains import errors")
|
||||
|
||||
|
||||
def test_various_alt_swarms_module_imports():
|
||||
"""Test that various_alt_swarms module can be imported"""
|
||||
try:
|
||||
from swarms.structs import various_alt_swarms
|
||||
assert various_alt_swarms is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module not found or contains import errors")
|
||||
|
||||
|
||||
def test_modules_contain_classes_placeholder():
|
||||
"""
|
||||
Placeholder test noting these modules primarily contain class definitions.
|
||||
Class-based tests require more complex setup with mocking and instance creation.
|
||||
Future work: Add comprehensive class-based tests.
|
||||
"""
|
||||
assert True
|
||||
@ -0,0 +1,328 @@
|
||||
import pytest
|
||||
import json
|
||||
import os
|
||||
import tempfile
|
||||
from datetime import datetime
|
||||
from uuid import UUID, uuid4
|
||||
from swarms.structs.safe_loading import (
|
||||
SafeLoaderUtils,
|
||||
SafeStateManager,
|
||||
)
|
||||
|
||||
|
||||
# Test SafeLoaderUtils.is_class_instance
|
||||
def test_is_class_instance_with_custom_class():
|
||||
"""Test that is_class_instance detects custom class instances"""
|
||||
class CustomClass:
|
||||
def __init__(self):
|
||||
self.value = 42
|
||||
|
||||
obj = CustomClass()
|
||||
assert SafeLoaderUtils.is_class_instance(obj) is True
|
||||
|
||||
|
||||
def test_is_class_instance_with_none():
|
||||
"""Test that is_class_instance returns False for None"""
|
||||
assert SafeLoaderUtils.is_class_instance(None) is False
|
||||
|
||||
|
||||
def test_is_class_instance_with_builtin_types():
|
||||
"""Test that is_class_instance returns False for built-in types"""
|
||||
assert SafeLoaderUtils.is_class_instance(42) is False
|
||||
assert SafeLoaderUtils.is_class_instance("string") is False
|
||||
assert SafeLoaderUtils.is_class_instance([1, 2, 3]) is False
|
||||
assert SafeLoaderUtils.is_class_instance({"key": "value"}) is False
|
||||
assert SafeLoaderUtils.is_class_instance(True) is False
|
||||
|
||||
|
||||
def test_is_class_instance_with_class_itself():
|
||||
"""Test that is_class_instance returns False for class itself"""
|
||||
class CustomClass:
|
||||
pass
|
||||
|
||||
assert SafeLoaderUtils.is_class_instance(CustomClass) is False
|
||||
|
||||
|
||||
# Test SafeLoaderUtils.is_safe_type
|
||||
def test_is_safe_type_with_basic_types():
|
||||
"""Test that is_safe_type returns True for basic safe types"""
|
||||
assert SafeLoaderUtils.is_safe_type(None) is True
|
||||
assert SafeLoaderUtils.is_safe_type(True) is True
|
||||
assert SafeLoaderUtils.is_safe_type(42) is True
|
||||
assert SafeLoaderUtils.is_safe_type(3.14) is True
|
||||
assert SafeLoaderUtils.is_safe_type("string") is True
|
||||
|
||||
|
||||
def test_is_safe_type_with_datetime():
|
||||
"""Test that is_safe_type returns True for datetime"""
|
||||
dt = datetime.now()
|
||||
assert SafeLoaderUtils.is_safe_type(dt) is True
|
||||
|
||||
|
||||
def test_is_safe_type_with_uuid():
|
||||
"""Test that is_safe_type returns True for UUID"""
|
||||
uid = uuid4()
|
||||
assert SafeLoaderUtils.is_safe_type(uid) is True
|
||||
|
||||
|
||||
def test_is_safe_type_with_safe_list():
|
||||
"""Test that is_safe_type returns True for list of safe types"""
|
||||
assert SafeLoaderUtils.is_safe_type([1, 2, 3]) is True
|
||||
assert SafeLoaderUtils.is_safe_type(["a", "b", "c"]) is True
|
||||
|
||||
|
||||
def test_is_safe_type_with_unsafe_list():
|
||||
"""Test that is_safe_type returns False for list with unsafe types"""
|
||||
class CustomClass:
|
||||
pass
|
||||
|
||||
assert SafeLoaderUtils.is_safe_type([CustomClass()]) is False
|
||||
|
||||
|
||||
def test_is_safe_type_with_safe_dict():
|
||||
"""Test that is_safe_type returns True for dict with safe types"""
|
||||
assert SafeLoaderUtils.is_safe_type({"key": "value"}) is True
|
||||
assert SafeLoaderUtils.is_safe_type({"num": 42, "str": "hello"}) is True
|
||||
|
||||
|
||||
def test_is_safe_type_with_unsafe_dict():
|
||||
"""Test that is_safe_type returns False for dict with unsafe types"""
|
||||
class CustomClass:
|
||||
pass
|
||||
|
||||
assert SafeLoaderUtils.is_safe_type({"obj": CustomClass()}) is False
|
||||
|
||||
|
||||
def test_is_safe_type_with_non_string_dict_keys():
|
||||
"""Test that is_safe_type returns False for dict with non-string keys"""
|
||||
assert SafeLoaderUtils.is_safe_type({1: "value"}) is False
|
||||
|
||||
|
||||
# Test SafeLoaderUtils.get_class_attributes
|
||||
def test_get_class_attributes_basic():
|
||||
"""Test that get_class_attributes returns all attributes"""
|
||||
class TestClass:
|
||||
class_var = "class"
|
||||
|
||||
def __init__(self):
|
||||
self.instance_var = "instance"
|
||||
|
||||
obj = TestClass()
|
||||
attrs = SafeLoaderUtils.get_class_attributes(obj)
|
||||
assert "class_var" in attrs
|
||||
assert "instance_var" in attrs
|
||||
|
||||
|
||||
def test_get_class_attributes_inheritance():
|
||||
"""Test that get_class_attributes includes inherited attributes"""
|
||||
class Parent:
|
||||
parent_var = "parent"
|
||||
|
||||
class Child(Parent):
|
||||
child_var = "child"
|
||||
|
||||
def __init__(self):
|
||||
self.instance_var = "instance"
|
||||
|
||||
obj = Child()
|
||||
attrs = SafeLoaderUtils.get_class_attributes(obj)
|
||||
assert "parent_var" in attrs
|
||||
assert "child_var" in attrs
|
||||
assert "instance_var" in attrs
|
||||
|
||||
|
||||
# Test SafeLoaderUtils.create_state_dict
|
||||
def test_create_state_dict_basic():
|
||||
"""Test that create_state_dict creates dict of safe values"""
|
||||
class TestClass:
|
||||
def __init__(self):
|
||||
self.safe_value = 42
|
||||
self.safe_string = "hello"
|
||||
self._private = "private"
|
||||
|
||||
obj = TestClass()
|
||||
state = SafeLoaderUtils.create_state_dict(obj)
|
||||
assert state["safe_value"] == 42
|
||||
assert state["safe_string"] == "hello"
|
||||
assert "_private" not in state
|
||||
|
||||
|
||||
def test_create_state_dict_skips_unsafe():
|
||||
"""Test that create_state_dict skips unsafe types"""
|
||||
class Inner:
|
||||
pass
|
||||
|
||||
class TestClass:
|
||||
def __init__(self):
|
||||
self.safe = 42
|
||||
self.unsafe = Inner()
|
||||
|
||||
obj = TestClass()
|
||||
state = SafeLoaderUtils.create_state_dict(obj)
|
||||
assert "safe" in state
|
||||
assert "unsafe" not in state
|
||||
|
||||
|
||||
# Test SafeLoaderUtils.preserve_instances
|
||||
def test_preserve_instances_basic():
|
||||
"""Test that preserve_instances preserves class instances"""
|
||||
class Inner:
|
||||
def __init__(self):
|
||||
self.value = 100
|
||||
|
||||
class Outer:
|
||||
def __init__(self):
|
||||
self.safe = 42
|
||||
self.instance = Inner()
|
||||
|
||||
obj = Outer()
|
||||
preserved = SafeLoaderUtils.preserve_instances(obj)
|
||||
assert "instance" in preserved
|
||||
assert isinstance(preserved["instance"], Inner)
|
||||
assert "safe" not in preserved
|
||||
|
||||
|
||||
def test_preserve_instances_skips_private():
|
||||
"""Test that preserve_instances skips private attributes"""
|
||||
class Inner:
|
||||
pass
|
||||
|
||||
class Outer:
|
||||
def __init__(self):
|
||||
self._private_instance = Inner()
|
||||
self.public_instance = Inner()
|
||||
|
||||
obj = Outer()
|
||||
preserved = SafeLoaderUtils.preserve_instances(obj)
|
||||
assert "_private_instance" not in preserved
|
||||
assert "public_instance" in preserved
|
||||
|
||||
|
||||
# Test SafeStateManager.save_state and load_state
|
||||
def test_save_and_load_state():
|
||||
"""Test that save_state and load_state work correctly"""
|
||||
class TestClass:
|
||||
def __init__(self):
|
||||
self.value = 42
|
||||
self.text = "hello"
|
||||
|
||||
obj = TestClass()
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
file_path = os.path.join(tmpdir, "state.json")
|
||||
|
||||
# Save state
|
||||
SafeStateManager.save_state(obj, file_path)
|
||||
|
||||
# Verify file exists
|
||||
assert os.path.exists(file_path)
|
||||
|
||||
# Load state into new object
|
||||
new_obj = TestClass()
|
||||
new_obj.value = 0 # Change value to test loading
|
||||
new_obj.text = ""
|
||||
|
||||
SafeStateManager.load_state(new_obj, file_path)
|
||||
|
||||
assert new_obj.value == 42
|
||||
assert new_obj.text == "hello"
|
||||
|
||||
|
||||
def test_save_state_creates_directory():
|
||||
"""Test that save_state creates directory if it doesn't exist"""
|
||||
class TestClass:
|
||||
def __init__(self):
|
||||
self.value = 42
|
||||
|
||||
obj = TestClass()
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
file_path = os.path.join(tmpdir, "subdir", "state.json")
|
||||
|
||||
SafeStateManager.save_state(obj, file_path)
|
||||
|
||||
assert os.path.exists(file_path)
|
||||
|
||||
|
||||
def test_load_state_preserves_instances():
|
||||
"""Test that load_state preserves existing class instances"""
|
||||
class Inner:
|
||||
def __init__(self, val):
|
||||
self.val = val
|
||||
|
||||
class Outer:
|
||||
def __init__(self):
|
||||
self.safe = 42
|
||||
self.instance = Inner(100)
|
||||
|
||||
obj = Outer()
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
file_path = os.path.join(tmpdir, "state.json")
|
||||
|
||||
# Save state
|
||||
SafeStateManager.save_state(obj, file_path)
|
||||
|
||||
# Create new object with different values
|
||||
new_obj = Outer()
|
||||
new_obj.safe = 0
|
||||
original_instance = new_obj.instance
|
||||
|
||||
# Load state
|
||||
SafeStateManager.load_state(new_obj, file_path)
|
||||
|
||||
# Safe value should be updated
|
||||
assert new_obj.safe == 42
|
||||
|
||||
# Instance should be preserved (same object)
|
||||
assert new_obj.instance is original_instance
|
||||
assert new_obj.instance.val == 100
|
||||
|
||||
|
||||
def test_load_state_file_not_found():
|
||||
"""Test that load_state raises FileNotFoundError for missing file"""
|
||||
class TestClass:
|
||||
pass
|
||||
|
||||
obj = TestClass()
|
||||
|
||||
with pytest.raises(FileNotFoundError, match="State file not found"):
|
||||
SafeStateManager.load_state(obj, "/nonexistent/path.json")
|
||||
|
||||
|
||||
def test_save_state_with_datetime():
|
||||
"""Test that save_state handles datetime objects"""
|
||||
class TestClass:
|
||||
def __init__(self):
|
||||
self.created_at = datetime(2024, 1, 1, 12, 0, 0)
|
||||
|
||||
obj = TestClass()
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
file_path = os.path.join(tmpdir, "state.json")
|
||||
|
||||
# Should not raise an error
|
||||
SafeStateManager.save_state(obj, file_path)
|
||||
assert os.path.exists(file_path)
|
||||
|
||||
|
||||
def test_save_state_with_uuid():
|
||||
"""Test that save_state handles UUID objects"""
|
||||
class TestClass:
|
||||
def __init__(self):
|
||||
self.id = uuid4()
|
||||
|
||||
obj = TestClass()
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
file_path = os.path.join(tmpdir, "state.json")
|
||||
|
||||
# Should not raise an error
|
||||
SafeStateManager.save_state(obj, file_path)
|
||||
assert os.path.exists(file_path)
|
||||
|
||||
|
||||
def test_is_safe_type_with_tuple():
|
||||
"""Test that is_safe_type returns True for tuple of safe types"""
|
||||
assert SafeLoaderUtils.is_safe_type((1, 2, 3)) is True
|
||||
assert SafeLoaderUtils.is_safe_type(("a", "b")) is True
|
||||
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_social_algorithms_module_can_be_imported():
|
||||
"""Test that social_algorithms module can be imported"""
|
||||
try:
|
||||
from swarms.structs import social_algorithms
|
||||
assert social_algorithms is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module has import dependencies")
|
||||
|
||||
|
||||
def test_social_algorithms_classes_exist():
|
||||
"""Test that social algorithm classes exist"""
|
||||
try:
|
||||
from swarms.structs.social_algorithms import SocialSwarm
|
||||
assert SocialSwarm is not None
|
||||
except (ImportError, AttributeError):
|
||||
pytest.skip("Classes not available or have dependencies")
|
||||
@ -0,0 +1,194 @@
|
||||
import pytest
|
||||
from swarms.structs.stopping_conditions import (
|
||||
check_done,
|
||||
check_finished,
|
||||
check_complete,
|
||||
check_success,
|
||||
check_failure,
|
||||
check_error,
|
||||
check_stopped,
|
||||
check_cancelled,
|
||||
check_exit,
|
||||
check_end,
|
||||
check_stopping_conditions,
|
||||
)
|
||||
|
||||
|
||||
def test_check_done_true():
|
||||
"""Test check_done returns True when <DONE> is in string"""
|
||||
assert check_done("Task is <DONE>") is True
|
||||
|
||||
|
||||
def test_check_done_false():
|
||||
"""Test check_done returns False when <DONE> is not in string"""
|
||||
assert check_done("Task in progress") is False
|
||||
|
||||
|
||||
def test_check_finished_true():
|
||||
"""Test check_finished returns True when 'finished' is in string"""
|
||||
assert check_finished("Task finished successfully") is True
|
||||
|
||||
|
||||
def test_check_finished_false():
|
||||
"""Test check_finished returns False when 'finished' is not in string"""
|
||||
assert check_finished("Task in progress") is False
|
||||
|
||||
|
||||
def test_check_complete_true():
|
||||
"""Test check_complete returns True when 'complete' is in string"""
|
||||
assert check_complete("Task is complete") is True
|
||||
|
||||
|
||||
def test_check_complete_false():
|
||||
"""Test check_complete returns False when 'complete' is not in string"""
|
||||
assert check_complete("Task in progress") is False
|
||||
|
||||
|
||||
def test_check_success_true():
|
||||
"""Test check_success returns True when 'success' is in string"""
|
||||
assert check_success("Task success") is True
|
||||
|
||||
|
||||
def test_check_success_false():
|
||||
"""Test check_success returns False when 'success' is not in string"""
|
||||
assert check_success("Task failed") is False
|
||||
|
||||
|
||||
def test_check_failure_true():
|
||||
"""Test check_failure returns True when 'failure' is in string"""
|
||||
assert check_failure("Task failure detected") is True
|
||||
|
||||
|
||||
def test_check_failure_false():
|
||||
"""Test check_failure returns False when 'failure' is not in string"""
|
||||
assert check_failure("Task succeeded") is False
|
||||
|
||||
|
||||
def test_check_error_true():
|
||||
"""Test check_error returns True when 'error' is in string"""
|
||||
assert check_error("An error occurred") is True
|
||||
|
||||
|
||||
def test_check_error_false():
|
||||
"""Test check_error returns False when 'error' is not in string"""
|
||||
assert check_error("Everything is fine") is False
|
||||
|
||||
|
||||
def test_check_stopped_true():
|
||||
"""Test check_stopped returns True when 'stopped' is in string"""
|
||||
assert check_stopped("Task was stopped") is True
|
||||
|
||||
|
||||
def test_check_stopped_false():
|
||||
"""Test check_stopped returns False when 'stopped' is not in string"""
|
||||
assert check_stopped("Task is running") is False
|
||||
|
||||
|
||||
def test_check_cancelled_true():
|
||||
"""Test check_cancelled returns True when 'cancelled' is in string"""
|
||||
assert check_cancelled("Task cancelled by user") is True
|
||||
|
||||
|
||||
def test_check_cancelled_false():
|
||||
"""Test check_cancelled returns False when 'cancelled' is not in string"""
|
||||
assert check_cancelled("Task is running") is False
|
||||
|
||||
|
||||
def test_check_exit_true():
|
||||
"""Test check_exit returns True when 'exit' is in string"""
|
||||
assert check_exit("Program will exit") is True
|
||||
|
||||
|
||||
def test_check_exit_false():
|
||||
"""Test check_exit returns False when 'exit' is not in string"""
|
||||
assert check_exit("Task is running") is False
|
||||
|
||||
|
||||
def test_check_end_true():
|
||||
"""Test check_end returns True when 'end' is in string"""
|
||||
assert check_end("This is the end") is True
|
||||
|
||||
|
||||
def test_check_end_false():
|
||||
"""Test check_end returns False when 'end' is not in string"""
|
||||
assert check_end("Task is running") is False
|
||||
|
||||
|
||||
def test_check_stopping_conditions_done():
|
||||
"""Test check_stopping_conditions returns correct message for done"""
|
||||
result = check_stopping_conditions("Task is <DONE>")
|
||||
assert result == "Task is done"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_finished():
|
||||
"""Test check_stopping_conditions returns correct message for finished"""
|
||||
result = check_stopping_conditions("Task finished successfully")
|
||||
assert result == "Task is finished"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_complete():
|
||||
"""Test check_stopping_conditions returns correct message for complete"""
|
||||
result = check_stopping_conditions("Task is complete")
|
||||
assert result == "Task is complete"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_success():
|
||||
"""Test check_stopping_conditions returns correct message for success"""
|
||||
result = check_stopping_conditions("Task success")
|
||||
assert result == "Task succeeded"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_failure():
|
||||
"""Test check_stopping_conditions returns correct message for failure"""
|
||||
result = check_stopping_conditions("Task failure")
|
||||
assert result == "Task failed"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_error():
|
||||
"""Test check_stopping_conditions returns correct message for error"""
|
||||
result = check_stopping_conditions("An error occurred")
|
||||
assert result == "Task encountered an error"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_stopped():
|
||||
"""Test check_stopping_conditions returns correct message for stopped"""
|
||||
result = check_stopping_conditions("Task was stopped")
|
||||
assert result == "Task was stopped"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_cancelled():
|
||||
"""Test check_stopping_conditions returns correct message for cancelled"""
|
||||
result = check_stopping_conditions("Task was cancelled")
|
||||
assert result == "Task was cancelled"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_exit():
|
||||
"""Test check_stopping_conditions returns correct message for exit"""
|
||||
result = check_stopping_conditions("Program will exit")
|
||||
assert result == "Task exited"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_end():
|
||||
"""Test check_stopping_conditions returns correct message for end"""
|
||||
result = check_stopping_conditions("This is the end")
|
||||
assert result == "Task ended"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_none():
|
||||
"""Test check_stopping_conditions returns None when no condition is met"""
|
||||
result = check_stopping_conditions("Task is running normally")
|
||||
assert result is None
|
||||
|
||||
|
||||
def test_check_stopping_conditions_priority():
|
||||
"""Test that check_stopping_conditions returns first matching condition"""
|
||||
# 'finished' appears before other conditions in the list, so it should match first
|
||||
result = check_stopping_conditions("Task is finished and complete")
|
||||
assert result == "Task is finished"
|
||||
|
||||
|
||||
def test_check_stopping_conditions_case_sensitive():
|
||||
"""Test that all checks are case-sensitive"""
|
||||
assert check_done("DONE") is False # Should be <DONE>
|
||||
assert check_finished("FINISHED") is False # lowercase 'finished' required
|
||||
assert check_complete("COMPLETE") is False # lowercase 'complete' required
|
||||
@ -0,0 +1,43 @@
|
||||
import pytest
|
||||
from swarms.structs.swarm_id import swarm_id
|
||||
|
||||
|
||||
def test_swarm_id_returns_string():
|
||||
"""Test that swarm_id returns a string"""
|
||||
result = swarm_id()
|
||||
assert isinstance(result, str)
|
||||
|
||||
|
||||
def test_swarm_id_starts_with_swarm():
|
||||
"""Test that swarm_id starts with 'swarm-'"""
|
||||
result = swarm_id()
|
||||
assert result.startswith("swarm-")
|
||||
|
||||
|
||||
def test_swarm_id_has_correct_format():
|
||||
"""Test that swarm_id has correct format (swarm-{hex})"""
|
||||
result = swarm_id()
|
||||
parts = result.split("-", 1)
|
||||
assert len(parts) == 2
|
||||
assert parts[0] == "swarm"
|
||||
assert len(parts[1]) == 32 # UUID4 hex is 32 characters
|
||||
|
||||
|
||||
def test_swarm_id_is_unique():
|
||||
"""Test that swarm_id generates unique IDs"""
|
||||
ids = [swarm_id() for _ in range(100)]
|
||||
assert len(ids) == len(set(ids))
|
||||
|
||||
|
||||
def test_swarm_id_hex_characters():
|
||||
"""Test that the hex part contains only valid hex characters"""
|
||||
result = swarm_id()
|
||||
hex_part = result.split("-", 1)[1]
|
||||
assert all(c in "0123456789abcdef" for c in hex_part)
|
||||
|
||||
|
||||
def test_swarm_id_no_hyphens_in_hex():
|
||||
"""Test that hex part has no hyphens (uuid4().hex strips them)"""
|
||||
result = swarm_id()
|
||||
hex_part = result.split("-", 1)[1]
|
||||
assert "-" not in hex_part
|
||||
@ -0,0 +1,140 @@
|
||||
import pytest
|
||||
from swarms.structs.swarm_rearrange import swarm_arrange
|
||||
from swarms.structs.agent import Agent
|
||||
from swarms.structs.swarm_router import SwarmRouter
|
||||
|
||||
|
||||
def create_test_agent(name: str, description: str = "Test agent") -> Agent:
|
||||
"""Create a real Agent instance for testing"""
|
||||
return Agent(
|
||||
agent_name=name,
|
||||
agent_description=description,
|
||||
system_prompt=f"You are {name}, a helpful test assistant. Keep responses brief.",
|
||||
model_name="gpt-4o-mini",
|
||||
max_loops=1,
|
||||
verbose=False,
|
||||
)
|
||||
|
||||
|
||||
def create_test_swarm(name: str) -> SwarmRouter:
|
||||
"""Create a real SwarmRouter instance for testing"""
|
||||
agent = create_test_agent(f"{name}_agent")
|
||||
return SwarmRouter(
|
||||
name=name,
|
||||
description=f"Test swarm {name}",
|
||||
agents=[agent],
|
||||
swarm_type="SequentialWorkflow",
|
||||
max_loops=1,
|
||||
)
|
||||
|
||||
|
||||
def test_swarm_arrange_with_none_swarms():
|
||||
"""Test swarm_arrange with None swarms parameter"""
|
||||
result = swarm_arrange(
|
||||
name="Test",
|
||||
swarms=None,
|
||||
flow="A->B",
|
||||
task="Test task"
|
||||
)
|
||||
# Should handle None swarms gracefully
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_swarm_arrange_returns_string():
|
||||
"""Test that swarm_arrange returns a string"""
|
||||
swarm = create_test_swarm("SwarmA")
|
||||
|
||||
result = swarm_arrange(
|
||||
name="TestArrange",
|
||||
swarms=[swarm],
|
||||
flow="SwarmA",
|
||||
task="What is 2+2?"
|
||||
)
|
||||
assert isinstance(result, str)
|
||||
|
||||
|
||||
def test_swarm_arrange_with_empty_swarms_list():
|
||||
"""Test swarm_arrange with empty swarms list"""
|
||||
result = swarm_arrange(
|
||||
name="Test",
|
||||
swarms=[],
|
||||
flow="A->B",
|
||||
task="Test task"
|
||||
)
|
||||
# Should handle empty swarms
|
||||
assert isinstance(result, str)
|
||||
|
||||
|
||||
def test_swarm_arrange_with_custom_name():
|
||||
"""Test swarm_arrange with custom name"""
|
||||
swarm = create_test_swarm("SwarmA")
|
||||
|
||||
result = swarm_arrange(
|
||||
name="CustomName",
|
||||
description="Custom description",
|
||||
swarms=[swarm],
|
||||
flow="SwarmA",
|
||||
task="Say hello"
|
||||
)
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_swarm_arrange_with_json_output_type():
|
||||
"""Test swarm_arrange with json output type"""
|
||||
swarm = create_test_swarm("SwarmA")
|
||||
|
||||
result = swarm_arrange(
|
||||
name="Test",
|
||||
swarms=[swarm],
|
||||
output_type="json",
|
||||
flow="SwarmA",
|
||||
task="What is 1+1?"
|
||||
)
|
||||
assert isinstance(result, str)
|
||||
|
||||
|
||||
def test_swarm_arrange_with_default_parameters():
|
||||
"""Test swarm_arrange with mostly default parameters"""
|
||||
result = swarm_arrange()
|
||||
assert isinstance(result, str)
|
||||
|
||||
|
||||
def test_swarm_arrange_with_multiple_swarms():
|
||||
"""Test swarm_arrange with multiple swarms"""
|
||||
swarm1 = create_test_swarm("SwarmA")
|
||||
swarm2 = create_test_swarm("SwarmB")
|
||||
|
||||
result = swarm_arrange(
|
||||
name="MultiSwarm",
|
||||
swarms=[swarm1, swarm2],
|
||||
flow="SwarmA->SwarmB",
|
||||
task="Complete this simple task"
|
||||
)
|
||||
assert isinstance(result, str)
|
||||
|
||||
|
||||
def test_swarm_arrange_with_sequential_flow():
|
||||
"""Test swarm_arrange with sequential flow pattern"""
|
||||
swarm1 = create_test_swarm("First")
|
||||
swarm2 = create_test_swarm("Second")
|
||||
|
||||
result = swarm_arrange(
|
||||
name="Sequential",
|
||||
swarms=[swarm1, swarm2],
|
||||
flow="First->Second",
|
||||
task="Process this step by step"
|
||||
)
|
||||
assert isinstance(result, str)
|
||||
|
||||
|
||||
def test_swarm_arrange_with_kwargs():
|
||||
"""Test swarm_arrange with additional kwargs"""
|
||||
swarm = create_test_swarm("SwarmA")
|
||||
|
||||
result = swarm_arrange(
|
||||
name="Test",
|
||||
swarms=[swarm],
|
||||
flow="SwarmA",
|
||||
task="Simple test"
|
||||
)
|
||||
assert isinstance(result, str)
|
||||
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_swarm_templates_module_can_be_imported():
|
||||
"""Test that swarm_templates module can be imported"""
|
||||
try:
|
||||
from swarms.structs import swarm_templates
|
||||
assert swarm_templates is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module has import dependencies")
|
||||
|
||||
|
||||
def test_swarm_templates_classes_exist():
|
||||
"""Test that swarm template classes exist"""
|
||||
try:
|
||||
from swarms.structs.swarm_templates import SwarmTemplate
|
||||
assert SwarmTemplate is not None
|
||||
except (ImportError, AttributeError):
|
||||
pytest.skip("Classes not available or have dependencies")
|
||||
@ -0,0 +1,188 @@
|
||||
import pytest
|
||||
from unittest.mock import Mock
|
||||
from swarms.structs.swarming_architectures import (
|
||||
circular_swarm,
|
||||
grid_swarm,
|
||||
linear_swarm,
|
||||
star_swarm,
|
||||
mesh_swarm,
|
||||
pyramid_swarm,
|
||||
fibonacci_swarm,
|
||||
prime_swarm,
|
||||
power_swarm,
|
||||
log_swarm,
|
||||
exponential_swarm,
|
||||
geometric_swarm,
|
||||
harmonic_swarm,
|
||||
staircase_swarm,
|
||||
sigmoid_swarm,
|
||||
sinusoidal_swarm,
|
||||
one_to_one,
|
||||
)
|
||||
|
||||
|
||||
def test_circular_swarm_with_single_agent():
|
||||
"""Test circular_swarm with a single agent"""
|
||||
agent = Mock()
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = circular_swarm(agents=[agent], tasks=["Task 1"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_grid_swarm_with_agents():
|
||||
"""Test grid_swarm with multiple agents"""
|
||||
agents = [Mock() for _ in range(4)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = grid_swarm(agents=agents, tasks=["Task 1", "Task 2"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_linear_swarm_with_tasks():
|
||||
"""Test linear_swarm with sequential tasks"""
|
||||
agents = [Mock(), Mock()]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = linear_swarm(agents=agents, tasks=["Task 1"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_star_swarm_basic():
|
||||
"""Test star_swarm with central coordinator"""
|
||||
agents = [Mock() for _ in range(3)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = star_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_mesh_swarm_basic():
|
||||
"""Test mesh_swarm with interconnected agents"""
|
||||
agents = [Mock(), Mock()]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = mesh_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_pyramid_swarm_basic():
|
||||
"""Test pyramid_swarm hierarchical structure"""
|
||||
agents = [Mock() for _ in range(3)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = pyramid_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_fibonacci_swarm_basic():
|
||||
"""Test fibonacci_swarm with fibonacci sequence"""
|
||||
agents = [Mock() for _ in range(5)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = fibonacci_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_prime_swarm_basic():
|
||||
"""Test prime_swarm with prime number sequence"""
|
||||
agents = [Mock() for _ in range(5)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = prime_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_power_swarm_basic():
|
||||
"""Test power_swarm with power sequence"""
|
||||
agents = [Mock() for _ in range(4)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = power_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_log_swarm_basic():
|
||||
"""Test log_swarm with logarithmic sequence"""
|
||||
agents = [Mock() for _ in range(3)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = log_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_exponential_swarm_basic():
|
||||
"""Test exponential_swarm with exponential growth"""
|
||||
agents = [Mock() for _ in range(4)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = exponential_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_geometric_swarm_basic():
|
||||
"""Test geometric_swarm with geometric sequence"""
|
||||
agents = [Mock() for _ in range(4)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = geometric_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_harmonic_swarm_basic():
|
||||
"""Test harmonic_swarm with harmonic sequence"""
|
||||
agents = [Mock() for _ in range(3)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = harmonic_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_sigmoid_swarm_basic():
|
||||
"""Test sigmoid_swarm with sigmoid curve"""
|
||||
agents = [Mock() for _ in range(3)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = sigmoid_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_sinusoidal_swarm_basic():
|
||||
"""Test sinusoidal_swarm with sinusoidal pattern"""
|
||||
agents = [Mock() for _ in range(3)]
|
||||
for agent in agents:
|
||||
agent.run.return_value = "Response"
|
||||
|
||||
result = sinusoidal_swarm(agents=agents, tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_circular_swarm_returns_result():
|
||||
"""Test that circular_swarm returns a result"""
|
||||
agent = Mock()
|
||||
agent.run.return_value = "Test response"
|
||||
|
||||
result = circular_swarm(agents=[agent], tasks=["Task"])
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_linear_swarm_returns_result():
|
||||
"""Test that linear_swarm returns a result"""
|
||||
agent = Mock()
|
||||
agent.run.return_value = "Test response"
|
||||
|
||||
result = linear_swarm(agents=[agent], tasks=["Task"])
|
||||
assert result is not None
|
||||
@ -0,0 +1,164 @@
|
||||
import pytest
|
||||
from swarms.structs.utils import find_agent_by_id, find_agent_by_name
|
||||
from swarms.structs.agent import Agent
|
||||
|
||||
|
||||
def create_test_agent(name: str, agent_id: str = None, description: str = "Test agent") -> Agent:
|
||||
"""Create a real Agent instance for testing"""
|
||||
agent = Agent(
|
||||
agent_name=name,
|
||||
agent_description=description,
|
||||
system_prompt=f"You are {name}, a helpful test assistant. Keep responses brief.",
|
||||
model_name="gpt-4o-mini",
|
||||
max_loops=1,
|
||||
verbose=False,
|
||||
)
|
||||
if agent_id:
|
||||
agent.id = agent_id
|
||||
# Set name attribute for find_agent_by_name
|
||||
agent.name = name
|
||||
return agent
|
||||
|
||||
|
||||
def test_find_agent_by_id_found():
|
||||
"""Test finding agent by ID when agent exists"""
|
||||
agent1 = create_test_agent("Agent One", "agent-1")
|
||||
agent2 = create_test_agent("Agent Two", "agent-2")
|
||||
|
||||
agents = [agent1, agent2]
|
||||
|
||||
result = find_agent_by_id("agent-1", agents)
|
||||
assert result == agent1
|
||||
|
||||
|
||||
def test_find_agent_by_id_not_found():
|
||||
"""Test finding agent by ID when agent does not exist"""
|
||||
agent1 = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent1]
|
||||
|
||||
result = find_agent_by_id("agent-99", agents)
|
||||
assert result is None
|
||||
|
||||
|
||||
def test_find_agent_by_id_with_task():
|
||||
"""Test finding agent by ID and running a task"""
|
||||
agent = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent]
|
||||
|
||||
result = find_agent_by_id("agent-1", agents, task="What is 2+2?")
|
||||
assert result is not None
|
||||
assert len(str(result)) > 0
|
||||
|
||||
|
||||
def test_find_agent_by_id_with_task_and_kwargs():
|
||||
"""Test finding agent by ID and running a task with kwargs"""
|
||||
agent = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent]
|
||||
|
||||
result = find_agent_by_id(
|
||||
agent_id="agent-1", agents=agents, task="Say hello"
|
||||
)
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_find_agent_by_id_empty_list():
|
||||
"""Test finding agent by ID in empty list"""
|
||||
result = find_agent_by_id("agent-1", [])
|
||||
assert result is None
|
||||
|
||||
|
||||
def test_find_agent_by_id_exception_handling():
|
||||
"""Test that find_agent_by_id handles task execution"""
|
||||
agent = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent]
|
||||
|
||||
# Should execute successfully with real agent
|
||||
result = find_agent_by_id("agent-1", agents, task="What is the capital of France?")
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_find_agent_by_name_found():
|
||||
"""Test finding agent by name when agent exists"""
|
||||
agent1 = create_test_agent("Agent One", "agent-1")
|
||||
agent2 = create_test_agent("Agent Two", "agent-2")
|
||||
|
||||
agents = [agent1, agent2]
|
||||
|
||||
result = find_agent_by_name("Agent One", agents)
|
||||
assert result == agent1
|
||||
|
||||
|
||||
def test_find_agent_by_name_not_found():
|
||||
"""Test finding agent by name when agent does not exist"""
|
||||
agent1 = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent1]
|
||||
|
||||
result = find_agent_by_name("Agent Ninety Nine", agents)
|
||||
assert result is None
|
||||
|
||||
|
||||
def test_find_agent_by_name_with_task():
|
||||
"""Test finding agent by name and running a task"""
|
||||
agent = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent]
|
||||
|
||||
result = find_agent_by_name("Agent One", agents, task="What is 3+3?")
|
||||
assert result is not None
|
||||
assert len(str(result)) > 0
|
||||
|
||||
|
||||
def test_find_agent_by_name_with_task_and_kwargs():
|
||||
"""Test finding agent by name and running a task with kwargs"""
|
||||
agent = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent]
|
||||
|
||||
result = find_agent_by_name(
|
||||
agent_name="Agent One", agents=agents, task="Say goodbye"
|
||||
)
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_find_agent_by_name_empty_list():
|
||||
"""Test finding agent by name in empty list"""
|
||||
result = find_agent_by_name("Agent One", [])
|
||||
assert result is None
|
||||
|
||||
|
||||
def test_find_agent_by_name_exception_handling():
|
||||
"""Test that find_agent_by_name handles task execution"""
|
||||
agent = create_test_agent("Agent One", "agent-1")
|
||||
|
||||
agents = [agent]
|
||||
|
||||
# Should execute successfully with real agent
|
||||
result = find_agent_by_name("Agent One", agents, task="List 3 colors")
|
||||
assert result is not None
|
||||
|
||||
|
||||
def test_find_agent_by_id_multiple_agents():
|
||||
"""Test finding correct agent by ID when multiple agents exist"""
|
||||
agents = []
|
||||
for i in range(10):
|
||||
agent = create_test_agent(f"Agent {i}", f"agent-{i}")
|
||||
agents.append(agent)
|
||||
|
||||
result = find_agent_by_id("agent-5", agents)
|
||||
assert result.id == "agent-5"
|
||||
|
||||
|
||||
def test_find_agent_by_name_multiple_agents():
|
||||
"""Test finding correct agent by name when multiple agents exist"""
|
||||
agents = []
|
||||
for i in range(10):
|
||||
agent = create_test_agent(f"Agent {i}", f"agent-{i}")
|
||||
agents.append(agent)
|
||||
|
||||
result = find_agent_by_name("Agent 5", agents)
|
||||
assert result.name == "Agent 5"
|
||||
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
|
||||
|
||||
def test_various_alt_swarms_module_can_be_imported():
|
||||
"""Test that various_alt_swarms module can be imported"""
|
||||
try:
|
||||
from swarms.structs import various_alt_swarms
|
||||
assert various_alt_swarms is not None
|
||||
except ImportError:
|
||||
pytest.skip("Module has import dependencies")
|
||||
|
||||
|
||||
def test_various_alt_swarms_classes_exist():
|
||||
"""Test that alternative swarm classes exist"""
|
||||
try:
|
||||
from swarms.structs.various_alt_swarms import VariousAltSwarm
|
||||
assert VariousAltSwarm is not None
|
||||
except (ImportError, AttributeError):
|
||||
pytest.skip("Classes not available or have dependencies")
|
||||
Loading…
Reference in new issue