TestMultipleMiddleware Class — langchain Architecture
Architecture documentation for the TestMultipleMiddleware class in test_pii.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 7e31f02f_d85d_39af_fd29_e624f564a8b9["TestMultipleMiddleware"] 6dcffc03_fae9_01f8_ed9b_d30d8a73dd13["test_pii.py"] 7e31f02f_d85d_39af_fd29_e624f564a8b9 -->|defined in| 6dcffc03_fae9_01f8_ed9b_d30d8a73dd13 97e67991_85da_8123_e748_d34ebb1dfbbc["test_sequential_application()"] 7e31f02f_d85d_39af_fd29_e624f564a8b9 -->|method| 97e67991_85da_8123_e748_d34ebb1dfbbc 7b18fe6c_1ede_dd0b_df34_08eac92137fe["test_multiple_pii_middleware_with_create_agent()"] 7e31f02f_d85d_39af_fd29_e624f564a8b9 -->|method| 7b18fe6c_1ede_dd0b_df34_08eac92137fe ec89f1ec_a6bc_9cbf_9d7e_92a2467aae98["test_custom_detector_for_multiple_types()"] 7e31f02f_d85d_39af_fd29_e624f564a8b9 -->|method| ec89f1ec_a6bc_9cbf_9d7e_92a2467aae98
Relationship Graph
Source Code
libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_pii.py lines 569–646
class TestMultipleMiddleware:
"""Test using multiple PII middleware instances."""
def test_sequential_application(self) -> None:
"""Test that multiple PII types are detected when applied sequentially."""
# First apply email middleware
email_middleware = PIIMiddleware("email", strategy="redact")
state = AgentState[Any](messages=[HumanMessage("Email: test@example.com, IP: 192.168.1.1")])
result1 = email_middleware.before_model(state, Runtime())
# Then apply IP middleware to the result
ip_middleware = PIIMiddleware("ip", strategy="mask")
assert result1 is not None
state_with_email_redacted = AgentState[Any](messages=result1["messages"])
result2 = ip_middleware.before_model(state_with_email_redacted, Runtime())
assert result2 is not None
content = result2["messages"][0].content
# Email should be redacted
assert "[REDACTED_EMAIL]" in content
assert "test@example.com" not in content
# IP should be masked
assert "*.*.*.1" in content
assert "192.168.1.1" not in content
def test_multiple_pii_middleware_with_create_agent(self) -> None:
"""Test that multiple PIIMiddleware instances work together in create_agent."""
model = FakeToolCallingModel()
# Multiple PIIMiddleware instances should work because each has a unique name
agent = create_agent(
model=model,
middleware=[
PIIMiddleware("email", strategy="redact"),
PIIMiddleware("ip", strategy="mask"),
PIIMiddleware("url", strategy="block", apply_to_input=True),
],
)
# Test with email and IP (url would block, so we omit it)
result = agent.invoke(
{"messages": [HumanMessage("Contact: test@example.com, IP: 192.168.1.100")]}
)
messages = result["messages"]
content = " ".join(str(msg.content) for msg in messages)
# Email should be redacted
assert "test@example.com" not in content
# IP should be masked
assert "192.168.1.100" not in content
def test_custom_detector_for_multiple_types(self) -> None:
"""Test using a single middleware with custom detector for multiple PII types.
This is an alternative to using multiple middleware instances,
useful when you want the same strategy for multiple PII types.
"""
# Combine multiple detectors into one
def detect_email_and_ip(content: str) -> list[PIIMatch]:
return detect_email(content) + detect_ip(content)
middleware = PIIMiddleware(
"email_or_ip",
detector=detect_email_and_ip,
strategy="redact",
)
state = AgentState[Any](messages=[HumanMessage("Email: test@example.com, IP: 10.0.0.1")])
result = middleware.before_model(state, Runtime())
assert result is not None
content = result["messages"][0].content
assert "test@example.com" not in content
assert "10.0.0.1" not in content
Source
Frequently Asked Questions
What is the TestMultipleMiddleware class?
TestMultipleMiddleware is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_pii.py.
Where is TestMultipleMiddleware defined?
TestMultipleMiddleware is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_pii.py at line 569.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free