6 from cubicweb.common.uilib import rql_for_eid |
6 from cubicweb.common.uilib import rql_for_eid |
7 |
7 |
8 from cubicweb.web import INTERNAL_FIELD_VALUE, Redirect |
8 from cubicweb.web import INTERNAL_FIELD_VALUE, Redirect |
9 |
9 |
10 from cubicweb.goa.goaconfig import GAEConfiguration |
10 from cubicweb.goa.goaconfig import GAEConfiguration |
11 from cubicweb.entities.authobjs import EUser |
11 from cubicweb.entities.authobjs import CWUser |
12 |
12 |
13 |
13 |
14 class EditControllerTC(GAEBasedTC): |
14 class EditControllerTC(GAEBasedTC): |
15 |
15 |
16 config = GAEConfiguration('toto') |
16 config = GAEConfiguration('toto') |
71 self.assertRaises(ValidationError, self.publish, self.req) |
71 self.assertRaises(ValidationError, self.publish, self.req) |
72 |
72 |
73 def test_validation_unique(self): |
73 def test_validation_unique(self): |
74 """test creation of two linked entities""" |
74 """test creation of two linked entities""" |
75 user = self.user |
75 user = self.user |
76 self.req.form = {'eid': 'X', '__type:X': 'EUser', |
76 self.req.form = {'eid': 'X', '__type:X': 'CWUser', |
77 'login:X': self.user.login, 'edits-login:X': u'', |
77 'login:X': self.user.login, 'edits-login:X': u'', |
78 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
78 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
79 } |
79 } |
80 self.assertRaises(ValidationError, self.publish, self.req) |
80 self.assertRaises(ValidationError, self.publish, self.req) |
81 |
81 |
82 |
82 |
83 def test_user_editing_itself(self): |
83 def test_user_editing_itself(self): |
84 """checking that a manager user can edit itself""" |
84 """checking that a manager user can edit itself""" |
85 self.skip('missing actual gae support, retry latter') |
85 self.skip('missing actual gae support, retry latter') |
86 user = self.user |
86 user = self.user |
87 basegroups = [str(eid) for eid, in self.req.execute('EGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})] |
87 basegroups = [str(eid) for eid, in self.req.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})] |
88 groupeids = [eid for eid, in self.req.execute('EGroup G WHERE G name in ("managers", "users")')] |
88 groupeids = [eid for eid, in self.req.execute('CWGroup G WHERE G name in ("managers", "users")')] |
89 groups = [str(eid) for eid in groupeids] |
89 groups = [str(eid) for eid in groupeids] |
90 stateeid = [eid for eid, in self.req.execute('State S WHERE S name "activated"')][0] |
90 stateeid = [eid for eid, in self.req.execute('State S WHERE S name "activated"')][0] |
91 self.req.form = { |
91 self.req.form = { |
92 'eid': user.eid, |
92 'eid': user.eid, |
93 '__type:'+user.eid: 'EUser', |
93 '__type:'+user.eid: 'CWUser', |
94 'login:'+user.eid: unicode(user.login), |
94 'login:'+user.eid: unicode(user.login), |
95 'firstname:'+user.eid: u'Th\xe9nault', |
95 'firstname:'+user.eid: u'Th\xe9nault', |
96 'surname:'+user.eid: u'Sylvain', |
96 'surname:'+user.eid: u'Sylvain', |
97 'in_group:'+user.eid: groups, |
97 'in_group:'+user.eid: groups, |
98 'in_state:'+user.eid: stateeid, |
98 'in_state:'+user.eid: stateeid, |
113 |
113 |
114 def test_user_can_change_its_password(self): |
114 def test_user_can_change_its_password(self): |
115 user = self.create_user('user') |
115 user = self.create_user('user') |
116 cnx = self.login('user') |
116 cnx = self.login('user') |
117 req = self.request() |
117 req = self.request() |
118 #self.assertEquals(self.ctrl.schema['EUser']._groups['read'], |
118 #self.assertEquals(self.ctrl.schema['CWUser']._groups['read'], |
119 # ('managers', 'users')) |
119 # ('managers', 'users')) |
120 req.form = { |
120 req.form = { |
121 'eid': user.eid, '__type:'+user.eid: 'EUser', |
121 'eid': user.eid, '__type:'+user.eid: 'CWUser', |
122 '__maineid' : str(user.eid), |
122 '__maineid' : str(user.eid), |
123 'upassword:'+user.eid: 'tournicoton', |
123 'upassword:'+user.eid: 'tournicoton', |
124 'upassword-confirm:'+user.eid: 'tournicoton', |
124 'upassword-confirm:'+user.eid: 'tournicoton', |
125 'edits-upassword:'+user.eid: '', |
125 'edits-upassword:'+user.eid: '', |
126 } |
126 } |
132 def test_user_editing_itself_no_relation(self): |
132 def test_user_editing_itself_no_relation(self): |
133 """checking we can edit an entity without specifying some required |
133 """checking we can edit an entity without specifying some required |
134 relations (meaning no changes) |
134 relations (meaning no changes) |
135 """ |
135 """ |
136 user = self.user |
136 user = self.user |
137 groupeids = [eid for eid, in self.req.execute('EGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})] |
137 groupeids = [eid for eid, in self.req.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})] |
138 self.req.form = { |
138 self.req.form = { |
139 'eid': user.eid, |
139 'eid': user.eid, |
140 '__type:'+user.eid: 'EUser', |
140 '__type:'+user.eid: 'CWUser', |
141 'login:'+user.eid: unicode(user.login), |
141 'login:'+user.eid: unicode(user.login), |
142 'firstname:'+user.eid: u'Th\xe9nault', |
142 'firstname:'+user.eid: u'Th\xe9nault', |
143 'surname:'+user.eid: u'Sylvain', |
143 'surname:'+user.eid: u'Sylvain', |
144 # |
144 # |
145 'edits-login:'+user.eid: unicode(user.login), |
145 'edits-login:'+user.eid: unicode(user.login), |
156 #stateeids = [eid for eid, in self.req.execute('State S WHERE S name "activated"')] |
156 #stateeids = [eid for eid, in self.req.execute('State S WHERE S name "activated"')] |
157 #self.assertEquals([s.eid for s in e.in_state], stateeids) |
157 #self.assertEquals([s.eid for s in e.in_state], stateeids) |
158 |
158 |
159 |
159 |
160 def test_create_multiple_linked(self): |
160 def test_create_multiple_linked(self): |
161 gueid = self.req.execute('EGroup G WHERE G name "users"')[0][0] |
161 gueid = self.req.execute('CWGroup G WHERE G name "users"')[0][0] |
162 self.req.form = {'eid': ['X', 'Y'], |
162 self.req.form = {'eid': ['X', 'Y'], |
163 |
163 |
164 '__type:X': 'EUser', |
164 '__type:X': 'CWUser', |
165 '__maineid' : 'X', |
165 '__maineid' : 'X', |
166 'login:X': u'adim', 'edits-login:X': u'', |
166 'login:X': u'adim', 'edits-login:X': u'', |
167 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
167 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
168 'surname:X': u'Di Mascio', 'edits-surname:X': '', |
168 'surname:X': u'Di Mascio', 'edits-surname:X': '', |
169 |
169 |
182 self.assertEquals(email.address, 'dima@logilab.fr') |
182 self.assertEquals(email.address, 'dima@logilab.fr') |
183 |
183 |
184 def test_edit_multiple_linked(self): |
184 def test_edit_multiple_linked(self): |
185 peid = self.create_user('adim').eid |
185 peid = self.create_user('adim').eid |
186 self.req.form = {'eid': [peid, 'Y'], |
186 self.req.form = {'eid': [peid, 'Y'], |
187 '__type:%s'%peid: 'EUser', |
187 '__type:%s'%peid: 'CWUser', |
188 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: '', |
188 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: '', |
189 |
189 |
190 '__type:Y': 'EmailAddress', |
190 '__type:Y': 'EmailAddress', |
191 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
191 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
192 'use_email:%s'%peid: 'Y', 'edits-use_email:%s'%peid: INTERNAL_FIELD_VALUE, |
192 'use_email:%s'%peid: 'Y', 'edits-use_email:%s'%peid: INTERNAL_FIELD_VALUE, |
201 email = e.use_email[0] |
201 email = e.use_email[0] |
202 self.assertEquals(email.address, 'dima@logilab.fr') |
202 self.assertEquals(email.address, 'dima@logilab.fr') |
203 |
203 |
204 emaileid = email.eid |
204 emaileid = email.eid |
205 self.req.form = {'eid': [peid, emaileid], |
205 self.req.form = {'eid': [peid, emaileid], |
206 '__type:%s'%peid: 'EUser', |
206 '__type:%s'%peid: 'CWUser', |
207 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: 'Di Masci', |
207 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: 'Di Masci', |
208 '__type:%s'%emaileid: 'EmailAddress', |
208 '__type:%s'%emaileid: 'EmailAddress', |
209 'address:%s'%emaileid: u'adim@logilab.fr', 'edits-address:%s'%emaileid: 'dima@logilab.fr', |
209 'address:%s'%emaileid: u'adim@logilab.fr', 'edits-address:%s'%emaileid: 'dima@logilab.fr', |
210 'use_email:%s'%peid: emaileid, 'edits-use_email:%s'%peid: emaileid, |
210 'use_email:%s'%peid: emaileid, 'edits-use_email:%s'%peid: emaileid, |
211 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
211 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
224 def test_password_confirm(self): |
224 def test_password_confirm(self): |
225 """test creation of two linked entities |
225 """test creation of two linked entities |
226 """ |
226 """ |
227 user = self.user |
227 user = self.user |
228 self.req.form = {'__cloned_eid:X': user.eid, |
228 self.req.form = {'__cloned_eid:X': user.eid, |
229 'eid': 'X', '__type:X': 'EUser', |
229 'eid': 'X', '__type:X': 'CWUser', |
230 'login:X': u'toto', 'edits-login:X': u'', |
230 'login:X': u'toto', 'edits-login:X': u'', |
231 'upassword:X': u'toto', 'edits-upassword:X': u'', |
231 'upassword:X': u'toto', 'edits-upassword:X': u'', |
232 } |
232 } |
233 self.assertRaises(ValidationError, self.publish, self.req) |
233 self.assertRaises(ValidationError, self.publish, self.req) |
234 self.req.form = {'__cloned_eid:X': user.eid, |
234 self.req.form = {'__cloned_eid:X': user.eid, |
235 'eid': 'X', '__type:X': 'EUser', |
235 'eid': 'X', '__type:X': 'CWUser', |
236 'login:X': u'toto', 'edits-login:X': u'', |
236 'login:X': u'toto', 'edits-login:X': u'', |
237 'upassword:X': u'toto', 'upassword-confirm:X': u'tutu', 'edits-upassword:X': u'', |
237 'upassword:X': u'toto', 'upassword-confirm:X': u'tutu', 'edits-upassword:X': u'', |
238 } |
238 } |
239 self.assertRaises(ValidationError, self.publish, self.req) |
239 self.assertRaises(ValidationError, self.publish, self.req) |
240 |
240 |
241 |
241 |
242 def test_req_pending_insert(self): |
242 def test_req_pending_insert(self): |
243 """make sure req's pending insertions are taken into account""" |
243 """make sure req's pending insertions are taken into account""" |
244 tmpgroup = self.add_entity('EGroup', name=u"test") |
244 tmpgroup = self.add_entity('CWGroup', name=u"test") |
245 user = self.user |
245 user = self.user |
246 self.req.set_session_data('pending_insert', set([(user.eid, 'in_group', tmpgroup.eid)])) |
246 self.req.set_session_data('pending_insert', set([(user.eid, 'in_group', tmpgroup.eid)])) |
247 path, params = self.expect_redirect_publish() |
247 path, params = self.expect_redirect_publish() |
248 usergroups = [gname for gname, in |
248 usergroups = [gname for gname, in |
249 self.req.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
249 self.req.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
252 |
252 |
253 |
253 |
254 def test_req_pending_delete(self): |
254 def test_req_pending_delete(self): |
255 """make sure req's pending deletions are taken into account""" |
255 """make sure req's pending deletions are taken into account""" |
256 user = self.user |
256 user = self.user |
257 groupeid = self.req.execute('INSERT EGroup G: G name "test", U in_group G WHERE U eid %(x)s', |
257 groupeid = self.req.execute('INSERT CWGroup G: G name "test", U in_group G WHERE U eid %(x)s', |
258 {'x': user.eid})[0][0] |
258 {'x': user.eid})[0][0] |
259 usergroups = [gname for gname, in |
259 usergroups = [gname for gname, in |
260 self.req.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
260 self.req.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
261 # just make sure everything was set correctly |
261 # just make sure everything was set correctly |
262 self.assertUnorderedIterableEquals(usergroups, ['managers', 'users', 'test']) |
262 self.assertUnorderedIterableEquals(usergroups, ['managers', 'users', 'test']) |
271 |
271 |
272 def test_custom_attribute_handler(self): |
272 def test_custom_attribute_handler(self): |
273 def custom_login_edit(self, formparams, value, relations): |
273 def custom_login_edit(self, formparams, value, relations): |
274 formparams['login'] = value.upper() |
274 formparams['login'] = value.upper() |
275 relations.append('X login %(login)s') |
275 relations.append('X login %(login)s') |
276 EUser.custom_login_edit = custom_login_edit |
276 CWUser.custom_login_edit = custom_login_edit |
277 try: |
277 try: |
278 user = self.user |
278 user = self.user |
279 eid = repr(user.eid) |
279 eid = repr(user.eid) |
280 self.req.form = { |
280 self.req.form = { |
281 'eid': eid, |
281 'eid': eid, |
282 '__type:'+eid: 'EUser', |
282 '__type:'+eid: 'CWUser', |
283 'login:'+eid: u'foo', |
283 'login:'+eid: u'foo', |
284 'edits-login:'+eid: unicode(user.login), |
284 'edits-login:'+eid: unicode(user.login), |
285 } |
285 } |
286 path, params = self.expect_redirect_publish() |
286 path, params = self.expect_redirect_publish() |
287 rset = self.req.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x') |
287 rset = self.req.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x') |
288 self.assertEquals(rset[0][0], 'FOO') |
288 self.assertEquals(rset[0][0], 'FOO') |
289 finally: |
289 finally: |
290 del EUser.custom_login_edit |
290 del CWUser.custom_login_edit |
291 |
291 |
292 def test_redirect_apply_button(self): |
292 def test_redirect_apply_button(self): |
293 redirectrql = rql_for_eid(4012) # whatever |
293 redirectrql = rql_for_eid(4012) # whatever |
294 self.req.form = { |
294 self.req.form = { |
295 'eid': 'A', '__type:A': 'BlogEntry', |
295 'eid': 'A', '__type:A': 'BlogEntry', |
356 self.assertEquals(path, 'view') |
356 self.assertEquals(path, 'view') |
357 self.assertEquals(params, {u'__message': u'entities deleted'}) |
357 self.assertEquals(params, {u'__message': u'entities deleted'}) |
358 |
358 |
359 |
359 |
360 def test_nonregr_multiple_empty_email_addr(self): |
360 def test_nonregr_multiple_empty_email_addr(self): |
361 gueid = self.req.execute('EGroup G WHERE G name "users"')[0][0] |
361 gueid = self.req.execute('CWGroup G WHERE G name "users"')[0][0] |
362 self.req.form = {'eid': ['X', 'Y'], |
362 self.req.form = {'eid': ['X', 'Y'], |
363 |
363 |
364 '__type:X': 'EUser', |
364 '__type:X': 'CWUser', |
365 'login:X': u'adim', 'edits-login:X': u'', |
365 'login:X': u'adim', 'edits-login:X': u'', |
366 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
366 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
367 'in_group:X': gueid, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
367 'in_group:X': gueid, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
368 |
368 |
369 '__type:Y': 'EmailAddress', |
369 '__type:Y': 'EmailAddress', |
383 try: |
383 try: |
384 e = self.add_entity('EmailAddress', address=u'doe@doe.com') |
384 e = self.add_entity('EmailAddress', address=u'doe@doe.com') |
385 self.req.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s', |
385 self.req.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s', |
386 {'p' : p.eid, 'e' : e.eid}) |
386 {'p' : p.eid, 'e' : e.eid}) |
387 self.req.form = {'__cloned_eid:X': p.eid, |
387 self.req.form = {'__cloned_eid:X': p.eid, |
388 'eid': 'X', '__type:X': 'EUser', |
388 'eid': 'X', '__type:X': 'CWUser', |
389 'login': u'dodo', 'edits-login': u'dodo', |
389 'login': u'dodo', 'edits-login': u'dodo', |
390 'surname:X': u'Boom', 'edits-surname:X': u'', |
390 'surname:X': u'Boom', 'edits-surname:X': u'', |
391 '__errorurl' : "whatever but required", |
391 '__errorurl' : "whatever but required", |
392 } |
392 } |
393 # try to emulate what really happens in the web application |
393 # try to emulate what really happens in the web application |
398 self.env.app.publish('edit', self.req) |
398 self.env.app.publish('edit', self.req) |
399 except Redirect: |
399 except Redirect: |
400 self.req.form['rql'] = 'Any X WHERE X eid %s' % p.eid |
400 self.req.form['rql'] = 'Any X WHERE X eid %s' % p.eid |
401 self.req.form['vid'] = 'copy' |
401 self.req.form['vid'] = 'copy' |
402 self.env.app.publish('view', self.req) |
402 self.env.app.publish('view', self.req) |
403 rset = self.req.execute('EUser P WHERE P surname "Boom"') |
403 rset = self.req.execute('CWUser P WHERE P surname "Boom"') |
404 self.assertEquals(len(rset), 0) |
404 self.assertEquals(len(rset), 0) |
405 finally: |
405 finally: |
406 p.__class__.skip_copy_for = old_skips |
406 p.__class__.skip_copy_for = old_skips |
407 |
407 |
408 |
408 |