1 | #!/usr/bin/env python |
---|
2 | # -*- coding: utf-8 -*- |
---|
3 | |
---|
4 | """ Unit tests for authapi """ |
---|
5 | import os |
---|
6 | import unittest |
---|
7 | from gluon.globals import Request, Response, Session |
---|
8 | from gluon.languages import TranslatorFactory |
---|
9 | from gluon.dal import DAL, Field |
---|
10 | from gluon.authapi import AuthAPI |
---|
11 | from gluon.storage import Storage |
---|
12 | from gluon._compat import to_bytes, to_native, add_charset |
---|
13 | |
---|
14 | DEFAULT_URI = os.getenv('DB', 'sqlite:memory') |
---|
15 | |
---|
16 | |
---|
17 | class TestAuthAPI(unittest.TestCase): |
---|
18 | |
---|
19 | def setUp(self): |
---|
20 | self.request = Request(env={}) |
---|
21 | self.request.application = 'a' |
---|
22 | self.request.controller = 'c' |
---|
23 | self.request.function = 'f' |
---|
24 | self.request.folder = 'applications/admin' |
---|
25 | self.response = Response() |
---|
26 | self.session = Session() |
---|
27 | T = TranslatorFactory('', 'en') |
---|
28 | self.session.connect(self.request, self.response) |
---|
29 | from gluon.globals import current |
---|
30 | self.current = current |
---|
31 | self.current.request = self.request |
---|
32 | self.current.response = self.response |
---|
33 | self.current.session = self.session |
---|
34 | self.current.T = T |
---|
35 | self.db = DAL(DEFAULT_URI, check_reserved=['all']) |
---|
36 | self.auth = AuthAPI(self.db) |
---|
37 | self.auth.define_tables(username=True, signature=False) |
---|
38 | # Create a user |
---|
39 | self.auth.table_user().validate_and_insert(first_name='Bart', |
---|
40 | last_name='Simpson', |
---|
41 | username='bart', |
---|
42 | email='bart@simpson.com', |
---|
43 | password='bart_password', |
---|
44 | registration_key='', |
---|
45 | registration_id='' |
---|
46 | ) |
---|
47 | self.db.commit() |
---|
48 | |
---|
49 | def test_login(self): |
---|
50 | result = self.auth.login(**{'username': 'bart', 'password': 'bart_password'}) |
---|
51 | self.assertTrue(self.auth.is_logged_in()) |
---|
52 | self.assertTrue(result['user']['email'] == 'bart@simpson.com') |
---|
53 | self.auth.logout() |
---|
54 | self.assertFalse(self.auth.is_logged_in()) |
---|
55 | self.auth.settings.username_case_sensitive = False |
---|
56 | result = self.auth.login(**{'username': 'BarT', 'password': 'bart_password'}) |
---|
57 | self.assertTrue(self.auth.is_logged_in()) |
---|
58 | |
---|
59 | def test_logout(self): |
---|
60 | self.auth.login(**{'username': 'bart', 'password': 'bart_password'}) |
---|
61 | self.assertTrue(self.auth.is_logged_in()) |
---|
62 | result = self.auth.logout() |
---|
63 | self.assertTrue(not self.auth.is_logged_in()) |
---|
64 | self.assertTrue(result['user'] is None) |
---|
65 | |
---|
66 | def test_register(self): |
---|
67 | self.auth.settings.login_after_registration = True |
---|
68 | result = self.auth.register(**{ |
---|
69 | 'username': 'lisa', |
---|
70 | 'first_name': 'Lisa', |
---|
71 | 'last_name': 'Simpson', |
---|
72 | 'email': 'lisa@simpson.com', |
---|
73 | 'password': 'lisa_password' |
---|
74 | }) |
---|
75 | self.assertTrue(result['user']['email'] == 'lisa@simpson.com') |
---|
76 | self.assertTrue(self.auth.is_logged_in()) |
---|
77 | with self.assertRaises(AssertionError): # Can't register if you're logged in |
---|
78 | result = self.auth.register(**{ |
---|
79 | 'username': 'lisa', |
---|
80 | 'first_name': 'Lisa', |
---|
81 | 'last_name': 'Simpson', |
---|
82 | 'email': 'lisa@simpson.com', |
---|
83 | 'password': 'lisa_password' |
---|
84 | }) |
---|
85 | self.auth.logout() |
---|
86 | self.auth.settings.login_after_registration = False |
---|
87 | result = self.auth.register(**{ |
---|
88 | 'username': 'barney', |
---|
89 | 'first_name': 'Barney', |
---|
90 | 'last_name': 'Gumble', |
---|
91 | 'email': 'barney@simpson.com', |
---|
92 | 'password': 'barney_password' |
---|
93 | }) |
---|
94 | self.assertTrue(result['user']['email'] == 'barney@simpson.com') |
---|
95 | self.assertFalse(self.auth.is_logged_in()) |
---|
96 | self.auth.settings.login_userfield = 'email' |
---|
97 | result = self.auth.register(**{ |
---|
98 | 'username': 'lisa', |
---|
99 | 'first_name': 'Lisa', |
---|
100 | 'last_name': 'Simpson', |
---|
101 | 'email': 'lisa@simpson.com', |
---|
102 | 'password': 'lisa_password' |
---|
103 | }) |
---|
104 | self.assertTrue(result['errors']['email'] == self.auth.messages.email_taken) |
---|
105 | self.assertTrue(result['user'] is None) |
---|
106 | self.auth.settings.registration_requires_verification = True |
---|
107 | result = self.auth.register(**{ |
---|
108 | 'username': 'homer', |
---|
109 | 'first_name': 'Homer', |
---|
110 | 'last_name': 'Simpson', |
---|
111 | 'email': 'homer@simpson.com', |
---|
112 | 'password': 'homer_password' |
---|
113 | }) |
---|
114 | self.assertTrue('key' in result['user']) |
---|
115 | |
---|
116 | def test_profile(self): |
---|
117 | with self.assertRaises(AssertionError): |
---|
118 | # We are not logged in |
---|
119 | self.auth.profile() |
---|
120 | self.auth.login(**{'username': 'bart', 'password': 'bart_password'}) |
---|
121 | self.assertTrue(self.auth.is_logged_in()) |
---|
122 | result = self.auth.profile(email='bartolo@simpson.com') |
---|
123 | self.assertTrue(result['user']['email'] == 'bartolo@simpson.com') |
---|
124 | self.assertTrue(self.auth.table_user()[result['user']['id']].email == 'bartolo@simpson.com') |
---|
125 | |
---|
126 | def test_change_password(self): |
---|
127 | with self.assertRaises(AssertionError): |
---|
128 | # We are not logged in |
---|
129 | self.auth.change_password() |
---|
130 | self.auth.login(**{'username': 'bart', 'password': 'bart_password'}) |
---|
131 | self.assertTrue(self.auth.is_logged_in()) |
---|
132 | self.auth.change_password(old_password='bart_password', new_password='1234', new_password2='1234') |
---|
133 | self.auth.logout() |
---|
134 | self.assertTrue(not self.auth.is_logged_in()) |
---|
135 | self.auth.login(username='bart', password='1234') |
---|
136 | self.assertTrue(self.auth.is_logged_in()) |
---|
137 | result = self.auth.change_password(old_password='bart_password', new_password='1234', new_password2='5678') |
---|
138 | self.assertTrue('new_password2' in result['errors']) |
---|
139 | result = self.auth.change_password(old_password='bart_password', new_password='1234', new_password2='1234') |
---|
140 | self.assertTrue('old_password' in result['errors']) |
---|
141 | # Test the default 4 min_length is enforced on change password |
---|
142 | result = self.auth.change_password(old_password='1234', new_password='123', new_password2='123') |
---|
143 | self.assertTrue('new_password' in result['errors']) |
---|
144 | |
---|
145 | def test_verify_key(self): |
---|
146 | self.auth.settings.registration_requires_verification = True |
---|
147 | result = self.auth.register(**{ |
---|
148 | 'username': 'homer', |
---|
149 | 'first_name': 'Homer', |
---|
150 | 'last_name': 'Simpson', |
---|
151 | 'email': 'homer@simpson.com', |
---|
152 | 'password': 'homer_password' |
---|
153 | }) |
---|
154 | self.assertTrue('key' in result['user']) |
---|
155 | homer_id = result['user']['id'] |
---|
156 | homers_key = result['user']['key'] |
---|
157 | result = self.auth.verify_key(key=None) |
---|
158 | self.assertTrue(result['errors'] is not None) |
---|
159 | result = self.auth.verify_key(key='12345') |
---|
160 | self.assertTrue(result['errors'] is not None) |
---|
161 | result = self.auth.verify_key(key=homers_key) |
---|
162 | self.assertTrue(result['errors'] is None) |
---|
163 | self.assertEqual(self.auth.table_user()[homer_id].registration_key, '') |
---|
164 | self.auth.settings.registration_requires_approval = True |
---|
165 | result = self.auth.register(**{ |
---|
166 | 'username': 'lisa', |
---|
167 | 'first_name': 'Lisa', |
---|
168 | 'last_name': 'Simpson', |
---|
169 | 'email': 'lisa@simpson.com', |
---|
170 | 'password': 'lisa_password' |
---|
171 | }) |
---|
172 | lisa_id = result['user']['id'] |
---|
173 | result = self.auth.verify_key(key=result['user']['key']) |
---|
174 | self.assertEqual(self.auth.table_user()[lisa_id].registration_key, 'pending') |
---|