from ftw.contentpage.interfaces import ITeaser
from ftw.contentpage.testing import FTW_CONTENTPAGE_FUNCTIONAL_TESTING
from plone.app.testing import TEST_USER_NAME, TEST_USER_PASSWORD
from plone.testing.z2 import Browser
from Products.CMFCore.utils import getToolByName
from pyquery import PyQuery
from StringIO import StringIO
from unittest2 import TestCase
import transaction
 
 
class TestTeaserImage(TestCase):
 
    layer = FTW_CONTENTPAGE_FUNCTIONAL_TESTING
 
    def setUp(self):
        super(TestTeaserImage, self).setUp()
        self.portal = self.layer['portal']
        self.portal_url = self.portal.portal_url()
        self.catalog = getToolByName(self.portal, 'portal_catalog')
 
        self.contentpage = self.portal.get(
            self.portal.invokeFactory('ContentPage', 'contentpage'))
        # Fire all necessary events
        self.contentpage.processForm()
 
        # Regular old simplayout page
        self.page = self.portal.get(
            self.portal.invokeFactory('Page', 'page'))
        self.page.processForm()
 
        transaction.commit()
 
        # Browser setup
        self.browser = Browser(self.layer['app'])
        self.browser.handleErrors = False
 
    def _auth(self):
        self.browser.addHeader('Authorization', 'Basic %s:%s' % (
            TEST_USER_NAME, TEST_USER_PASSWORD, ))
 
    def test_teaser_interface(self):
        self.assertTrue(ITeaser.providedBy(self.contentpage),
            'ContentPage should provide ITeaser interface')
 
        self.assertFalse(ITeaser.providedBy(self.page),
            'Old Page should not provide ITeaser interface')
 
    def test_not_show_teaser(self):
        # No image, no description - no teaser
        self._auth()
        self.browser.open(self.contentpage.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertFalse(
            pq('.simplelayout-content.sl-teaser-content-listing'),
            'There should be no simplelayout teaser viewlet')
 
        self.browser.open(self.page.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertFalse(
            pq('.simplelayout-content.sl-teaser-content-listing'),
            'There should be no simplelayout teaser viewlet on old '
            'simplelayout pages')
 
    def test_show_teaser__description(self):
        self.contentpage.setDescription('qwerty')
        self.page.setDescription('qwerty')
 
        transaction.commit()
 
        self._auth()
        self.browser.open(self.contentpage.absolute_url())
        pq = PyQuery(self.browser.contents)
 
        wrapper = pq('.simplelayout-content.sl-teaser-content-listing')
        self.assertTrue(
            wrapper,
            'There should be the teaser viewlet')
        self.assertEquals(
            wrapper.find('.sl-text-wrapper')[0].text, 'qwerty')
 
        self.assertEquals(len(pq('.documentDescription')), 1,
            'The default description should appear only once')
 
        self.browser.open(self.page.absolute_url())
        pq = PyQuery(self.browser.contents)
 
        self.assertFalse(
            pq('.simplelayout-content.sl-teaser-content-listing'),
            'There should be still no simplelayout teaser viewlet on old '
            'simplelayout pages')
 
    def test_show_teaser__image(self):
        self.contentpage.setImage(
            StringIO('GIF89a\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00'
                '\x00!\xf9\x04\x04\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00'
                '\x01\x00\x00\x02\x02D\x01\x00;'))
 
        self.assertNotIn('image', self.page.Schema(),
            'There should be no image field on old simplelayout pages')
 
        transaction.commit()
 
        self._auth()
        self.browser.open(self.contentpage.absolute_url())
        pq = PyQuery(self.browser.contents)
 
        wrapper = pq('.simplelayout-content.sl-teaser-content-listing')
        self.assertTrue(
            wrapper,
            'There should be the teaser viewlet')
        self.assertTrue(
            wrapper.find('.sl-img-wrapper'), 'No image found')
 
        self.browser.open(self.page.absolute_url())
        pq = PyQuery(self.browser.contents)
 
        self.assertFalse(
            pq('.simplelayout-content.sl-teaser-content-listing'),
            'There should be still no simplelayout teaser viewlet on old '
            'simplelayout pages')
 
    def test_teaser_field_permission_contentpage(self):
        self._auth()
        self.browser.open("%s/edit" % self.contentpage.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertTrue(pq('#fieldset-image .ArchetypesImageWidget'),
            'Expect an image field (teaser)')
 
        permissions = 'ftw.contentpage: Edit teaser image on ContentPage'
        self.contentpage.manage_permission(permissions, roles=[],
            acquire=False)
        self.contentpage.reindexObjectSecurity()
        transaction.commit()
 
        self.browser.open("%s/edit" % self.contentpage.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertFalse(pq('#fieldset-image .ArchetypesImageWidget'),
            'Expect NO an image field (teaser)')
 
    def test_teaser_field_permission_eventpage(self):
        eventfolder = self.portal.get(self.portal.invokeFactory(
            'EventFolder', 'eventfolder'))
        eventfolder.processForm()
 
        eventpage = eventfolder.get(
            eventfolder.invokeFactory('EventPage', 'eventpage'))
        eventpage.processForm()
        transaction.commit()
 
        self._auth()
        self.browser.open("%s/edit" % eventpage.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertTrue(pq('#fieldset-image .ArchetypesImageWidget'),
            'Expect an image field (teaser)')
 
        permissions = 'ftw.contentpage: Edit teaser image on EventPage'
        eventpage.manage_permission(permissions, roles=[],
            acquire=False)
        eventpage.reindexObjectSecurity()
        transaction.commit()
 
        self.browser.open("%s/edit" % eventpage.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertFalse(pq('#fieldset-image .ArchetypesImageWidget'),
            'Expect NO an image field (teaser)')
 
    def test_teaser_field_permission_news(self):
        newsfolder = self.portal.get(self.portal.invokeFactory(
            'NewsFolder', 'newsfolder'))
        newsfolder.processForm()
 
        news = newsfolder.get(
            newsfolder.invokeFactory('News', 'news'))
        news.processForm()
        transaction.commit()
 
        self._auth()
        self.browser.open("%s/edit" % news.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertTrue(pq('#fieldset-image .ArchetypesImageWidget'),
            'Expect an image field (teaser)')
 
        permissions = 'ftw.contentpage: Edit teaser image on News'
        news.manage_permission(permissions, roles=[],
            acquire=False)
        news.reindexObjectSecurity()
        transaction.commit()
 
        self.browser.open("%s/edit" % news.absolute_url())
        pq = PyQuery(self.browser.contents)
        self.assertFalse(pq('#fieldset-image .ArchetypesImageWidget'),
            'Expect NO an image field (teaser)')
 
    def test_teaser_viewlet_not_used_when_not_on_a_simplelayout_view(self):
        self.contentpage.setDescription('The Description')
        transaction.commit()
        self._auth()
 
        self.browser.open(self.contentpage.absolute_url())
        self.assertTrue(
            self.teaser_viewlet_visible(),
            'Expected the teaser viewlet to be visible on a normal content page.')
 
        self.browser.open('/'.join((self.contentpage.absolute_url(),
                                    'folder_contents')))
        self.assertFalse(
            self.teaser_viewlet_visible(),
            'Unexpectedly found traces of the teaser viewlet on folder_contents.')
 
    def teaser_viewlet_visible(self):
        pq = PyQuery(self.browser.contents)
        return pq('.sl-teaser-content-listing')