"""The tests for the folder_watcher component."""
import unittest
from unittest.mock import MagicMock
import os

from homeassistant.components import folder_watcher
from homeassistant.setup import setup_component
from tests.common import get_test_home_assistant

CWD = os.path.join(os.path.dirname(__file__))
FILE = 'file.txt'


class TestFolderWatcher(unittest.TestCase):
    """Test the file_watcher component."""

    def setup_method(self, method):
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()
        self.hass.config.whitelist_external_dirs = set((CWD))

    def teardown_method(self, method):
        """Stop everything that was started."""
        self.hass.stop()

    def test_invalid_path_setup(self):
        """Test that a invalid path is not setup."""
        config = {
            folder_watcher.DOMAIN: [{
                folder_watcher.CONF_FOLDER: 'invalid_path'
                }]
        }
        self.assertFalse(
            setup_component(self.hass, folder_watcher.DOMAIN, config))

    def test_valid_path_setup(self):
        """Test that a valid path is setup."""
        config = {
            folder_watcher.DOMAIN: [{folder_watcher.CONF_FOLDER: CWD}]
        }

        self.assertTrue(setup_component(
            self.hass, folder_watcher.DOMAIN, config))

    def test_event(self):
        """Check that HASS events are fired correctly on watchdog event."""
        from watchdog.events import FileModifiedEvent

        # Cant use setup_component as need to retrieve Watcher object.
        w = folder_watcher.Watcher(CWD,
                                   folder_watcher.DEFAULT_PATTERN,
                                   self.hass)
        w.startup(None)

        self.hass.bus.fire = MagicMock()

        # Trigger a fake filesystem event through the Watcher Observer emitter.
        (emitter,) = w._observer.emitters
        emitter.queue_event(FileModifiedEvent(FILE))

        # Wait for the event to propagate.
        self.hass.block_till_done()

        assert self.hass.bus.fire.called