diff --git a/docs/docs/en/getting-started/index.md b/docs/docs/en/getting-started/index.md index b695e12aaa..44da18dce7 100644 --- a/docs/docs/en/getting-started/index.md +++ b/docs/docs/en/getting-started/index.md @@ -176,6 +176,35 @@ Also, you can run the `FastStream` application manually, as a regular async func {!> docs_src/getting_started/manual_run/redis_base_run.py!} ``` +### Testing + +The service can be tested using the `TestBroker` context managers, which, by default, puts the Broker into "testing mode". + +=== "AIOKafka" + ```python linenums="1" + {!> docs_src/getting_started/testing/kafka_test_service.py!} + ``` + +=== "Confluent" + ```python linenums="1" + {!> docs_src/getting_started/testing/confluent_test_service.py!} + ``` + +=== "RabbitMQ" + ```python linenums="1" + {!> docs_src/getting_started/testing/rabbit_test_service.py!} + ``` + +=== "NATS" + ```python linenums="1" + {!> docs_src/getting_started/testing/nats_test_service.py!} + ``` + +=== "Redis" + ```python linenums="1" + {!> docs_src/getting_started/testing/redis_test_service.py!} + ``` + ### Other tools integrations If you want to use **FastStream** as part of another framework service, you probably don't need to utilize the `FastStream` object at all, as it is primarily intended as a **CLI** tool target. Instead, you can start and stop your broker as part of another framework's lifespan. You can find such examples in the [integrations section](./integrations/frameworks/index.md){.internal-link}. diff --git a/docs/docs/en/release.md b/docs/docs/en/release.md index b3e2721560..0cfa3aa486 100644 --- a/docs/docs/en/release.md +++ b/docs/docs/en/release.md @@ -3220,7 +3220,7 @@ pip install faststream==0.3.0rc0 && pip install "faststream[redis]" #### Misc * chore: polishing by [@davorrunje](https://github.com/davorrunje){.external-link target="_blank"} in [https://github.com/ag2ai/faststream/pull/946](https://github.com/ag2ai/faststream/pull/946){.external-link target="_blank"} -* сhore: add manual publish btn to CI by [@Lancetnik](https://github.com/Lancetnik){.external-link target="_blank"} in [https://github.com/ag2ai/faststream/pull/950](https://github.com/ag2ai/faststream/pull/950){.external-link target="_blank"} +* chore: add manual publish btn to CI by [@Lancetnik](https://github.com/Lancetnik){.external-link target="_blank"} in [https://github.com/ag2ai/faststream/pull/950](https://github.com/ag2ai/faststream/pull/950){.external-link target="_blank"} * chore: limit open dev dependency versions by [@kumaranvpl](https://github.com/kumaranvpl){.external-link target="_blank"} in [https://github.com/ag2ai/faststream/pull/953](https://github.com/ag2ai/faststream/pull/953){.external-link target="_blank"} diff --git a/docs/docs_src/getting_started/testing/__init__.py b/docs/docs_src/getting_started/testing/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/docs_src/getting_started/testing/confluent_test_service.py b/docs/docs_src/getting_started/testing/confluent_test_service.py new file mode 100644 index 0000000000..5aa2c93084 --- /dev/null +++ b/docs/docs_src/getting_started/testing/confluent_test_service.py @@ -0,0 +1,19 @@ +import pytest +from pydantic import ValidationError +from faststream import FastStream +from faststream.confluent import KafkaBroker, TestKafkaBroker + + +broker = KafkaBroker("localhost:9092") +app = FastStream(broker) + + +@pytest.mark.asyncio +async def test_correct() -> None: + async with TestKafkaBroker(broker) as br: + await br.publish(...) + +@pytest.mark.asyncio +async def test_invalid() -> None: + async with TestKafkaBroker(broker) as br: + with pytest.raises(ValidationError): ... diff --git a/docs/docs_src/getting_started/testing/kafka_test_service.py b/docs/docs_src/getting_started/testing/kafka_test_service.py new file mode 100644 index 0000000000..120c178b89 --- /dev/null +++ b/docs/docs_src/getting_started/testing/kafka_test_service.py @@ -0,0 +1,19 @@ +import pytest +from pydantic import ValidationError +from faststream import FastStream +from faststream.kafka import KafkaBroker, TestKafkaBroker + + +broker = KafkaBroker("localhost:9092") +app = FastStream(broker) + + +@pytest.mark.asyncio +async def test_correct() -> None: + async with TestKafkaBroker(broker) as br: + await br.publish(...) + +@pytest.mark.asyncio +async def test_invalid() -> None: + async with TestKafkaBroker(broker) as br: + with pytest.raises(ValidationError): ... diff --git a/docs/docs_src/getting_started/testing/nats_test_service.py b/docs/docs_src/getting_started/testing/nats_test_service.py new file mode 100644 index 0000000000..eea9a60dd0 --- /dev/null +++ b/docs/docs_src/getting_started/testing/nats_test_service.py @@ -0,0 +1,19 @@ +import pytest +from pydantic import ValidationError +from faststream import FastStream +from faststream.nats import NatsBroker, TestNatsBroker + + +broker = NatsBroker("nats://localhost:4222") +app = FastStream(broker) + + +@pytest.mark.asyncio +async def test_correct() -> None: + async with TestNatsBroker(broker) as br: + await br.publish(...) + +@pytest.mark.asyncio +async def test_invalid() -> None: + async with TestNatsBroker(broker) as br: + with pytest.raises(ValidationError): ... diff --git a/docs/docs_src/getting_started/testing/rabbit_test_service.py b/docs/docs_src/getting_started/testing/rabbit_test_service.py new file mode 100644 index 0000000000..9bff4a7100 --- /dev/null +++ b/docs/docs_src/getting_started/testing/rabbit_test_service.py @@ -0,0 +1,19 @@ +import pytest +from pydantic import ValidationError +from faststream import FastStream +from faststream.rabbit import RabbitBroker, TestRabbitBroker + + +broker = RabbitBroker("amqp://guest:guest@localhost:5672/") +app = FastStream(broker) + + +@pytest.mark.asyncio +async def test_correct() -> None: + async with TestRabbitBroker(broker) as br: + await br.publish(...) + +@pytest.mark.asyncio +async def test_invalid() -> None: + async with TestRabbitBroker(broker) as br: + with pytest.raises(ValidationError): ... diff --git a/docs/docs_src/getting_started/testing/redis_test_service.py b/docs/docs_src/getting_started/testing/redis_test_service.py new file mode 100644 index 0000000000..41aa6cc666 --- /dev/null +++ b/docs/docs_src/getting_started/testing/redis_test_service.py @@ -0,0 +1,19 @@ +import pytest +from pydantic import ValidationError +from faststream import FastStream +from faststream.redis import RedisBroker, TestRedisBroker + + +broker = RedisBroker("redis://localhost:6379") +app = FastStream(broker) + + +@pytest.mark.asyncio +async def test_correct() -> None: + async with TestRedisBroker(broker) as br: + await br.publish(...) + +@pytest.mark.asyncio +async def test_invalid() -> None: + async with TestRedisBroker(broker) as br: + with pytest.raises(ValidationError): ... diff --git a/uv.lock b/uv.lock index 69dc15d257..e955353a98 100644 --- a/uv.lock +++ b/uv.lock @@ -732,7 +732,7 @@ wheels = [ [[package]] name = "faststream" -version = "0.6.1" +version = "0.6.2" source = { editable = "." } dependencies = [ { name = "anyio" },