sync with master branch
This commit is contained in:
@@ -13,6 +13,7 @@ from .test_contribs import *
|
||||
from .test_routes import *
|
||||
from .test_router import *
|
||||
from .test_validators import *
|
||||
from .test_authapi import *
|
||||
from .test_tools import *
|
||||
from .test_utils import *
|
||||
from .test_serializers import *
|
||||
@@ -22,7 +23,8 @@ from .test_appadmin import *
|
||||
from .test_web import *
|
||||
from .test_sqlhtml import *
|
||||
from .test_scheduler import *
|
||||
from .test_cron import *
|
||||
from .test_is_url import *
|
||||
|
||||
if sys.version[:3] == '2.7':
|
||||
from .test_is_url import *
|
||||
from .test_old_doctests import *
|
||||
|
||||
@@ -17,6 +17,7 @@ from gluon import fileutils
|
||||
from gluon.dal import DAL, Field, Table
|
||||
from gluon.http import HTTP
|
||||
from gluon.fileutils import open_file
|
||||
from gluon.cache import CacheInRam
|
||||
|
||||
DEFAULT_URI = os.getenv('DB', 'sqlite:memory')
|
||||
|
||||
@@ -104,6 +105,21 @@ class TestAppAdmin(unittest.TestCase):
|
||||
self._test_index()
|
||||
remove_compiled_application(appname_path)
|
||||
|
||||
def test_index_minify(self):
|
||||
# test for gluon/contrib/minify
|
||||
self.env['response'].optimize_css = 'concat|minify'
|
||||
self.env['response'].optimize_js = 'concat|minify'
|
||||
self.env['current'].cache = Storage({'ram':CacheInRam()})
|
||||
appname_path = os.path.join(os.getcwd(), 'applications', 'welcome')
|
||||
self._test_index()
|
||||
file_l = os.listdir(os.path.join(appname_path, 'static', 'temp'))
|
||||
file_l.sort()
|
||||
self.assertTrue(len(file_l) == 2)
|
||||
self.assertEqual(file_l[0][0:10], 'compressed')
|
||||
self.assertEqual(file_l[1][0:10], 'compressed')
|
||||
self.assertEqual(file_l[0][-3:], 'css')
|
||||
self.assertEqual(file_l[1][-2:], 'js')
|
||||
|
||||
def test_select(self):
|
||||
request = self.env['request']
|
||||
request.args = List(['db'])
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
""" Unit tests for authapi """
|
||||
import os
|
||||
import unittest
|
||||
from gluon.globals import Request, Response, Session
|
||||
from gluon.languages import translator
|
||||
from gluon.dal import DAL, Field
|
||||
from gluon.authapi import AuthAPI
|
||||
from gluon.storage import Storage
|
||||
from gluon._compat import to_bytes, to_native, add_charset
|
||||
|
||||
DEFAULT_URI = os.getenv('DB', 'sqlite:memory')
|
||||
|
||||
|
||||
class TestAuthAPI(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.request = Request(env={})
|
||||
self.request.application = 'a'
|
||||
self.request.controller = 'c'
|
||||
self.request.function = 'f'
|
||||
self.request.folder = 'applications/admin'
|
||||
self.response = Response()
|
||||
self.session = Session()
|
||||
T = translator('', 'en')
|
||||
self.session.connect(self.request, self.response)
|
||||
from gluon.globals import current
|
||||
self.current = current
|
||||
self.current.request = self.request
|
||||
self.current.response = self.response
|
||||
self.current.session = self.session
|
||||
self.current.T = T
|
||||
self.db = DAL(DEFAULT_URI, check_reserved=['all'])
|
||||
self.auth = AuthAPI(self.db)
|
||||
self.auth.define_tables(username=True, signature=False)
|
||||
# Create a user
|
||||
self.auth.table_user().validate_and_insert(first_name='Bart',
|
||||
last_name='Simpson',
|
||||
username='bart',
|
||||
email='bart@simpson.com',
|
||||
password='bart_password',
|
||||
registration_key='',
|
||||
registration_id=''
|
||||
)
|
||||
self.db.commit()
|
||||
|
||||
def test_login(self):
|
||||
result = self.auth.login(**{'username': 'bart', 'password': 'bart_password'})
|
||||
self.assertTrue(self.auth.is_logged_in())
|
||||
self.assertTrue(result['user']['email'] == 'bart@simpson.com')
|
||||
self.auth.logout()
|
||||
self.assertFalse(self.auth.is_logged_in())
|
||||
self.auth.settings.username_case_sensitive = False
|
||||
result = self.auth.login(**{'username': 'BarT', 'password': 'bart_password'})
|
||||
self.assertTrue(self.auth.is_logged_in())
|
||||
|
||||
def test_logout(self):
|
||||
self.auth.login(**{'username': 'bart', 'password': 'bart_password'})
|
||||
self.assertTrue(self.auth.is_logged_in())
|
||||
result = self.auth.logout()
|
||||
self.assertTrue(not self.auth.is_logged_in())
|
||||
self.assertTrue(result['user'] is None)
|
||||
|
||||
def test_register(self):
|
||||
self.auth.settings.login_after_registration = True
|
||||
result = self.auth.register(**{
|
||||
'username': 'lisa',
|
||||
'first_name': 'Lisa',
|
||||
'last_name': 'Simpson',
|
||||
'email': 'lisa@simpson.com',
|
||||
'password': 'lisa_password'
|
||||
})
|
||||
self.assertTrue(result['user']['email'] == 'lisa@simpson.com')
|
||||
self.assertTrue(self.auth.is_logged_in())
|
||||
with self.assertRaises(AssertionError): # Can't register if you're logged in
|
||||
result = self.auth.register(**{
|
||||
'username': 'lisa',
|
||||
'first_name': 'Lisa',
|
||||
'last_name': 'Simpson',
|
||||
'email': 'lisa@simpson.com',
|
||||
'password': 'lisa_password'
|
||||
})
|
||||
self.auth.logout()
|
||||
self.auth.settings.login_after_registration = False
|
||||
result = self.auth.register(**{
|
||||
'username': 'barney',
|
||||
'first_name': 'Barney',
|
||||
'last_name': 'Gumble',
|
||||
'email': 'barney@simpson.com',
|
||||
'password': 'barney_password'
|
||||
})
|
||||
self.assertTrue(result['user']['email'] == 'barney@simpson.com')
|
||||
self.assertFalse(self.auth.is_logged_in())
|
||||
self.auth.settings.login_userfield = 'email'
|
||||
result = self.auth.register(**{
|
||||
'username': 'lisa',
|
||||
'first_name': 'Lisa',
|
||||
'last_name': 'Simpson',
|
||||
'email': 'lisa@simpson.com',
|
||||
'password': 'lisa_password'
|
||||
})
|
||||
self.assertTrue(result['errors']['email'] == self.auth.messages.email_taken)
|
||||
self.assertTrue(result['user'] is None)
|
||||
self.auth.settings.registration_requires_verification = True
|
||||
result = self.auth.register(**{
|
||||
'username': 'homer',
|
||||
'first_name': 'Homer',
|
||||
'last_name': 'Simpson',
|
||||
'email': 'homer@simpson.com',
|
||||
'password': 'homer_password'
|
||||
})
|
||||
self.assertTrue('key' in result['user'])
|
||||
|
||||
def test_profile(self):
|
||||
with self.assertRaises(AssertionError):
|
||||
# We are not logged in
|
||||
self.auth.profile()
|
||||
self.auth.login(**{'username': 'bart', 'password': 'bart_password'})
|
||||
self.assertTrue(self.auth.is_logged_in())
|
||||
result = self.auth.profile(email='bartolo@simpson.com')
|
||||
self.assertTrue(result['user']['email'] == 'bartolo@simpson.com')
|
||||
self.assertTrue(self.auth.table_user()[result['user']['id']].email == 'bartolo@simpson.com')
|
||||
|
||||
def test_change_password(self):
|
||||
with self.assertRaises(AssertionError):
|
||||
# We are not logged in
|
||||
self.auth.change_password()
|
||||
self.auth.login(**{'username': 'bart', 'password': 'bart_password'})
|
||||
self.assertTrue(self.auth.is_logged_in())
|
||||
self.auth.change_password(old_password='bart_password', new_password='1234', new_password2='1234')
|
||||
self.auth.logout()
|
||||
self.assertTrue(not self.auth.is_logged_in())
|
||||
self.auth.login(username='bart', password='1234')
|
||||
self.assertTrue(self.auth.is_logged_in())
|
||||
result = self.auth.change_password(old_password='bart_password', new_password='1234', new_password2='5678')
|
||||
self.assertTrue('new_password2' in result['errors'])
|
||||
result = self.auth.change_password(old_password='bart_password', new_password='1234', new_password2='1234')
|
||||
self.assertTrue('old_password' in result['errors'])
|
||||
|
||||
def test_verify_key(self):
|
||||
self.auth.settings.registration_requires_verification = True
|
||||
result = self.auth.register(**{
|
||||
'username': 'homer',
|
||||
'first_name': 'Homer',
|
||||
'last_name': 'Simpson',
|
||||
'email': 'homer@simpson.com',
|
||||
'password': 'homer_password'
|
||||
})
|
||||
self.assertTrue('key' in result['user'])
|
||||
homer_id = result['user']['id']
|
||||
homers_key = result['user']['key']
|
||||
result = self.auth.verify_key(key=None)
|
||||
self.assertTrue(result['errors'] is not None)
|
||||
result = self.auth.verify_key(key='12345')
|
||||
self.assertTrue(result['errors'] is not None)
|
||||
result = self.auth.verify_key(key=homers_key)
|
||||
self.assertTrue(result['errors'] is None)
|
||||
self.assertEqual(self.auth.table_user()[homer_id].registration_key, '')
|
||||
self.auth.settings.registration_requires_approval = True
|
||||
result = self.auth.register(**{
|
||||
'username': 'lisa',
|
||||
'first_name': 'Lisa',
|
||||
'last_name': 'Simpson',
|
||||
'email': 'lisa@simpson.com',
|
||||
'password': 'lisa_password'
|
||||
})
|
||||
lisa_id = result['user']['id']
|
||||
result = self.auth.verify_key(key=result['user']['key'])
|
||||
self.assertEqual(self.auth.table_user()[lisa_id].registration_key, 'pending')
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
""" Unit tests for cron """
|
||||
import unittest, os
|
||||
from gluon.newcron import Token, crondance
|
||||
|
||||
class TestCron(unittest.TestCase):
|
||||
|
||||
|
||||
def test_Token(self):
|
||||
appname_path = os.path.join(os.getcwd(), 'applications', 'welcome')
|
||||
t = Token(path=appname_path)
|
||||
self.assertNotEqual(t.acquire(), None)
|
||||
self.assertFalse(t.release())
|
||||
self.assertEqual(t.acquire(), None)
|
||||
self.assertTrue(t.release())
|
||||
return
|
||||
|
||||
def test_crondance(self):
|
||||
#TODO update crondance to return something
|
||||
crondance(os.getcwd())
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import unittest
|
||||
import datetime
|
||||
|
||||
from gluon.fileutils import parse_version
|
||||
from gluon.fileutils import parse_version, fix_newlines
|
||||
|
||||
|
||||
class TestFileUtils(unittest.TestCase):
|
||||
@@ -22,3 +23,6 @@ class TestFileUtils(unittest.TestCase):
|
||||
# Semantic Beta
|
||||
rtn = parse_version('Version 2.14.1-beta+timestamp.2016.03.21.22.35.26')
|
||||
self.assertEqual(rtn, (2, 14, 1, 'beta', datetime.datetime(2016, 3, 21, 22, 35, 26)))
|
||||
|
||||
def test_fix_newlines(self):
|
||||
fix_newlines(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
+72
-24
@@ -10,27 +10,76 @@ 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)
|
||||
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.request = request
|
||||
current.response = response
|
||||
current.session = session
|
||||
return 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
|
||||
# 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):
|
||||
@@ -99,8 +148,8 @@ class testResponse(unittest.TestCase):
|
||||
response.files.append(URL('a', 'static', 'css/file.css'))
|
||||
content = return_includes(response)
|
||||
self.assertEqual(content,
|
||||
'<script src="https://code.jquery.com/jquery-1.11.3.min.js?var=0" type="text/javascript"></script>' +
|
||||
'<link href="/a/static/css/file.css" rel="stylesheet" type="text/css" />')
|
||||
'<script src="https://code.jquery.com/jquery-1.11.3.min.js?var=0" type="text/javascript"></script>' +
|
||||
'<link href="/a/static/css/file.css" rel="stylesheet" type="text/css" />')
|
||||
|
||||
response = Response()
|
||||
response.files.append(('js', 'http://maps.google.com/maps/api/js?sensor=false'))
|
||||
@@ -109,12 +158,11 @@ class testResponse(unittest.TestCase):
|
||||
response.files.append(URL('a', 'static', 'css/file.ts'))
|
||||
content = return_includes(response)
|
||||
self.assertEqual(content,
|
||||
'<script src="https://code.jquery.com/jquery-1.11.3.min.js?var=0" type="text/javascript"></script>' +
|
||||
'<link href="/a/static/css/file.css" rel="stylesheet" type="text/css" />' +
|
||||
'<script src="/a/static/css/file.ts" type="text/typescript"></script>' +
|
||||
'<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>'
|
||||
)
|
||||
|
||||
'<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>' +
|
||||
'<script src="https://code.jquery.com/jquery-1.11.3.min.js?var=0" type="text/javascript"></script>' +
|
||||
'<link href="/a/static/css/file.css" rel="stylesheet" type="text/css" />' +
|
||||
'<script src="/a/static/css/file.ts" type="text/typescript"></script>'
|
||||
)
|
||||
|
||||
response = Response()
|
||||
response.files.append(URL('a', 'static', 'css/file.js'))
|
||||
@@ -122,13 +170,13 @@ class testResponse(unittest.TestCase):
|
||||
content = return_includes(response, extensions=['css'])
|
||||
self.assertEqual(content, '<link href="/a/static/css/file.css" rel="stylesheet" type="text/css" />')
|
||||
|
||||
#regr test for #628
|
||||
# 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
|
||||
# regr test for #628
|
||||
response = Response()
|
||||
response.files.append(('js', 'http://maps.google.com/maps/api/js?sensor=false'))
|
||||
content = return_includes(response)
|
||||
@@ -147,7 +195,7 @@ class testResponse(unittest.TestCase):
|
||||
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)
|
||||
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)
|
||||
|
||||
+50
-13
@@ -11,11 +11,13 @@ import unittest
|
||||
from gluon.html import A, ASSIGNJS, B, BEAUTIFY, P, BODY, BR, BUTTON, CAT, CENTER, CODE, COL, COLGROUP, DIV, SPAN, URL, verifyURL
|
||||
from gluon.html import truncate_string, EM, FIELDSET, FORM, H1, H2, H3, H4, H5, H6, HEAD, HR, HTML, I, IFRAME, IMG, INPUT, EMBED
|
||||
from gluon.html import LABEL, LEGEND, LI, LINK, MARKMIN, MENU, META, OBJECT, OL, OPTGROUP, OPTION, PRE, SCRIPT, SELECT, STRONG
|
||||
from gluon.html import STYLE, TABLE, TR, TD, TAG, TBODY, THEAD, TEXTAREA, TFOOT, TH, TITLE, TT, UL, XHTML, XML
|
||||
from gluon.html import STYLE, TABLE, TR, TD, TAG, TBODY, THEAD, TEXTAREA, TFOOT, TH, TITLE, TT, UL, XHTML, XML, web2pyHTMLParser
|
||||
from gluon.storage import Storage
|
||||
from gluon.html import XML_pickle, XML_unpickle
|
||||
from gluon.html import TAG_pickler, TAG_unpickler
|
||||
from gluon._compat import xrange, PY2, to_native
|
||||
from gluon.decoder import decoder
|
||||
import re
|
||||
|
||||
class TestBareHelpers(unittest.TestCase):
|
||||
|
||||
@@ -155,7 +157,7 @@ class TestBareHelpers(unittest.TestCase):
|
||||
self.assertEqual(rtn, True)
|
||||
|
||||
# TODO: def test_XmlComponent(self):
|
||||
@unittest.skipIf(not PY2, "Skipping Python 3.x tests for XML.__repr__")
|
||||
|
||||
def test_XML(self):
|
||||
# sanitization process
|
||||
self.assertEqual(XML('<h1>Hello<a data-hello="world">World</a></h1>').xml(),
|
||||
@@ -168,6 +170,8 @@ class TestBareHelpers(unittest.TestCase):
|
||||
# seams that __repr__ is no longer enough
|
||||
##self.assertEqual(XML('1.3'), '1.3')
|
||||
self.assertEqual(XML(u'<div>è</div>').xml(), b'<div>\xc3\xa8</div>')
|
||||
# make sure unicode works with sanitize
|
||||
self.assertEqual(XML(u'<div>è</div>', sanitize=True).xml(), b'<div>\xc3\xa8</div>')
|
||||
# you can calc len on the class, that equals the xml() and the str()
|
||||
##self.assertEqual(len(XML('1.3')), len('1.3'))
|
||||
self.assertEqual(len(XML('1.3').xml()), len('1.3'))
|
||||
@@ -179,19 +183,18 @@ class TestBareHelpers(unittest.TestCase):
|
||||
# you can compare them
|
||||
##self.assertEqual(XML('a') == XML('a'), True)
|
||||
# beware that the comparison is made on the XML repr
|
||||
self.assertEqual(XML('<h1>Hello<a data-hello="world">World</a></h1>', sanitize=True),
|
||||
XML('<h1>HelloWorld</h1>'))
|
||||
|
||||
self.assertEqual(XML('<h1>Hello<a data-hello="world">World</a></h1>', sanitize=True).__repr__(),
|
||||
XML('<h1>HelloWorld</h1>').__repr__())
|
||||
# bug check for the sanitizer for closing no-close tags
|
||||
self.assertEqual(XML('<p>Test</p><br/><p>Test</p><br/>', sanitize=True),
|
||||
XML('<p>Test</p><br /><p>Test</p><br />'))
|
||||
self.assertEqual(XML('<p>Test</p><br/><p>Test</p><br/>', sanitize=True).xml(),
|
||||
XML('<p>Test</p><br /><p>Test</p><br />').xml())
|
||||
# basic flatten test
|
||||
self.assertEqual(XML('<p>Test</p>').flatten(), '<p>Test</p>')
|
||||
self.assertEqual(XML('<p>Test</p>').flatten(render=lambda text, tag, attr: text), '<p>Test</p>')
|
||||
|
||||
@unittest.skipIf(not PY2, "Skipping Python 3.x tests for XML_unpickle.__repr__")
|
||||
def test_XML_pickle_unpickle(self):
|
||||
# weird test
|
||||
self.assertEqual(XML_unpickle(XML_pickle('data to be pickle')[1][0]), 'data to be pickle')
|
||||
self.assertEqual(str(XML_unpickle(XML_pickle('data to be pickle')[1][0])), 'data to be pickle')
|
||||
|
||||
def test_DIV(self):
|
||||
# Empty DIV()
|
||||
@@ -255,6 +258,11 @@ class TestBareHelpers(unittest.TestCase):
|
||||
self.assertEqual(DIV('<p>Test</p>', _class="class_test").get('_class'), 'class_test')
|
||||
self.assertEqual(DIV(b'a').xml(), b'<div>a</div>')
|
||||
|
||||
def test_decoder(self):
|
||||
tag_html = '<div><span><a id="1-1" u:v="$">hello</a></span><p class="this is a test">world</p></div>'
|
||||
a = decoder(tag_html)
|
||||
self.assertEqual(a, tag_html)
|
||||
|
||||
def test_CAT(self):
|
||||
# Empty CAT()
|
||||
self.assertEqual(CAT().xml(), b'')
|
||||
@@ -636,8 +644,8 @@ class TestBareHelpers(unittest.TestCase):
|
||||
# These 2 crash AppVeyor and Travis with: "ImportError: No YAML serializer available"
|
||||
# self.assertEqual(FORM('<>', _a='1', _b='2').as_yaml(),
|
||||
# "accepted: null\nattributes: {_a: '1', _action: '#', _b: '2', _enctype: multipart/form-data, _method: post}\ncomponents: [<>]\nerrors: {}\nlatest: {}\nparent: null\nvars: {}\n")
|
||||
# self.assertEqual(FORM('<>', _a='1', _b='2').as_xml(),
|
||||
# '<?xml version="1.0" encoding="UTF-8"?><document><errors></errors><vars></vars><parent>None</parent><attributes><_enctype>multipart/form-data</_enctype><_action>#</_action><_b>2</_b><_a>1</_a><_method>post</_method></attributes><components><item>&lt;&gt;</item></components><accepted>None</accepted><latest></latest></document>')
|
||||
# TODO check tags content
|
||||
self.assertEqual(len(FORM('<>', _a='1', _b='2').as_xml()), 334)
|
||||
|
||||
def test_BEAUTIFY(self):
|
||||
#self.assertEqual(BEAUTIFY(['a', 'b', {'hello': 'world'}]).xml(),
|
||||
@@ -670,13 +678,42 @@ class TestBareHelpers(unittest.TestCase):
|
||||
|
||||
# TODO: def test_embed64(self):
|
||||
|
||||
# TODO: def test_web2pyHTMLParser(self):
|
||||
def test_web2pyHTMLParser(self):
|
||||
#tag should not be a byte
|
||||
self.assertEqual(web2pyHTMLParser("<div></div>").tree.components[0].tag, 'div')
|
||||
a = str(web2pyHTMLParser('<div>a<span>b</div>c').tree)
|
||||
self.assertEqual(a, "<div>a<span>b</span></div>c")
|
||||
|
||||
tree = web2pyHTMLParser('hello<div a="b">world</div>').tree
|
||||
tree.element(_a='b')['_c']=5
|
||||
self.assertEqual(str(tree), 'hello<div a="b" c="5">world</div>')
|
||||
|
||||
a = str(web2pyHTMLParser('<div><img class="img"/></div>', closed=['img']).tree)
|
||||
self.assertEqual(a, '<div><img class="img" /></div>')
|
||||
|
||||
#greater-than sign ( > ) --> decimal > --> hexadecimal >
|
||||
#Less-than sign ( < ) --> decimal < --> hexadecimal <
|
||||
# test decimal
|
||||
a = str(web2pyHTMLParser('<div>< ></div>').tree)
|
||||
self.assertEqual(a, '<div>< ></div>')
|
||||
# test hexadecimal
|
||||
a = str(web2pyHTMLParser('<div>< ></div>').tree)
|
||||
self.assertEqual(a, '<div>< ></div>')
|
||||
|
||||
def test_markdown(self):
|
||||
def markdown(text, tag=None, attributes={}):
|
||||
r = {None: re.sub('\s+',' ',text), \
|
||||
'h1':'#'+text+'\\n\\n', \
|
||||
'p':text+'\\n'}.get(tag,text)
|
||||
return r
|
||||
a=TAG('<h1>Header</h1><p>this is a test</p>')
|
||||
ret = a.flatten(markdown)
|
||||
self.assertEqual(ret, '#Header\\n\\nthis is a test\\n')
|
||||
|
||||
# TODO: def test_markdown_serializer(self):
|
||||
|
||||
# TODO: def test_markmin_serializer(self):
|
||||
|
||||
@unittest.skipIf(not PY2, "Skipping Python 3.x tests for MARKMIN")
|
||||
def test_MARKMIN(self):
|
||||
# This test pass with python 2.7 but expected to fail under 2.6
|
||||
# with self.assertRaises(TypeError) as cm:
|
||||
|
||||
+39
-39
@@ -586,81 +586,81 @@ class TestUnicode(unittest.TestCase):
|
||||
# disables prepending the scheme in the return value
|
||||
|
||||
def testUnicodeToAsciiUrl(self):
|
||||
self.assertEquals(unicode_to_ascii_authority(u'www.Alliancefran\xe7aise.nu'), 'www.xn--alliancefranaise-npb.nu')
|
||||
self.assertEquals(
|
||||
self.assertEqual(unicode_to_ascii_authority(u'www.Alliancefran\xe7aise.nu'), 'www.xn--alliancefranaise-npb.nu')
|
||||
self.assertEqual(
|
||||
unicode_to_ascii_authority(u'www.benn.ca'), 'www.benn.ca')
|
||||
self.assertRaises(UnicodeError, unicode_to_ascii_authority,
|
||||
u'\u4e2d' * 1000) # label is too long
|
||||
|
||||
def testValidUrls(self):
|
||||
self.assertEquals(self.x(u'www.Alliancefrancaise.nu'), (
|
||||
self.assertEqual(self.x(u'www.Alliancefrancaise.nu'), (
|
||||
'http://www.Alliancefrancaise.nu', None))
|
||||
self.assertEquals(self.x(u'www.Alliancefran\xe7aise.nu'), (
|
||||
self.assertEqual(self.x(u'www.Alliancefran\xe7aise.nu'), (
|
||||
'http://www.xn--alliancefranaise-npb.nu', None))
|
||||
self.assertEquals(self.x(u'www.Alliancefran\xe7aise.nu:8080'), (
|
||||
self.assertEqual(self.x(u'www.Alliancefran\xe7aise.nu:8080'), (
|
||||
'http://www.xn--alliancefranaise-npb.nu:8080', None))
|
||||
self.assertEquals(self.x(u'http://www.Alliancefran\xe7aise.nu'),
|
||||
self.assertEqual(self.x(u'http://www.Alliancefran\xe7aise.nu'),
|
||||
('http://www.xn--alliancefranaise-npb.nu', None))
|
||||
self.assertEquals(self.x(u'http://www.Alliancefran\xe7aise.nu/parnaise/blue'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue', None))
|
||||
self.assertEquals(self.x(u'http://www.Alliancefran\xe7aise.nu/parnaise/blue#fragment'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue#fragment', None))
|
||||
self.assertEquals(self.x(u'http://www.Alliancefran\xe7aise.nu/parnaise/blue?query=value#fragment'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue?query=value#fragment', None))
|
||||
self.assertEquals(self.x(u'http://www.Alliancefran\xe7aise.nu:8080/parnaise/blue?query=value#fragment'), ('http://www.xn--alliancefranaise-npb.nu:8080/parnaise/blue?query=value#fragment', None))
|
||||
self.assertEquals(self.x(u'www.Alliancefran\xe7aise.nu/parnaise/blue?query=value#fragment'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue?query=value#fragment', None))
|
||||
self.assertEquals(self.x(
|
||||
self.assertEqual(self.x(u'http://www.Alliancefran\xe7aise.nu/parnaise/blue'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue', None))
|
||||
self.assertEqual(self.x(u'http://www.Alliancefran\xe7aise.nu/parnaise/blue#fragment'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue#fragment', None))
|
||||
self.assertEqual(self.x(u'http://www.Alliancefran\xe7aise.nu/parnaise/blue?query=value#fragment'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue?query=value#fragment', None))
|
||||
self.assertEqual(self.x(u'http://www.Alliancefran\xe7aise.nu:8080/parnaise/blue?query=value#fragment'), ('http://www.xn--alliancefranaise-npb.nu:8080/parnaise/blue?query=value#fragment', None))
|
||||
self.assertEqual(self.x(u'www.Alliancefran\xe7aise.nu/parnaise/blue?query=value#fragment'), ('http://www.xn--alliancefranaise-npb.nu/parnaise/blue?query=value#fragment', None))
|
||||
self.assertEqual(self.x(
|
||||
u'http://\u4e2d\u4fd4.com'), ('http://xn--fiq13b.com', None))
|
||||
self.assertEquals(self.x(u'http://\u4e2d\u4fd4.com/\u4e86'),
|
||||
self.assertEqual(self.x(u'http://\u4e2d\u4fd4.com/\u4e86'),
|
||||
('http://xn--fiq13b.com/%4e%86', None))
|
||||
self.assertEquals(self.x(u'http://\u4e2d\u4fd4.com/\u4e86?query=\u4e86'), ('http://xn--fiq13b.com/%4e%86?query=%4e%86', None))
|
||||
self.assertEquals(self.x(u'http://\u4e2d\u4fd4.com/\u4e86?query=\u4e86#fragment'), ('http://xn--fiq13b.com/%4e%86?query=%4e%86#fragment', None))
|
||||
self.assertEquals(self.x(u'http://\u4e2d\u4fd4.com?query=\u4e86#fragment'), ('http://xn--fiq13b.com?query=%4e%86#fragment', None))
|
||||
self.assertEquals(
|
||||
self.assertEqual(self.x(u'http://\u4e2d\u4fd4.com/\u4e86?query=\u4e86'), ('http://xn--fiq13b.com/%4e%86?query=%4e%86', None))
|
||||
self.assertEqual(self.x(u'http://\u4e2d\u4fd4.com/\u4e86?query=\u4e86#fragment'), ('http://xn--fiq13b.com/%4e%86?query=%4e%86#fragment', None))
|
||||
self.assertEqual(self.x(u'http://\u4e2d\u4fd4.com?query=\u4e86#fragment'), ('http://xn--fiq13b.com?query=%4e%86#fragment', None))
|
||||
self.assertEqual(
|
||||
self.x(u'http://B\xfccher.ch'), ('http://xn--bcher-kva.ch', None))
|
||||
self.assertEquals(self.x(u'http://\xe4\xf6\xfc\xdf.com'), (
|
||||
self.assertEqual(self.x(u'http://\xe4\xf6\xfc\xdf.com'), (
|
||||
'http://xn--ss-uia6e4a.com', None))
|
||||
self.assertEquals(self.x(
|
||||
self.assertEqual(self.x(
|
||||
u'http://visegr\xe1d.com'), ('http://xn--visegrd-mwa.com', None))
|
||||
self.assertEquals(self.x(u'http://h\xe1zipatika.com'), (
|
||||
self.assertEqual(self.x(u'http://h\xe1zipatika.com'), (
|
||||
'http://xn--hzipatika-01a.com', None))
|
||||
self.assertEquals(self.x(u'http://www.\xe7ukurova.com'), (
|
||||
self.assertEqual(self.x(u'http://www.\xe7ukurova.com'), (
|
||||
'http://www.xn--ukurova-txa.com', None))
|
||||
self.assertEquals(self.x(u'http://nixier\xf6hre.nixieclock-tube.com'), ('http://xn--nixierhre-57a.nixieclock-tube.com', None))
|
||||
self.assertEquals(self.x(u'google.ca.'), ('http://google.ca.', None))
|
||||
self.assertEqual(self.x(u'http://nixier\xf6hre.nixieclock-tube.com'), ('http://xn--nixierhre-57a.nixieclock-tube.com', None))
|
||||
self.assertEqual(self.x(u'google.ca.'), ('http://google.ca.', None))
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
self.y(u'https://google.ca'), ('https://google.ca', None))
|
||||
self.assertEquals(self.y(
|
||||
self.assertEqual(self.y(
|
||||
u'https://\u4e2d\u4fd4.com'), ('https://xn--fiq13b.com', None))
|
||||
|
||||
self.assertEquals(self.z(u'google.ca'), ('google.ca', None))
|
||||
self.assertEqual(self.z(u'google.ca'), ('google.ca', None))
|
||||
|
||||
def testInvalidUrls(self):
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
self.x(u'://ABC.com'), (u'://ABC.com', 'Enter a valid URL'))
|
||||
self.assertEquals(self.x(u'http://\u4e2d\u4fd4.dne'), (
|
||||
self.assertEqual(self.x(u'http://\u4e2d\u4fd4.dne'), (
|
||||
u'http://\u4e2d\u4fd4.dne', 'Enter a valid URL'))
|
||||
self.assertEquals(self.x(u'https://google.dne'), (
|
||||
self.assertEqual(self.x(u'https://google.dne'), (
|
||||
u'https://google.dne', 'Enter a valid URL'))
|
||||
self.assertEquals(self.x(u'https://google..ca'), (
|
||||
self.assertEqual(self.x(u'https://google..ca'), (
|
||||
u'https://google..ca', 'Enter a valid URL'))
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
self.x(u'google..ca'), (u'google..ca', 'Enter a valid URL'))
|
||||
self.assertEquals(self.x(u'http://' + u'\u4e2d' * 1000 + u'.com'), (
|
||||
self.assertEqual(self.x(u'http://' + u'\u4e2d' * 1000 + u'.com'), (
|
||||
u'http://' + u'\u4e2d' * 1000 + u'.com', 'Enter a valid URL'))
|
||||
|
||||
self.assertEquals(self.x(u'http://google.com#fragment_\u4e86'), (
|
||||
self.assertEqual(self.x(u'http://google.com#fragment_\u4e86'), (
|
||||
u'http://google.com#fragment_\u4e86', 'Enter a valid URL'))
|
||||
self.assertEquals(self.x(u'http\u4e86://google.com'), (
|
||||
self.assertEqual(self.x(u'http\u4e86://google.com'), (
|
||||
u'http\u4e86://google.com', 'Enter a valid URL'))
|
||||
self.assertEquals(self.x(u'http\u4e86://google.com#fragment_\u4e86'), (
|
||||
self.assertEqual(self.x(u'http\u4e86://google.com#fragment_\u4e86'), (
|
||||
u'http\u4e86://google.com#fragment_\u4e86', 'Enter a valid URL'))
|
||||
|
||||
self.assertEquals(self.y(u'http://\u4e2d\u4fd4.com/\u4e86'), (
|
||||
self.assertEqual(self.y(u'http://\u4e2d\u4fd4.com/\u4e86'), (
|
||||
u'http://\u4e2d\u4fd4.com/\u4e86', 'Enter a valid URL'))
|
||||
#self.assertEquals(self.y(u'google.ca'), (u'google.ca', 'Enter a valid URL'))
|
||||
#self.assertEqual(self.y(u'google.ca'), (u'google.ca', 'Enter a valid URL'))
|
||||
|
||||
self.assertEquals(self.z(u'invalid.domain..com'), (
|
||||
self.assertEqual(self.z(u'invalid.domain..com'), (
|
||||
u'invalid.domain..com', 'Enter a valid URL'))
|
||||
self.assertEquals(self.z(u'invalid.\u4e2d\u4fd4.blargg'), (
|
||||
self.assertEqual(self.z(u'invalid.\u4e2d\u4fd4.blargg'), (
|
||||
u'invalid.\u4e2d\u4fd4.blargg', 'Enter a valid URL'))
|
||||
|
||||
# ##############################################################################
|
||||
|
||||
@@ -235,6 +235,11 @@ class TestValidators(unittest.TestCase):
|
||||
self.assertEqual(sorted(rtn), [('%d' % george_id, 'george'), ('%d' % costanza_id, 'costanza')])
|
||||
rtn = IS_IN_DB(db, db.person.id, db.person.name, error_message='oops', sort=True).options(zero=True)
|
||||
self.assertEqual(rtn, [('', ''), ('%d' % costanza_id, 'costanza'), ('%d' % george_id, 'george')])
|
||||
# Test None
|
||||
rtn = IS_IN_DB(db, 'person.id', '%(name)s', error_message='oops')(None)
|
||||
self.assertEqual(rtn, (None, 'oops'))
|
||||
rtn = IS_IN_DB(db, 'person.name', '%(name)s', error_message='oops')(None)
|
||||
self.assertEqual(rtn, (None, 'oops'))
|
||||
# Test using the set it made for options
|
||||
vldtr = IS_IN_DB(db, 'person.name', '%(name)s', error_message='oops')
|
||||
vldtr.options()
|
||||
@@ -494,21 +499,23 @@ class TestValidators(unittest.TestCase):
|
||||
rtn = IS_NOT_EMPTY()('x')
|
||||
self.assertEqual(rtn, ('x', None))
|
||||
rtn = IS_NOT_EMPTY()(' x ')
|
||||
self.assertEqual(rtn, ('x', None))
|
||||
self.assertEqual(rtn, (' x ', None))
|
||||
rtn = IS_NOT_EMPTY()(None)
|
||||
self.assertEqual(rtn, (None, 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY()('')
|
||||
self.assertEqual(rtn, ('', 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY()(b'')
|
||||
self.assertEqual(rtn, (b'', 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY()(' ')
|
||||
self.assertEqual(rtn, ('', 'Enter a value'))
|
||||
self.assertEqual(rtn, (' ', 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY()(' \n\t')
|
||||
self.assertEqual(rtn, ('', 'Enter a value'))
|
||||
self.assertEqual(rtn, (' \n\t', 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY()([])
|
||||
self.assertEqual(rtn, ([], 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY(empty_regex='def')('def')
|
||||
self.assertEqual(rtn, ('', 'Enter a value'))
|
||||
self.assertEqual(rtn, ('def', 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY(empty_regex='de[fg]')('deg')
|
||||
self.assertEqual(rtn, ('', 'Enter a value'))
|
||||
self.assertEqual(rtn, ('deg', 'Enter a value'))
|
||||
rtn = IS_NOT_EMPTY(empty_regex='def')('abc')
|
||||
self.assertEqual(rtn, ('abc', None))
|
||||
|
||||
@@ -591,6 +598,11 @@ class TestValidators(unittest.TestCase):
|
||||
rtn = IS_EMAIL(error_message='oops')(42)
|
||||
self.assertEqual(rtn, (42, 'oops'))
|
||||
|
||||
# test for Internationalized Domain Names, see https://docs.python.org/2/library/codecs.html#module-encodings.idna
|
||||
rtn = IS_EMAIL()('web2py@Alliancefrançaise.nu')
|
||||
self.assertEqual(rtn, ('web2py@Alliancefrançaise.nu', None))
|
||||
|
||||
|
||||
def test_IS_LIST_OF_EMAILS(self):
|
||||
emails = ['localguy@localhost', '_Yosemite.Sam@example.com']
|
||||
rtn = IS_LIST_OF_EMAILS()(','.join(emails))
|
||||
@@ -762,15 +774,19 @@ class TestValidators(unittest.TestCase):
|
||||
|
||||
def test_IS_LOWER(self):
|
||||
rtn = IS_LOWER()('ABC')
|
||||
self.assertEqual(rtn, ('abc', None))
|
||||
rtn = IS_LOWER()(b'ABC')
|
||||
self.assertEqual(rtn, (b'abc', None))
|
||||
rtn = IS_LOWER()('Ñ')
|
||||
self.assertEqual(rtn, (b'\xc3\xb1', None))
|
||||
self.assertEqual(rtn, ('ñ', None))
|
||||
|
||||
def test_IS_UPPER(self):
|
||||
rtn = IS_UPPER()('abc')
|
||||
self.assertEqual(rtn, ('ABC', None))
|
||||
rtn = IS_UPPER()(b'abc')
|
||||
self.assertEqual(rtn, (b'ABC', None))
|
||||
rtn = IS_UPPER()('ñ')
|
||||
self.assertEqual(rtn, (b'\xc3\x91', None))
|
||||
self.assertEqual(rtn, ('Ñ', None))
|
||||
|
||||
def test_IS_SLUG(self):
|
||||
rtn = IS_SLUG()('abc123')
|
||||
@@ -840,7 +856,7 @@ class TestValidators(unittest.TestCase):
|
||||
rtn = IS_EMPTY_OR(IS_EMAIL())('abc')
|
||||
self.assertEqual(rtn, ('abc', 'Enter a valid email address'))
|
||||
rtn = IS_EMPTY_OR(IS_EMAIL())(' abc ')
|
||||
self.assertEqual(rtn, ('abc', 'Enter a valid email address'))
|
||||
self.assertEqual(rtn, (' abc ', 'Enter a valid email address'))
|
||||
rtn = IS_EMPTY_OR(IS_IN_SET([('id1', 'first label'), ('id2', 'second label')], zero='zero')).options(zero=False)
|
||||
self.assertEqual(rtn, [('', ''), ('id1', 'first label'), ('id2', 'second label')])
|
||||
rtn = IS_EMPTY_OR(IS_IN_SET([('id1', 'first label'), ('id2', 'second label')], zero='zero')).options()
|
||||
|
||||
@@ -110,7 +110,7 @@ class TestWeb(LiveTest):
|
||||
self.assertTrue('Welcome Homer' in client.text)
|
||||
|
||||
client = WebClient('http://127.0.0.1:8000/admin/default/')
|
||||
client.post('index', data=dict(password='hello'))
|
||||
client.post('index', data=dict(password='testpass'))
|
||||
client.get('site')
|
||||
client.get('design/welcome')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user