# -*- coding: utf-8 -*-

from unittest import TestCase

from mock import patch

from elasticsearch import RequestError as ElasticsearchRequestError
from elasticsearch import TransportError as ElasticsearchTransportError
from werkzeug.exceptions import HTTPException, MethodNotAllowed, NotFound, NotAcceptable, InternalServerError

from distribution.models.sitemap_url import SitemapURL
from .. import utils


class SitemapURLTestCase(TestCase):
    def setUp(self):
        pass

    @patch('distribution.models.feed.TaxonomyTopic.manager.get', return_value=None)
    @patch('distribution.models.feed.FeedItem.manager.get_by_field', return_value=[])
    @patch('distribution.models.feed.FeedItem.manager.search_by_field', return_value=None)
    def test_sitemap_url_create(self, search_by_field_mock, get_by_field_mock,
                                get_mock):
        """
        Test: Create new Sitemap URL model
        """

        # Test setup
        data = utils.get_sitemap_mock_data()

        # Test execution
        sitemap_url_item = SitemapURL(data[0], 'awesome-project')
        self.assertEqual(sitemap_url_item.key, 'awesome-project:5544332')
        self.assertEqual(sitemap_url_item.get('url'), 'https://morton.name')
        self.assertEqual(sitemap_url_item.get('publication_datetime'), '2017-08-03T20:51:51.000000Z')
        self.assertEqual(sitemap_url_item.get('last_modified_datetime'), '2017-08-03T20:51:51.000000Z')
        self.assertEqual(len(sitemap_url_item.get('images')), 1)
        self.assertEqual(sitemap_url_item.get('title'), 'est tempor in incididunt')
        self.assertEqual(len(sitemap_url_item.get('keywords')), 2)
        self.assertEqual(len(sitemap_url_item.get('genres')), 1)
        self.assertEqual(sitemap_url_item.get('change_frequency'), 'daily')
        self.assertEqual(sitemap_url_item.get('content_type'), 'sitemap:url')
        self.assertIsNone(sitemap_url_item.get('canonical_url'))
        self.assertEqual(sitemap_url_item.get('language'), 'en-US')

    @patch('distribution.models.feed.TaxonomyTopic.manager.get', return_value=None)
    @patch('elasticsearch.Elasticsearch.search')
    def test_sitemap_url_get_children(self, search_mock, get_mock):

        data = utils.get_sitemap_mock_data()[0]
        search_mock.return_value = utils.wrap_search_response(
            [data])

        # Test execution
        sitemap_url_item = SitemapURL(data, 'awesome-project')

        self.assertEqual(sitemap_url_item.get_children(''),
                         [SitemapURL(data)])

    @patch('distribution.models.feed.TaxonomyTopic.manager.get', return_value=None)
    @patch('elasticsearch.Elasticsearch.search')
    def test_sitemap_url_get_children_without_results(
            self, search_mock, get_mock):

        data = utils.get_sitemap_mock_data()[0]
        search_mock.return_value = utils.wrap_empty_search_response()

        # Test execution
        sitemap_url_item = SitemapURL(data, 'awesome-project')

        self.assertEqual(sitemap_url_item.get_children(''), [])

    @patch('distribution.models.feed.TaxonomyTopic.manager.get', return_value=None)
    @patch('elasticsearch.Elasticsearch.search')
    def test_sitemap_url_get_children_with_elastic_exception(
            self, search_mock, get_mock):

        data = utils.get_sitemap_mock_data()[0]
        search_mock.side_effect = ElasticsearchTransportError()

        # Test execution
        sitemap_url_item = SitemapURL(data, 'awesome-project')

        self.assertRaises(
            HTTPException,
            sitemap_url_item.get_children,
            ''
        )

        search_mock.side_effect = ElasticsearchRequestError()

        self.assertRaises(
            HTTPException,
            sitemap_url_item.get_children,
            ''
        )
