10 from cubicweb.goa.goaconfig import GAEConfiguration |
10 from cubicweb.goa.goaconfig import GAEConfiguration |
11 from cubicweb.entities.authobjs import CWUser |
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') |
17 config.global_set_option('use-google-auth', False) |
17 config.global_set_option('use-google-auth', False) |
18 config.global_set_option('schema-type', 'yams') |
18 config.global_set_option('schema-type', 'yams') |
19 config.global_set_option('included-cubes', ()) |
19 config.global_set_option('included-cubes', ()) |
20 config.global_set_option('included-yams-cubes', ('blog',)) |
20 config.global_set_option('included-yams-cubes', ('blog',)) |
21 |
21 |
22 MODEL_CLASSES = () |
22 MODEL_CLASSES = () |
23 from cubicweb.web.views import editcontroller |
23 from cubicweb.web.views import editcontroller |
24 from cubicweb.entities import lib |
24 from cubicweb.entities import lib |
25 LOAD_APP_MODULES = (editcontroller, lib) |
25 LOAD_APP_MODULES = (editcontroller, lib) |
26 |
26 |
27 def setUp(self): |
27 def setUp(self): |
28 GAEBasedTC.setUp(self) |
28 GAEBasedTC.setUp(self) |
29 self.req = self.request() |
29 self.req = self.request() |
30 self.ctrl = self.get_ctrl(self.req) |
30 self.ctrl = self.get_ctrl(self.req) |
31 |
31 |
32 def get_ctrl(self, req): |
32 def get_ctrl(self, req): |
33 return self.vreg.select(self.vreg.registry_objects('controllers', 'edit'), |
33 return self.vreg.select(self.vreg.registry_objects('controllers', 'edit'), |
34 req=req, appli=self) |
34 req=req, appli=self) |
35 |
35 |
36 def publish(self, req): |
36 def publish(self, req): |
67 |
67 |
68 def test_noparam_edit(self): |
68 def test_noparam_edit(self): |
69 """check behaviour of this controller without any form parameter""" |
69 """check behaviour of this controller without any form parameter""" |
70 self.req.form = {} |
70 self.req.form = {} |
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': 'CWUser', |
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): |
153 self.assertEquals(e.firstname, u'Th\xe9nault') |
153 self.assertEquals(e.firstname, u'Th\xe9nault') |
154 self.assertEquals(e.surname, u'Sylvain') |
154 self.assertEquals(e.surname, u'Sylvain') |
155 self.assertUnorderedIterableEquals([g.eid for g in e.in_group], groupeids) |
155 self.assertUnorderedIterableEquals([g.eid for g in e.in_group], groupeids) |
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('CWGroup 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': 'CWUser', |
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 |
170 'in_group:X': gueid, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
170 'in_group:X': gueid, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
171 |
171 |
172 '__type:Y': 'EmailAddress', |
172 '__type:Y': 'EmailAddress', |
173 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
173 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
174 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
174 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
175 } |
175 } |
176 path, params = self.expect_redirect_publish() |
176 path, params = self.expect_redirect_publish() |
177 # should be redirected on the created person |
177 # should be redirected on the created person |
178 self.assertEquals(path, 'euser/adim') |
178 self.assertEquals(path, 'euser/adim') |
179 e = self.req.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0) |
179 e = self.req.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0) |
180 self.assertEquals(e.surname, 'Di Mascio') |
180 self.assertEquals(e.surname, 'Di Mascio') |
181 email = e.use_email[0] |
181 email = e.use_email[0] |
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: 'CWUser', |
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, |
193 |
193 |
194 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
194 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
195 } |
195 } |
196 path, params = self.expect_redirect_publish() |
196 path, params = self.expect_redirect_publish() |
197 # should be redirected on the created person |
197 # should be redirected on the created person |
198 eid = params['rql'].split()[-1] |
198 eid = params['rql'].split()[-1] |
199 e = self.req.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
199 e = self.req.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
200 self.assertEquals(e.surname, 'Di Masci') |
200 self.assertEquals(e.surname, 'Di Masci') |
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: 'CWUser', |
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, |
212 } |
212 } |
213 path, params = self.expect_redirect_publish() |
213 path, params = self.expect_redirect_publish() |
214 # should be redirected on the created person |
214 # should be redirected on the created person |
215 eid = params['rql'].split()[-1] |
215 eid = params['rql'].split()[-1] |
218 e = self.req.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
218 e = self.req.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
219 self.assertEquals(e.surname, 'Di Masci') |
219 self.assertEquals(e.surname, 'Di Masci') |
220 email = e.use_email[0] |
220 email = e.use_email[0] |
221 self.assertEquals(email.address, 'adim@logilab.fr') |
221 self.assertEquals(email.address, 'adim@logilab.fr') |
222 |
222 |
223 |
223 |
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': 'CWUser', |
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': 'CWUser', |
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): |
353 '__type:%s'%eid2: 'EmailAddress', |
353 '__type:%s'%eid2: 'EmailAddress', |
354 '__action_delete': ''} |
354 '__action_delete': ''} |
355 path, params = self.expect_redirect_publish() |
355 path, params = self.expect_redirect_publish() |
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('CWGroup 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': 'CWUser', |
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', |
370 'address:Y': u'', 'edits-address:Y': '', |
370 'address:Y': u'', 'edits-address:Y': '', |
371 'alias:Y': u'', 'edits-alias:Y': '', |
371 'alias:Y': u'', 'edits-alias:Y': '', |
372 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
372 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
373 } |
373 } |
374 self.assertRaises(ValidationError, self.publish, self.req) |
374 self.assertRaises(ValidationError, self.publish, self.req) |
375 |
375 |
376 |
376 |
377 def test_nonregr_rollback_on_validation_error(self): |
377 def test_nonregr_rollback_on_validation_error(self): |
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': 'CWUser', |
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 |
394 # 1/ validate form => EditController.publish raises a ValidationError |
394 # 1/ validate form => EditController.publish raises a ValidationError |