Propagate destination of watched folder moves (#70252)

pull/73804/head
Edward 2022-06-29 14:52:17 +10:00 committed by GitHub
parent 9f15234b92
commit 22b8afe966
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 9 deletions

View File

@ -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."""

View File

@ -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",
}