goa/test/unittest_editcontroller.py
branchtls-sprint
changeset 1802 d628defebc17
parent 1398 5fe84a5f7035
child 1977 606923dff11b
equal deleted inserted replaced
1801:672acc730ce5 1802:d628defebc17
    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):
   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 CWUser.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',
   296                          '__maineid' : 'A',
   296                          '__maineid' : 'A',
   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
   403             rset = self.req.execute('CWUser 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 
   409 if __name__ == '__main__':
   409 if __name__ == '__main__':
   410     from logilab.common.testlib import unittest_main
   410     from logilab.common.testlib import unittest_main
   411     unittest_main()
   411     unittest_main()