Files
crewAI/tests/security/test_integration.py
João Moura d42e58e199 adding fingerprints (#2332)
* adding fingerprints

* fixed

* fix

* Fix Pydantic v2 compatibility in SecurityConfig and Fingerprint classes (#2335)

* Fix Pydantic v2 compatibility in SecurityConfig and Fingerprint classes

Co-Authored-By: Joe Moura <joao@crewai.com>

* Fix type-checker errors in fingerprint properties

Co-Authored-By: Joe Moura <joao@crewai.com>

* Enhance security validation in Fingerprint and SecurityConfig classes

Co-Authored-By: Joe Moura <joao@crewai.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Joe Moura <joao@crewai.com>

* incorporate small improvements / changes

* Expect different

* Remove redundant null check in Crew.fingerprint property (#2342)

* Remove redundant null check in Crew.fingerprint property and add security module

Co-Authored-By: Joe Moura <joao@crewai.com>

* Enhance security module with type hints, improved UUID namespace, metadata validation, and versioning

Co-Authored-By: Joe Moura <joao@crewai.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Joe Moura <joao@crewai.com>
Co-authored-by: João Moura <joaomdmoura@gmail.com>

---------

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Joe Moura <joao@crewai.com>
Co-authored-by: Brandon Hancock <brandon@brandonhancock.io>
2025-03-14 03:00:30 -03:00

259 lines
7.3 KiB
Python

"""Test integration of fingerprinting with Agent, Crew, and Task classes."""
import pytest
from crewai import Agent, Crew, Task
from crewai.security import Fingerprint, SecurityConfig
def test_agent_with_security_config():
"""Test creating an Agent with a SecurityConfig."""
# Create agent with SecurityConfig
security_config = SecurityConfig()
agent = Agent(
role="Tester",
goal="Test fingerprinting",
backstory="Testing fingerprinting",
security_config=security_config
)
assert agent.security_config is not None
assert agent.security_config == security_config
assert agent.security_config.fingerprint is not None
assert agent.fingerprint is not None
def test_agent_fingerprint_property():
"""Test the fingerprint property on Agent."""
# Create agent without security_config
agent = Agent(
role="Tester",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
# Fingerprint should be automatically generated
assert agent.fingerprint is not None
assert isinstance(agent.fingerprint, Fingerprint)
assert agent.security_config is not None
def test_crew_with_security_config():
"""Test creating a Crew with a SecurityConfig."""
# Create crew with SecurityConfig
security_config = SecurityConfig()
agent1 = Agent(
role="Tester1",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
agent2 = Agent(
role="Tester2",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
crew = Crew(
agents=[agent1, agent2],
security_config=security_config
)
assert crew.security_config is not None
assert crew.security_config == security_config
assert crew.security_config.fingerprint is not None
assert crew.fingerprint is not None
def test_crew_fingerprint_property():
"""Test the fingerprint property on Crew."""
# Create crew without security_config
agent1 = Agent(
role="Tester1",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
agent2 = Agent(
role="Tester2",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
crew = Crew(agents=[agent1, agent2])
# Fingerprint should be automatically generated
assert crew.fingerprint is not None
assert isinstance(crew.fingerprint, Fingerprint)
assert crew.security_config is not None
def test_task_with_security_config():
"""Test creating a Task with a SecurityConfig."""
# Create task with SecurityConfig
security_config = SecurityConfig()
agent = Agent(
role="Tester",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
task = Task(
description="Test task",
expected_output="Testing output",
agent=agent,
security_config=security_config
)
assert task.security_config is not None
assert task.security_config == security_config
assert task.security_config.fingerprint is not None
assert task.fingerprint is not None
def test_task_fingerprint_property():
"""Test the fingerprint property on Task."""
# Create task without security_config
agent = Agent(
role="Tester",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
task = Task(
description="Test task",
expected_output="Testing output",
agent=agent
)
# Fingerprint should be automatically generated
assert task.fingerprint is not None
assert isinstance(task.fingerprint, Fingerprint)
assert task.security_config is not None
def test_end_to_end_fingerprinting():
"""Test end-to-end fingerprinting across Agent, Crew, and Task."""
# Create components with auto-generated fingerprints
agent1 = Agent(
role="Researcher",
goal="Research information",
backstory="Expert researcher"
)
agent2 = Agent(
role="Writer",
goal="Write content",
backstory="Expert writer"
)
task1 = Task(
description="Research topic",
expected_output="Research findings",
agent=agent1
)
task2 = Task(
description="Write article",
expected_output="Written article",
agent=agent2
)
crew = Crew(
agents=[agent1, agent2],
tasks=[task1, task2]
)
# Verify all fingerprints were automatically generated
assert agent1.fingerprint is not None
assert agent2.fingerprint is not None
assert task1.fingerprint is not None
assert task2.fingerprint is not None
assert crew.fingerprint is not None
# Verify fingerprints are unique
fingerprints = [
agent1.fingerprint.uuid_str,
agent2.fingerprint.uuid_str,
task1.fingerprint.uuid_str,
task2.fingerprint.uuid_str,
crew.fingerprint.uuid_str
]
assert len(fingerprints) == len(set(fingerprints)), "All fingerprints should be unique"
def test_fingerprint_persistence():
"""Test that fingerprints persist and don't change."""
# Create an agent and check its fingerprint
agent = Agent(
role="Tester",
goal="Test fingerprinting",
backstory="Testing fingerprinting"
)
# Get initial fingerprint
initial_fingerprint = agent.fingerprint.uuid_str
# Access the fingerprint again - it should be the same
assert agent.fingerprint.uuid_str == initial_fingerprint
# Create a task with the agent
task = Task(
description="Test task",
expected_output="Testing output",
agent=agent
)
# Check that task has its own unique fingerprint
assert task.fingerprint is not None
assert task.fingerprint.uuid_str != agent.fingerprint.uuid_str
def test_shared_security_config_fingerprints():
"""Test that components with the same SecurityConfig share the same fingerprint."""
# Create a shared SecurityConfig
shared_security_config = SecurityConfig()
fingerprint_uuid = shared_security_config.fingerprint.uuid_str
# Create multiple components with the same security config
agent1 = Agent(
role="Researcher",
goal="Research information",
backstory="Expert researcher",
security_config=shared_security_config
)
agent2 = Agent(
role="Writer",
goal="Write content",
backstory="Expert writer",
security_config=shared_security_config
)
task = Task(
description="Write article",
expected_output="Written article",
agent=agent1,
security_config=shared_security_config
)
crew = Crew(
agents=[agent1, agent2],
tasks=[task],
security_config=shared_security_config
)
# Verify all components have the same fingerprint UUID
assert agent1.fingerprint.uuid_str == fingerprint_uuid
assert agent2.fingerprint.uuid_str == fingerprint_uuid
assert task.fingerprint.uuid_str == fingerprint_uuid
assert crew.fingerprint.uuid_str == fingerprint_uuid
# Verify the identity of the fingerprint objects
assert agent1.fingerprint is shared_security_config.fingerprint
assert agent2.fingerprint is shared_security_config.fingerprint
assert task.fingerprint is shared_security_config.fingerprint
assert crew.fingerprint is shared_security_config.fingerprint