Ctrl K
ComunidadGuías…

test/agent/test_hooks_di.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Copyright (c) 2026, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
#
# SPDX-License-Identifier: Apache-2.0

from typing import Annotated
from unittest.mock import MagicMock

import pytest

from ag2 import Agent, Context, Depends, Inject, MemoryStream
from ag2.events import ModelMessage, ModelResponse
from ag2.testing import TestConfig


@pytest.fixture()
def test_config() -> TestConfig:
    return TestConfig(
        ModelResponse(
            message=ModelMessage("result"),
        ),
    )


@pytest.mark.asyncio()
async def test_sync_hook_subscriber(
    mock: MagicMock,
    test_config: TestConfig,
) -> None:
    def result_sub(
        event: ModelResponse,
        c: Context,
        dep: Annotated[str, Inject()],
    ) -> None:
        mock(c.dependencies["dep"] == dep == "1")
        mock.response(event.content)

    agent = Agent("", config=test_config)

    stream = MemoryStream()
    stream.where(ModelResponse).subscribe(result_sub)

    await agent.ask("Hi!", dependencies={"dep": "1"}, stream=stream)

    mock.assert_called_once_with(True)
    mock.response.assert_called_once_with("result")


@pytest.mark.asyncio()
async def test_async_hook_subscriber(
    mock: MagicMock,
    test_config: TestConfig,
) -> None:
    async def result_sub(
        c: Context,
        dep: Annotated[str, Inject()],
    ) -> None:
        mock(c.dependencies["dep"] == dep == "1")

    agent = Agent("", config=test_config)

    stream = MemoryStream()
    stream.where(ModelResponse).subscribe(result_sub)

    await agent.ask("Hi!", dependencies={"dep": "1"}, stream=stream)

    mock.assert_called_once_with(True)


@pytest.mark.asyncio()
async def test_hook_with_depends(
    mock: MagicMock,
    test_config: TestConfig,
) -> None:
    def d(dep: Annotated[str, Inject()]) -> str:
        return dep

    def result_sub(
        c: Context,
        dep: Annotated[str, Depends(d)],
    ) -> None:
        mock(c.dependencies["dep"] == dep == "1")

    agent = Agent("", config=test_config)

    stream = MemoryStream()
    stream.where(ModelResponse).subscribe(result_sub, sync_to_thread=False)

    await agent.ask("Hi!", dependencies={"dep": "1"}, stream=stream)

    mock.assert_called_once_with(True)


@pytest.mark.asyncio()
async def test_hook_with_agent_dependency(
    mock: MagicMock,
    test_config: TestConfig,
) -> None:
    def result_sub(
        c: Context,
        dep: Annotated[str, Inject()],
    ) -> None:
        mock(c.dependencies["dep"] == dep == "1")

    agent = Agent("", config=test_config, dependencies={"dep": "1"})

    stream = MemoryStream()
    stream.where(ModelResponse).subscribe(result_sub)

    await agent.ask("Hi!", stream=stream)

    mock.assert_called_once_with(True)


@pytest.mark.asyncio()
async def test_hook_depends_override(mock: MagicMock, test_config: TestConfig) -> None:
    def dep1():
        raise ValueError

    def dep2():
        return "1"

    def result_sub(
        dep: Annotated[str, Depends(dep1)],
    ) -> None:
        mock(dep)

    agent = Agent("", config=test_config)
    agent.dependency_provider.override(dep1, dep2)

    stream = MemoryStream()
    stream.where(ModelResponse).subscribe(result_sub, sync_to_thread=False)

    await agent.ask("Hi!", stream=stream)

    mock.assert_called_once_with("1")