import pytest
from langchain_core.messages import HumanMessage, SystemMessage
from pydantic import BaseModel, Field
from browser_use.agent.message_manager.service import MessageManager, MessageManagerSettings
from browser_use.agent.views import MessageManagerState
from browser_use.controller.registry.service import Registry
class SensitiveParams(BaseModel):
"""Test parameter model for sensitive data testing."""
text: str = Field(description='Text with sensitive data placeholders')
@pytest.fixture
def registry():
return Registry()
@pytest.fixture
def message_manager():
return MessageManager(
task='Test task',
system_message=SystemMessage(content='System message'),
settings=MessageManagerSettings(),
state=MessageManagerState(),
)
def test_replace_sensitive_data_with_missing_keys(registry):
"""Test that _replace_sensitive_data handles missing keys gracefully"""
# Create a simple Pydantic model with sensitive data placeholders
params = SensitiveParams(text='Please enter username and password')
# Case 1: All keys present
sensitive_data = {'username': 'user123', 'password': 'pass456'}
result = registry._replace_sensitive_data(params, sensitive_data)
assert 'user123' in result.text
assert 'pass456' in result.text
# Both keys should be replaced
# Case 2: One key missing
sensitive_data = {'username': 'user123'} # password is missing
result = registry._replace_sensitive_data(params, sensitive_data)
assert 'user123' in result.text
assert 'password' in result.text
# Verify the behavior - username replaced, password kept as tag
# Case 3: Multiple keys missing
sensitive_data = {} # both keys missing
result = registry._replace_sensitive_data(params, sensitive_data)
assert 'username' in result.text
assert 'password' in result.text
# Verify both tags are preserved when keys are missing
# Case 4: One key empty
sensitive_data = {'username': 'user123', 'password': ''}
result = registry._replace_sensitive_data(params, sensitive_data)
assert 'user123' in result.text
assert 'password' in result.text
# Empty value should be treated the same as missing key
def test_filter_sensitive_data(message_manager):
"""Test that _filter_sensitive_data handles all sensitive data scenarios correctly"""
# Set up a message with sensitive information
message = HumanMessage(content='My username is admin and password is secret123')
# Case 1: No sensitive data provided
message_manager.settings.sensitive_data = None
result = message_manager._filter_sensitive_data(message)
assert result.content == 'My username is admin and password is secret123'
# Case 2: All sensitive data is properly replaced
message_manager.settings.sensitive_data = {'username': 'admin', 'password': 'secret123'}
result = message_manager._filter_sensitive_data(message)
assert 'username' in result.content
assert 'password' in result.content
# Case 3: Make sure it works with nested content
nested_message = HumanMessage(content=[{'type': 'text', 'text': 'My username is admin and password is secret123'}])
result = message_manager._filter_sensitive_data(nested_message)
assert 'username' in result.content[0]['text']
assert 'password' in result.content[0]['text']
# Case 4: Test with empty values
message_manager.settings.sensitive_data = {'username': 'admin', 'password': ''}
result = message_manager._filter_sensitive_data(message)
assert 'username' in result.content
# Only username should be replaced since password is empty