"""The tests for local file camera component."""
from tempfile import NamedTemporaryFile
import unittest
from unittest import mock

from werkzeug.test import EnvironBuilder

from homeassistant.bootstrap import setup_component
from homeassistant.components.http import request_class

from tests.common import get_test_home_assistant


class TestLocalCamera(unittest.TestCase):
    """Test the local file camera component."""

    def setUp(self):
        """Setup things to be run when tests are started."""
        self.hass = get_test_home_assistant()
        self.hass.wsgi = mock.MagicMock()
        self.hass.config.components.append('http')

    def tearDown(self):
        """Stop everything that was started."""
        self.hass.stop()

    def test_loading_file(self):
        """Test that it loads image from disk."""
        self.hass.wsgi = mock.MagicMock()

        with NamedTemporaryFile() as fp:
            fp.write('hello'.encode('utf-8'))
            fp.flush()

            assert setup_component(self.hass, 'camera', {
                'camera': {
                    'name': 'config_test',
                    'platform': 'local_file',
                    'file_path': fp.name,
                }})

            image_view = self.hass.wsgi.mock_calls[0][1][0]

            builder = EnvironBuilder(method='GET')
            Request = request_class()
            request = Request(builder.get_environ())
            request.authenticated = True
            resp = image_view.get(request, 'camera.config_test')

            assert resp.status_code == 200, resp.response
            assert resp.response[0].decode('utf-8') == 'hello'

    def test_file_not_readable(self):
        """Test local file will not setup when file is not readable."""
        self.hass.wsgi = mock.MagicMock()

        with NamedTemporaryFile() as fp:
            fp.write('hello'.encode('utf-8'))
            fp.flush()

            with mock.patch('os.access', return_value=False):
                assert not setup_component(self.hass, 'camera', {
                    'camera': {
                        'name': 'config_test',
                        'platform': 'local_file',
                        'file_path': fp.name,
                    }})

                assert [] == self.hass.states.all()
