diff --git a/homeassistant/components/folder_watcher/__init__.py b/homeassistant/components/folder_watcher/__init__.py index e718c3d3bf2..cd979d51457 100644 --- a/homeassistant/components/folder_watcher/__init__.py +++ b/homeassistant/components/folder_watcher/__init__.py @@ -63,19 +63,30 @@ def create_event_handler(patterns, hass): super().__init__(patterns) self.hass = hass - def process(self, event): + def process(self, event, moved=False): """On Watcher event, fire HA event.""" _LOGGER.debug("process(%s)", event) if not event.is_directory: folder, file_name = os.path.split(event.src_path) + fireable = { + "event_type": event.event_type, + "path": event.src_path, + "file": file_name, + "folder": folder, + } + + if moved: + dest_folder, dest_file_name = os.path.split(event.dest_path) + fireable.update( + { + "dest_path": event.dest_path, + "dest_file": dest_file_name, + "dest_folder": dest_folder, + } + ) self.hass.bus.fire( DOMAIN, - { - "event_type": event.event_type, - "path": event.src_path, - "file": file_name, - "folder": folder, - }, + fireable, ) def on_modified(self, event): @@ -84,7 +95,7 @@ def create_event_handler(patterns, hass): def on_moved(self, event): """File moved.""" - self.process(event) + self.process(event, moved=True) def on_created(self, event): """File created.""" diff --git a/tests/components/folder_watcher/test_init.py b/tests/components/folder_watcher/test_init.py index b0a522cb7fc..babac930c2d 100644 --- a/tests/components/folder_watcher/test_init.py +++ b/tests/components/folder_watcher/test_init.py @@ -1,5 +1,6 @@ """The tests for the folder_watcher component.""" import os +from types import SimpleNamespace from unittest.mock import Mock, patch from homeassistant.components import folder_watcher @@ -43,7 +44,9 @@ def test_event(): hass = Mock() handler = folder_watcher.create_event_handler(["*"], hass) handler.on_created( - Mock(is_directory=False, src_path="/hello/world.txt", event_type="created") + SimpleNamespace( + is_directory=False, src_path="/hello/world.txt", event_type="created" + ) ) assert hass.bus.fire.called assert hass.bus.fire.mock_calls[0][1][0] == folder_watcher.DOMAIN @@ -53,3 +56,39 @@ def test_event(): "file": "world.txt", "folder": "/hello", } + + +def test_move_event(): + """Check that Home Assistant events are fired correctly on watchdog event.""" + + class MockPatternMatchingEventHandler: + """Mock base class for the pattern matcher event handler.""" + + def __init__(self, patterns): + pass + + with patch( + "homeassistant.components.folder_watcher.PatternMatchingEventHandler", + MockPatternMatchingEventHandler, + ): + hass = Mock() + handler = folder_watcher.create_event_handler(["*"], hass) + handler.on_moved( + SimpleNamespace( + is_directory=False, + src_path="/hello/world.txt", + dest_path="/hello/earth.txt", + event_type="moved", + ) + ) + assert hass.bus.fire.called + assert hass.bus.fire.mock_calls[0][1][0] == folder_watcher.DOMAIN + assert hass.bus.fire.mock_calls[0][1][1] == { + "event_type": "moved", + "path": "/hello/world.txt", + "dest_path": "/hello/earth.txt", + "file": "world.txt", + "dest_file": "earth.txt", + "folder": "/hello", + "dest_folder": "/hello", + }