#!/usr/bin/env python # -*- coding: utf-8 -*- """ Unit tests for gluon.globals """ import re import unittest from gluon.globals import Request, Response, Session from gluon.rewrite import regex_url_in from gluon import URL from gluon._compat import basestring def setup_clean_session(): request = Request(env={}) request.application = 'a' request.controller = 'c' request.function = 'f' request.folder = 'applications/admin' response = Response() session = Session() session.connect(request, response) from gluon.globals import current current.request = request current.response = response current.session = session return current class testRequest(unittest.TestCase): def setUp(self): from gluon.globals import current current.response = Response() def test_restful_simple(self): env = {'request_method': 'GET', 'PATH_INFO': '/welcome/default/index/1.pdf'} r = Request(env) regex_url_in(r, env) @r.restful() def simple_rest(): def GET(*args, **vars): return args[0] return locals() self.assertEqual(simple_rest(), '1') def test_restful_calls_post(self): env = {'request_method': 'POST', 'PATH_INFO': '/welcome/default/index'} r = Request(env) regex_url_in(r, env) @r.restful() def post_rest(): def POST(*args, **vars): return 'I posted' return locals() self.assertEqual(post_rest(), 'I posted') def test_restful_ignore_extension(self): env = {'request_method': 'GET', 'PATH_INFO': '/welcome/default/index/127.0.0.1'} r = Request(env) regex_url_in(r, env) @r.restful(ignore_extension=True) def ignore_rest(): def GET(*args, **vars): return args[0] return locals() self.assertEqual(ignore_rest(), '127.0.0.1') class testResponse(unittest.TestCase): # port from python 2.7, needed for 2.5 and 2.6 tests def assertRegexpMatches(self, text, expected_regexp, msg=None): """Fail the test unless the text matches the regular expression.""" if isinstance(expected_regexp, basestring): expected_regexp = re.compile(expected_regexp) if not expected_regexp.search(text): msg = msg or "Regexp didn't match" msg = '%s: %r not found in %r' % ( msg, expected_regexp.pattern, text) raise self.failureException(msg) def test_include_files(self): def return_includes(response, extensions=None): response.include_files(extensions) return response.body.getvalue() response = Response() response.files.append(URL('a', 'static', 'css/file.css')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(URL('a', 'static', 'css/file.js')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(URL('a', 'static', 'css/file.coffee')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(URL('a', 'static', 'css/file.ts')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(URL('a', 'static', 'css/file.less')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(('css:inline', 'background-color; white;')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(('js:inline', 'alert("hello")')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append('https://code.jquery.com/jquery-1.11.3.min.js') content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append('https://code.jquery.com/jquery-1.11.3.min.js?var=0') content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append('https://code.jquery.com/jquery-1.11.3.min.js?var=0') response.files.append('https://code.jquery.com/jquery-1.11.3.min.js?var=0') response.files.append(URL('a', 'static', 'css/file.css')) response.files.append(URL('a', 'static', 'css/file.css')) content = return_includes(response) self.assertEqual(content, '' + '') response = Response() response.files.append(('js', 'http://maps.google.com/maps/api/js?sensor=false')) response.files.append('https://code.jquery.com/jquery-1.11.3.min.js?var=0') response.files.append(URL('a', 'static', 'css/file.css')) response.files.append(URL('a', 'static', 'css/file.ts')) content = return_includes(response) self.assertEqual(content, '' + '' + '' + '' ) response = Response() response.files.append(URL('a', 'static', 'css/file.js')) response.files.append(URL('a', 'static', 'css/file.css')) content = return_includes(response, extensions=['css']) self.assertEqual(content, '') # regr test for #628 response = Response() response.files.append('http://maps.google.com/maps/api/js?sensor=false') content = return_includes(response) self.assertEqual(content, '') # regr test for #628 response = Response() response.files.append(('js', 'http://maps.google.com/maps/api/js?sensor=false')) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(['js', 'http://maps.google.com/maps/api/js?sensor=false']) content = return_includes(response) self.assertEqual(content, '') response = Response() response.files.append(('js1', 'http://maps.google.com/maps/api/js?sensor=false')) content = return_includes(response) self.assertEqual(content, '') def test_cookies(self): current = setup_clean_session() cookie = str(current.response.cookies) session_key = '%s=%s' % (current.response.session_id_name, current.response.session_id) self.assertRegexpMatches(cookie, r'^Set-Cookie: ') self.assertTrue(session_key in cookie) self.assertTrue('Path=/' in cookie) def test_cookies_secure(self): current = setup_clean_session() current.session._fixup_before_save() cookie = str(current.response.cookies) self.assertTrue('secure' not in cookie.lower()) current = setup_clean_session() current.session.secure() current.session._fixup_before_save() cookie = str(current.response.cookies) self.assertTrue('secure' in cookie.lower()) def test_cookies_httponly(self): current = setup_clean_session() current.session._fixup_before_save() cookie = str(current.response.cookies) # cookies in PY3 have capital letters self.assertTrue('httponly' in cookie.lower()) current = setup_clean_session() current.session.httponly_cookies = True current.session._fixup_before_save() cookie = str(current.response.cookies) self.assertTrue('httponly' in cookie.lower()) current = setup_clean_session() current.session.httponly_cookies = False current.session._fixup_before_save() cookie = str(current.response.cookies) self.assertTrue('httponly' not in cookie.lower()) def test_include_meta(self): response = Response() response.meta[u'web2py'] = 'web2py' response.include_meta() self.assertEqual(response.body.getvalue(), '\n\n') response = Response() response.meta[u'meta_dict'] = {u'tag_name':'tag_value'} response.include_meta() self.assertEqual(response.body.getvalue(), '\n\n')