# ============LICENSE_START=======================================================
# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============LICENSE_END=========================================================
#
# ECOMP is a trademark and service mark of AT&T Intellectual Property.
import json
import pytest
import os
import tempfile
from config_binding_service import app


TEST_NAME = "test_service_component_name.unknown.unknown.unknown.dcae.onap.org"


# http://flask.pocoo.org/docs/1.0/testing/
@pytest.fixture
def cbsclient():
    db_fd, app.app.config["DATABASE"] = tempfile.mkstemp()
    app.app.config["TESTING"] = True
    testclient = app.app.test_client()

    yield testclient

    os.close(db_fd)
    os.unlink(app.app.config["DATABASE"])


def test_get(monkeypatch, cbsclient, monkeyed_requests_put):
    monkeypatch.setattr("requests.put", monkeyed_requests_put)

    res = cbsclient.get("/service_component/scn_exists", headers={"x-onap-requestid": 123456789})
    assert json.loads(res.data) == {"foo3": "bar3"}
    assert res.status_code == 200
    assert res.headers["x-onap-requestid"] == "123456789"

    res = cbsclient.get("/service_component/scn_NOTexists", headers={"x-onap-requestid": 123456789})
    assert res.status_code == 404
    assert res.headers["x-onap-requestid"] == "123456789"

    res = cbsclient.get("/service_component/asdfasdf", headers={"x-onap-requestid": 123456789})
    assert res.status_code == 500
    assert res.headers["x-onap-requestid"] == "123456789"


def test_generic(monkeypatch, cbsclient, monkeyed_requests_get, monkeyed_requests_put):
    monkeypatch.setattr("requests.put", monkeyed_requests_put)
    monkeypatch.setattr("requests.get", monkeyed_requests_get)

    res = cbsclient.get("/dti/{0}".format(TEST_NAME))
    assert json.loads(res.data) == {"my": "dti"}
    assert res.json == {"my": "dti"}
    assert res.status_code == 200
    assert "x-onap-requestid" in res.headers

    res = cbsclient.get("/nokeyforyou/{0}".format(TEST_NAME))
    assert res.status_code == 404
    assert "x-onap-requestid" in res.headers

    res = cbsclient.get("/policies/{0}".format(TEST_NAME))
    assert res.status_code == 400
    assert "x-onap-requestid" in res.headers


def test_resolve_all(
    monkeypatch, cbsclient, monkeyed_requests_put, monkeyed_get_connection_info_from_consul, expected_config
):
    monkeypatch.setattr("requests.put", monkeyed_requests_put)
    monkeypatch.setattr(
        "config_binding_service.client._get_connection_info_from_consul", monkeyed_get_connection_info_from_consul
    )
    withstuff = {
        "config": {"my": "amazing config"},
        "dti": {"my": "dti"},
        "policies": {
            "items": [
                {
                    "policyName": "DCAE_alex.Config_MS_alex_microservice.132.xml",
                    "policyConfigMessage": "Config Retrieved! ",
                    "responseAttributes": {},
                    "policyConfigStatus": "CONFIG_RETRIEVED",
                    "matchingConditions": {"ONAPName": "DCAE", "Name": "DCAE", "ConfigName": "alex_config_name"},
                    "config": {
                        "policyScope": "alex_policy_scope",
                        "configName": "alex_config_name",
                        "description": "test DCAE policy-handler",
                        "service": "alex_service",
                        "policyName": "alex_policy_name",
                        "riskLevel": "3",
                        "key1": "value1",
                        "policy_hello": "world!",
                        "content": {"foo": "microservice3", "foo_updated": "2018-01-30T13:25:33.222Z"},
                        "riskType": "1712_ETE",
                        "guard": "False",
                        "version": "0.0.1",
                        "location": "Central",
                        "policy_updated_ts": "2018-02-19T15:09:55.217Z",
                        "updated_policy_id": "DCAE_alex.Config_MS_alex_microservice",
                        "policy_updated_to_ver": "132",
                        "priority": "4",
                        "policy_updated_from_ver": "131",
                        "templateVersion": "2",
                        "uuid": "5e87d7c5-0daf-4b6b-ab92-5365cf5db1ef",
                    },
                    "property": None,
                    "type": "JSON",
                    "policyVersion": "132",
                },
                {
                    "policyName": "DCAE_alex.Config_db_client_policy_id_value.133.xml",
                    "policyConfigMessage": "Config Retrieved! ",
                    "responseAttributes": {},
                    "policyConfigStatus": "CONFIG_RETRIEVED",
                    "matchingConditions": {"ONAPName": "DCAE", "Name": "DCAE", "ConfigName": "alex_config_name"},
                    "config": {
                        "db_client_ts": "2017-11-21T12:12:13.696Z",
                        "db_client": "ipsum",
                        "policy_hello": "world!",
                        "policy_updated_from_ver": "132",
                        "updated_policy_id": "DCAE_alex.Config_db_client_policy_id_value",
                        "policy_updated_ts": "2018-02-19T15:09:55.812Z",
                        "policy_updated_to_ver": "133",
                    },
                    "property": None,
                    "type": "JSON",
                    "policyVersion": "133",
                },
            ],
            "event": {
                "action": "gathered",
                "timestamp": "2018-02-19 15:36:44.877380",
                "update_id": "bb73c20a-5ff8-450f-8223-da6720ade267",
                "policies_count": 2,
            },
        },
    }

    assert cbsclient.get("service_component_all/{0}".format(TEST_NAME)).json == withstuff

    assert cbsclient.get("service_component_all/test_resolve_scn").json == {"config": expected_config}

    res = cbsclient.get("/service_component_all/{0}".format(TEST_NAME))
    assert json.loads(res.data) == withstuff
    assert res.json == withstuff
    assert res.status_code == 200
    assert "x-onap-requestid" in res.headers

    res = cbsclient.get("/service_component_all/test_resolve_scn")
    assert res.status_code == 200
    assert res.json == {"config": expected_config}

    res = cbsclient.get("/service_component_all/scn_NOTexists")
    assert res.status_code == 404
    assert "x-onap-requestid" in res.headers
