1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
"""Basic tests for the API."""
# pylint: disable=protected-access
import asyncio
from unittest.mock import patch
import pytest
from aiohttp import ClientError, ClientResponse, ClientSession
from aresponses import Response, ResponsesMockServer
from gridnet import GridNet
from gridnet.exceptions import GridNetConnectionError, GridNetError
from . import load_fixtures
async def test_json_request(aresponses: ResponsesMockServer) -> None:
"""Test JSON response is handled correctly."""
aresponses.add(
"127.0.0.1",
"/test",
"GET",
aresponses.Response(
status=200,
headers={"Content-Type": "application/json"},
text='{"status": "ok"}',
),
)
async with ClientSession() as session:
client = GridNet("127.0.0.1", session=session)
await client._request("test")
await client.close()
async def test_internal_session(aresponses: ResponsesMockServer) -> None:
"""Test JSON response is handled correctly."""
aresponses.add(
"127.0.0.1",
"/test",
"GET",
aresponses.Response(
status=200,
headers={"Content-Type": "application/json"},
text='{"status": "ok"}',
),
)
async with GridNet("127.0.0.1") as client:
await client._request("test")
async def test_timeout(aresponses: ResponsesMockServer) -> None:
"""Test request timeout from the API."""
# Faking a timeout by sleeping
async def response_handler(_: ClientResponse) -> Response:
await asyncio.sleep(0.2)
return aresponses.Response(
body="Goodmorning!",
text=load_fixtures("smartbridge.json"),
)
aresponses.add("127.0.0.1", "/meter/now", "GET", response_handler)
async with ClientSession() as session:
client = GridNet(host="127.0.0.1", session=session, request_timeout=0.1)
with pytest.raises(GridNetConnectionError):
assert await client.smartbridge()
async def test_client_error() -> None:
"""Test request client error from the API."""
async with ClientSession() as session:
client = GridNet(host="127.0.0.1", session=session)
with patch.object(
session,
"request",
side_effect=ClientError,
), pytest.raises(GridNetConnectionError):
assert await client._request("test")
@pytest.mark.parametrize("status", [401, 403])
async def test_http_error401(aresponses: ResponsesMockServer, status: int) -> None:
"""Test HTTP 401 response handling."""
aresponses.add(
"127.0.0.1",
"/meter/now",
"GET",
aresponses.Response(text="Give me energy!", status=status),
)
async with ClientSession() as session:
client = GridNet(host="127.0.0.1", session=session)
with pytest.raises(GridNetError):
assert await client._request("test")
async def test_http_error400(aresponses: ResponsesMockServer) -> None:
"""Test HTTP 404 response handling."""
aresponses.add(
"127.0.0.1",
"/meter/now",
"GET",
aresponses.Response(text="Give me energy!", status=404),
)
async with ClientSession() as session:
client = GridNet(host="127.0.0.1", session=session)
with pytest.raises(GridNetError):
assert await client._request("test")
async def test_http_error500(aresponses: ResponsesMockServer) -> None:
"""Test HTTP 500 response handling."""
aresponses.add(
"127.0.0.1",
"/meter/now",
"GET",
aresponses.Response(
body=b'{"status":"nok"}',
status=500,
),
)
async with ClientSession() as session:
client = GridNet(host="127.0.0.1", session=session)
with pytest.raises(GridNetError):
assert await client._request("test")
async def test_no_success(aresponses: ResponsesMockServer) -> None:
"""Test a message without a success message throws."""
aresponses.add(
"127.0.0.1",
"/meter/now",
"GET",
aresponses.Response(
status=200,
text='{"message": "no success"}',
),
)
async with ClientSession() as session:
client = GridNet(host="127.0.0.1", session=session)
with pytest.raises(GridNetError):
assert await client._request("test")
|