import io
|
import mimetypes
|
import os
|
import unittest
|
from pyramid import testing
|
|
|
class TestResponse(unittest.TestCase):
|
def _getTargetClass(self):
|
from pyramid.response import Response
|
|
return Response
|
|
def test_implements_IResponse(self):
|
from pyramid.interfaces import IResponse
|
|
cls = self._getTargetClass()
|
self.assertTrue(IResponse.implementedBy(cls))
|
|
def test_provides_IResponse(self):
|
from pyramid.interfaces import IResponse
|
|
inst = self._getTargetClass()()
|
self.assertTrue(IResponse.providedBy(inst))
|
|
|
class TestFileResponse(unittest.TestCase):
|
def _makeOne(self, file, **kw):
|
from pyramid.response import FileResponse
|
|
return FileResponse(file, **kw)
|
|
def _getPath(self, suffix='txt'):
|
here = os.path.dirname(__file__)
|
return os.path.join(here, 'fixtures', 'minimal.%s' % (suffix,))
|
|
def test_with_image_content_type(self):
|
path = self._getPath('jpg')
|
r = self._makeOne(path, content_type='image/jpeg')
|
self.assertEqual(r.content_type, 'image/jpeg')
|
self.assertEqual(r.headers['content-type'], 'image/jpeg')
|
path = self._getPath()
|
r.app_iter.close()
|
|
def test_with_xml_content_type(self):
|
path = self._getPath('xml')
|
r = self._makeOne(path, content_type='application/xml')
|
self.assertEqual(r.content_type, 'application/xml')
|
self.assertEqual(
|
r.headers['content-type'], 'application/xml; charset=UTF-8'
|
)
|
r.app_iter.close()
|
|
def test_with_pdf_content_type(self):
|
path = self._getPath('xml')
|
r = self._makeOne(path, content_type='application/pdf')
|
self.assertEqual(r.content_type, 'application/pdf')
|
self.assertEqual(r.headers['content-type'], 'application/pdf')
|
r.app_iter.close()
|
|
def test_without_content_type(self):
|
for suffix in ('txt', 'xml', 'pdf'):
|
path = self._getPath(suffix)
|
r = self._makeOne(path)
|
self.assertEqual(
|
r.headers['content-type'].split(';')[0],
|
mimetypes.guess_type(path, strict=False)[0],
|
)
|
r.app_iter.close()
|
|
def test_python_277_bug_15207(self):
|
# python 2.7.7 on windows has a bug where its mimetypes.guess_type
|
# function returns Unicode for the content_type, unlike any previous
|
# version of Python. See https://github.com/Pylons/pyramid/issues/1360
|
# for more information.
|
from pyramid.compat import text_
|
import mimetypes as old_mimetypes
|
from pyramid import response
|
|
class FakeMimetypesModule(object):
|
def guess_type(self, *arg, **kw):
|
return text_('foo/bar'), None
|
|
fake_mimetypes = FakeMimetypesModule()
|
try:
|
response.mimetypes = fake_mimetypes
|
path = self._getPath('xml')
|
r = self._makeOne(path)
|
self.assertEqual(r.content_type, 'foo/bar')
|
self.assertEqual(type(r.content_type), str)
|
finally:
|
response.mimetypes = old_mimetypes
|
|
|
class TestFileIter(unittest.TestCase):
|
def _makeOne(self, file, block_size):
|
from pyramid.response import FileIter
|
|
return FileIter(file, block_size)
|
|
def test___iter__(self):
|
f = io.BytesIO(b'abc')
|
inst = self._makeOne(f, 1)
|
self.assertEqual(inst.__iter__(), inst)
|
|
def test_iteration(self):
|
data = b'abcdef'
|
f = io.BytesIO(b'abcdef')
|
inst = self._makeOne(f, 1)
|
r = b''
|
for x in inst:
|
self.assertEqual(len(x), 1)
|
r += x
|
self.assertEqual(r, data)
|
|
def test_close(self):
|
f = io.BytesIO(b'abc')
|
inst = self._makeOne(f, 1)
|
inst.close()
|
self.assertTrue(f.closed)
|
|
|
class Test_patch_mimetypes(unittest.TestCase):
|
def _callFUT(self, module):
|
from pyramid.response import init_mimetypes
|
|
return init_mimetypes(module)
|
|
def test_has_init(self):
|
class DummyMimetypes(object):
|
def init(self):
|
self.initted = True
|
|
module = DummyMimetypes()
|
result = self._callFUT(module)
|
self.assertEqual(result, True)
|
self.assertEqual(module.initted, True)
|
|
def test_missing_init(self):
|
class DummyMimetypes(object):
|
pass
|
|
module = DummyMimetypes()
|
result = self._callFUT(module)
|
self.assertEqual(result, False)
|
|
|
class TestResponseAdapter(unittest.TestCase):
|
def setUp(self):
|
registry = Dummy()
|
self.config = testing.setUp(registry=registry)
|
|
def tearDown(self):
|
self.config.end()
|
|
def _makeOne(self, *types_or_ifaces, **kw):
|
from pyramid.response import response_adapter
|
|
return response_adapter(*types_or_ifaces, **kw)
|
|
def test_register_single(self):
|
from zope.interface import Interface
|
|
class IFoo(Interface):
|
pass
|
|
dec = self._makeOne(IFoo)
|
|
def foo(): # pragma: no cover
|
pass
|
|
config = DummyConfigurator()
|
scanner = Dummy()
|
scanner.config = config
|
dec.register(scanner, None, foo)
|
self.assertEqual(config.adapters, [(foo, IFoo)])
|
|
def test_register_multi(self):
|
from zope.interface import Interface
|
|
class IFoo(Interface):
|
pass
|
|
class IBar(Interface):
|
pass
|
|
dec = self._makeOne(IFoo, IBar)
|
|
def foo(): # pragma: no cover
|
pass
|
|
config = DummyConfigurator()
|
scanner = Dummy()
|
scanner.config = config
|
dec.register(scanner, None, foo)
|
self.assertEqual(config.adapters, [(foo, IFoo), (foo, IBar)])
|
|
def test___call__(self):
|
from zope.interface import Interface
|
|
class IFoo(Interface):
|
pass
|
|
dec = self._makeOne(IFoo)
|
dummy_venusian = DummyVenusian()
|
dec.venusian = dummy_venusian
|
|
def foo(): # pragma: no cover
|
pass
|
|
dec(foo)
|
self.assertEqual(
|
dummy_venusian.attached, [(foo, dec.register, 'pyramid', 1)]
|
)
|
|
def test___call___with_venusian_args(self):
|
from zope.interface import Interface
|
|
class IFoo(Interface):
|
pass
|
|
dec = self._makeOne(IFoo, _category='foo', _depth=1)
|
dummy_venusian = DummyVenusian()
|
dec.venusian = dummy_venusian
|
|
def foo(): # pragma: no cover
|
pass
|
|
dec(foo)
|
self.assertEqual(
|
dummy_venusian.attached, [(foo, dec.register, 'foo', 2)]
|
)
|
|
|
class TestGetResponseFactory(unittest.TestCase):
|
def test_get_factory(self):
|
from pyramid.registry import Registry
|
from pyramid.response import Response, _get_response_factory
|
|
registry = Registry()
|
response = _get_response_factory(registry)(None)
|
self.assertTrue(isinstance(response, Response))
|
|
|
class Dummy(object):
|
pass
|
|
|
class DummyConfigurator(object):
|
def __init__(self):
|
self.adapters = []
|
|
def add_response_adapter(self, wrapped, type_or_iface):
|
self.adapters.append((wrapped, type_or_iface))
|
|
|
class DummyVenusian(object):
|
def __init__(self):
|
self.attached = []
|
|
def attach(self, wrapped, fn, category=None, depth=None):
|
self.attached.append((wrapped, fn, category, depth))
|