"""The tests for the notify file platform."""
import os
import unittest
from unittest.mock import call, mock_open, patch

from homeassistant.setup import setup_component
import homeassistant.components.notify as notify
from homeassistant.components.notify import ATTR_TITLE_DEFAULT
import homeassistant.util.dt as dt_util

from tests.common import assert_setup_component, get_test_home_assistant


class TestNotifyFile(unittest.TestCase):
    """Test the file notify."""

    def setUp(self):  # pylint: disable=invalid-name
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()

    def tearDown(self):  # pylint: disable=invalid-name
        """Stop down everything that was started."""
        self.hass.stop()

    def test_bad_config(self):
        """Test set up the platform with bad/missing config."""
        config = {notify.DOMAIN: {"name": "test", "platform": "file"}}
        with assert_setup_component(0) as handle_config:
            assert setup_component(self.hass, notify.DOMAIN, config)
        assert not handle_config[notify.DOMAIN]

    def _test_notify_file(self, timestamp):
        """Test the notify file output."""
        filename = "mock_file"
        message = "one, two, testing, testing"
        with assert_setup_component(1) as handle_config:
            assert setup_component(
                self.hass,
                notify.DOMAIN,
                {
                    "notify": {
                        "name": "test",
                        "platform": "file",
                        "filename": filename,
                        "timestamp": timestamp,
                    }
                },
            )
        assert handle_config[notify.DOMAIN]

        m_open = mock_open()
        with patch(
            "homeassistant.components.file.notify.open", m_open, create=True
        ), patch("homeassistant.components.file.notify.os.stat") as mock_st, patch(
            "homeassistant.util.dt.utcnow", return_value=dt_util.utcnow()
        ):

            mock_st.return_value.st_size = 0
            title = "{} notifications (Log started: {})\n{}\n".format(
                ATTR_TITLE_DEFAULT, dt_util.utcnow().isoformat(), "-" * 80
            )

            self.hass.services.call(
                "notify", "test", {"message": message}, blocking=True
            )

            full_filename = os.path.join(self.hass.config.path(), filename)
            assert m_open.call_count == 1
            assert m_open.call_args == call(full_filename, "a")

            assert m_open.return_value.write.call_count == 2
            if not timestamp:
                assert m_open.return_value.write.call_args_list == [
                    call(title),
                    call("{}\n".format(message)),
                ]
            else:
                assert m_open.return_value.write.call_args_list == [
                    call(title),
                    call("{} {}\n".format(dt_util.utcnow().isoformat(), message)),
                ]

    def test_notify_file(self):
        """Test the notify file output without timestamp."""
        self._test_notify_file(False)

    def test_notify_file_timestamp(self):
        """Test the notify file output with timestamp."""
        self._test_notify_file(True)
