Skip to content

Commit

Permalink
Fix fallback image view and add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
hvelarde committed Sep 25, 2017
1 parent 2913fce commit 4a1abe7
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 43 deletions.
25 changes: 14 additions & 11 deletions sc/social/like/browser/fallbackimage.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,25 @@


class FallBackImage(Download):
"""Download fallback image file, via /@@sociallike-fallback-image/filename"""
"""Helper view to return the fallback image."""

filename = None
data = None
def __init__(self, context, request):
super(FallBackImage, self).__init__(context, request)

def __call__(self):
self.setup()
super(FallBackImage, self).__call__()
record = ISocialLikeSettings.__identifier__ + '.fallback_image'
fallback_image = api.portal.get_registry_record(record, default=None)

def setup(self):
fallback_image = api.portal.get_registry_record('fallback_image', interface=ISocialLikeSettings, default=False)
if fallback_image:
if fallback_image is not None:
# set fallback image data for download
filename, data = b64decode_file(fallback_image)
data = NamedImage(data=data, filename=filename)
self.data = data
self.filename = filename
self.filename, self.data = filename, data
# enable image caching for 2 minutes
self.request.RESPONSE.setHeader('Cache-Control', 'max-age=120, public')
else:
# resource no longer available
self.data = NamedImage(data='')
self.request.RESPONSE.setStatus(410) # Gone

def _getFile(self):
return self.data
32 changes: 0 additions & 32 deletions sc/social/like/tests/test_view.py

This file was deleted.

66 changes: 66 additions & 0 deletions sc/social/like/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
from plone import api
from plone.app.testing import setRoles
from plone.app.testing import TEST_USER_ID
from sc.social.like.browser.socialikes import SocialLikes
from sc.social.like.testing import INTEGRATION_TESTING

import unittest


class BrowserViewTestCase(unittest.TestCase):

layer = INTEGRATION_TESTING

def setUp(self):
self.portal = self.layer['portal']
self.request = self.layer['request']
setRoles(self.portal, TEST_USER_ID, ['Manager'])
self.portal.invokeFactory('Document', 'my-document')
self.document = self.portal['my-document']

def view(self, context=None):
context = context or self.portal
view = SocialLikes(context, self.request)
return view

def test_disabled_on_portal(self):
view = self.view(self.portal)
self.assertFalse(view.enabled)

def test_enabled_on_document(self):
view = self.view(self.document)
self.assertTrue(view.enabled)


class FallBackImageViewTestCase(unittest.TestCase):

layer = INTEGRATION_TESTING

def setUp(self):
self.portal = self.layer['portal']
self.request = self.layer['request']

def set_fallback_image(self, filename):
from sc.social.like.interfaces import ISocialLikeSettings
from sc.social.like.tests.utils import get_file_b64encoded
record = ISocialLikeSettings.__identifier__ + '.fallback_image'
logo = get_file_b64encoded(filename)
api.portal.set_registry_record(record, logo)

def test_no_fall_back_image(self):
view = api.content.get_view(
'sociallike-fallback-image', self.portal, self.request)
self.assertEqual(len(view()), 0)
self.assertEqual(self.request.RESPONSE.getStatus(), 410)

def test_fall_back_image(self):
self.set_fallback_image('imgtest_1920x1080.png')
view = api.content.get_view(
'sociallike-fallback-image', self.portal, self.request)
self.assertEqual(len(view()), 42901)
self.assertEqual(self.request.RESPONSE.getStatus(), 200)
self.assertEqual(
self.request.RESPONSE.getHeader('Cache-Control'),
'max-age=120, public',
)
16 changes: 16 additions & 0 deletions sc/social/like/tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,19 @@ def get_random_string(length):
from random import choice
from string import printable
return ''.join(choice(printable) for i in xrange(0, length))


def get_file(filename):
"""Return contents of file from current directory."""
import os
path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(path, 'images', filename)
with open(path, 'rb') as f:
return f.read()


def get_file_b64encoded(filename):
"""Load file from current directory and return it b64encoded."""
from plone.formwidget.namedfile.converter import b64encode_file
data = get_file(filename)
return b64encode_file(filename, data)

0 comments on commit 4a1abe7

Please sign in to comment.