diff --git a/openevsehttp/__init__.py b/openevsehttp/__init__.py index 7e84214..15946fd 100644 --- a/openevsehttp/__init__.py +++ b/openevsehttp/__init__.py @@ -9,7 +9,13 @@ import aiohttp # type: ignore from .const import MAX_AMPS, MIN_AMPS -from .exceptions import AuthenticationError, ParseJSONError +from .exceptions import ( + AlreadyListening, + AuthenticationError, + MissingMethod, + ParseJSONError, + UnknownError, +) _LOGGER = logging.getLogger(__name__) @@ -116,7 +122,7 @@ async def running(self): break except aiohttp.ClientResponseError as error: - if error.code == 401: + if error.status == 401: _LOGGER.error("Credentials rejected: %s", error) self._error_reason = ERROR_AUTH_FAILURE else: @@ -174,70 +180,82 @@ def __init__(self, host: str, user: str = None, pwd: str = None) -> None: self.callback: Optional[Callable] = None self._loop = None - async def send_command(self, command: str) -> tuple | None: - """Send a RAPI command to the charger and parses the response.""" + async def process_request( + self, url: str, method: str = None, data: Any = None + ) -> Any: + """Return result of processed HTTP request.""" auth = None - url = f"{self.url}r" - data = {"json": 1, "rapi": command} + if method is None: + raise MissingMethod if self._user and self._pwd: auth = aiohttp.BasicAuth(self._user, self._pwd) - _LOGGER.debug("Posting data: %s to %s", command, url) async with aiohttp.ClientSession() as session: - async with session.post(url, data=data, auth=auth) as resp: + http_method = getattr(session, method) + async with http_method(url, data=data, auth=auth) as resp: + try: + message = await resp.json() + except TimeoutError: + _LOGGER.error("%s: %s", ERROR_TIMEOUT, url) + if resp.status == 400: - _LOGGER.debug("JSON error: %s", await resp.text()) + _LOGGER.error("%s", message["msg"]) raise ParseJSONError if resp.status == 401: - _LOGGER.debug("Authentication error: %s", await resp.text()) + error = await resp.text() + _LOGGER.error("Authentication error: %s", error) raise AuthenticationError + if resp.status == 404: + _LOGGER.error("%s", message["msg"]) + raise UnknownError + if resp.status == 405: + _LOGGER.error("%s", message["msg"]) + elif resp.status == 500: + _LOGGER.error("%s", message["msg"]) - value = await resp.json() + return message - if "ret" not in value: - return False, "" - return value["cmd"], value["ret"] + async def send_command(self, command: str) -> tuple | None: + """Send a RAPI command to the charger and parses the response.""" + url = f"{self.url}r" + data = {"json": 1, "rapi": command} + + _LOGGER.debug("Posting data: %s to %s", command, url) + value = await self.process_request(url=url, method="post", data=data) + if "ret" not in value: + return False, "" + return value["cmd"], value["ret"] async def update(self) -> None: """Update the values.""" - auth = None urls = [f"{self.url}config"] - if self._user and self._pwd: - auth = aiohttp.BasicAuth(self._user, self._pwd) - if not self._ws_listening: urls = [f"{self.url}status", f"{self.url}config"] - async with aiohttp.ClientSession() as session: - for url in urls: - _LOGGER.debug("Updating data from %s", url) - async with session.get(url, auth=auth) as resp: - if resp.status == 401: - _LOGGER.debug("Authentication error: %s", resp.text()) - raise AuthenticationError - - if "/status" in url: - try: - self._status = await resp.json() - _LOGGER.debug("Status update: %s", self._status) - except TimeoutError: - _LOGGER.error("%s status.", ERROR_TIMEOUT) - else: - try: - self._config = await resp.json() - _LOGGER.debug("Config update: %s", self._config) - except TimeoutError: - _LOGGER.error("%s config.", ERROR_TIMEOUT) + for url in urls: + _LOGGER.debug("Updating data from %s", url) + response = await self.process_request(url, method="get") + if "/status" in url: + self._status = response + _LOGGER.debug("Status update: %s", self._status) + + else: + self._config = response + _LOGGER.debug("Config update: %s", self._config) if not self.websocket: # Start Websocket listening self.websocket = OpenEVSEWebsocket( self.url, self._update_status, self._user, self._pwd ) - if not self._ws_listening: - self._start_listening() + + def ws_start(self): + """Start the websocket listener.""" + if self._ws_listening: + raise AlreadyListening + self._start_listening() def _start_listening(self): """Start the websocket listener.""" @@ -283,7 +301,7 @@ def _update_status(self, msgtype, data, error): self._status.update(data) if self.callback is not None: - self.callback() + self.callback() # pylint: disable=not-callable def ws_disconnect(self) -> None: """Disconnect the websocket listener.""" @@ -297,28 +315,39 @@ def ws_state(self) -> Any: assert self.websocket return self.websocket.state + async def get_schedule(self) -> list: + """Return the current schedule.""" + url = f"{self.url}schedule" + + _LOGGER.debug("Getting current schedule from %s", url) + response = await self.process_request(url=url, method="post") + return response + + async def set_charge_mode(self, mode: str = "fast") -> None: + """Set the charge mode.""" + url = f"{self.url}config" + + if mode != "fast" or mode != "eco": + _LOGGER.error("Invalid value for charge_mode: %s", mode) + raise ValueError + + data = {"charge_mode": mode} + + _LOGGER.debug("Setting charge mode to %s", mode) + response = await self.process_request( + url=url, method="post", data=data + ) # noqa: E501 + if response["msg"] != "done": + _LOGGER.error("Problem issuing command: %s", response["msg"]) + raise UnknownError + async def get_override(self) -> None: """Get the manual override status.""" url = f"{self.url}override" - if self._user and self._pwd: - auth = aiohttp.BasicAuth(self._user, self._pwd) - _LOGGER.debug("Geting data from %s", url) - async with aiohttp.ClientSession() as session: - async with session.get(url, auth=auth) as resp: - if resp.status == 400: - _LOGGER.debug("JSON error: %s", await resp.text()) - raise ParseJSONError - if resp.status == 401: - _LOGGER.debug("Authentication error: %s", await resp.text()) - raise AuthenticationError - if resp.status == 404: - error = await resp.json() - _LOGGER.error("Error getting override status: %s", error["msg"]) - - value = await resp.json() - return value + response = await self.process_request(url=url, method="get") + return response async def set_override( self, @@ -332,9 +361,6 @@ async def set_override( """Set the manual override status.""" url = f"{self.url}override" - if self._user and self._pwd: - auth = aiohttp.BasicAuth(self._user, self._pwd) - if state not in ["active", "disabled"]: raise ValueError @@ -348,56 +374,26 @@ async def set_override( } _LOGGER.debug("Setting override config on %s", url) - async with aiohttp.ClientSession() as session: - async with session.post(url, data=data, auth=auth) as resp: - if resp.status == 400: - _LOGGER.debug("JSON error: %s", await resp.text()) - raise ParseJSONError - if resp.status == 401: - _LOGGER.debug("Authentication error: %s", await resp.text()) - raise AuthenticationError - - value = await resp.json() - _LOGGER.debug("Override set response: %s", value["msg"]) - return value + response = await self.process_request( + url=url, method="post", data=data + ) # noqa: E501 + return response async def toggle_override(self) -> None: """Toggle the manual override status.""" url = f"{self.url}override" - if self._user and self._pwd: - auth = aiohttp.BasicAuth(self._user, self._pwd) - _LOGGER.debug("Toggling manual override %s", url) - async with aiohttp.ClientSession() as session: - async with session.patch(url, auth=auth) as resp: - if resp.status == 400: - _LOGGER.debug("JSON error: %s", await resp.text()) - raise ParseJSONError - if resp.status == 401: - _LOGGER.debug("Authentication error: %s", await resp.text()) - raise AuthenticationError - - _LOGGER.debug("Toggle response: %s", resp.status) + response = await self.process_request(url=url, method="patch") + _LOGGER.debug("Toggle response: %s", response["msg"]) async def clear_override(self) -> None: """Clear the manual override status.""" url = f"{self.url}overrride" - if self._user and self._pwd: - auth = aiohttp.BasicAuth(self._user, self._pwd) - _LOGGER.debug("Clearing manual overrride %s", url) - async with aiohttp.ClientSession() as session: - async with session.delete(url, auth=auth) as resp: - if resp.status == 400: - _LOGGER.debug("JSON error: %s", await resp.text()) - raise ParseJSONError - if resp.status == 401: - _LOGGER.debug("Authentication error: %s", await resp.text()) - raise AuthenticationError - - _LOGGER.debug("Toggle response: %s", resp.status) + response = await self.process_request(url=url, method="delete") + _LOGGER.debug("Toggle response: %s", response["msg"]) @property def hostname(self) -> str: diff --git a/openevsehttp/exceptions.py b/openevsehttp/exceptions.py index 77b7550..c384f24 100644 --- a/openevsehttp/exceptions.py +++ b/openevsehttp/exceptions.py @@ -7,3 +7,15 @@ class AuthenticationError(Exception): class ParseJSONError(Exception): """Exception for JSON parsing errors.""" + + +class UnknownError(Exception): + """Exception for Unknown errors.""" + + +class MissingMethod(Exception): + """Exception for missing method variable.""" + + +class AlreadyListening(Exception): + """Exception for already listening websocket.""" diff --git a/requirements_test.txt b/requirements_test.txt index 8beeef0..1a08932 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1,7 +1,7 @@ pytest==6.2.4 pytest-cov==2.12.1 pytest-timeout==1.4.2 -pytest-aiohttp +pytest-asyncio requests_mock aiohttp -aioresponses \ No newline at end of file +aioresponses diff --git a/setup.py b/setup.py index 378f221..7afb880 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ PROJECT_DIR = Path(__file__).parent.resolve() README_FILE = PROJECT_DIR / "README.md" -VERSION = "0.1.10" +VERSION = "0.1.11" setup( diff --git a/tests/conftest.py b/tests/conftest.py index 6b7cde8..9c08faa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -14,164 +14,67 @@ @pytest.fixture(name="test_charger_auth") -def test_charger_auth(status_mock, config_mock): +def test_charger_auth(mock_aioclient): """Load the charger data.""" + mock_aioclient.get( + TEST_URL_STATUS, + status=200, + body=load_fixture("v4_json/status.json"), + ) + mock_aioclient.get( + TEST_URL_CONFIG, + status=200, + body=load_fixture("v4_json/config.json"), + ) return openevsehttp.OpenEVSE(TEST_TLD, user="testuser", pwd="fakepassword") @pytest.fixture(name="test_charger_auth_err") -def test_charger_auth_err(status_mock_err, config_mock_err): +def test_charger_auth_err(mock_aioclient): """Load the charger data.""" + mock_aioclient.get( + TEST_URL_STATUS, + status=401, + ) + mock_aioclient.get( + TEST_URL_CONFIG, + status=401, + ) return openevsehttp.OpenEVSE(TEST_TLD, user="testuser", pwd="fakepassword") -@pytest.fixture(name="status_mock_err") -def mock_status_err(): - """Mock the status reply.""" - with aioresponses() as client_mock: - client_mock.get( - TEST_URL_STATUS, - status=401, - ) - - yield client_mock - - -@pytest.fixture(name="config_mock_err") -def mock_config_err(): - """Mock the config reply.""" - with aioresponses() as client_mock: - client_mock.get( - TEST_URL_CONFIG, - status=401, - ) - - yield client_mock - - @pytest.fixture(name="test_charger") -def test_charger(status_mock, config_mock): +def test_charger(mock_aioclient): """Load the charger data.""" + mock_aioclient.get( + TEST_URL_STATUS, + status=200, + body=load_fixture("v4_json/status.json"), + ) + mock_aioclient.get( + TEST_URL_CONFIG, + status=200, + body=load_fixture("v4_json/config.json"), + ) return openevsehttp.OpenEVSE(TEST_TLD) @pytest.fixture(name="test_charger_v2") -def test_charger_v2(status_mock_v2, config_mock_v2): +def test_charger_v2(mock_aioclient): """Load the charger data.""" + mock_aioclient.get( + TEST_URL_STATUS, + status=200, + body=load_fixture("v2_json/status.json"), + ) + mock_aioclient.get( + TEST_URL_CONFIG, + status=200, + body=load_fixture("v2_json/config.json"), + ) return openevsehttp.OpenEVSE(TEST_TLD) -@pytest.fixture(name="status_mock") -def mock_status(): - """Mock the status reply.""" - with aioresponses() as mock_status: - mock_status.get( - TEST_URL_STATUS, - status=200, - body=load_fixture("v4_json/status.json"), - ) - - yield mock_status - - -@pytest.fixture(name="config_mock") -def mock_config(): - """Mock the config reply.""" - with aioresponses() as mock_config: - mock_config.get( - TEST_URL_CONFIG, - status=200, - body=load_fixture("v4_json/config.json"), - ) - - yield mock_config - - -@pytest.fixture(name="status_mock_v2") -def mock_status_v2(): - """Mock the status reply.""" - with aioresponses() as client_mock: - client_mock.get( - TEST_URL_STATUS, - status=200, - body=load_fixture("v2_json/status.json"), - ) - yield client_mock - - -@pytest.fixture(name="config_mock_v2") -def mock_config_v2(): - """Mock the config reply.""" - with aioresponses() as client_mock: - client_mock.get( - TEST_URL_CONFIG, - status=200, - body=load_fixture("v2_json/config.json"), - ) - yield client_mock - - -@pytest.fixture(name="send_command_mock") -def mock_send_command(): - """Mock the command reply.""" - with aioresponses() as client_mock: - value = {"cmd": "OK", "ret": "$OK^20"} - client_mock.post( - TEST_URL_RAPI, - status=200, - body=json.dumps(value), - ) - yield client_mock - - -@pytest.fixture(name="send_command_parse_err") -def mock_send_command_parse_err(): - """Mock the command reply parse err.""" - with aioresponses() as client_mock: - client_mock.post( - TEST_URL_RAPI, - status=400, - ) - yield client_mock - - -@pytest.fixture(name="send_command_auth_err") -def mock_send_command_auth_err(): - """Mock the command reply auth err.""" - with aioresponses() as client_mock: - client_mock.post( - TEST_URL_RAPI, - status=401, - ) - yield client_mock - - -@pytest.fixture(name="send_command_mock_missing") -def mock_send_command_missing(): - """Mock the command reply.""" - with aioresponses() as client_mock: - value = {"cmd": "OK", "what": "$NK^21"} - client_mock.post( - TEST_URL_RAPI, - status=200, - body=json.dumps(value), - ) - yield client_mock - - -@pytest.fixture(name="send_command_mock_failed") -def mock_send_command_failed(): - """Mock the command reply.""" - with aioresponses() as client_mock: - value = {"cmd": "OK", "ret": "$NK^21"} - client_mock.post( - TEST_URL_RAPI, - status=200, - body=json.dumps(value), - ) - yield client_mock - - @pytest.fixture def aioclient_mock(): """Fixture to mock aioclient calls.""" @@ -185,3 +88,10 @@ def aioclient_mock(): ) yield mock_aiohttp + + +@pytest.fixture +def mock_aioclient(): + """Fixture to mock aioclient calls.""" + with aioresponses() as m: + yield m diff --git a/tests/test_init.py b/tests/test_init.py index 7a72e53..3a303a0 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -1,9 +1,12 @@ import asyncio +import json import pytest import openevsehttp pytestmark = pytest.mark.asyncio +TEST_URL_RAPI = "http://openevse.test.tld/r" + async def test_get_status_auth(test_charger_auth): """Test v4 Status reply""" @@ -19,39 +22,70 @@ async def test_get_status_auth_err(test_charger_auth_err): assert test_charger_auth_err is None -async def test_send_command(test_charger, send_command_mock): +async def test_send_command(test_charger, mock_aioclient): """Test v4 Status reply""" + value = {"cmd": "OK", "ret": "$OK^20"} + mock_aioclient.post( + TEST_URL_RAPI, + status=200, + body=json.dumps(value), + ) status = await test_charger.send_command("test") assert status == ("OK", "$OK^20") -async def test_send_command_failed(test_charger, send_command_mock_failed): +async def test_send_command_failed(test_charger, mock_aioclient): """Test v4 Status reply""" + value = {"cmd": "OK", "ret": "$NK^21"} + mock_aioclient.post( + TEST_URL_RAPI, + status=200, + body=json.dumps(value), + ) status = await test_charger.send_command("test") assert status == ("OK", "$NK^21") -async def test_send_command_missing(test_charger, send_command_mock_missing): +async def test_send_command_missing(test_charger, mock_aioclient): """Test v4 Status reply""" + value = {"cmd": "OK", "what": "$NK^21"} + mock_aioclient.post( + TEST_URL_RAPI, + status=200, + body=json.dumps(value), + ) status = await test_charger.send_command("test") assert status == (False, "") -async def test_send_command_auth(test_charger_auth, send_command_mock): +async def test_send_command_auth(test_charger_auth, mock_aioclient): """Test v4 Status reply""" + value = {"cmd": "OK", "ret": "$OK^20"} + mock_aioclient.post( + TEST_URL_RAPI, + status=200, + body=json.dumps(value), + ) status = await test_charger_auth.send_command("test") assert status == ("OK", "$OK^20") -async def test_send_command_parse_err(test_charger_auth, send_command_parse_err): +async def test_send_command_parse_err(test_charger_auth, mock_aioclient): """Test v4 Status reply""" + mock_aioclient.post( + TEST_URL_RAPI, status=400, body='{"msg": "Could not parse JSON"}' + ) with pytest.raises(openevsehttp.ParseJSONError): status = await test_charger_auth.send_command("test") assert status is None -async def test_send_command_auth_err(test_charger_auth, send_command_auth_err): +async def test_send_command_auth_err(test_charger_auth, mock_aioclient): """Test v4 Status reply""" + mock_aioclient.post( + TEST_URL_RAPI, + status=401, + ) with pytest.raises(openevsehttp.AuthenticationError): status = await test_charger_auth.send_command("test") assert status is None @@ -61,7 +95,7 @@ async def test_send_command_auth_err(test_charger_auth, send_command_auth_err): "fixture, expected", [("test_charger", "sleeping"), ("test_charger_v2", "not connected")], ) -async def test_get_status(fixture, expected, request, aioclient_mock): +async def test_get_status(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -73,7 +107,7 @@ async def test_get_status(fixture, expected, request, aioclient_mock): "fixture, expected", [("test_charger", "Datanode-IoT"), ("test_charger_v2", "nsavanup_IoT")], ) -async def test_get_ssid(fixture, expected, request, aioclient_mock): +async def test_get_ssid(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -84,7 +118,7 @@ async def test_get_ssid(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", "7.1.3"), ("test_charger_v2", "5.0.1")] ) -async def test_get_firmware(fixture, expected, request, aioclient_mock): +async def test_get_firmware(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -96,7 +130,7 @@ async def test_get_firmware(fixture, expected, request, aioclient_mock): "fixture, expected", [("test_charger", "openevse-7b2c"), ("test_charger_v2", "openevse")], ) -async def test_get_hostname(fixture, expected, request, aioclient_mock): +async def test_get_hostname(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -107,7 +141,7 @@ async def test_get_hostname(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_ammeter_offset(fixture, expected, request, aioclient_mock): +async def test_get_ammeter_offset(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -119,7 +153,7 @@ async def test_get_ammeter_offset(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 220), ("test_charger_v2", 220)] ) -async def test_get_ammeter_scale_factor(fixture, expected, request, aioclient_mock): +async def test_get_ammeter_scale_factor(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -137,7 +171,7 @@ async def test_get_ammeter_scale_factor(fixture, expected, request, aioclient_mo @pytest.mark.parametrize( "fixture, expected", [("test_charger", 2), ("test_charger_v2", 2)] ) -async def test_get_service_level(fixture, expected, request, aioclient_mock): +async def test_get_service_level(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -148,7 +182,7 @@ async def test_get_service_level(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", "4.0.0"), ("test_charger_v2", "2.9.1")] ) -async def test_get_wifi_firmware(fixture, expected, request, aioclient_mock): +async def test_get_wifi_firmware(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -160,7 +194,7 @@ async def test_get_wifi_firmware(fixture, expected, request, aioclient_mock): "fixture, expected", [("test_charger", "192.168.21.10"), ("test_charger_v2", "192.168.1.67")], ) -async def test_get_ip_address(fixture, expected, request, aioclient_mock): +async def test_get_ip_address(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -171,7 +205,7 @@ async def test_get_ip_address(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 240), ("test_charger_v2", 240)] ) -async def test_get_charging_voltage(fixture, expected, request, aioclient_mock): +async def test_get_charging_voltage(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -182,7 +216,7 @@ async def test_get_charging_voltage(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", "STA"), ("test_charger_v2", "STA")] ) -async def test_get_mode(fixture, expected, request, aioclient_mock): +async def test_get_mode(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -193,7 +227,7 @@ async def test_get_mode(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", False), ("test_charger_v2", False)] ) -async def test_get_using_ethernet(fixture, expected, request, aioclient_mock): +async def test_get_using_ethernet(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -204,7 +238,7 @@ async def test_get_using_ethernet(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_stuck_relay_trip_count(fixture, expected, request, aioclient_mock): +async def test_get_stuck_relay_trip_count(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -215,7 +249,7 @@ async def test_get_stuck_relay_trip_count(fixture, expected, request, aioclient_ @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_no_gnd_trip_count(fixture, expected, request, aioclient_mock): +async def test_get_no_gnd_trip_count(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -226,7 +260,7 @@ async def test_get_no_gnd_trip_count(fixture, expected, request, aioclient_mock) @pytest.mark.parametrize( "fixture, expected", [("test_charger", 1), ("test_charger_v2", 0)] ) -async def test_get_gfi_trip_count(fixture, expected, request, aioclient_mock): +async def test_get_gfi_trip_count(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -237,7 +271,7 @@ async def test_get_gfi_trip_count(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 246), ("test_charger_v2", 8751)] ) -async def test_get_charge_time_elapsed(fixture, expected, request, aioclient_mock): +async def test_get_charge_time_elapsed(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -248,7 +282,7 @@ async def test_get_charge_time_elapsed(fixture, expected, request, aioclient_moc @pytest.mark.parametrize( "fixture, expected", [("test_charger", -61), ("test_charger_v2", -56)] ) -async def test_get_wifi_signal(fixture, expected, request, aioclient_mock): +async def test_get_wifi_signal(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -259,7 +293,7 @@ async def test_get_wifi_signal(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_charging_current(fixture, expected, request, aioclient_mock): +async def test_get_charging_current(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -270,7 +304,7 @@ async def test_get_charging_current(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 48), ("test_charger_v2", 25)] ) -async def test_get_current_capacity(fixture, expected, request, aioclient_mock): +async def test_get_current_capacity(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -281,7 +315,7 @@ async def test_get_current_capacity(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 64582), ("test_charger_v2", 1585443)] ) -async def test_get_usage_total(fixture, expected, request, aioclient_mock): +async def test_get_usage_total(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -292,7 +326,7 @@ async def test_get_usage_total(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 50.3), ("test_charger_v2", 34.0)] ) -async def test_get_ambient_temperature(fixture, expected, request, aioclient_mock): +async def test_get_ambient_temperature(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -303,7 +337,7 @@ async def test_get_ambient_temperature(fixture, expected, request, aioclient_moc @pytest.mark.parametrize( "fixture, expected", [("test_charger", 50.3), ("test_charger_v2", None)] ) -async def test_get_rtc_temperature(fixture, expected, request, aioclient_mock): +async def test_get_rtc_temperature(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -314,7 +348,7 @@ async def test_get_rtc_temperature(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", None), ("test_charger_v2", None)] ) -async def test_get_ir_temperature(fixture, expected, request, aioclient_mock): +async def test_get_ir_temperature(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -325,7 +359,7 @@ async def test_get_ir_temperature(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 56.0), ("test_charger_v2", None)] ) -async def test_get_esp_temperature(fixture, expected, request, aioclient_mock): +async def test_get_esp_temperature(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -337,7 +371,7 @@ async def test_get_esp_temperature(fixture, expected, request, aioclient_mock): "fixture, expected", [("test_charger", "2021-08-10T23:00:11Z"), ("test_charger_v2", None)], ) -async def test_get_time(fixture, expected, request, aioclient_mock): +async def test_get_time(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -348,7 +382,7 @@ async def test_get_time(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 275.71), ("test_charger_v2", 7003.41)] ) -async def test_get_usage_session(fixture, expected, request, aioclient_mock): +async def test_get_usage_session(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -359,7 +393,7 @@ async def test_get_usage_session(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", "-"), ("test_charger_v2", "4.0.1")] ) -async def test_get_protocol_version(fixture, expected, request, aioclient_mock): +async def test_get_protocol_version(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -370,7 +404,7 @@ async def test_get_protocol_version(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 6), ("test_charger_v2", 6)] ) -async def test_get_min_amps(fixture, expected, request, aioclient_mock): +async def test_get_min_amps(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -381,7 +415,7 @@ async def test_get_min_amps(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 48), ("test_charger_v2", 48)] ) -async def test_get_max_amps(fixture, expected, request, aioclient_mock): +async def test_get_max_amps(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -392,7 +426,7 @@ async def test_get_max_amps(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_ota_update(fixture, expected, request, aioclient_mock): +async def test_get_ota_update(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -401,7 +435,7 @@ async def test_get_ota_update(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize("fixture, expected", [("test_charger", 1)]) -async def test_get_vehicle(fixture, expected, request, aioclient_mock): +async def test_get_vehicle(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -413,7 +447,7 @@ async def test_get_vehicle(fixture, expected, request, aioclient_mock): "fixture, expected", [("test_charger", "sleeping"), ("test_charger_v2", "not connected")], ) -async def test_get_state(fixture, expected, request, aioclient_mock): +async def test_get_state(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -424,7 +458,7 @@ async def test_get_state(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_tempt(fixture, expected, request, aioclient_mock): +async def test_get_tempt(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -435,7 +469,7 @@ async def test_get_tempt(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 1)] ) -async def test_get_diodet(fixture, expected, request, aioclient_mock): +async def test_get_diodet(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -446,7 +480,7 @@ async def test_get_diodet(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_ventt(fixture, expected, request, aioclient_mock): +async def test_get_ventt(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -457,7 +491,7 @@ async def test_get_ventt(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_groundt(fixture, expected, request, aioclient_mock): +async def test_get_groundt(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update() @@ -468,7 +502,7 @@ async def test_get_groundt(fixture, expected, request, aioclient_mock): @pytest.mark.parametrize( "fixture, expected", [("test_charger", 0), ("test_charger_v2", 0)] ) -async def test_get_relayt(fixture, expected, request, aioclient_mock): +async def test_get_relayt(fixture, expected, request): """Test v4 Status reply""" charger = request.getfixturevalue(fixture) await charger.update()