python-bsblan> ============================= test session starts ==============================
python-bsblan> platform linux -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0
python-bsblan> rootdir: /build/source
python-bsblan> configfile: pyproject.toml
python-bsblan> plugins: aresponses-2.1.6, asyncio-0.21.1, mock-3.11.1, devtools-0.12.2
python-bsblan> asyncio: mode=Mode.AUTO
python-bsblan> collected 16 items
python-bsblan>
python-bsblan> tests/test_bsblan.py ......F.F [ 56%]
python-bsblan> tests/test_device.py . [ 62%]
python-bsblan> tests/test_info.py . [ 68%]
python-bsblan> tests/test_sensor.py . [ 75%]
python-bsblan> tests/test_state.py . [ 81%]
python-bsblan> tests/test_static_state.py . [ 87%]
python-bsblan> tests/test_thermostat.py .. [100%]
python-bsblan>
python-bsblan> =================================== FAILURES ===================================
python-bsblan> ______________________________ test_http_error400 ______________________________
python-bsblan>
python-bsblan> aresponses = <aresponses.main.ResponsesMockServer object at 0x7ffff507a410>
python-bsblan>
python-bsblan> @pytest.mark.asyncio
python-bsblan> async def test_http_error400(aresponses: ResponsesMockServer) -> None:
python-bsblan> """Test HTTP 404 response handling."""
python-bsblan> aresponses.add(
python-bsblan> "example.com",
python-bsblan> "/",
python-bsblan> "POST",
python-bsblan> aresponses.Response(text="OMG PUPPIES!", status=404),
python-bsblan> )
python-bsblan>
python-bsblan> async with aiohttp.ClientSession() as session:
python-bsblan> bsblan = BSBLAN("example.com", session=session)
python-bsblan> with pytest.raises(BSBLANError):
python-bsblan> > assert await bsblan._request("/")
python-bsblan>
python-bsblan> tests/test_bsblan.py:146:
python-bsblan> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
python-bsblan> /nix/store/pcxqjpwmr1ym8gyhznikdbgn8i1pzq6a-python3.11-backoff-2.2.1/lib/python3.11/site-packages/backoff/_async.py:151: in retry
python-bsblan> ret = await target(*args, **kwargs)
python-bsblan> /nix/store/qbr3z806smc2x07ypz7dw76sdz8sr5kk-python3.11-python-bsblan-0.5.16/lib/python3.11/site-packages/bsblan/bsblan.py:129: in _request
python-bsblan> response = await self.session.request(
python-bsblan> /nix/store/glq1cn6g1sh7c6avqmg0y2bsmxsfg58c-python3.11-aiohttp-3.9.1/lib/python3.11/site-packages/aiohttp/client.py:541: in _request
python-bsblan> req = self._request_class(
python-bsblan> /nix/store/ixq4rwwdgxs08vgm5m3nyxvs67v1620y-python3.11-aresponses-2.1.6/lib/python3.11/site-packages/aresponses/main.py:289: in new_init
python-bsblan> self._old_init(_self, *largs, **kwargs)
python-bsblan> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
python-bsblan>
python-bsblan> self = <aiohttp.client_reqrep.ClientRequest object at 0x7ffff5079650>
python-bsblan> method = '/', url = URL('http://example.com:80/JQ')
python-bsblan>
python-bsblan> def __init__(
python-bsblan> self,
python-bsblan> method: str,
python-bsblan> url: URL,
python-bsblan> *,
python-bsblan> params: Optional[Mapping[str, str]] = None,
python-bsblan> headers: Optional[LooseHeaders] = None,
python-bsblan> skip_auto_headers: Iterable[str] = frozenset(),
python-bsblan> data: Any = None,
python-bsblan> cookies: Optional[LooseCookies] = None,
python-bsblan> auth: Optional[BasicAuth] = None,
python-bsblan> version: http.HttpVersion = http.HttpVersion11,
python-bsblan> compress: Optional[str] = None,
python-bsblan> chunked: Optional[bool] = None,
python-bsblan> expect100: bool = False,
python-bsblan> loop: Optional[asyncio.AbstractEventLoop] = None,
python-bsblan> response_class: Optional[Type["ClientResponse"]] = None,
python-bsblan> proxy: Optional[URL] = None,
python-bsblan> proxy_auth: Optional[BasicAuth] = None,
python-bsblan> timer: Optional[BaseTimerContext] = None,
python-bsblan> session: Optional["ClientSession"] = None,
python-bsblan> ssl: Union[SSLContext, Literal[False], Fingerprint, None] = None,
python-bsblan> proxy_headers: Optional[LooseHeaders] = None,
python-bsblan> traces: Optional[List["Trace"]] = None,
python-bsblan> trust_env: bool = False,
python-bsblan> server_hostname: Optional[str] = None,
python-bsblan> ):
python-bsblan> if loop is None:
python-bsblan> loop = asyncio.get_event_loop()
python-bsblan>
python-bsblan> match = _CONTAINS_CONTROL_CHAR_RE.search(method)
python-bsblan> if match:
python-bsblan> > raise ValueError(
python-bsblan> f"Method cannot contain non-token characters {method!r} "
python-bsblan> "(found at least {match.group()!r})"
python-bsblan> )
python-bsblan> E ValueError: Method cannot contain non-token characters '/' (found at least {match.group()!r})
python-bsblan>
python-bsblan> /nix/store/glq1cn6g1sh7c6avqmg0y2bsmxsfg58c-python3.11-aiohttp-3.9.1/lib/python3.11/site-packages/aiohttp/client_reqrep.py:290: ValueError
python-bsblan> _______________________ test_not_authorized_401_response _______________________
python-bsblan>
python-bsblan> aresponses = <aresponses.main.ResponsesMockServer object at 0x7ffff4ea5710>
python-bsblan>
python-bsblan> @pytest.mark.asyncio
python-bsblan> async def test_not_authorized_401_response(aresponses: ResponsesMockServer) -> None:
python-bsblan> """Test wrong username and password response handling."""
python-bsblan> aresponses.add(
python-bsblan> "example.com",
python-bsblan> "/JQ",
python-bsblan> "POST",
python-bsblan> aresponses.Response(
python-bsblan> status=401,
python-bsblan> headers={"Content-Type": "text/html"},
python-bsblan> ),
python-bsblan> )
python-bsblan>
python-bsblan> async with aiohttp.ClientSession() as session:
python-bsblan> bsblan = BSBLAN("example.com", session=session)
python-bsblan> with pytest.raises(BSBLANError):
python-bsblan> > assert await bsblan._request("/JQ")
python-bsblan>
python-bsblan> tests/test_bsblan.py:181:
python-bsblan> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
python-bsblan> /nix/store/pcxqjpwmr1ym8gyhznikdbgn8i1pzq6a-python3.11-backoff-2.2.1/lib/python3.11/site-packages/backoff/_async.py:151: in retry
python-bsblan> ret = await target(*args, **kwargs)
python-bsblan> /nix/store/qbr3z806smc2x07ypz7dw76sdz8sr5kk-python3.11-python-bsblan-0.5.16/lib/python3.11/site-packages/bsblan/bsblan.py:129: in _request
python-bsblan> response = await self.session.request(
python-bsblan> /nix/store/glq1cn6g1sh7c6avqmg0y2bsmxsfg58c-python3.11-aiohttp-3.9.1/lib/python3.11/site-packages/aiohttp/client.py:541: in _request
python-bsblan> req = self._request_class(
python-bsblan> /nix/store/ixq4rwwdgxs08vgm5m3nyxvs67v1620y-python3.11-aresponses-2.1.6/lib/python3.11/site-packages/aresponses/main.py:289: in new_init
python-bsblan> self._old_init(_self, *largs, **kwargs)
python-bsblan> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
python-bsblan>
python-bsblan> self = <aiohttp.client_reqrep.ClientRequest object at 0x7ffff4ea6710>
python-bsblan> method = '/JQ', url = URL('http://example.com:80/JQ')
python-bsblan>
python-bsblan> def __init__(
python-bsblan> self,
python-bsblan> method: str,
python-bsblan> url: URL,
python-bsblan> *,
python-bsblan> params: Optional[Mapping[str, str]] = None,
python-bsblan> headers: Optional[LooseHeaders] = None,
python-bsblan> skip_auto_headers: Iterable[str] = frozenset(),
python-bsblan> data: Any = None,
python-bsblan> cookies: Optional[LooseCookies] = None,
python-bsblan> auth: Optional[BasicAuth] = None,
python-bsblan> version: http.HttpVersion = http.HttpVersion11,
python-bsblan> compress: Optional[str] = None,
python-bsblan> chunked: Optional[bool] = None,
python-bsblan> expect100: bool = False,
python-bsblan> loop: Optional[asyncio.AbstractEventLoop] = None,
python-bsblan> response_class: Optional[Type["ClientResponse"]] = None,
python-bsblan> proxy: Optional[URL] = None,
python-bsblan> proxy_auth: Optional[BasicAuth] = None,
python-bsblan> timer: Optional[BaseTimerContext] = None,
python-bsblan> session: Optional["ClientSession"] = None,
python-bsblan> ssl: Union[SSLContext, Literal[False], Fingerprint, None] = None,
python-bsblan> proxy_headers: Optional[LooseHeaders] = None,
python-bsblan> traces: Optional[List["Trace"]] = None,
python-bsblan> trust_env: bool = False,
python-bsblan> server_hostname: Optional[str] = None,
python-bsblan> ):
python-bsblan> if loop is None:
python-bsblan> loop = asyncio.get_event_loop()
python-bsblan>
python-bsblan> match = _CONTAINS_CONTROL_CHAR_RE.search(method)
python-bsblan> if match:
python-bsblan> > raise ValueError(
python-bsblan> f"Method cannot contain non-token characters {method!r} "
python-bsblan> "(found at least {match.group()!r})"
python-bsblan> )
python-bsblan> E ValueError: Method cannot contain non-token characters '/JQ' (found at least {match.group()!r})
python-bsblan>
python-bsblan> /nix/store/glq1cn6g1sh7c6avqmg0y2bsmxsfg58c-python3.11-aiohttp-3.9.1/lib/python3.11/site-packages/aiohttp/client_reqrep.py:290: ValueError