File: test_api.py

package info (click to toggle)
python-tilt-pi 0.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 192 kB
  • sloc: python: 153; makefile: 2
file content (98 lines) | stat: -rw-r--r-- 2,963 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
import asyncio
from unittest.mock import AsyncMock, Mock, patch

import aiohttp
import pytest
import pytest_asyncio

from tiltpi.api import TiltPiClient, TiltPiConnectionError, TiltPiConnectionTimeoutError
from tiltpi.model import TiltColor, TiltHydrometerData

TEST_HOST = "192.1.1.123"
TEST_PORT = 1880


@pytest_asyncio.fixture
async def mock_client_session():
    session = aiohttp.ClientSession()
    yield session
    await session.close()


def make_mock_response(response_data):
    mock_response = AsyncMock()
    mock_response.raise_for_status = Mock(return_value=None)
    mock_response.json.return_value = response_data

    context_manager = AsyncMock()
    context_manager.__aenter__.return_value = mock_response
    context_manager.__aexit__.return_value = None
    return context_manager


@pytest.mark.asyncio
@patch.object(aiohttp.ClientSession, "get")
async def test_get_hydrometers_success(mock_get, mock_client_session):
    """Test successful fetch of hydrometer data using a patch decorator."""
    response = [
        {
            "mac": "00:11:22:33:44:55",
            "Color": "blue",
            "Temp": 70,
            "SG": 1.012,
        },
        {
            "mac": "AA:BB:CC:DD:EE:FF",
            "Color": "red",
            "Temp": 68,
            "SG": 1.015,
        },
    ]

    mock_get.return_value = make_mock_response(response)

    client = TiltPiClient(
        host=TEST_HOST,
        port=TEST_PORT,
        session=mock_client_session,
    )
    result = await client.get_hydrometers()
    assert len(result) == 2
    assert isinstance(result[0], TiltHydrometerData)
    assert result[0].mac_id == "00:11:22:33:44:55"
    assert result[0].color == TiltColor.BLUE
    assert result[0].temperature == 70.0
    assert result[0].gravity == 1.012
    assert isinstance(result[1], TiltHydrometerData)
    assert result[1].mac_id == "AA:BB:CC:DD:EE:FF"
    assert result[1].color == TiltColor.RED
    assert result[1].temperature == 68.0
    assert result[1].gravity == 1.015


@pytest.mark.asyncio
@patch.object(aiohttp.ClientSession, "get")
async def test_get_hydrometers_timeout(mock_get, mock_client_session):
    """Test that a timeout error is raised."""
    mock_get.side_effect = asyncio.TimeoutError("Timeout occurred")
    client = TiltPiClient(
        host=TEST_HOST,
        port=TEST_PORT,
        session=mock_client_session,
    )
    with pytest.raises(TiltPiConnectionTimeoutError):
        await client.get_hydrometers()


@pytest.mark.asyncio
@patch.object(aiohttp.ClientSession, "get")
async def test_get_hydrometers_connection_error(mock_get, mock_client_session):
    """Test that a connection error is raised."""
    mock_get.side_effect = aiohttp.ClientError("Connection error occurred")
    client = TiltPiClient(
        host=TEST_HOST,
        port=TEST_PORT,
        session=mock_client_session,
    )
    with pytest.raises(TiltPiConnectionError):
        await client.get_hydrometers()