# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Copyright (c) 2016, Anaconda, Inc. All rights reserved.
#
# Licensed under the terms of the BSD 3-Clause License.
# The full license is in the file LICENSE.txt, distributed with this software.
# -----------------------------------------------------------------------------
from anaconda_project.local_state_file import LocalStateFile
from anaconda_project.requirements_registry.registry import RequirementsRegistry
from anaconda_project.requirements_registry.requirement import UserConfigOverrides
from anaconda_project.requirements_registry.requirements.redis import RedisRequirement

from anaconda_project.internal.test.tmpfile_utils import with_directory_contents


def test_find_by_service_type_redis():
    registry = RequirementsRegistry()
    found = registry.find_requirement_by_service_type(service_type='redis', env_var='MYREDIS', options=dict())
    assert found is not None
    assert isinstance(found, RedisRequirement)
    assert found.env_var == 'MYREDIS'
    assert found.service_type == 'redis'


def test_redis_url_not_set():
    def check_not_set(dirname):
        local_state = LocalStateFile.load_for_directory(dirname)
        requirement = RedisRequirement(registry=RequirementsRegistry(), env_var="REDIS_URL")
        status = requirement.check_status(dict(), local_state, 'default', UserConfigOverrides())
        assert not status
        assert "Environment variable REDIS_URL is not set." == status.status_description

    with_directory_contents({}, check_not_set)


def test_redis_url_bad_scheme():
    def check_bad_scheme(dirname):
        local_state = LocalStateFile.load_for_directory(dirname)
        requirement = RedisRequirement(registry=RequirementsRegistry(), env_var="REDIS_URL")
        status = requirement.check_status(
            dict(REDIS_URL="http://example.com/"),
            local_state,
            'default',
            UserConfigOverrides())
        assert not status
        assert "REDIS_URL value 'http://example.com/' does not have 'redis:' scheme." == status.status_description

    with_directory_contents({}, check_bad_scheme)


def _monkeypatch_can_connect_to_socket_fails(monkeypatch):
    can_connect_args_list = []

    def mock_can_connect_to_socket(host, port, timeout_seconds=0.5):
        can_connect_args = dict(host=host, port=port, timeout_seconds=timeout_seconds)
        can_connect_args_list.append(can_connect_args)
        return False

    monkeypatch.setattr("anaconda_project.requirements_registry.network_util.can_connect_to_socket",
                        mock_can_connect_to_socket)

    return can_connect_args_list


def test_redis_url_cannot_connect(monkeypatch):
    def check_cannot_connect(dirname):
        local_state = LocalStateFile.load_for_directory(dirname)
        requirement = RedisRequirement(registry=RequirementsRegistry(), env_var="REDIS_URL")
        can_connect_args_list = _monkeypatch_can_connect_to_socket_fails(monkeypatch)
        status = requirement.check_status(
            dict(REDIS_URL="redis://example.com:1234/"),
            local_state,
            'default',
            UserConfigOverrides())
        assert dict(host='example.com', port=1234, timeout_seconds=0.5) == can_connect_args_list[0]
        assert dict(host='localhost', port=6379, timeout_seconds=0.5) == can_connect_args_list[1]

        assert not status
        expected = "Cannot connect to Redis at redis://example.com:1234/."
        assert expected == status.status_description

    with_directory_contents({}, check_cannot_connect)
