File: test_gridnet.py

package info (click to toggle)
python-gridnet 5.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 632 kB
  • sloc: python: 302; makefile: 8; sh: 5
file content (145 lines) | stat: -rw-r--r-- 4,415 bytes parent folder | download
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")