From a8703270da51db40e1c2638ff401ab018df3f365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20V=C3=A9zina?= Date: Wed, 30 Mar 2016 16:20:02 -0400 Subject: [PATCH 1/5] PEP8 enhancement --- gluon/tests/test_tools.py | 63 ++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/gluon/tests/test_tools.py b/gluon/tests/test_tools.py index b89d5364..d1c9e527 100644 --- a/gluon/tests/test_tools.py +++ b/gluon/tests/test_tools.py @@ -29,6 +29,7 @@ from gluon.http import HTTP python_version = sys.version[:3] IS_IMAP = "imap" in DEFAULT_URI + @unittest.skipIf(IS_IMAP, "TODO: Imap raises 'Connection refused'") class TestAuth(unittest.TestCase): @@ -102,7 +103,7 @@ class TestMail(unittest.TestCase): users = {} def __init__(self, address, port, **kwargs): - self.address=address + self.address = address self.port = port self.has_quit = False self.tls = False @@ -110,14 +111,14 @@ class TestMail(unittest.TestCase): def login(self, username, password): if username not in self.users or self.users[username] != password: raise smtplib.SMTPAuthenticationError - self.username=username - self.password=password + self.username = username + self.password = password def sendmail(self, sender, to, payload): self.inbox.append(TestMail.Message(sender, to, payload)) def quit(self): - self.has_quit=True + self.has_quit = True def ehlo(self, hostname=None): pass @@ -125,7 +126,6 @@ class TestMail(unittest.TestCase): def starttls(self): self.tls = True - def setUp(self): self.original_SMTP = smtplib.SMTP self.original_SMTP_SSL = smtplib.SMTP_SSL @@ -141,10 +141,10 @@ class TestMail(unittest.TestCase): mail.settings.server = 'smtp.example.com:25' mail.settings.sender = 'you@example.com' self.assertTrue(mail.send(to=['somebody@example.com'], - subject='hello', - # If reply_to is omitted, then mail.settings.sender is used - reply_to='us@example.com', - message='world')) + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) message = TestMail.DummySMTP.inbox.pop() self.assertEqual(message.sender, mail.settings.sender) self.assertEqual(message.to, ['somebody@example.com']) @@ -158,10 +158,10 @@ class TestMail(unittest.TestCase): mail.settings.sender = 'you@example.com' mail.settings.login = 'username:password' self.assertFalse(mail.send(to=['somebody@example.com'], - subject='hello', - # If reply_to is omitted, then mail.settings.sender is used - reply_to='us@example.com', - message='world')) + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) def test_login(self): TestMail.DummySMTP.users['username'] = 'password' @@ -170,10 +170,10 @@ class TestMail(unittest.TestCase): mail.settings.sender = 'you@example.com' mail.settings.login = 'username:password' self.assertTrue(mail.send(to=['somebody@example.com'], - subject='hello', - # If reply_to is omitted, then mail.settings.sender is used - reply_to='us@example.com', - message='world')) + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) del TestMail.DummySMTP.users['username'] TestMail.DummySMTP.inbox.pop() @@ -182,10 +182,10 @@ class TestMail(unittest.TestCase): mail.settings.server = 'smtp.example.com:25' mail.settings.sender = 'you@example.com' self.assertTrue(mail.send(to=['somebody@example.com'], - subject='hello', - # If reply_to is omitted, then mail.settings.sender is used - reply_to='us@example.com', - message='')) + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='')) message = TestMail.DummySMTP.inbox.pop() self.assertTrue('Content-Type: text/html' in message.payload) @@ -195,10 +195,10 @@ class TestMail(unittest.TestCase): mail.settings.sender = 'you@example.com' mail.settings.ssl = True self.assertTrue(mail.send(to=['somebody@example.com'], - subject='hello', - # If reply_to is omitted, then mail.settings.sender is used - reply_to='us@example.com', - message='world')) + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) TestMail.DummySMTP.inbox.pop() def test_tls(self): @@ -207,16 +207,11 @@ class TestMail(unittest.TestCase): mail.settings.sender = 'you@example.com' mail.settings.tls = True self.assertTrue(mail.send(to=['somebody@example.com'], - subject='hello', - # If reply_to is omitted, then mail.settings.sender is used - reply_to='us@example.com', - message='world')) + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) TestMail.DummySMTP.inbox.pop() - - - - - if __name__ == '__main__': unittest.main() From 104d616cb98b515cd34e14dfcd022612bf05f7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20V=C3=A9zina?= Date: Wed, 30 Mar 2016 16:32:37 -0400 Subject: [PATCH 2/5] Reorder test case and make inventory of what missing --- gluon/tests/test_tools.py | 136 +++++++++++++++++++++++--------------- 1 file changed, 84 insertions(+), 52 deletions(-) diff --git a/gluon/tests/test_tools.py b/gluon/tests/test_tools.py index d1c9e527..87e75c9d 100644 --- a/gluon/tests/test_tools.py +++ b/gluon/tests/test_tools.py @@ -30,58 +30,6 @@ python_version = sys.version[:3] IS_IMAP = "imap" in DEFAULT_URI -@unittest.skipIf(IS_IMAP, "TODO: Imap raises 'Connection refused'") -class TestAuth(unittest.TestCase): - - def testRun(self): - # setup - request = Request(env={}) - request.application = 'a' - request.controller = 'c' - request.function = 'f' - request.folder = 'applications/admin' - response = Response() - session = Session() - T = translator('', 'en') - session.connect(request, response) - from gluon.globals import current - current.request = request - current.response = response - current.session = session - current.T = T - db = DAL(DEFAULT_URI, check_reserved=['all']) - auth = Auth(db) - auth.define_tables(username=True, signature=False) - self.assertTrue('auth_user' in db) - self.assertTrue('auth_group' in db) - self.assertTrue('auth_membership' in db) - self.assertTrue('auth_permission' in db) - self.assertTrue('auth_event' in db) - db.define_table('t0', Field('tt'), auth.signature) - auth.enable_record_versioning(db) - self.assertTrue('t0_archive' in db) - for f in ['login', 'register', 'retrieve_password', - 'retrieve_username']: - html_form = getattr(auth, f)().xml() - self.assertTrue('name="_formkey"' in html_form) - - for f in ['logout', 'verify_email', 'reset_password', - 'change_password', 'profile', 'groups']: - self.assertRaisesRegexp(HTTP, "303*", getattr(auth, f)) - - self.assertRaisesRegexp(HTTP, "401*", auth.impersonate) - - try: - for t in ['t0_archive', 't0', 'auth_cas', 'auth_event', - 'auth_membership', 'auth_permission', 'auth_group', - 'auth_user']: - db[t].drop() - except SyntaxError as e: - # GAE doesn't support drop - pass - return - - class TestMail(unittest.TestCase): """ Test the Mail class. @@ -213,5 +161,89 @@ class TestMail(unittest.TestCase): message='world')) TestMail.DummySMTP.inbox.pop() + +# TODO class TestRecaptcha(unittest.TestCase): + + +# TODO class TestRecaptcha2(unittest.TestCase): + + +# TODO: class TestAuthJWT(unittest.TestCase): + + +@unittest.skipIf(IS_IMAP, "TODO: Imap raises 'Connection refused'") +class TestAuth(unittest.TestCase): + + def testRun(self): + # setup + request = Request(env={}) + request.application = 'a' + request.controller = 'c' + request.function = 'f' + request.folder = 'applications/admin' + response = Response() + session = Session() + T = translator('', 'en') + session.connect(request, response) + from gluon.globals import current + current.request = request + current.response = response + current.session = session + current.T = T + db = DAL(DEFAULT_URI, check_reserved=['all']) + auth = Auth(db) + auth.define_tables(username=True, signature=False) + self.assertTrue('auth_user' in db) + self.assertTrue('auth_group' in db) + self.assertTrue('auth_membership' in db) + self.assertTrue('auth_permission' in db) + self.assertTrue('auth_event' in db) + db.define_table('t0', Field('tt'), auth.signature) + auth.enable_record_versioning(db) + self.assertTrue('t0_archive' in db) + for f in ['login', 'register', 'retrieve_password', + 'retrieve_username']: + html_form = getattr(auth, f)().xml() + self.assertTrue('name="_formkey"' in html_form) + + for f in ['logout', 'verify_email', 'reset_password', + 'change_password', 'profile', 'groups']: + self.assertRaisesRegexp(HTTP, "303*", getattr(auth, f)) + + self.assertRaisesRegexp(HTTP, "401*", auth.impersonate) + + try: + for t in ['t0_archive', 't0', 'auth_cas', 'auth_event', + 'auth_membership', 'auth_permission', 'auth_group', + 'auth_user']: + db[t].drop() + except SyntaxError as e: + # GAE doesn't support drop + pass + return + + +# TODO: class TestCrud(unittest.TestCase): +# It deprecated so far from a priority + + +# TODO: class TestService(unittest.TestCase): + + +# TODO: class TestPluginManager(unittest.TestCase): + + +# TODO: class TestExpose(unittest.TestCase): + + +# TODO: class TestWiki(unittest.TestCase): + + +# TODO: class TestConfig(unittest.TestCase): + + +# TODO: class TestToolsFunctions(unittest.TestCase): +# For all the tools.py functions + if __name__ == '__main__': unittest.main() From f7ad31f066b7f66fc2cb94a345cb0d584f4b143b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20V=C3=A9zina?= Date: Thu, 31 Mar 2016 10:15:28 -0400 Subject: [PATCH 3/5] Refactor TestAuth() with setUp() and add test case --- gluon/tests/test_tools.py | 87 +++++++++++++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 17 deletions(-) diff --git a/gluon/tests/test_tools.py b/gluon/tests/test_tools.py index 87e75c9d..214206e6 100644 --- a/gluon/tests/test_tools.py +++ b/gluon/tests/test_tools.py @@ -174,8 +174,7 @@ class TestMail(unittest.TestCase): @unittest.skipIf(IS_IMAP, "TODO: Imap raises 'Connection refused'") class TestAuth(unittest.TestCase): - def testRun(self): - # setup + def setUp(self): request = Request(env={}) request.application = 'a' request.controller = 'c' @@ -190,38 +189,92 @@ class TestAuth(unittest.TestCase): current.response = response current.session = session current.T = T - db = DAL(DEFAULT_URI, check_reserved=['all']) - auth = Auth(db) - auth.define_tables(username=True, signature=False) - self.assertTrue('auth_user' in db) - self.assertTrue('auth_group' in db) - self.assertTrue('auth_membership' in db) - self.assertTrue('auth_permission' in db) - self.assertTrue('auth_event' in db) - db.define_table('t0', Field('tt'), auth.signature) - auth.enable_record_versioning(db) - self.assertTrue('t0_archive' in db) + self.db = DAL(DEFAULT_URI, check_reserved=['all']) + self.auth = Auth(self.db) + self.auth.define_tables(username=True, signature=False) + self.db.define_table('t0', Field('tt'), self.auth.signature) + self.auth.enable_record_versioning(self.db) + # Create a user + self.db.auth_user.insert(first_name='Bart', + last_name='Simpson', + username='user1', + email='user1@test.com', + password='password_123', + registration_key=None, + registration_id=None) + + self.db.commit() + + def test_assert_setup(self): + self.assertEqual(self.db(self.db.auth_user.username == 'user1').select().first()['id'], 1) + self.assertTrue('auth_user' in self.db) + self.assertTrue('auth_group' in self.db) + self.assertTrue('auth_membership' in self.db) + self.assertTrue('auth_permission' in self.db) + self.assertTrue('auth_event' in self.db) + + def test_enable_record_versioning(self): + self.assertTrue('t0_archive' in self.db) + + def test_basic_blank_forms(self): for f in ['login', 'register', 'retrieve_password', 'retrieve_username']: - html_form = getattr(auth, f)().xml() + html_form = getattr(self.auth, f)().xml() self.assertTrue('name="_formkey"' in html_form) for f in ['logout', 'verify_email', 'reset_password', 'change_password', 'profile', 'groups']: - self.assertRaisesRegexp(HTTP, "303*", getattr(auth, f)) + self.assertRaisesRegexp(HTTP, "303*", getattr(self.auth, f)) - self.assertRaisesRegexp(HTTP, "401*", auth.impersonate) + self.assertRaisesRegexp(HTTP, "401*", self.auth.impersonate) try: for t in ['t0_archive', 't0', 'auth_cas', 'auth_event', 'auth_membership', 'auth_permission', 'auth_group', 'auth_user']: - db[t].drop() + self.db[t].drop() except SyntaxError as e: # GAE doesn't support drop pass return + def test_get_or_create_user(self): + self.db.auth_user.insert(email='user1@test.com', password='password_123') + self.db.commit() + # True case + self.assertEqual(self.auth.get_or_create_user({'email': 'user1@test.com', + 'username': 'user1'})['username'], 'user1') + # user2 doesn't exist yet and get created + self.assertEqual(self.auth.get_or_create_user({'email': 'user2@test.com', + 'username': 'user2'})['username'], 'user2') + # False case + self.assertEqual(self.auth.get_or_create_user({'email': ''}), None) + self.db.auth_user.truncate() + self.db.commit() + + def test_login_bare(self): + # The following test case should succeed but failed as I never received the user record but False + # TODO: Make this test pass + # self.assertEqual(self.auth.login_bare(username='user1', password='password_123')['username'], 'user1') + # Failing login because bad_password + self.assertEqual(self.auth.login_bare(username='user1', password='bad_password'), False) + + def test_register_bare(self): + # failing register_bare user already exist + self.assertEqual(self.auth.register_bare(username='user1', password='wrong_password'), False) + # successful register_bare + self.assertEqual(self.auth.register_bare(username='user2', + email='user2@test.com', + password='password_123')['username'], 'user2') + # raise ValueError + self.assertRaises(ValueError, self.auth.register_bare, + **dict(wrong_field_name='user3', password='password_123')) + # raise ValueError wrong email + self.assertRaises(ValueError, self.auth.register_bare, + **dict(email='user4@', password='password_123')) + self.db.auth_user.truncate() + self.db.commit() + # TODO: class TestCrud(unittest.TestCase): # It deprecated so far from a priority From e0eb425223e0c8ace6548b0ec4c1ef8f6f96f20a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20V=C3=A9zina?= Date: Thu, 31 Mar 2016 16:25:55 -0400 Subject: [PATCH 4/5] Little improvement of tools.py --- gluon/tools.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gluon/tools.py b/gluon/tools.py index fbebcc00..b13c48db 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -2575,7 +2575,7 @@ class Auth(object): update_keys[key] = keys[key] user.update_record(**update_keys) elif checks: - if not 'first_name' in keys and 'first_name' in table_user.fields: + if 'first_name' not in keys and 'first_name' in table_user.fields: guess = keys.get('email', 'anonymous').split('@')[0] keys['first_name'] = keys.get('username', guess) vars = table_user._filter_fields(keys) @@ -2698,8 +2698,7 @@ class Auth(object): fields[settings.passfield] = \ settings.table_user[settings.passfield].validate(fields[settings.passfield])[0] if not fields.get(settings.userfield): - raise ValueError('register_bare: ' + - 'userfield not provided or invalid') + raise ValueError('register_bare: userfield not provided or invalid') user = self.get_or_create_user(fields, login=False, get=False, update_fields=self.settings.update_fields) if not user: From 3a9221a2b966d5591de8fea0af39b008665606a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20V=C3=A9zina?= Date: Thu, 31 Mar 2016 17:00:50 -0400 Subject: [PATCH 5/5] Reach fully some partially hit lines --- gluon/tests/test_tools.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gluon/tests/test_tools.py b/gluon/tests/test_tools.py index 214206e6..ee40e0ee 100644 --- a/gluon/tests/test_tools.py +++ b/gluon/tests/test_tools.py @@ -247,6 +247,12 @@ class TestAuth(unittest.TestCase): # user2 doesn't exist yet and get created self.assertEqual(self.auth.get_or_create_user({'email': 'user2@test.com', 'username': 'user2'})['username'], 'user2') + # user3 for corner case + self.assertEqual(self.auth.get_or_create_user({'first_name': 'Omer', + 'last_name': 'Simpson', + 'email': 'user3@test.com', + 'registration_id': 'user3', + 'username': 'user3'})['username'], 'user3') # False case self.assertEqual(self.auth.get_or_create_user({'email': ''}), None) self.db.auth_user.truncate() @@ -260,6 +266,8 @@ class TestAuth(unittest.TestCase): self.assertEqual(self.auth.login_bare(username='user1', password='bad_password'), False) def test_register_bare(self): + # corner case empty register call register_bare without args + self.assertRaises(ValueError, self.auth.register_bare) # failing register_bare user already exist self.assertEqual(self.auth.register_bare(username='user1', password='wrong_password'), False) # successful register_bare