28 from cubicweb.devtools.testlib import CubicWebTC |
28 from cubicweb.devtools.testlib import CubicWebTC |
29 |
29 |
30 class CoreHooksTC(CubicWebTC): |
30 class CoreHooksTC(CubicWebTC): |
31 |
31 |
32 def test_inlined(self): |
32 def test_inlined(self): |
33 self.assertEqual(self.repo.schema['sender'].inlined, True) |
33 with self.admin_access.repo_cnx() as cnx: |
34 self.execute('INSERT EmailAddress X: X address "toto@logilab.fr", X alias "hop"') |
34 self.assertEqual(self.repo.schema['sender'].inlined, True) |
35 self.execute('INSERT EmailPart X: X content_format "text/plain", X ordernum 1, X content "this is a test"') |
35 cnx.execute('INSERT EmailAddress X: X address "toto@logilab.fr", X alias "hop"') |
36 eeid = self.execute('INSERT Email X: X messageid "<1234>", X subject "test", X sender Y, X recipients Y, X parts P ' |
36 cnx.execute('INSERT EmailPart X: X content_format "text/plain", X ordernum 1, ' |
37 'WHERE Y is EmailAddress, P is EmailPart')[0][0] |
37 'X content "this is a test"') |
38 self.execute('SET X sender Y WHERE X is Email, Y is EmailAddress') |
38 eeid = cnx.execute('INSERT Email X: X messageid "<1234>", X subject "test", ' |
39 rset = self.execute('Any S WHERE X sender S, X eid %s' % eeid) |
39 'X sender Y, X recipients Y, X parts P ' |
40 self.assertEqual(len(rset), 1) |
40 'WHERE Y is EmailAddress, P is EmailPart')[0][0] |
|
41 cnx.execute('SET X sender Y WHERE X is Email, Y is EmailAddress') |
|
42 rset = cnx.execute('Any S WHERE X sender S, X eid %s' % eeid) |
|
43 self.assertEqual(len(rset), 1) |
41 |
44 |
42 def test_symmetric(self): |
45 def test_symmetric(self): |
43 req = self.request() |
46 with self.admin_access.repo_cnx() as cnx: |
44 u1 = self.create_user(req, u'1') |
47 u1 = self.create_user(cnx, u'1') |
45 u2 = self.create_user(req, u'2') |
48 u2 = self.create_user(cnx, u'2') |
46 u3 = self.create_user(req, u'3') |
49 u3 = self.create_user(cnx, u'3') |
47 ga = req.create_entity('CWGroup', name=u'A') |
50 ga = cnx.create_entity('CWGroup', name=u'A') |
48 gb = req.create_entity('CWGroup', name=u'B') |
51 gb = cnx.create_entity('CWGroup', name=u'B') |
49 u1.cw_set(friend=u2) |
52 u1.cw_set(friend=u2) |
50 u2.cw_set(friend=u3) |
53 u2.cw_set(friend=u3) |
51 ga.cw_set(friend=gb) |
54 ga.cw_set(friend=gb) |
52 ga.cw_set(friend=u1) |
55 ga.cw_set(friend=u1) |
53 self.commit() |
56 cnx.commit() |
54 req = self.request() |
57 for l1, l2 in ((u'1', u'2'), |
55 for l1, l2 in ((u'1', u'2'), |
58 (u'2', u'3')): |
56 (u'2', u'3')): |
59 self.assertTrue(cnx.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s', |
57 self.assertTrue(req.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s', |
60 {'l1': l1, 'l2': l2})) |
58 {'l1': l1, 'l2': l2})) |
61 self.assertTrue(cnx.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s', |
59 self.assertTrue(req.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s', |
62 {'l1': l1, 'l2': l2})) |
60 {'l1': l1, 'l2': l2})) |
63 self.assertTrue(cnx.execute('Any GA,GB WHERE GA friend GB, GA name "A", GB name "B"')) |
61 self.assertTrue(req.execute('Any GA,GB WHERE GA friend GB, GA name "A", GB name "B"')) |
64 self.assertTrue(cnx.execute('Any GA,GB WHERE GB friend GA, GA name "A", GB name "B"')) |
62 self.assertTrue(req.execute('Any GA,GB WHERE GB friend GA, GA name "A", GB name "B"')) |
65 self.assertTrue(cnx.execute('Any GA,U1 WHERE GA friend U1, GA name "A", U1 login "1"')) |
63 self.assertTrue(req.execute('Any GA,U1 WHERE GA friend U1, GA name "A", U1 login "1"')) |
66 self.assertTrue(cnx.execute('Any GA,U1 WHERE U1 friend GA, GA name "A", U1 login "1"')) |
64 self.assertTrue(req.execute('Any GA,U1 WHERE U1 friend GA, GA name "A", U1 login "1"')) |
67 self.assertFalse(cnx.execute('Any GA,U WHERE GA friend U, GA name "A", U login "2"')) |
65 self.assertFalse(req.execute('Any GA,U WHERE GA friend U, GA name "A", U login "2"')) |
68 for l1, l2 in ((u'1', u'3'), |
66 for l1, l2 in ((u'1', u'3'), |
69 (u'3', u'1')): |
67 (u'3', u'1')): |
70 self.assertFalse(cnx.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s', |
68 self.assertFalse(req.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s', |
71 {'l1': l1, 'l2': l2})) |
69 {'l1': l1, 'l2': l2})) |
72 self.assertFalse(cnx.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s', |
70 self.assertFalse(req.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s', |
73 {'l1': l1, 'l2': l2})) |
71 {'l1': l1, 'l2': l2})) |
|
72 |
74 |
73 def test_html_tidy_hook(self): |
75 def test_html_tidy_hook(self): |
74 req = self.request() |
76 with self.admin_access.client_cnx() as cnx: |
75 entity = req.create_entity('Workflow', name=u'wf1', |
77 entity = cnx.create_entity('Workflow', name=u'wf1', |
76 description_format=u'text/html', |
78 description_format=u'text/html', |
77 description=u'yo') |
79 description=u'yo') |
78 self.assertEqual(entity.description, u'yo') |
80 self.assertEqual(entity.description, u'yo') |
79 entity = req.create_entity('Workflow', name=u'wf2', |
81 entity = cnx.create_entity('Workflow', name=u'wf2', |
80 description_format=u'text/html', |
82 description_format=u'text/html', |
81 description=u'<b>yo') |
83 description=u'<b>yo') |
82 self.assertEqual(entity.description, u'<b>yo</b>') |
84 self.assertEqual(entity.description, u'<b>yo</b>') |
83 entity = req.create_entity('Workflow', name=u'wf3', |
85 entity = cnx.create_entity('Workflow', name=u'wf3', |
84 description_format=u'text/html', |
86 description_format=u'text/html', |
85 description=u'<b>yo</b>') |
87 description=u'<b>yo</b>') |
86 self.assertEqual(entity.description, u'<b>yo</b>') |
88 self.assertEqual(entity.description, u'<b>yo</b>') |
87 entity = req.create_entity('Workflow', name=u'wf4', |
89 entity = cnx.create_entity('Workflow', name=u'wf4', |
88 description_format=u'text/html', |
90 description_format=u'text/html', |
89 description=u'<b>R&D</b>') |
91 description=u'<b>R&D</b>') |
90 self.assertEqual(entity.description, u'<b>R&D</b>') |
92 self.assertEqual(entity.description, u'<b>R&D</b>') |
91 entity = req.create_entity('Workflow', name=u'wf5', |
93 entity = cnx.create_entity('Workflow', name=u'wf5', |
92 description_format=u'text/html', |
94 description_format=u'text/html', |
93 description=u"<div>c'est <b>l'été") |
95 description=u"<div>c'est <b>l'été") |
94 self.assertEqual(entity.description, u"<div>c'est <b>l'été</b></div>") |
96 self.assertEqual(entity.description, u"<div>c'est <b>l'été</b></div>") |
95 |
97 |
96 def test_nonregr_html_tidy_hook_no_update(self): |
98 def test_nonregr_html_tidy_hook_no_update(self): |
97 entity = self.request().create_entity('Workflow', name=u'wf1', |
99 with self.admin_access.client_cnx() as cnx: |
98 description_format=u'text/html', |
100 entity = cnx.create_entity('Workflow', name=u'wf1', |
99 description=u'yo') |
101 description_format=u'text/html', |
100 entity.cw_set(name=u'wf2') |
102 description=u'yo') |
101 self.assertEqual(entity.description, u'yo') |
103 entity.cw_set(name=u'wf2') |
102 entity.cw_set(description=u'R&D<p>yo') |
104 self.assertEqual(entity.description, u'yo') |
103 self.assertEqual(entity.description, u'R&D<p>yo</p>') |
105 entity.cw_set(description=u'R&D<p>yo') |
|
106 self.assertEqual(entity.description, u'R&D<p>yo</p>') |
104 |
107 |
105 def test_metadata_cwuri(self): |
108 def test_metadata_cwuri(self): |
106 entity = self.request().create_entity('Workflow', name=u'wf1') |
109 with self.admin_access.repo_cnx() as cnx: |
107 self.assertEqual(entity.cwuri, self.repo.config['base-url'] + str(entity.eid)) |
110 entity = cnx.create_entity('Workflow', name=u'wf1') |
|
111 self.assertEqual(entity.cwuri, self.repo.config['base-url'] + str(entity.eid)) |
108 |
112 |
109 def test_metadata_creation_modification_date(self): |
113 def test_metadata_creation_modification_date(self): |
110 _now = datetime.now() |
114 with self.admin_access.repo_cnx() as cnx: |
111 entity = self.request().create_entity('Workflow', name=u'wf1') |
115 _now = datetime.now() |
112 self.assertEqual((entity.creation_date - _now).seconds, 0) |
116 entity = cnx.create_entity('Workflow', name=u'wf1') |
113 self.assertEqual((entity.modification_date - _now).seconds, 0) |
117 self.assertEqual((entity.creation_date - _now).seconds, 0) |
|
118 self.assertEqual((entity.modification_date - _now).seconds, 0) |
114 |
119 |
115 def test_metadata_created_by(self): |
120 def test_metadata_created_by(self): |
116 entity = self.request().create_entity('Bookmark', title=u'wf1', path=u'/view') |
121 with self.admin_access.repo_cnx() as cnx: |
117 self.commit() # fire operations |
122 entity = cnx.create_entity('Bookmark', title=u'wf1', path=u'/view') |
118 self.assertEqual(len(entity.created_by), 1) # make sure we have only one creator |
123 cnx.commit() # fire operations |
119 self.assertEqual(entity.created_by[0].eid, self.session.user.eid) |
124 self.assertEqual(len(entity.created_by), 1) # make sure we have only one creator |
|
125 self.assertEqual(entity.created_by[0].eid, self.session.user.eid) |
120 |
126 |
121 def test_metadata_owned_by(self): |
127 def test_metadata_owned_by(self): |
122 entity = self.request().create_entity('Bookmark', title=u'wf1', path=u'/view') |
128 with self.admin_access.repo_cnx() as cnx: |
123 self.commit() # fire operations |
129 entity = cnx.create_entity('Bookmark', title=u'wf1', path=u'/view') |
124 self.assertEqual(len(entity.owned_by), 1) # make sure we have only one owner |
130 cnx.commit() # fire operations |
125 self.assertEqual(entity.owned_by[0].eid, self.session.user.eid) |
131 self.assertEqual(len(entity.owned_by), 1) # make sure we have only one owner |
|
132 self.assertEqual(entity.owned_by[0].eid, self.session.user.eid) |
126 |
133 |
127 def test_user_login_stripped(self): |
134 def test_user_login_stripped(self): |
128 req = self.request() |
135 with self.admin_access.repo_cnx() as cnx: |
129 u = self.create_user(req, ' joe ') |
136 u = self.create_user(cnx, ' joe ') |
130 tname = self.execute('Any L WHERE E login L, E eid %(e)s', |
137 tname = cnx.execute('Any L WHERE E login L, E eid %(e)s', |
131 {'e': u.eid})[0][0] |
138 {'e': u.eid})[0][0] |
132 self.assertEqual(tname, 'joe') |
139 self.assertEqual(tname, 'joe') |
133 self.execute('SET X login " jijoe " WHERE X eid %(x)s', {'x': u.eid}) |
140 cnx.execute('SET X login " jijoe " WHERE X eid %(x)s', {'x': u.eid}) |
134 tname = self.execute('Any L WHERE E login L, E eid %(e)s', |
141 tname = cnx.execute('Any L WHERE E login L, E eid %(e)s', |
135 {'e': u.eid})[0][0] |
142 {'e': u.eid})[0][0] |
136 self.assertEqual(tname, 'jijoe') |
143 self.assertEqual(tname, 'jijoe') |
137 |
144 |
138 |
145 |
139 |
146 |
140 class UserGroupHooksTC(CubicWebTC): |
147 class UserGroupHooksTC(CubicWebTC): |
141 |
148 |
142 def test_user_synchronization(self): |
149 def test_user_synchronization(self): |
143 req = self.request() |
150 with self.admin_access.repo_cnx() as cnx: |
144 self.create_user(req, 'toto', password='hop', commit=False) |
151 self.create_user(cnx, 'toto', password='hop', commit=False) |
145 self.assertRaises(AuthenticationError, |
152 self.assertRaises(AuthenticationError, |
146 self.repo.connect, u'toto', password='hop') |
153 self.repo.connect, u'toto', password='hop') |
147 self.commit() |
154 cnx.commit() |
148 cnxid = self.repo.connect(u'toto', password='hop') |
155 cnxid = self.repo.connect(u'toto', password='hop') |
149 self.assertNotEqual(cnxid, self.session.id) |
156 self.assertNotEqual(cnxid, self.session.id) |
150 self.execute('DELETE CWUser X WHERE X login "toto"') |
157 cnx.execute('DELETE CWUser X WHERE X login "toto"') |
151 self.repo.execute(cnxid, 'State X') |
158 self.repo.execute(cnxid, 'State X') |
152 self.commit() |
159 cnx.commit() |
153 self.assertRaises(BadConnectionId, |
160 self.assertRaises(BadConnectionId, |
154 self.repo.execute, cnxid, 'State X') |
161 self.repo.execute, cnxid, 'State X') |
155 |
162 |
156 def test_user_group_synchronization(self): |
163 def test_user_group_synchronization(self): |
157 user = self.session.user |
164 with self.admin_access.repo_cnx() as cnx: |
158 self.assertEqual(user.groups, set(('managers',))) |
165 user = cnx.user |
159 self.execute('SET X in_group G WHERE X eid %s, G name "guests"' % user.eid) |
166 self.assertEqual(user.groups, set(('managers',))) |
160 self.assertEqual(user.groups, set(('managers',))) |
167 cnx.execute('SET X in_group G WHERE X eid %s, G name "guests"' % user.eid) |
161 self.commit() |
168 self.assertEqual(user.groups, set(('managers',))) |
162 self.assertEqual(user.groups, set(('managers', 'guests'))) |
169 cnx.commit() |
163 self.execute('DELETE X in_group G WHERE X eid %s, G name "guests"' % user.eid) |
170 self.assertEqual(user.groups, set(('managers', 'guests'))) |
164 self.assertEqual(user.groups, set(('managers', 'guests'))) |
171 cnx.execute('DELETE X in_group G WHERE X eid %s, G name "guests"' % user.eid) |
165 self.commit() |
172 self.assertEqual(user.groups, set(('managers', 'guests'))) |
166 self.assertEqual(user.groups, set(('managers',))) |
173 cnx.commit() |
|
174 self.assertEqual(user.groups, set(('managers',))) |
167 |
175 |
168 def test_user_composite_owner(self): |
176 def test_user_composite_owner(self): |
169 req = self.request() |
177 with self.admin_access.repo_cnx() as cnx: |
170 ueid = self.create_user(req, 'toto').eid |
178 self.create_user(cnx, 'toto').eid |
171 # composite of euser should be owned by the euser regardless of who created it |
179 # composite of euser should be owned by the euser regardless of who created it |
172 self.execute('INSERT EmailAddress X: X address "toto@logilab.fr", U use_email X ' |
180 cnx.execute('INSERT EmailAddress X: X address "toto@logilab.fr", U use_email X ' |
173 'WHERE U login "toto"') |
181 'WHERE U login "toto"') |
174 self.commit() |
182 cnx.commit() |
175 self.assertEqual(self.execute('Any A WHERE X owned_by U, U use_email X,' |
183 self.assertEqual(cnx.execute('Any A WHERE X owned_by U, U use_email X,' |
176 'U login "toto", X address A')[0][0], |
184 'U login "toto", X address A')[0][0], |
177 'toto@logilab.fr') |
185 'toto@logilab.fr') |
178 |
186 |
179 def test_no_created_by_on_deleted_entity(self): |
187 def test_no_created_by_on_deleted_entity(self): |
180 eid = self.execute('INSERT EmailAddress X: X address "toto@logilab.fr"')[0][0] |
188 with self.admin_access.repo_cnx() as cnx: |
181 self.execute('DELETE EmailAddress X WHERE X eid %s' % eid) |
189 eid = cnx.execute('INSERT EmailAddress X: X address "toto@logilab.fr"')[0][0] |
182 self.commit() |
190 cnx.execute('DELETE EmailAddress X WHERE X eid %s' % eid) |
183 self.assertFalse(self.execute('Any X WHERE X created_by Y, X eid >= %(x)s', {'x': eid})) |
191 cnx.commit() |
|
192 self.assertFalse(cnx.execute('Any X WHERE X created_by Y, X eid >= %(x)s', {'x': eid})) |
184 |
193 |
185 |
194 |
186 |
195 |
187 class SchemaHooksTC(CubicWebTC): |
196 class SchemaHooksTC(CubicWebTC): |
188 |
197 |
189 def test_duplicate_etype_error(self): |
198 def test_duplicate_etype_error(self): |
190 # check we can't add a CWEType or CWRType entity if it already exists one |
199 with self.admin_access.repo_cnx() as cnx: |
191 # with the same name |
200 # check we can't add a CWEType or CWRType entity if it already exists one |
192 self.assertRaises(ValidationError, |
201 # with the same name |
193 self.execute, 'INSERT CWEType X: X name "CWUser"') |
202 self.assertRaises(ValidationError, |
194 self.assertRaises(ValidationError, |
203 cnx.execute, 'INSERT CWEType X: X name "CWUser"') |
195 self.execute, 'INSERT CWRType X: X name "in_group"') |
204 cnx.rollback() |
|
205 self.assertRaises(ValidationError, |
|
206 cnx.execute, 'INSERT CWRType X: X name "in_group"') |
196 |
207 |
197 def test_validation_unique_constraint(self): |
208 def test_validation_unique_constraint(self): |
198 with self.assertRaises(ValidationError) as cm: |
209 with self.admin_access.repo_cnx() as cnx: |
199 self.execute('INSERT CWUser X: X login "admin"') |
210 with self.assertRaises(ValidationError) as cm: |
200 ex = cm.exception |
211 cnx.execute('INSERT CWUser X: X login "admin"') |
201 ex.translate(unicode) |
212 ex = cm.exception |
202 self.assertIsInstance(ex.entity, int) |
213 ex.translate(unicode) |
203 self.assertEqual(ex.errors, {'login-subject': 'the value "admin" is already used, use another one'}) |
214 self.assertIsInstance(ex.entity, int) |
|
215 self.assertEqual(ex.errors, {'login-subject': 'the value "admin" is already used, use another one'}) |
204 |
216 |
205 |
217 |
206 if __name__ == '__main__': |
218 if __name__ == '__main__': |
207 from logilab.common.testlib import unittest_main |
219 from logilab.common.testlib import unittest_main |
208 unittest_main() |
220 unittest_main() |