diff --git a/CHANGES.rst b/CHANGES.rst index 809ea064..11abf795 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -12,7 +12,7 @@ There's a frood who really knows where his towel is. 2.6b1 (2016-12-21) ^^^^^^^^^^^^^^^^^^ -- Add Twitter Cards metadata (closes `#65`_). +- Add metadata for Twitter Cards (closes `#65`_). [rodfersou] - Code clean up; tests related with loading BMP images were removed as make no sense. diff --git a/sc/social/like/plugins/facebook/browser.py b/sc/social/like/plugins/facebook/browser.py index d7e77716..09267702 100644 --- a/sc/social/like/plugins/facebook/browser.py +++ b/sc/social/like/plugins/facebook/browser.py @@ -9,6 +9,7 @@ from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from sc.social.like.interfaces import ISocialLikeSettings from sc.social.like.plugins.facebook.utils import facebook_language +from sc.social.like.testing import IS_PLONE_5 # TODO: move to config.py from sc.social.like.utils import get_content_image from sc.social.like.utils import get_language from urllib import urlencode @@ -46,9 +47,9 @@ def __init__(self, context, request): self.image = get_content_image(context, width=1200, height=630) self.typebutton # XXX: needed to initialize self.width - def metadata_enabled(self): - """Disable metadata on Plone 5""" - return not api.env.plone_version().startswith('5') + @property + def is_plone5(self): + return IS_PLONE_5 def fbjs(self): js_source = """ diff --git a/sc/social/like/plugins/facebook/templates/metadata.pt b/sc/social/like/plugins/facebook/templates/metadata.pt index b263d353..72a74f90 100644 --- a/sc/social/like/plugins/facebook/templates/metadata.pt +++ b/sc/social/like/plugins/facebook/templates/metadata.pt @@ -1,4 +1,7 @@ - + + Plone 5 already includes metadata for Facebook and Twitter. + + diff --git a/sc/social/like/plugins/twitter/browser.py b/sc/social/like/plugins/twitter/browser.py index 7f5c45b1..1356d6eb 100644 --- a/sc/social/like/plugins/twitter/browser.py +++ b/sc/social/like/plugins/twitter/browser.py @@ -6,6 +6,7 @@ from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from Products.PythonScripts.standard import url_quote from sc.social.like.interfaces import ISocialLikeSettings +from sc.social.like.testing import IS_PLONE_5 # TODO: move to config.py from sc.social.like.utils import get_content_image from sc.social.like.utils import get_language from urllib import urlencode @@ -46,9 +47,9 @@ def __init__(self, context, request): ) ) - def metadata_enabled(self): - """Disable metadata on Plone 5""" - return not api.env.plone_version().startswith('5') + @property + def is_plone5(self): + return IS_PLONE_5 @property def typebutton(self): @@ -78,8 +79,5 @@ def share_link(self): return url def image_url(self): - """ Return url to image - """ - img = self.image - if img: - return img.url + """Return image URL.""" + return self.image.url if self.image else None diff --git a/sc/social/like/plugins/twitter/templates/metadata.pt b/sc/social/like/plugins/twitter/templates/metadata.pt index 9e299a48..e9e61e79 100644 --- a/sc/social/like/plugins/twitter/templates/metadata.pt +++ b/sc/social/like/plugins/twitter/templates/metadata.pt @@ -1,6 +1,9 @@ - + + Plone 5 already includes metadata for Facebook and Twitter. + + - + diff --git a/sc/social/like/tests/test_plugin_twitter.py b/sc/social/like/tests/test_plugin_twitter.py index 2833cdf7..4d7e1c4f 100644 --- a/sc/social/like/tests/test_plugin_twitter.py +++ b/sc/social/like/tests/test_plugin_twitter.py @@ -68,7 +68,7 @@ def setUp(self): with api.env.adopt_roles(['Manager']): self.image = api.content.create( - self.portal, 'Image', id='test-image') + self.portal, 'Image', title='Lorem Ipsum', description='Neque Porro') set_image_field(self.image, load_image(1024, 768), 'image/png') @@ -77,26 +77,24 @@ def setup_content(self, portal): self.document = portal['my-document'] def test_plugin_view_metadata(self): - plugin = self.plugin - image = self.image - plugin_view = plugin.view() - view = image.restrictedTraverse(plugin_view) - view.title = 'Twitter Title' - view.description = 'Twitter Description' + + def get_meta_content(name): + """Return the content attribute of the meta tag specified by name.""" + return html.find('*/meta[@name="{0}"]'.format(name)).attrib['content'] + + view = self.image.restrictedTraverse(self.plugin.view()) record = ISocialLikeSettings.__identifier__ + '.twitter_username' api.portal.set_registry_record(record, 'plone') - metadata = view.metadata() - self.assertIn( - '', metadata) - self.assertIn( - '', metadata) - self.assertIn( - '', metadata) - self.assertIn( - '', metadata) + from lxml import etree + html = etree.HTML(view.metadata()) + + self.assertEqual(get_meta_content('twitter:card'), 'summary_large_image') + expected = r'http://nohost/plone/lorem-ipsum/@@images/[0-9a-f--]+.png' + self.assertRegexpMatches(get_meta_content('twitter:image'), expected) + self.assertEqual(get_meta_content('twitter:site'), '@plone') + self.assertEqual(get_meta_content('twitter:title'), 'Lorem Ipsum') + self.assertEqual(get_meta_content('twitter:description'), 'Neque Porro') def test_plugin_view_html(self): plugin = self.plugin diff --git a/setup.py b/setup.py index 1ec6ace4..7f122de1 100644 --- a/setup.py +++ b/setup.py @@ -66,6 +66,7 @@ extras_require={ 'test': [ 'AccessControl', + 'lxml', 'mock', 'plone.app.robotframework', 'plone.app.testing [robot] >=4.2.2',