Closed
Description
Problem
As the generated README.md
suggests, I am running postgres with the command:
docker run -p "5432:5432" -e "POSTGRES_PASSWORD=readapp2" -e "POSTGRES_USER=readapp2" -e "POSTGRES_DB=readapp2" postgres:16.3-bullseye
and then attemping to run pytest via the command poetry run pytest -vv .
The problem is that 2/5 of the tests (the ones defined in the file test_rabbit.py
) fail because it cannot resolve the ampq
url for the rabbitMQ service.
After messing with it a bit, I cannot figure out an easy way to launch an instance of rabbitMQ as a stand-alone container.
Full output
(base) nate@nate-Kudu:~/spyder_projects/readapp/readapp2$ poetry run pytest . -vv
================================================================================= test session starts ==================================================================================
platform linux -- Python 3.12.8, pytest-8.3.4, pluggy-1.5.0 -- /home/nate/.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/bin/python
cachedir: .pytest_cache
rootdir: /home/nate/spyder_projects/readapp/readapp2
configfile: pyproject.toml
plugins: anyio-4.8.0, env-1.1.5, cov-5.0.0
collected 7 items
tests/test_db.py::test_db PASSED [ 14%]
tests/test_echo.py::test_echo PASSED [ 28%]
tests/test_rabbit.py::test_message_publishing ERROR [ 42%]
tests/test_rabbit.py::test_message_wrong_exchange ERROR [ 57%]
tests/test_readapp2.py::test_health PASSED [ 71%]
tests/test_redis.py::test_setting_value PASSED [ 85%]
tests/test_redis.py::test_getting_value PASSED [100%]
======================================================================================== ERRORS ========================================================================================
______________________________________________________________________ ERROR at setup of test_message_publishing _______________________________________________________________________
self = <Connection: "amqp://guest:******@readapp2-rmq:5672/" at 0x784ad9d4edf0>, client_properties = {}
@task
async def connect(
self, client_properties: Optional[FieldTable] = None,
) -> bool:
if self.is_opened:
raise RuntimeError("Connection already opened")
ssl_context = self.ssl_context
if ssl_context is None and self.url.scheme == "amqps":
ssl_context = await self.loop.run_in_executor(
None, self._get_ssl_context,
)
self.ssl_context = ssl_context
log.debug("Connecting to: %s", self)
try:
> reader, writer = await asyncio.open_connection(
self.url.host, self.url.port, ssl=ssl_context,
**self.__create_connection_kwargs,
)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/connection.py:457:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../../miniconda3/lib/python3.12/asyncio/streams.py:48: in open_connection
transport, _ = await loop.create_connection(
../../../miniconda3/lib/python3.12/asyncio/base_events.py:1078: in create_connection
infos = await self._ensure_resolved(
../../../miniconda3/lib/python3.12/asyncio/base_events.py:1461: in _ensure_resolved
return await loop.getaddrinfo(host, port, family=family, type=type,
../../../miniconda3/lib/python3.12/asyncio/base_events.py:900: in getaddrinfo
return await self.run_in_executor(
../../../miniconda3/lib/python3.12/concurrent/futures/thread.py:59: in run
result = self.fn(*self.args, **self.kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
host = 'readapp2-rmq', port = 5672, family = 0, type = <SocketKind.SOCK_STREAM: 1>, proto = 0, flags = 0
def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
"""Resolve host and port into list of address info entries.
Translate the host/port argument into a sequence of 5-tuples that contain
all the necessary arguments for creating a socket connected to that service.
host is a domain name, a string representation of an IPv4/v6 address or
None. port is a string service name such as 'http', a numeric port number or
None. By passing None as the value of host and port, you can pass NULL to
the underlying C API.
The family, type and proto arguments can be optionally specified in order to
narrow the list of addresses returned. Passing zero as a value for each of
these arguments selects the full range of results.
"""
# We override this function since we want to translate the numeric family
# and socket type values to enum constants.
addrlist = []
> for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
E socket.gaierror: [Errno -2] Name or service not known
../../../miniconda3/lib/python3.12/socket.py:976: gaierror
The above exception was the direct cause of the following exception:
anyio_backend = 'asyncio', request = <SubRequest 'test_exchange' for <Function test_message_publishing>>, args = ()
kwargs = {'test_exchange_name': '1cd4c981028b42628b327156c64487d5', 'test_rmq_pool': <aio_pika.pool.Pool object at 0x784ad9dfde70>}
local_func = <function test_exchange at 0x784ada1a6f20>, backend_name = 'asyncio', backend_options = {}, runner = <anyio._backends._asyncio.TestRunner object at 0x784ada00dd60>
def wrapper(
*args: Any, anyio_backend: Any, request: SubRequest, **kwargs: Any
) -> Any:
# Rebind any fixture methods to the request instance
if (
request.instance
and ismethod(func)
and type(func.__self__) is type(request.instance)
):
local_func = func.__func__.__get__(request.instance)
else:
local_func = func
backend_name, backend_options = extract_backend_and_options(anyio_backend)
if has_backend_arg:
kwargs["anyio_backend"] = anyio_backend
if has_request_arg:
kwargs["request"] = request
with get_runner(backend_name, backend_options) as runner:
if isasyncgenfunction(local_func):
> yield from runner.run_asyncgen_fixture(local_func, kwargs)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/pytest_plugin.py:98:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:2234: in run_asyncgen_fixture
fixturevalue: T_Retval = self.get_loop().run_until_complete(
../../../miniconda3/lib/python3.12/asyncio/base_events.py:686: in run_until_complete
return future.result()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:2226: in _call_in_runner_task
return await future
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:2193: in _run_tests_and_fixtures
retval = await coro
tests/conftest.py:140: in test_exchange
async with test_rmq_pool.acquire() as conn:
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:147: in __aenter__
self.item = await self.pool._get()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:104: in _get
return await self._create_item()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:92: in _create_item
item = await self.__constructor(*self.__constructor_args)
readapp2/services/rabbit/lifespan.py:38: in get_channel
async with connection_pool.acquire() as connection:
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:147: in __aenter__
self.item = await self.pool._get()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:104: in _get
return await self._create_item()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:92: in _create_item
item = await self.__constructor(*self.__constructor_args)
readapp2/services/rabbit/lifespan.py:22: in get_connection
return await aio_pika.connect_robust(str(settings.rabbit_url))
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/robust_connection.py:334: in connect_robust
await connection.connect(timeout=timeout)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/robust_connection.py:180: in connect
await self.__fail_fast_future
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/robust_connection.py:135: in __connection_factory
await Connection.connect(self, self.__connect_timeout)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/connection.py:125: in connect
self.transport = await UnderlayConnection.connect(
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/abc.py:679: in connect
connection = await cls.make_connection(
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/abc.py:667: in make_connection
connection: aiormq.abc.AbstractConnection = await asyncio.wait_for(
../../../miniconda3/lib/python3.12/asyncio/tasks.py:520: in wait_for
return await fut
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/connection.py:920: in connect
await connection.connect(client_properties or {})
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/base.py:164: in wrap
return await self.create_task(func(self, *args, **kwargs))
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/abc.py:44: in __inner
return await self.task
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Connection: "amqp://guest:******@readapp2-rmq:5672/" at 0x784ad9d4edf0>, client_properties = {}
@task
async def connect(
self, client_properties: Optional[FieldTable] = None,
) -> bool:
if self.is_opened:
raise RuntimeError("Connection already opened")
ssl_context = self.ssl_context
if ssl_context is None and self.url.scheme == "amqps":
ssl_context = await self.loop.run_in_executor(
None, self._get_ssl_context,
)
self.ssl_context = ssl_context
log.debug("Connecting to: %s", self)
try:
reader, writer = await asyncio.open_connection(
self.url.host, self.url.port, ssl=ssl_context,
**self.__create_connection_kwargs,
)
frame_receiver = FrameReceiver(reader)
except OSError as e:
> raise AMQPConnectionError(*e.args) from e
E aiormq.exceptions.AMQPConnectionError: [Errno -2] Name or service not known
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/connection.py:464: AMQPConnectionError
____________________________________________________________________ ERROR at setup of test_message_wrong_exchange _____________________________________________________________________
self = <Connection: "amqp://guest:******@readapp2-rmq:5672/" at 0x784ad93d2fd0>, client_properties = {}
@task
async def connect(
self, client_properties: Optional[FieldTable] = None,
) -> bool:
if self.is_opened:
raise RuntimeError("Connection already opened")
ssl_context = self.ssl_context
if ssl_context is None and self.url.scheme == "amqps":
ssl_context = await self.loop.run_in_executor(
None, self._get_ssl_context,
)
self.ssl_context = ssl_context
log.debug("Connecting to: %s", self)
try:
> reader, writer = await asyncio.open_connection(
self.url.host, self.url.port, ssl=ssl_context,
**self.__create_connection_kwargs,
)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/connection.py:457:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../../miniconda3/lib/python3.12/asyncio/streams.py:48: in open_connection
transport, _ = await loop.create_connection(
../../../miniconda3/lib/python3.12/asyncio/base_events.py:1078: in create_connection
infos = await self._ensure_resolved(
../../../miniconda3/lib/python3.12/asyncio/base_events.py:1461: in _ensure_resolved
return await loop.getaddrinfo(host, port, family=family, type=type,
../../../miniconda3/lib/python3.12/asyncio/base_events.py:900: in getaddrinfo
return await self.run_in_executor(
../../../miniconda3/lib/python3.12/concurrent/futures/thread.py:59: in run
result = self.fn(*self.args, **self.kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
host = 'readapp2-rmq', port = 5672, family = 0, type = <SocketKind.SOCK_STREAM: 1>, proto = 0, flags = 0
def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
"""Resolve host and port into list of address info entries.
Translate the host/port argument into a sequence of 5-tuples that contain
all the necessary arguments for creating a socket connected to that service.
host is a domain name, a string representation of an IPv4/v6 address or
None. port is a string service name such as 'http', a numeric port number or
None. By passing None as the value of host and port, you can pass NULL to
the underlying C API.
The family, type and proto arguments can be optionally specified in order to
narrow the list of addresses returned. Passing zero as a value for each of
these arguments selects the full range of results.
"""
# We override this function since we want to translate the numeric family
# and socket type values to enum constants.
addrlist = []
> for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
E socket.gaierror: [Errno -2] Name or service not known
../../../miniconda3/lib/python3.12/socket.py:976: gaierror
The above exception was the direct cause of the following exception:
anyio_backend = 'asyncio', request = <SubRequest 'test_exchange' for <Function test_message_wrong_exchange>>, args = ()
kwargs = {'test_exchange_name': '74502e149edc4d7f8e65679f6dad990c', 'test_rmq_pool': <aio_pika.pool.Pool object at 0x784ad8cdc970>}
local_func = <function test_exchange at 0x784ada1a6f20>, backend_name = 'asyncio', backend_options = {}, runner = <anyio._backends._asyncio.TestRunner object at 0x784ada00dd60>
def wrapper(
*args: Any, anyio_backend: Any, request: SubRequest, **kwargs: Any
) -> Any:
# Rebind any fixture methods to the request instance
if (
request.instance
and ismethod(func)
and type(func.__self__) is type(request.instance)
):
local_func = func.__func__.__get__(request.instance)
else:
local_func = func
backend_name, backend_options = extract_backend_and_options(anyio_backend)
if has_backend_arg:
kwargs["anyio_backend"] = anyio_backend
if has_request_arg:
kwargs["request"] = request
with get_runner(backend_name, backend_options) as runner:
if isasyncgenfunction(local_func):
> yield from runner.run_asyncgen_fixture(local_func, kwargs)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/pytest_plugin.py:98:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:2234: in run_asyncgen_fixture
fixturevalue: T_Retval = self.get_loop().run_until_complete(
../../../miniconda3/lib/python3.12/asyncio/base_events.py:686: in run_until_complete
return future.result()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:2226: in _call_in_runner_task
return await future
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:2193: in _run_tests_and_fixtures
retval = await coro
tests/conftest.py:140: in test_exchange
async with test_rmq_pool.acquire() as conn:
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:147: in __aenter__
self.item = await self.pool._get()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:104: in _get
return await self._create_item()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:92: in _create_item
item = await self.__constructor(*self.__constructor_args)
readapp2/services/rabbit/lifespan.py:38: in get_channel
async with connection_pool.acquire() as connection:
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:147: in __aenter__
self.item = await self.pool._get()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:104: in _get
return await self._create_item()
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/pool.py:92: in _create_item
item = await self.__constructor(*self.__constructor_args)
readapp2/services/rabbit/lifespan.py:22: in get_connection
return await aio_pika.connect_robust(str(settings.rabbit_url))
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/robust_connection.py:334: in connect_robust
await connection.connect(timeout=timeout)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/robust_connection.py:180: in connect
await self.__fail_fast_future
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/robust_connection.py:135: in __connection_factory
await Connection.connect(self, self.__connect_timeout)
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/connection.py:125: in connect
self.transport = await UnderlayConnection.connect(
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/abc.py:679: in connect
connection = await cls.make_connection(
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aio_pika/abc.py:667: in make_connection
connection: aiormq.abc.AbstractConnection = await asyncio.wait_for(
../../../miniconda3/lib/python3.12/asyncio/tasks.py:520: in wait_for
return await fut
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/connection.py:920: in connect
await connection.connect(client_properties or {})
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/base.py:164: in wrap
return await self.create_task(func(self, *args, **kwargs))
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/abc.py:44: in __inner
return await self.task
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Connection: "amqp://guest:******@readapp2-rmq:5672/" at 0x784ad93d2fd0>, client_properties = {}
@task
async def connect(
self, client_properties: Optional[FieldTable] = None,
) -> bool:
if self.is_opened:
raise RuntimeError("Connection already opened")
ssl_context = self.ssl_context
if ssl_context is None and self.url.scheme == "amqps":
ssl_context = await self.loop.run_in_executor(
None, self._get_ssl_context,
)
self.ssl_context = ssl_context
log.debug("Connecting to: %s", self)
try:
reader, writer = await asyncio.open_connection(
self.url.host, self.url.port, ssl=ssl_context,
**self.__create_connection_kwargs,
)
frame_receiver = FrameReceiver(reader)
except OSError as e:
> raise AMQPConnectionError(*e.args) from e
E aiormq.exceptions.AMQPConnectionError: [Errno -2] Name or service not known
../../../.cache/pypoetry/virtualenvs/readapp2-vunyLE_l-py3.12/lib/python3.12/site-packages/aiormq/connection.py:464: AMQPConnectionError
=============================================================================== short test summary info ================================================================================
ERROR tests/test_rabbit.py::test_message_publishing - aiormq.exceptions.AMQPConnectionError: [Errno -2] Name or service not known
ERROR tests/test_rabbit.py::test_message_wrong_exchange - aiormq.exceptions.AMQPConnectionError: [Errno -2] Name or service not known
============================================================================= 5 passed, 2 errors in 1.02s ==============================================================================
Metadata
Metadata
Assignees
Labels
No labels