# Copyright 2017 Nokia
#
#    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.

from oslo_log import log as logging
from testtools import matchers

from vitrage_tempest_plugin.tests.base import BaseVitrageTempest
from vitrageclient.exceptions import ClientException

LOG = logging.getLogger(__name__)

URL = 'url'
REGEX_FILTER = 'regex_filter'
HEADERS = 'headers'
HEADERS_PROPS = '{"content": "application/json"}'
REGEX_PROPS = '{"name": "e2e.*"}'


class TestWebhook(BaseVitrageTempest):
    """Webhook test class for Vitrage API tests."""

    @classmethod
    def setUpClass(cls):
        super(TestWebhook, cls).setUpClass()
        cls.pre_test_webhook_count = \
            len(cls.vitrage_client.webhook.list())

    def test_add_webhook(self):

        webhooks = self.vitrage_client.webhook.list()
        self.assertThat(webhooks,
                        matchers.HasLength(self.pre_test_webhook_count),
                        'Amount of webhooks should be '
                        'the same as before the test')

        created_webhook = self.vitrage_client.webhook.add(
            url="https://www.test.com",
            regex_filter=REGEX_PROPS,
            headers=HEADERS_PROPS
        )

        self.assertIsNone(created_webhook.get('ERROR'), 'webhook not '
                                                        'created')
        self.assertEqual(created_webhook[HEADERS],
                         HEADERS_PROPS,
                         'headers not created correctly')
        self.assertEqual(created_webhook[REGEX_FILTER],
                         REGEX_PROPS,
                         'regex not created correctly')
        self.assertEqual(created_webhook[URL],
                         "https://www.test.com",
                         'URL not created correctly')

        webhooks = self.vitrage_client.webhook.list()

        self.assertThat(webhooks,
                        matchers.HasLength(self.pre_test_webhook_count + 1))
        self.vitrage_client.webhook.delete(
            created_webhook['id'])

    def test_delete_webhook(self):
        webhooks = self.vitrage_client.webhook.list()
        self.assertThat(webhooks,
                        matchers.HasLength(self.pre_test_webhook_count),
                        'Amount of webhooks should '
                        'be the same as before the test')

        created_webhook = self.vitrage_client.webhook.add(
            url="https://www.test.com",
            regex_filter=REGEX_PROPS,
            headers=HEADERS_PROPS
        )

        created_webhook = self.vitrage_client.webhook.delete(
            id=created_webhook['id'])
        self.assertIsNotNone(created_webhook.get('SUCCESS'),
                             'failed to delete')
        self.assertThat(webhooks,
                        matchers.HasLength(self.pre_test_webhook_count),
                        'No webhooks should exist after deletion')

    def test_delete_non_existing_webhook(self):
        self.assertRaises(ClientException,
                          self.vitrage_client.webhook.delete,
                          'non existent')

    def test_list_webhook(self):

        webhooks = self.vitrage_client.webhook.list()
        self.assertThat(webhooks,
                        matchers.HasLength(self.pre_test_webhook_count),
                        'Amount of webhooks should be '
                        'the same as before the test')

        created_webhook = self.vitrage_client.webhook.add(
            url="https://www.test.com",
            regex_filter=REGEX_PROPS,
            headers=HEADERS_PROPS
        )

        webhooks = self.vitrage_client.webhook.list()
        self.assertThat(webhooks,
                        matchers.HasLength(self.pre_test_webhook_count + 1))
        self.assertEqual(created_webhook[HEADERS], webhooks[0][HEADERS])
        self.assertEqual(created_webhook['id'], webhooks[0]['id'])
        self.assertEqual(created_webhook[REGEX_FILTER],
                         webhooks[0][REGEX_FILTER])

        self.vitrage_client.webhook.delete(created_webhook['id'])

    def test_show_webhook(self):
        webhooks = self.vitrage_client.webhook.list()
        self.assertThat(webhooks,
                        matchers.HasLength(self.pre_test_webhook_count),
                        'Amount of webhooks should be '
                        'the same as before the test')

        created_webhook = self.vitrage_client.webhook.add(
            url="https://www.test.com",
            regex_filter=REGEX_PROPS,
            headers=HEADERS_PROPS
        )

        show_webhook = self.vitrage_client.webhook.show(created_webhook['id'])

        self.assertIsNotNone(show_webhook, 'webhook not listed')
        self.assertEqual(created_webhook[HEADERS],
                         show_webhook[HEADERS],
                         'headers mismatch')
        self.assertEqual(created_webhook[REGEX_FILTER],
                         show_webhook[REGEX_FILTER],
                         'regex mismatch')
        self.assertEqual(created_webhook[URL],
                         show_webhook[URL],
                         'URL mismatch')

        self.vitrage_client.webhook.delete(created_webhook['id'])