diff --git a/.coveragerc b/.coveragerc index b6940d4ff08..92bc1b47ad1 100644 --- a/.coveragerc +++ b/.coveragerc @@ -745,7 +745,6 @@ omit = homeassistant/components/mikrotik/hub.py homeassistant/components/mill/climate.py homeassistant/components/mill/sensor.py - homeassistant/components/minecraft_server/binary_sensor.py homeassistant/components/minio/minio_helper.py homeassistant/components/mjpeg/camera.py homeassistant/components/mjpeg/util.py diff --git a/tests/components/minecraft_server/snapshots/test_binary_sensor.ambr b/tests/components/minecraft_server/snapshots/test_binary_sensor.ambr new file mode 100644 index 00000000000..ef03e36343b --- /dev/null +++ b/tests/components/minecraft_server/snapshots/test_binary_sensor.ambr @@ -0,0 +1,57 @@ +# serializer version: 1 +# name: test_binary_sensor[bedrock_mock_config_entry-BedrockServer-status_response1] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'connectivity', + 'friendly_name': 'Minecraft Server Status', + 'icon': 'mdi:lan', + }), + 'context': , + 'entity_id': 'binary_sensor.minecraft_server_status', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_binary_sensor[java_mock_config_entry-JavaServer-status_response0] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'connectivity', + 'friendly_name': 'Minecraft Server Status', + 'icon': 'mdi:lan', + }), + 'context': , + 'entity_id': 'binary_sensor.minecraft_server_status', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_binary_sensor_update[bedrock_mock_config_entry-BedrockServer-status_response1] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'connectivity', + 'friendly_name': 'Minecraft Server Status', + 'icon': 'mdi:lan', + }), + 'context': , + 'entity_id': 'binary_sensor.minecraft_server_status', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_binary_sensor_update[java_mock_config_entry-JavaServer-status_response0] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'connectivity', + 'friendly_name': 'Minecraft Server Status', + 'icon': 'mdi:lan', + }), + 'context': , + 'entity_id': 'binary_sensor.minecraft_server_status', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- \ No newline at end of file diff --git a/tests/components/minecraft_server/test_binary_sensor.py b/tests/components/minecraft_server/test_binary_sensor.py new file mode 100644 index 00000000000..9fae35b113d --- /dev/null +++ b/tests/components/minecraft_server/test_binary_sensor.py @@ -0,0 +1,128 @@ +"""Tests for Minecraft Server binary sensor.""" +from datetime import timedelta +from unittest.mock import patch + +from freezegun.api import FrozenDateTimeFactory +from mcstatus import BedrockServer, JavaServer +from mcstatus.status_response import BedrockStatusResponse, JavaStatusResponse +import pytest +from syrupy import SnapshotAssertion + +from homeassistant.const import STATE_OFF +from homeassistant.core import HomeAssistant + +from .const import ( + TEST_BEDROCK_STATUS_RESPONSE, + TEST_HOST, + TEST_JAVA_STATUS_RESPONSE, + TEST_PORT, +) + +from tests.common import async_fire_time_changed + + +@pytest.mark.parametrize( + ("mock_config_entry", "server", "status_response"), + [ + ("java_mock_config_entry", JavaServer, TEST_JAVA_STATUS_RESPONSE), + ("bedrock_mock_config_entry", BedrockServer, TEST_BEDROCK_STATUS_RESPONSE), + ], +) +async def test_binary_sensor( + hass: HomeAssistant, + mock_config_entry: str, + server: JavaServer | BedrockServer, + status_response: JavaStatusResponse | BedrockStatusResponse, + request: pytest.FixtureRequest, + snapshot: SnapshotAssertion, +) -> None: + """Test binary sensor.""" + mock_config_entry = request.getfixturevalue(mock_config_entry) + mock_config_entry.add_to_hass(hass) + + with patch( + f"homeassistant.components.minecraft_server.api.{server.__name__}.lookup", + return_value=server(host=TEST_HOST, port=TEST_PORT), + ), patch( + f"homeassistant.components.minecraft_server.api.{server.__name__}.async_status", + return_value=status_response, + ): + assert await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + assert hass.states.get("binary_sensor.minecraft_server_status") == snapshot + + +@pytest.mark.parametrize( + ("mock_config_entry", "server", "status_response"), + [ + ("java_mock_config_entry", JavaServer, TEST_JAVA_STATUS_RESPONSE), + ("bedrock_mock_config_entry", BedrockServer, TEST_BEDROCK_STATUS_RESPONSE), + ], +) +async def test_binary_sensor_update( + hass: HomeAssistant, + mock_config_entry: str, + server: JavaServer | BedrockServer, + status_response: JavaStatusResponse | BedrockStatusResponse, + request: pytest.FixtureRequest, + snapshot: SnapshotAssertion, + freezer: FrozenDateTimeFactory, +) -> None: + """Test binary sensor update.""" + mock_config_entry = request.getfixturevalue(mock_config_entry) + mock_config_entry.add_to_hass(hass) + + with patch( + f"homeassistant.components.minecraft_server.api.{server.__name__}.lookup", + return_value=server(host=TEST_HOST, port=TEST_PORT), + ), patch( + f"homeassistant.components.minecraft_server.api.{server.__name__}.async_status", + return_value=status_response, + ): + assert await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + freezer.tick(timedelta(minutes=1)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert hass.states.get("binary_sensor.minecraft_server_status") == snapshot + + +@pytest.mark.parametrize( + ("mock_config_entry", "server", "status_response"), + [ + ("java_mock_config_entry", JavaServer, TEST_JAVA_STATUS_RESPONSE), + ("bedrock_mock_config_entry", BedrockServer, TEST_BEDROCK_STATUS_RESPONSE), + ], +) +async def test_binary_sensor_update_failure( + hass: HomeAssistant, + mock_config_entry: str, + server: JavaServer | BedrockServer, + status_response: JavaStatusResponse | BedrockStatusResponse, + request: pytest.FixtureRequest, + freezer: FrozenDateTimeFactory, +) -> None: + """Test failed binary sensor update.""" + mock_config_entry = request.getfixturevalue(mock_config_entry) + mock_config_entry.add_to_hass(hass) + + with patch( + f"homeassistant.components.minecraft_server.api.{server.__name__}.lookup", + return_value=server(host=TEST_HOST, port=TEST_PORT), + ), patch( + f"homeassistant.components.minecraft_server.api.{server.__name__}.async_status", + return_value=status_response, + ): + assert await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + with patch( + f"homeassistant.components.minecraft_server.api.{server.__name__}.async_status", + side_effect=OSError, + ): + freezer.tick(timedelta(minutes=1)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert ( + hass.states.get("binary_sensor.minecraft_server_status").state == STATE_OFF + )