Home / Class/ TestMultipleMiddleware Class — langchain Architecture

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

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