goa/test/unittest_editcontroller.py
branchtls-sprint
changeset 1398 5fe84a5f7035
parent 571 e02c95dd1827
child 1802 d628defebc17
equal deleted inserted replaced
1397:6cbc7bc8ea6d 1398:5fe84a5f7035
     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