from mock import patch
from unittest import TestCase
from xml.etree import ElementTree as ET

from distribution.adapters.models import RSSOutputAdapter
from distribution.models.article import Article
from test.test_adaptors.test_clients.test_rss.utils import get_context_mock


class RSSAdapterBaseTestCase(TestCase):
    ITEM_TEMPLATE = None

    def setUp(self):
        get_context_patcher = patch('distribution.adapters.models.Adapter.get_context', side_effect=get_context_mock)
        mget_patcher = patch('distribution.models.feed.TaxonomyTopic.manager.mget', return_value=[])
        get_patcher = patch('distribution.models.feed.TaxonomyTopic.manager.get', return_value=None)
        self.addCleanup(get_context_patcher.stop)
        self.addCleanup(mget_patcher.stop)
        self.addCleanup(get_patcher.stop)
        self.get_context_mock = get_context_patcher.start()
        self.mget_mock = mget_patcher.start()
        self.get_mock = get_patcher.start()

        self.adapter = RSSOutputAdapter()

    def _get_xml_tree_from_data(self, data):
        """Obtains an XML ElementTree parsing an Article
        with the given data.

        :param data: Article json data
        :return: XML ElementTree
        :rtype: xml.etree.ElementTree.Element
        """
        item = Article(data=data, validate=False)

        response = self.adapter.render(
            items=[item],
            item_template=self.ITEM_TEMPLATE,
        )

        # The response is generated correctly
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.mimetype, 'text/xml')

        return ET.fromstring(response.data)
