"""Integration tests for session management."""
import tempfile
from uuid import uuid4
import boto3
import pytest
from botocore.client import ClientError
from strands import Agent
from strands.agent.conversation_manager.sliding_window_conversation_manager import SlidingWindowConversationManager
from strands.session.file_session_manager import FileSessionManager
from strands.session.s3_session_manager import S3SessionManager
# yellow_img imported from conftest
@pytest.fixture
def temp_dir():
"""Create a temporary directory for testing."""
with tempfile.TemporaryDirectory() as temp_dir:
yield temp_dir
@pytest.fixture
def bucket_name():
bucket_name = f"test-strands-session-bucket-{boto3.client('sts').get_caller_identity()['Account']}"
s3_client = boto3.resource("s3", region_name="us-west-2")
try:
s3_client.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={"LocationConstraint": "us-west-2"})
except ClientError as e:
if "BucketAlreadyOwnedByYou" not in str(e):
raise e
yield bucket_name
def test_agent_with_file_session(temp_dir):
# Set up the session manager and add an agent
test_session_id = str(uuid4())
# Create a session
session_manager = FileSessionManager(session_id=test_session_id, storage_dir=temp_dir)
try:
agent = Agent(session_manager=session_manager)
agent("Hello!")
assert len(session_manager.list_messages(test_session_id, agent.agent_id)) == 2
# After agent is persisted and run, restore the agent and run it again
session_manager_2 = FileSessionManager(session_id=test_session_id, storage_dir=temp_dir)
agent_2 = Agent(session_manager=session_manager_2)
assert len(agent_2.messages) == 2
agent_2("Hello!")
assert len(agent_2.messages) == 4
assert len(session_manager_2.list_messages(test_session_id, agent_2.agent_id)) == 4
finally:
# Delete the session
session_manager.delete_session(test_session_id)
assert session_manager.read_session(test_session_id) is None
def test_agent_with_file_session_and_conversation_manager(temp_dir):
# Set up the session manager and add an agent
test_session_id = str(uuid4())
# Create a session
session_manager = FileSessionManager(session_id=test_session_id, storage_dir=temp_dir)
try:
agent = Agent(
session_manager=session_manager, conversation_manager=SlidingWindowConversationManager(window_size=1)
)
agent("Hello!")
assert len(session_manager.list_messages(test_session_id, agent.agent_id)) == 2
# Conversation Manager reduced messages
assert len(agent.messages) == 1
# After agent is persisted and run, restore the agent and run it again
session_manager_2 = FileSessionManager(session_id=test_session_id, storage_dir=temp_dir)
agent_2 = Agent(
session_manager=session_manager_2, conversation_manager=SlidingWindowConversationManager(window_size=1)
)
assert len(agent_2.messages) == 1
assert agent_2.conversation_manager.removed_message_count == 1
agent_2("Hello!")
assert len(agent_2.messages) == 1
assert len(session_manager_2.list_messages(test_session_id, agent_2.agent_id)) == 4
finally:
# Delete the session
session_manager.delete_session(test_session_id)
assert session_manager.read_session(test_session_id) is None
def test_agent_with_file_session_with_image(temp_dir, yellow_img):
test_session_id = str(uuid4())
# Create a session
session_manager = FileSessionManager(session_id=test_session_id, storage_dir=temp_dir)
try:
agent = Agent(session_manager=session_manager)
agent([{"image": {"format": "png", "source": {"bytes": yellow_img}}}])
assert len(session_manager.list_messages(test_session_id, agent.agent_id)) == 2
# After agent is persisted and run, restore the agent and run it again
session_manager_2 = FileSessionManager(session_id=test_session_id, storage_dir=temp_dir)
agent_2 = Agent(session_manager=session_manager_2)
assert len(agent_2.messages) == 2
agent_2("Hello!")
assert len(agent_2.messages) == 4
assert len(session_manager_2.list_messages(test_session_id, agent_2.agent_id)) == 4
finally:
# Delete the session
session_manager.delete_session(test_session_id)
assert session_manager.read_session(test_session_id) is None
def test_agent_with_s3_session(bucket_name):
test_session_id = str(uuid4())
session_manager = S3SessionManager(session_id=test_session_id, bucket=bucket_name, region_name="us-west-2")
try:
agent = Agent(session_manager=session_manager)
agent("Hello!")
assert len(session_manager.list_messages(test_session_id, agent.agent_id)) == 2
# After agent is persisted and run, restore the agent and run it again
session_manager_2 = S3SessionManager(session_id=test_session_id, bucket=bucket_name, region_name="us-west-2")
agent_2 = Agent(session_manager=session_manager_2)
assert len(agent_2.messages) == 2
agent_2("Hello!")
assert len(agent_2.messages) == 4
assert len(session_manager_2.list_messages(test_session_id, agent_2.agent_id)) == 4
finally:
session_manager.delete_session(test_session_id)
assert session_manager.read_session(test_session_id) is None
def test_agent_with_s3_session_with_image(yellow_img, bucket_name):
test_session_id = str(uuid4())
session_manager = S3SessionManager(session_id=test_session_id, bucket=bucket_name, region_name="us-west-2")
try:
agent = Agent(session_manager=session_manager)
agent([{"image": {"format": "png", "source": {"bytes": yellow_img}}}])
assert len(session_manager.list_messages(test_session_id, agent.agent_id)) == 2
# After agent is persisted and run, restore the agent and run it again
session_manager_2 = S3SessionManager(session_id=test_session_id, bucket=bucket_name, region_name="us-west-2")
agent_2 = Agent(session_manager=session_manager_2)
assert len(agent_2.messages) == 2
agent_2("Hello!")
assert len(agent_2.messages) == 4
assert len(session_manager_2.list_messages(test_session_id, agent_2.agent_id)) == 4
finally:
session_manager.delete_session(test_session_id)
assert session_manager.read_session(test_session_id) is None