diff options
| author | Michael Merickel <michael@merickel.org> | 2018-10-14 21:11:41 -0500 |
|---|---|---|
| committer | Michael Merickel <michael@merickel.org> | 2018-10-14 21:11:41 -0500 |
| commit | 3670c2cdb732d378ba6d38e72e7cd875ff726aa9 (patch) | |
| tree | 5213452a778c992d42602efe7d3b3655a349abd5 /tests/test_testing.py | |
| parent | 2b024920847481592b1a13d4006d2a9fa8881d72 (diff) | |
| download | pyramid-3670c2cdb732d378ba6d38e72e7cd875ff726aa9.tar.gz pyramid-3670c2cdb732d378ba6d38e72e7cd875ff726aa9.tar.bz2 pyramid-3670c2cdb732d378ba6d38e72e7cd875ff726aa9.zip | |
move tests out of the package
Diffstat (limited to 'tests/test_testing.py')
| -rw-r--r-- | tests/test_testing.py | 689 |
1 files changed, 689 insertions, 0 deletions
diff --git a/tests/test_testing.py b/tests/test_testing.py new file mode 100644 index 000000000..86c219988 --- /dev/null +++ b/tests/test_testing.py @@ -0,0 +1,689 @@ +import unittest +from zope.component import getSiteManager +from pyramid import testing + +class TestDummyRootFactory(unittest.TestCase): + def _makeOne(self, environ): + from pyramid.testing import DummyRootFactory + return DummyRootFactory(environ) + + def test_it(self): + environ = {'bfg.routes.matchdict':{'a':1}} + factory = self._makeOne(environ) + self.assertEqual(factory.a, 1) + +class TestDummySecurityPolicy(unittest.TestCase): + def _getTargetClass(self): + from pyramid.testing import DummySecurityPolicy + return DummySecurityPolicy + + def _makeOne(self, userid=None, groupids=(), permissive=True): + klass = self._getTargetClass() + return klass(userid, groupids, permissive) + + def test_authenticated_userid(self): + policy = self._makeOne('user') + self.assertEqual(policy.authenticated_userid(None), 'user') + + def test_unauthenticated_userid(self): + policy = self._makeOne('user') + self.assertEqual(policy.unauthenticated_userid(None), 'user') + + def test_effective_principals_userid(self): + policy = self._makeOne('user', ('group1',)) + from pyramid.security import Everyone + from pyramid.security import Authenticated + self.assertEqual(policy.effective_principals(None), + [Everyone, Authenticated, 'user', 'group1']) + + def test_effective_principals_nouserid(self): + policy = self._makeOne() + from pyramid.security import Everyone + self.assertEqual(policy.effective_principals(None), [Everyone]) + + def test_permits(self): + policy = self._makeOne() + self.assertEqual(policy.permits(None, None, None), True) + + def test_principals_allowed_by_permission(self): + policy = self._makeOne('user', ('group1',)) + from pyramid.security import Everyone + from pyramid.security import Authenticated + result = policy.principals_allowed_by_permission(None, None) + self.assertEqual(result, [Everyone, Authenticated, 'user', 'group1']) + + def test_forget(self): + policy = self._makeOne() + self.assertEqual(policy.forget(None), []) + + def test_remember(self): + policy = self._makeOne() + self.assertEqual(policy.remember(None, None), []) + + + +class TestDummyResource(unittest.TestCase): + def _getTargetClass(self): + from pyramid.testing import DummyResource + return DummyResource + + def _makeOne(self, name=None, parent=None, **kw): + klass = self._getTargetClass() + return klass(name, parent, **kw) + + def test__setitem__and__getitem__and__delitem__and__contains__and_get(self): + class Dummy: + pass + dummy = Dummy() + resource = self._makeOne() + resource['abc'] = dummy + self.assertEqual(dummy.__name__, 'abc') + self.assertEqual(dummy.__parent__, resource) + self.assertEqual(resource['abc'], dummy) + self.assertEqual(resource.get('abc'), dummy) + self.assertRaises(KeyError, resource.__getitem__, 'none') + self.assertTrue('abc' in resource) + del resource['abc'] + self.assertFalse('abc' in resource) + self.assertEqual(resource.get('abc', 'foo'), 'foo') + self.assertEqual(resource.get('abc'), None) + + def test_extra_params(self): + resource = self._makeOne(foo=1) + self.assertEqual(resource.foo, 1) + + def test_clone(self): + resource = self._makeOne('name', 'parent', foo=1, bar=2) + clone = resource.clone('name2', 'parent2', bar=1) + self.assertEqual(clone.bar, 1) + self.assertEqual(clone.__name__, 'name2') + self.assertEqual(clone.__parent__, 'parent2') + self.assertEqual(clone.foo, 1) + + def test_keys_items_values_len(self): + class Dummy: + pass + resource = self._makeOne() + resource['abc'] = Dummy() + resource['def'] = Dummy() + L = list + self.assertEqual(L(resource.values()), L(resource.subs.values())) + self.assertEqual(L(resource.items()), L(resource.subs.items())) + self.assertEqual(L(resource.keys()), L(resource.subs.keys())) + self.assertEqual(len(resource), 2) + + def test_nonzero(self): + resource = self._makeOne() + self.assertEqual(resource.__nonzero__(), True) + + def test_bool(self): + resource = self._makeOne() + self.assertEqual(resource.__bool__(), True) + + def test_ctor_with__provides__(self): + resource = self._makeOne(__provides__=IDummy) + self.assertTrue(IDummy.providedBy(resource)) + +class TestDummyRequest(unittest.TestCase): + def _getTargetClass(self): + from pyramid.testing import DummyRequest + return DummyRequest + + def _makeOne(self, *arg, **kw): + return self._getTargetClass()(*arg, **kw) + + def test_params(self): + request = self._makeOne(params = {'say':'Hello'}, + environ = {'PATH_INFO':'/foo'}, + headers = {'X-Foo':'YUP'}, + ) + self.assertEqual(request.params['say'], 'Hello') + self.assertEqual(request.GET['say'], 'Hello') + self.assertEqual(request.POST['say'], 'Hello') + self.assertEqual(request.headers['X-Foo'], 'YUP') + self.assertEqual(request.environ['PATH_INFO'], '/foo') + + def test_defaults(self): + from pyramid.threadlocal import get_current_registry + from pyramid.testing import DummySession + request = self._makeOne() + self.assertEqual(request.method, 'GET') + self.assertEqual(request.application_url, 'http://example.com') + self.assertEqual(request.host_url, 'http://example.com') + self.assertEqual(request.path_url, 'http://example.com') + self.assertEqual(request.url, 'http://example.com') + self.assertEqual(request.host, 'example.com:80') + self.assertEqual(request.content_length, 0) + self.assertEqual(request.environ.get('PATH_INFO'), None) + self.assertEqual(request.headers.get('X-Foo'), None) + self.assertEqual(request.params.get('foo'), None) + self.assertEqual(request.GET.get('foo'), None) + self.assertEqual(request.POST.get('foo'), None) + self.assertEqual(request.cookies.get('type'), None) + self.assertEqual(request.path, '/') + self.assertEqual(request.path_info, '/') + self.assertEqual(request.script_name, '') + self.assertEqual(request.path_qs, '') + self.assertEqual(request.view_name, '') + self.assertEqual(request.subpath, ()) + self.assertEqual(request.context, None) + self.assertEqual(request.root, None) + self.assertEqual(request.virtual_root, None) + self.assertEqual(request.virtual_root_path, ()) + self.assertEqual(request.registry, get_current_registry()) + self.assertEqual(request.session.__class__, DummySession) + + def test_params_explicit(self): + request = self._makeOne(params = {'foo':'bar'}) + self.assertEqual(request.params['foo'], 'bar') + self.assertEqual(request.GET['foo'], 'bar') + self.assertEqual(request.POST['foo'], 'bar') + + def test_environ_explicit(self): + request = self._makeOne(environ = {'PATH_INFO':'/foo'}) + self.assertEqual(request.environ['PATH_INFO'], '/foo') + + def test_headers_explicit(self): + request = self._makeOne(headers = {'X-Foo':'YUP'}) + self.assertEqual(request.headers['X-Foo'], 'YUP') + + def test_path_explicit(self): + request = self._makeOne(path = '/abc') + self.assertEqual(request.path, '/abc') + + def test_cookies_explicit(self): + request = self._makeOne(cookies = {'type': 'gingersnap'}) + self.assertEqual(request.cookies['type'], 'gingersnap') + + def test_post_explicit(self): + POST = {'foo': 'bar', 'baz': 'qux'} + request = self._makeOne(post=POST) + self.assertEqual(request.method, 'POST') + self.assertEqual(request.POST, POST) + # N.B.: Unlike a normal request, passing 'post' should *not* put + # explict POST data into params: doing so masks a possible + # XSS bug in the app. Tests for apps which don't care about + # the distinction should just use 'params'. + self.assertEqual(request.params, {}) + + def test_post_empty_shadows_params(self): + request = self._makeOne(params={'foo': 'bar'}, post={}) + self.assertEqual(request.method, 'POST') + self.assertEqual(request.params.get('foo'), 'bar') + self.assertEqual(request.POST.get('foo'), None) + + def test_kwargs(self): + request = self._makeOne(water = 1) + self.assertEqual(request.water, 1) + + def test_add_response_callback(self): + request = self._makeOne() + request.add_response_callback(1) + self.assertEqual(list(request.response_callbacks), [1]) + + def test_registry_is_config_registry_when_setup_is_called_after_ctor(self): + # see https://github.com/Pylons/pyramid/issues/165 + from pyramid.registry import Registry + from pyramid.config import Configurator + request = self._makeOne() + try: + registry = Registry('this_test') + config = Configurator(registry=registry) + config.begin() + self.assertTrue(request.registry is registry) + finally: + config.end() + + def test_set_registry(self): + request = self._makeOne() + request.registry = 'abc' + self.assertEqual(request.registry, 'abc') + + def test_del_registry(self): + # see https://github.com/Pylons/pyramid/issues/165 + from pyramid.registry import Registry + from pyramid.config import Configurator + request = self._makeOne() + request.registry = 'abc' + self.assertEqual(request.registry, 'abc') + del request.registry + try: + registry = Registry('this_test') + config = Configurator(registry=registry) + config.begin() + self.assertTrue(request.registry is registry) + finally: + config.end() + + def test_response_with_responsefactory(self): + from pyramid.registry import Registry + from pyramid.interfaces import IResponseFactory + registry = Registry('this_test') + class ResponseFactory(object): + pass + registry.registerUtility( + lambda r: ResponseFactory(), IResponseFactory + ) + request = self._makeOne() + request.registry = registry + resp = request.response + self.assertEqual(resp.__class__, ResponseFactory) + self.assertTrue(request.response is resp) # reified + + def test_response_without_responsefactory(self): + from pyramid.registry import Registry + from pyramid.response import Response + registry = Registry('this_test') + request = self._makeOne() + request.registry = registry + resp = request.response + self.assertEqual(resp.__class__, Response) + self.assertTrue(request.response is resp) # reified + + +class TestDummyTemplateRenderer(unittest.TestCase): + def _getTargetClass(self, ): + from pyramid.testing import DummyTemplateRenderer + return DummyTemplateRenderer + + def _makeOne(self, string_response=''): + return self._getTargetClass()(string_response=string_response) + + def test_implementation(self): + renderer = self._makeOne() + impl = renderer.implementation() + impl(a=1, b=2) + self.assertEqual(renderer._implementation._received['a'], 1) + self.assertEqual(renderer._implementation._received['b'], 2) + + def test_getattr(self): + renderer = self._makeOne() + renderer({'a':1}) + self.assertEqual(renderer.a, 1) + self.assertRaises(AttributeError, renderer.__getattr__, 'b') + + def test_assert_(self): + renderer = self._makeOne() + renderer({'a':1, 'b':2}) + self.assertRaises(AssertionError, renderer.assert_, c=1) + self.assertRaises(AssertionError, renderer.assert_, b=3) + self.assertTrue(renderer.assert_(a=1, b=2)) + + def test_nondefault_string_response(self): + renderer = self._makeOne('abc') + result = renderer({'a':1, 'b':2}) + self.assertEqual(result, 'abc') + +class Test_setUp(unittest.TestCase): + def _callFUT(self, **kw): + from pyramid.testing import setUp + return setUp(**kw) + + def tearDown(self): + from pyramid.threadlocal import manager + manager.clear() + getSiteManager.reset() + + def _assertSMHook(self, hook): + result = getSiteManager.sethook(None) + self.assertEqual(result, hook) + + def test_it_defaults(self): + from pyramid.threadlocal import manager + from pyramid.threadlocal import get_current_registry + from pyramid.registry import Registry + old = True + manager.push(old) + config = self._callFUT() + current = manager.get() + self.assertFalse(current is old) + self.assertEqual(config.registry, current['registry']) + self.assertEqual(current['registry'].__class__, Registry) + self.assertEqual(current['request'], None) + self.assertEqual(config.package.__name__, 'pyramid.tests') + self._assertSMHook(get_current_registry) + + def test_it_with_registry(self): + from pyramid.registry import Registry + from pyramid.threadlocal import manager + registry = Registry() + self._callFUT(registry=registry) + current = manager.get() + self.assertEqual(current['registry'], registry) + + def test_it_with_request(self): + from pyramid.threadlocal import manager + request = object() + self._callFUT(request=request) + current = manager.get() + self.assertEqual(current['request'], request) + + def test_it_with_package(self): + config = self._callFUT(package='pyramid') + self.assertEqual(config.package.__name__, 'pyramid') + + def test_it_with_hook_zca_false(self): + from pyramid.registry import Registry + registry = Registry() + self._callFUT(registry=registry, hook_zca=False) + sm = getSiteManager() + self.assertFalse(sm is registry) + + def test_it_with_settings_passed_explicit_registry(self): + from pyramid.registry import Registry + registry = Registry() + self._callFUT(registry=registry, hook_zca=False, settings=dict(a=1)) + self.assertEqual(registry.settings['a'], 1) + + def test_it_with_settings_passed_implicit_registry(self): + config = self._callFUT(hook_zca=False, settings=dict(a=1)) + self.assertEqual(config.registry.settings['a'], 1) + +class Test_cleanUp(Test_setUp): + def _callFUT(self, *arg, **kw): + from pyramid.testing import cleanUp + return cleanUp(*arg, **kw) + +class Test_tearDown(unittest.TestCase): + def _callFUT(self, **kw): + from pyramid.testing import tearDown + return tearDown(**kw) + + def tearDown(self): + from pyramid.threadlocal import manager + manager.clear() + getSiteManager.reset() + + def _assertSMHook(self, hook): + result = getSiteManager.sethook(None) + self.assertEqual(result, hook) + + def _setSMHook(self, hook): + getSiteManager.sethook(hook) + + def test_defaults(self): + from pyramid.threadlocal import manager + registry = DummyRegistry() + old = {'registry':registry} + hook = lambda *arg: None + try: + self._setSMHook(hook) + manager.push(old) + self._callFUT() + current = manager.get() + self.assertNotEqual(current, old) + self.assertEqual(registry.inited, 2) + finally: + result = getSiteManager.sethook(None) + self.assertNotEqual(result, hook) + + def test_registry_cannot_be_inited(self): + from pyramid.threadlocal import manager + registry = DummyRegistry() + def raiseit(name): + raise TypeError + registry.__init__ = raiseit + old = {'registry':registry} + try: + manager.push(old) + self._callFUT() # doesn't blow up + current = manager.get() + self.assertNotEqual(current, old) + self.assertEqual(registry.inited, 1) + finally: + manager.clear() + + def test_unhook_zc_false(self): + hook = lambda *arg: None + try: + self._setSMHook(hook) + self._callFUT(unhook_zca=False) + finally: + self._assertSMHook(hook) + +class TestDummyRendererFactory(unittest.TestCase): + def _makeOne(self, name, factory): + from pyramid.testing import DummyRendererFactory + return DummyRendererFactory(name, factory) + + def test_add_no_colon(self): + f = self._makeOne('name', None) + f.add('spec', 'renderer') + self.assertEqual(f.renderers['spec'], 'renderer') + + def test_add_with_colon(self): + f = self._makeOne('name', None) + f.add('spec:spec2', 'renderer') + self.assertEqual(f.renderers['spec:spec2'], 'renderer') + self.assertEqual(f.renderers['spec2'], 'renderer') + + def test_call(self): + f = self._makeOne('name', None) + f.renderers['spec'] = 'renderer' + info = DummyRendererInfo({'name':'spec'}) + self.assertEqual(f(info), 'renderer') + + def test_call2(self): + f = self._makeOne('name', None) + f.renderers['spec'] = 'renderer' + info = DummyRendererInfo({'name':'spec:spec'}) + self.assertEqual(f(info), 'renderer') + + def test_call3(self): + def factory(spec): + return 'renderer' + f = self._makeOne('name', factory) + info = DummyRendererInfo({'name':'spec'}) + self.assertEqual(f(info), 'renderer') + + def test_call_miss(self): + f = self._makeOne('name', None) + info = DummyRendererInfo({'name':'spec'}) + self.assertRaises(KeyError, f, info) + +class TestMockTemplate(unittest.TestCase): + def _makeOne(self, response): + from pyramid.testing import MockTemplate + return MockTemplate(response) + + def test_getattr(self): + template = self._makeOne(None) + self.assertEqual(template.foo, template) + + def test_getitem(self): + template = self._makeOne(None) + self.assertEqual(template['foo'], template) + + def test_call(self): + template = self._makeOne('123') + self.assertEqual(template(), '123') + +class Test_skip_on(unittest.TestCase): + def setUp(self): + from pyramid.testing import skip_on + self.os_name = skip_on.os_name + skip_on.os_name = 'wrong' + + def tearDown(self): + from pyramid.testing import skip_on + skip_on.os_name = self.os_name + + def _callFUT(self, *platforms): + from pyramid.testing import skip_on + return skip_on(*platforms) + + def test_wrong_platform(self): + def foo(): return True + decorated = self._callFUT('wrong')(foo) + self.assertEqual(decorated(), None) + + def test_ok_platform(self): + def foo(): return True + decorated = self._callFUT('ok')(foo) + self.assertEqual(decorated(), True) + +class TestDummySession(unittest.TestCase): + def _makeOne(self): + from pyramid.testing import DummySession + return DummySession() + + @testing.skip_on('pypy') # see https://github.com/Pylons/pyramid/issues/3237 + def test_instance_conforms(self): + from zope.interface.verify import verifyObject + from pyramid.interfaces import ISession + session = self._makeOne() + verifyObject(ISession, session) + + def test_changed(self): + session = self._makeOne() + self.assertEqual(session.changed(), None) + + def test_invalidate(self): + session = self._makeOne() + session['a'] = 1 + self.assertEqual(session.invalidate(), None) + self.assertFalse('a' in session) + + def test_flash_default(self): + session = self._makeOne() + session.flash('msg1') + session.flash('msg2') + self.assertEqual(session['_f_'], ['msg1', 'msg2']) + + def test_flash_mixed(self): + session = self._makeOne() + session.flash('warn1', 'warn') + session.flash('warn2', 'warn') + session.flash('err1', 'error') + session.flash('err2', 'error') + self.assertEqual(session['_f_warn'], ['warn1', 'warn2']) + + def test_pop_flash_default_queue(self): + session = self._makeOne() + queue = ['one', 'two'] + session['_f_'] = queue + result = session.pop_flash() + self.assertEqual(result, queue) + self.assertEqual(session.get('_f_'), None) + + def test_pop_flash_nodefault_queue(self): + session = self._makeOne() + queue = ['one', 'two'] + session['_f_error'] = queue + result = session.pop_flash('error') + self.assertEqual(result, queue) + self.assertEqual(session.get('_f_error'), None) + + def test_peek_flash_default_queue(self): + session = self._makeOne() + queue = ['one', 'two'] + session['_f_'] = queue + result = session.peek_flash() + self.assertEqual(result, queue) + self.assertEqual(session.get('_f_'), queue) + + def test_peek_flash_nodefault_queue(self): + session = self._makeOne() + queue = ['one', 'two'] + session['_f_error'] = queue + result = session.peek_flash('error') + self.assertEqual(result, queue) + self.assertEqual(session.get('_f_error'), queue) + + def test_new_csrf_token(self): + session = self._makeOne() + token = session.new_csrf_token() + self.assertEqual(token, session['_csrft_']) + + def test_get_csrf_token(self): + session = self._makeOne() + session['_csrft_'] = 'token' + token = session.get_csrf_token() + self.assertEqual(token, 'token') + self.assertTrue('_csrft_' in session) + + def test_get_csrf_token_generates_token(self): + session = self._makeOne() + token = session.get_csrf_token() + self.assertNotEqual(token, None) + self.assertTrue(len(token) >= 1) + +from zope.interface import Interface +from zope.interface import implementer + +class IDummy(Interface): + pass + +@implementer(IDummy) +class DummyEvent: + pass + +class DummyFactory: + def __init__(self, environ): + """ """ + +class DummyRegistry(object): + inited = 0 + __name__ = 'name' + def __init__(self, name=''): + self.inited = self.inited + 1 + +class DummyRendererInfo(object): + def __init__(self, kw): + self.__dict__.update(kw) + +class Test_testConfig(unittest.TestCase): + + def _setUp(self, **kw): + self._log.append(('setUp', kw)) + return 'fake config' + + def _tearDown(self, **kw): + self._log.append(('tearDown', kw)) + + def setUp(self): + from pyramid import testing + self._log = [] + self._orig_setUp = testing.setUp + testing.setUp = self._setUp + self._orig_tearDown = testing.tearDown + testing.tearDown = self._tearDown + + def tearDown(self): + from pyramid import testing + testing.setUp = self._orig_setUp + testing.tearDown = self._orig_tearDown + + def _callFUT(self, inner, **kw): + from pyramid.testing import testConfig + with testConfig(**kw) as config: + inner(config) + + def test_ok_calls(self): + self.assertEqual(self._log, []) + def inner(config): + self.assertEqual(self._log, + [('setUp', + {'autocommit': True, + 'hook_zca': True, + 'registry': None, + 'request': None, + 'settings': None})]) + self._log.pop() + self._callFUT(inner) + self.assertEqual(self._log, + [('tearDown', {'unhook_zca': True})]) + + def test_teardown_called_on_exception(self): + class TestException(Exception): + pass + def inner(config): + self._log = [] + raise TestException('oops') + self.assertRaises(TestException, self._callFUT, inner) + self.assertEqual(self._log[0][0], 'tearDown') + + def test_ok_get_config(self): + def inner(config): + self.assertEqual(config, 'fake config') + self._callFUT(inner) |
