Rewrite Wake on LAN Tests to use pytest style (#41173)

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
This commit is contained in:
Nathan Tilley 2020-10-12 11:17:31 -04:00 committed by GitHub
parent 625bbe6238
commit feabf99f92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,266 +1,277 @@
"""The tests for the wake on lan switch platform.""" """The tests for the wake on lan switch platform."""
import unittest import platform
import subprocess
import pytest
import homeassistant.components.switch as switch import homeassistant.components.switch as switch
from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.const import (
from homeassistant.setup import setup_component ATTR_ENTITY_ID,
SERVICE_TURN_OFF,
SERVICE_TURN_ON,
STATE_OFF,
STATE_ON,
)
from homeassistant.setup import async_setup_component
from tests.async_mock import Mock, patch from tests.async_mock import patch
from tests.common import get_test_home_assistant, mock_service from tests.common import async_mock_service
from tests.components.switch import common
TEST_STATE = None
def call(cmd, stdout, stderr): @pytest.fixture(autouse=True)
"""Return fake subprocess return codes.""" def mock_send_magic_packet():
if cmd[5] == "validhostname" and TEST_STATE: """Mock magic packet."""
return 0 with patch("wakeonlan.send_magic_packet") as mock_send:
return 2 yield mock_send
def system(): async def test_valid_hostname(hass):
"""Fake system call to test the windows platform.""" """Test with valid hostname."""
return "Windows" assert await async_setup_component(
hass,
switch.DOMAIN,
{
"switch": {
"platform": "wake_on_lan",
"mac": "00-01-02-03-04-05",
"host": "validhostname",
}
},
)
await hass.async_block_till_done()
state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
class TestWolSwitch(unittest.TestCase): with patch.object(subprocess, "call", return_value=0):
"""Test the wol switch."""
send_magic_packet = Mock(return_value=None) await hass.services.async_call(
def setUp(self):
"""Set up things to be run when tests are started."""
self.hass = get_test_home_assistant()
self.addCleanup(self.hass.stop)
@patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call)
def test_valid_hostname(self):
"""Test with valid hostname."""
global TEST_STATE
TEST_STATE = False
assert setup_component(
self.hass,
switch.DOMAIN, switch.DOMAIN,
{ SERVICE_TURN_ON,
"switch": { {ATTR_ENTITY_ID: "switch.wake_on_lan"},
"platform": "wake_on_lan", blocking=True,
"mac": "00-01-02-03-04-05",
"host": "validhostname",
}
},
) )
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan") state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
TEST_STATE = True
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan")
assert STATE_ON == state.state assert STATE_ON == state.state
common.turn_off(self.hass, "switch.wake_on_lan") await hass.services.async_call(
self.hass.block_till_done() switch.DOMAIN,
SERVICE_TURN_OFF,
{ATTR_ENTITY_ID: "switch.wake_on_lan"},
blocking=True,
)
state = self.hass.states.get("switch.wake_on_lan") state = hass.states.get("switch.wake_on_lan")
assert STATE_ON == state.state assert STATE_ON == state.state
@patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call) async def test_valid_hostname_windows(hass):
@patch("platform.system", new=system) """Test with valid hostname on windows."""
def test_valid_hostname_windows(self): assert await async_setup_component(
"""Test with valid hostname on windows.""" hass,
global TEST_STATE switch.DOMAIN,
TEST_STATE = False {
assert setup_component( "switch": {
self.hass, "platform": "wake_on_lan",
"mac": "00-01-02-03-04-05",
"host": "validhostname",
}
},
)
await hass.async_block_till_done()
state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
with patch.object(subprocess, "call", return_value=0), patch.object(
platform, "system", return_value="Windows"
):
await hass.services.async_call(
switch.DOMAIN, switch.DOMAIN,
{ SERVICE_TURN_ON,
"switch": { {ATTR_ENTITY_ID: "switch.wake_on_lan"},
"platform": "wake_on_lan", blocking=True,
"mac": "00-01-02-03-04-05",
"host": "validhostname",
}
},
) )
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan") state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state assert STATE_ON == state.state
TEST_STATE = True
common.turn_on(self.hass, "switch.wake_on_lan") async def test_broadcast_config_ip_and_port(hass, mock_send_magic_packet):
self.hass.block_till_done() """Test with broadcast address and broadcast port config."""
mac = "00-01-02-03-04-05"
broadcast_address = "255.255.255.255"
port = 999
state = self.hass.states.get("switch.wake_on_lan") assert await async_setup_component(
assert STATE_ON == state.state hass,
switch.DOMAIN,
{
"switch": {
"platform": "wake_on_lan",
"mac": mac,
"broadcast_address": broadcast_address,
"broadcast_port": port,
}
},
)
await hass.async_block_till_done()
@patch("wakeonlan.send_magic_packet", new=send_magic_packet) state = hass.states.get("switch.wake_on_lan")
@patch("subprocess.call", new=call) assert STATE_OFF == state.state
def test_broadcast_config_ip_and_port(self):
"""Test with broadcast address and broadcast port config."""
mac = "00-01-02-03-04-05" with patch.object(subprocess, "call", return_value=0):
broadcast_address = "255.255.255.255"
port = 999
assert setup_component( await hass.services.async_call(
self.hass,
switch.DOMAIN, switch.DOMAIN,
{ SERVICE_TURN_ON,
"switch": { {ATTR_ENTITY_ID: "switch.wake_on_lan"},
"platform": "wake_on_lan", blocking=True,
"mac": mac,
"broadcast_address": broadcast_address,
"broadcast_port": port,
}
},
) )
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan") mock_send_magic_packet.assert_called_with(
assert STATE_OFF == state.state
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
self.send_magic_packet.assert_called_with(
mac, ip_address=broadcast_address, port=port mac, ip_address=broadcast_address, port=port
) )
@patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call)
def test_broadcast_config_ip(self):
"""Test with only broadcast address."""
mac = "00-01-02-03-04-05" async def test_broadcast_config_ip(hass, mock_send_magic_packet):
broadcast_address = "255.255.255.255" """Test with only broadcast address."""
assert setup_component( mac = "00-01-02-03-04-05"
self.hass, broadcast_address = "255.255.255.255"
assert await async_setup_component(
hass,
switch.DOMAIN,
{
"switch": {
"platform": "wake_on_lan",
"mac": mac,
"broadcast_address": broadcast_address,
}
},
)
await hass.async_block_till_done()
state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
with patch.object(subprocess, "call", return_value=0):
await hass.services.async_call(
switch.DOMAIN, switch.DOMAIN,
{ SERVICE_TURN_ON,
"switch": { {ATTR_ENTITY_ID: "switch.wake_on_lan"},
"platform": "wake_on_lan", blocking=True,
"mac": mac,
"broadcast_address": broadcast_address,
}
},
) )
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan") mock_send_magic_packet.assert_called_with(mac, ip_address=broadcast_address)
assert STATE_OFF == state.state
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
self.send_magic_packet.assert_called_with(mac, ip_address=broadcast_address) async def test_broadcast_config_port(hass, mock_send_magic_packet):
"""Test with only broadcast port config."""
@patch("wakeonlan.send_magic_packet", new=send_magic_packet) mac = "00-01-02-03-04-05"
@patch("subprocess.call", new=call) port = 999
def test_broadcast_config_port(self):
"""Test with only broadcast port config."""
mac = "00-01-02-03-04-05" assert await async_setup_component(
port = 999 hass,
switch.DOMAIN,
{"switch": {"platform": "wake_on_lan", "mac": mac, "broadcast_port": port}},
)
await hass.async_block_till_done()
assert setup_component( state = hass.states.get("switch.wake_on_lan")
self.hass, assert STATE_OFF == state.state
with patch.object(subprocess, "call", return_value=0):
await hass.services.async_call(
switch.DOMAIN, switch.DOMAIN,
{ SERVICE_TURN_ON,
"switch": { {ATTR_ENTITY_ID: "switch.wake_on_lan"},
"platform": "wake_on_lan", blocking=True,
"mac": mac,
"broadcast_port": port,
}
},
) )
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan") mock_send_magic_packet.assert_called_with(mac, port=port)
assert STATE_OFF == state.state
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
self.send_magic_packet.assert_called_with(mac, port=port) async def test_off_script(hass):
"""Test with turn off script."""
@patch("wakeonlan.send_magic_packet", new=send_magic_packet) assert await async_setup_component(
@patch("subprocess.call", new=call) hass,
def test_off_script(self): switch.DOMAIN,
"""Test with turn off script.""" {
global TEST_STATE "switch": {
TEST_STATE = False "platform": "wake_on_lan",
assert setup_component( "mac": "00-01-02-03-04-05",
self.hass, "host": "validhostname",
"turn_off": {"service": "shell_command.turn_off_target"},
}
},
)
await hass.async_block_till_done()
calls = async_mock_service(hass, "shell_command", "turn_off_target")
state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
with patch.object(subprocess, "call", return_value=0):
await hass.services.async_call(
switch.DOMAIN, switch.DOMAIN,
{ SERVICE_TURN_ON,
"switch": { {ATTR_ENTITY_ID: "switch.wake_on_lan"},
"platform": "wake_on_lan", blocking=True,
"mac": "00-01-02-03-04-05",
"host": "validhostname",
"turn_off": {"service": "shell_command.turn_off_target"},
}
},
) )
self.hass.block_till_done()
calls = mock_service(self.hass, "shell_command", "turn_off_target")
state = self.hass.states.get("switch.wake_on_lan") state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
TEST_STATE = True
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan")
assert STATE_ON == state.state assert STATE_ON == state.state
assert len(calls) == 0 assert len(calls) == 0
TEST_STATE = False with patch.object(subprocess, "call", return_value=2):
common.turn_off(self.hass, "switch.wake_on_lan") await hass.services.async_call(
self.hass.block_till_done() switch.DOMAIN,
SERVICE_TURN_OFF,
{ATTR_ENTITY_ID: "switch.wake_on_lan"},
blocking=True,
)
state = self.hass.states.get("switch.wake_on_lan") state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state assert STATE_OFF == state.state
assert len(calls) == 1 assert len(calls) == 1
@patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call) async def test_invalid_hostname_windows(hass):
@patch("platform.system", new=system) """Test with invalid hostname on windows."""
def test_invalid_hostname_windows(self):
"""Test with invalid hostname on windows.""" assert await async_setup_component(
global TEST_STATE hass,
TEST_STATE = False switch.DOMAIN,
assert setup_component( {
self.hass, "switch": {
"platform": "wake_on_lan",
"mac": "00-01-02-03-04-05",
"host": "invalidhostname",
}
},
)
await hass.async_block_till_done()
state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
with patch.object(subprocess, "call", return_value=2):
await hass.services.async_call(
switch.DOMAIN, switch.DOMAIN,
{ SERVICE_TURN_ON,
"switch": { {ATTR_ENTITY_ID: "switch.wake_on_lan"},
"platform": "wake_on_lan", blocking=True,
"mac": "00-01-02-03-04-05",
"host": "invalidhostname",
}
},
) )
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan") state = hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
TEST_STATE = True
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state assert STATE_OFF == state.state