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

from homeassistant.bootstrap 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 get_test_home_assistant, assert_setup_component


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

    def setUp(self):  # pylint: disable=invalid-name
        """Setup 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."""
        with assert_setup_component(0):
            assert not setup_component(self.hass, notify.DOMAIN, {
                'notify': {
                    'name': 'test',
                    'platform': 'file',
                },
            })

    @patch('homeassistant.components.notify.file.os.stat')
    @patch('homeassistant.util.dt.utcnow')
    def test_notify_file(self, mock_utcnow, mock_stat):
        """Test the notify file output."""
        mock_utcnow.return_value = dt_util.as_utc(dt_util.now())
        mock_stat.return_value.st_size = 0

        m_open = mock_open()
        with patch(
                'homeassistant.components.notify.file.open',
                m_open, create=True
        ):
            filename = 'mock_file'
            message = 'one, two, testing, testing'
            self.assertTrue(setup_component(self.hass, notify.DOMAIN, {
                'notify': {
                    'name': 'test',
                    'platform': 'file',
                    'filename': filename,
                    'timestamp': False,
                }
            }))
            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)
            self.assertEqual(m_open.call_count, 1)
            self.assertEqual(m_open.call_args, call(full_filename, 'a'))

            self.assertEqual(m_open.return_value.write.call_count, 2)
            self.assertEqual(
                m_open.return_value.write.call_args_list,
                [call(title), call(message + '\n')]
            )