text: """The test for light device automation."""
  from datetime import timedelta
  
  import pytest
  
  import homeassistant.components.automation as automation
  from homeassistant.components.light import DOMAIN
  from homeassistant.const import CONF_PLATFORM, STATE_OFF, STATE_ON
  from homeassistant.helpers import device_registry
  from homeassistant.setup import async_setup_component
  import homeassistant.util.dt as dt_util
  
  from tests.async_mock import patch
  from tests.common import (
      MockConfigEntry,
      async_get_device_automation_capabilities,
      async_get_device_automations,
      async_mock_service,
      mock_device_registry,
      mock_registry,
  )
  
  
  @pytest.fixture
  def device_reg(hass):
      """Return an empty, loaded, registry."""
      return mock_device_registry(hass)
  
  
  @pytest.fixture
  def entity_reg(hass):
      """Return an empty, loaded, registry."""
      return mock_registry(hass)
  
  
  @pytest.fixture
  def calls(hass):
      """Track calls to a mock service."""
      return async_mock_service(hass, "test", "automation")
  
  
  async def test_get_conditions(hass, device_reg, entity_reg):
      """Test we get the expected conditions from a light."""
      config_entry = MockConfigEntry(domain="test", data={})
      config_entry.add_to_hass(hass)
      device_entry = device_reg.async_get_or_create(
          config_entry_id=config_entry.entry_id,
          connections={(device_registry.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")},
      )
      entity_reg.async_get_or_create(DOMAIN, "test", "5678", device_id=device_entry.id)
      expected_conditions = [
          {
              "condition": "device",
              "domain": DOMAIN,
              "type": "is_off",
              "device_id": device_entry.id,
              "entity_id": f"{DOMAIN}.test_5678",
          },
          {
              "condition": "device",
              "domain": DOMAIN,
              "type": "is_on",
              "device_id": device_entry.id,
              "entity_id": f"{DOMAIN}.test_5678",
          },
      ]
      conditions = await async_get_device_automations(hass, "condition", device_entry.id)
      assert conditions == expected_conditions
  
  
  async def test_get_condition_capabilities(hass, device_reg, entity_reg):
      """Test we get the expected capabilities from a light condition."""
      config_entry = MockConfigEntry(domain="test", data={})
      config_entry.add_to_hass(hass)
      device_entry = device_reg.async_get_or_create(
          config_entry_id=config_entry.entry_id,
          connections={(device_registry.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")},
      )
      entity_reg.async_get_or_create(DOMAIN, "test", "5678", device_id=device_entry.id)
      expected_capabilities = {
          "extra_fields": [
              {"name": "for", "optional": True, "type": "positive_time_period_dict"}
          ]
      }
      conditions = await async_get_device_automations(hass, "condition", device_entry.id)
      for condition in conditions:
          capabilities = await async_get_device_automation_capabilities(
              hass, "condition", condition
          )
          assert capabilities == expected_capabilities
  
  
  async def test_if_state(hass, calls):
      """Test for turn_on and turn_off conditions."""
      platform = getattr(hass.components, f"test.{DOMAIN}")
  
      platform.init()
      assert await async_setup_component(hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "test"}})
  
      ent1, ent2, ent3 = platform.ENTITIES
  
      assert await async_setup_component(
          hass,
          automation.DOMAIN,
          {
              automation.DOMAIN: [
                  {
                      "trigger": {"platform": "event", "event_type": "test_event1"},
                      "condition": [
                          {
                              "condition": "device",
                              "domain": DOMAIN,
                              "device_id": "",
                              "entity_id": ent1.entity_id,
                              "type": "is_on",
                          }
                      ],
                      "action": {
                          "service": "test.automation",
                          "data_template": {
                              "some": "is_on {{ trigger.%s }}"
                              % "}} - {{ trigger.".join(("platform", "event.event_type"))
                          },
                      },
                  },
                  {
                      "trigger": {"platform": "event", "event_type": "test_event2"},
                      "condition": [
                          {
                              "condition": "device",
                              "domain": DOMAIN,
                              "device_id": "",
                              "entity_id": ent1.entity_id,
                              "type": "is_off",
                          }
                      ],
                      "action": {
                          "service": "test.automation",
                          "data_template": {
                              "some": "is_off {{ trigger.%s }}"
                              % "}} - {{ trigger.".join(("platform", "event.event_type"))
                          },
                      },
                  },
              ]
          },
      )
      await hass.async_block_till_done()
      assert hass.states.get(ent1.entity_id).state == STATE_ON
      assert len(calls) == 0
  
      hass.bus.async_fire("test_event1")
      hass.bus.async_fire("test_event2")
      await hass.async_block_till_done()
      assert len(calls) == 1
      assert calls[0].data["some"] == "is_on event - test_event1"
  
      hass.states.async_set(ent1.entity_id, STATE_OFF)
      hass.bus.async_fire("test_event1")
      hass.bus.async_fire("test_event2")
      await hass.async_block_till_done()
      assert len(calls) == 2
      assert calls[1].data["some"] == "is_off event - test_event2"
  
  
  async def test_if_fires_on_for_condition(hass, calls):
      """Test for firing if condition is on with delay."""
      point1 = dt_util.utcnow()
      point2 = point1 + timedelta(seconds=10)
      point3 = point2 + timedelta(seconds=10)
  
      platform = getattr(hass.components, f"test.{DOMAIN}")
  
      platform.init()
      assert await async_setup_component(hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "test"}})
  
      ent1, ent2, ent3 = platform.ENTITIES
  
      with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow:
          mock_utcnow.return_value = point1
          assert await async_setup_component(
              hass,
              automation.DOMAIN,
              {
                  automation.DOMAIN: [
                      {
                          "trigger": {"platform": "event", "event_type": "test_event1"},
                          "condition": {
                              "condition": "device",
                              "domain": DOMAIN,
                              "device_id": "",
                              "entity_id": ent1.entity_id,
                              "type": "is_off",
                              "for": {"seconds": 5},
                          },
                          "action": {
                              "service": "test.automation",
                              "data_template": {
                                  "some": "is_off {{ trigger.%s }}"
                                  % "}} - {{ trigger.".join(
                                      ("platform", "event.event_type")
                                  )
                              },
                          },
                      }
                  ]
              },
          )
          await hass.async_block_till_done()
          assert hass.states.get(ent1.entity_id).state == STATE_ON
          assert len(calls) == 0
  
          hass.bus.async_fire("test_event1")
          await hass.async_block_till_done()
          assert len(calls) == 0
  
          # Time travel 10 secs into the future
          mock_utcnow.return_value = point2
          hass.bus.async_fire("test_event1")
          await hass.async_block_till_done()
          assert len(calls) == 0
  
          hass.states.async_set(ent1.entity_id, STATE_OFF)
          hass.bus.async_fire("test_event1")
          await hass.async_block_till_done()
          assert len(calls) == 0
  
          # Time travel 20 secs into the future
          mock_utcnow.return_value = point3
          hass.bus.async_fire("test_event1")
          await hass.async_block_till_done()
          assert len(calls) == 1
          assert calls[0].data["some"] == "is_off event - test_event1"
  