web/test/unittest_views_basecontrollers.py
branchstable
changeset 7677 134613d3b353
parent 7584 e1881933f366
child 7702 73cadb5d0097
equal deleted inserted replaced
7670:6397a9051f65 7677:134613d3b353
     1 # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     1 # copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     3 #
     3 #
     4 # This file is part of CubicWeb.
     4 # This file is part of CubicWeb.
     5 #
     5 #
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
    31 from cubicweb.web.views.autoform import get_pending_inserts, get_pending_deletes
    31 from cubicweb.web.views.autoform import get_pending_inserts, get_pending_deletes
    32 u = unicode
    32 u = unicode
    33 
    33 
    34 def req_form(user):
    34 def req_form(user):
    35     return {'eid': [str(user.eid)],
    35     return {'eid': [str(user.eid)],
    36             '_cw_edited_fields:%s' % user.eid: '_cw_generic_field',
    36             '_cw_entity_fields:%s' % user.eid: '_cw_generic_field',
    37             '__type:%s' % user.eid: user.__regid__
    37             '__type:%s' % user.eid: user.__regid__
    38             }
    38             }
    39 
    39 
    40 class EditControllerTC(CubicWebTC):
    40 class EditControllerTC(CubicWebTC):
    41     def setUp(self):
    41     def setUp(self):
    57         """test creation of two linked entities
    57         """test creation of two linked entities
    58         """
    58         """
    59         user = self.user()
    59         user = self.user()
    60         req = self.request()
    60         req = self.request()
    61         req.form = {'eid': 'X', '__type:X': 'CWUser',
    61         req.form = {'eid': 'X', '__type:X': 'CWUser',
    62                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
    62                     '_cw_entity_fields:X': 'login-subject,upassword-subject',
    63                     'login-subject:X': u'admin',
    63                     'login-subject:X': u'admin',
    64                     'upassword-subject:X': u'toto',
    64                     'upassword-subject:X': u'toto',
    65                     'upassword-subject-confirm:X': u'toto',
    65                     'upassword-subject-confirm:X': u'toto',
    66                     }
    66                     }
    67         with self.assertRaises(ValidationError) as cm:
    67         with self.assertRaises(ValidationError) as cm:
    77         groups = [u(eid) for eid in groupeids]
    77         groups = [u(eid) for eid in groupeids]
    78         req = self.request()
    78         req = self.request()
    79         eid = u(user.eid)
    79         eid = u(user.eid)
    80         req.form = {
    80         req.form = {
    81             'eid': eid, '__type:'+eid: 'CWUser',
    81             'eid': eid, '__type:'+eid: 'CWUser',
    82             '_cw_edited_fields:'+eid: 'login-subject,firstname-subject,surname-subject,in_group-subject',
    82             '_cw_entity_fields:'+eid: 'login-subject,firstname-subject,surname-subject,in_group-subject',
    83             'login-subject:'+eid:     u(user.login),
    83             'login-subject:'+eid:     u(user.login),
    84             'surname-subject:'+eid: u'Th\xe9nault',
    84             'surname-subject:'+eid: u'Th\xe9nault',
    85             'firstname-subject:'+eid:   u'Sylvain',
    85             'firstname-subject:'+eid:   u'Sylvain',
    86             'in_group-subject:'+eid:  groups,
    86             'in_group-subject:'+eid:  groups,
    87             }
    87             }
    98         cnx = self.login('user')
    98         cnx = self.login('user')
    99         eid = u(user.eid)
    99         eid = u(user.eid)
   100         req.form = {
   100         req.form = {
   101             'eid': eid, '__maineid' : eid,
   101             'eid': eid, '__maineid' : eid,
   102             '__type:'+eid: 'CWUser',
   102             '__type:'+eid: 'CWUser',
   103             '_cw_edited_fields:'+eid: 'upassword-subject',
   103             '_cw_entity_fields:'+eid: 'upassword-subject',
   104             'upassword-subject:'+eid: 'tournicoton',
   104             'upassword-subject:'+eid: 'tournicoton',
   105             'upassword-subject-confirm:'+eid: 'tournicoton',
   105             'upassword-subject-confirm:'+eid: 'tournicoton',
   106             }
   106             }
   107         path, params = self.expect_redirect_publish(req, 'edit')
   107         path, params = self.expect_redirect_publish(req, 'edit')
   108         cnx.commit() # commit to check we don't get late validation error for instance
   108         cnx.commit() # commit to check we don't get late validation error for instance
   118         req = self.request()
   118         req = self.request()
   119         eid = u(user.eid)
   119         eid = u(user.eid)
   120         req.form = {
   120         req.form = {
   121             'eid':       eid,
   121             'eid':       eid,
   122             '__type:'+eid:    'CWUser',
   122             '__type:'+eid:    'CWUser',
   123             '_cw_edited_fields:'+eid: 'login-subject,firstname-subject,surname-subject',
   123             '_cw_entity_fields:'+eid: 'login-subject,firstname-subject,surname-subject',
   124             'login-subject:'+eid:     u(user.login),
   124             'login-subject:'+eid:     u(user.login),
   125             'firstname-subject:'+eid: u'Th\xe9nault',
   125             'firstname-subject:'+eid: u'Th\xe9nault',
   126             'surname-subject:'+eid:   u'Sylvain',
   126             'surname-subject:'+eid:   u'Sylvain',
   127             }
   127             }
   128         path, params = self.expect_redirect_publish(req, 'edit')
   128         path, params = self.expect_redirect_publish(req, 'edit')
   138         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   138         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   139         req = self.request()
   139         req = self.request()
   140         req.form = {'eid': ['X', 'Y'], '__maineid' : 'X',
   140         req.form = {'eid': ['X', 'Y'], '__maineid' : 'X',
   141 
   141 
   142                     '__type:X': 'CWUser',
   142                     '__type:X': 'CWUser',
   143                     '_cw_edited_fields:X': 'login-subject,upassword-subject,surname-subject,in_group-subject',
   143                     '_cw_entity_fields:X': 'login-subject,upassword-subject,surname-subject,in_group-subject',
   144                     'login-subject:X': u'adim',
   144                     'login-subject:X': u'adim',
   145                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   145                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   146                     'surname-subject:X': u'Di Mascio',
   146                     'surname-subject:X': u'Di Mascio',
   147                     'in_group-subject:X': u(gueid),
   147                     'in_group-subject:X': u(gueid),
   148 
   148 
   149                     '__type:Y': 'EmailAddress',
   149                     '__type:Y': 'EmailAddress',
   150                     '_cw_edited_fields:Y': 'address-subject,use_email-object',
   150                     '_cw_entity_fields:Y': 'address-subject,use_email-object',
   151                     'address-subject:Y': u'dima@logilab.fr',
   151                     'address-subject:Y': u'dima@logilab.fr',
   152                     'use_email-object:Y': 'X',
   152                     'use_email-object:Y': 'X',
   153                     }
   153                     }
   154         path, params = self.expect_redirect_publish(req, 'edit')
   154         path, params = self.expect_redirect_publish(req, 'edit')
   155         # should be redirected on the created person
   155         # should be redirected on the created person
   163         req = self.request()
   163         req = self.request()
   164         peid = u(self.create_user(req, 'adim').eid)
   164         peid = u(self.create_user(req, 'adim').eid)
   165         req.form = {'eid': [peid, 'Y'], '__maineid': peid,
   165         req.form = {'eid': [peid, 'Y'], '__maineid': peid,
   166 
   166 
   167                     '__type:'+peid: u'CWUser',
   167                     '__type:'+peid: u'CWUser',
   168                     '_cw_edited_fields:'+peid: u'surname-subject',
   168                     '_cw_entity_fields:'+peid: u'surname-subject',
   169                     'surname-subject:'+peid: u'Di Masci',
   169                     'surname-subject:'+peid: u'Di Masci',
   170 
   170 
   171                     '__type:Y': u'EmailAddress',
   171                     '__type:Y': u'EmailAddress',
   172                     '_cw_edited_fields:Y': u'address-subject,use_email-object',
   172                     '_cw_entity_fields:Y': u'address-subject,use_email-object',
   173                     'address-subject:Y': u'dima@logilab.fr',
   173                     'address-subject:Y': u'dima@logilab.fr',
   174                     'use_email-object:Y': peid,
   174                     'use_email-object:Y': peid,
   175                     }
   175                     }
   176         path, params = self.expect_redirect_publish(req, 'edit')
   176         path, params = self.expect_redirect_publish(req, 'edit')
   177         # should be redirected on the created person
   177         # should be redirected on the created person
   183         emaileid = u(email.eid)
   183         emaileid = u(email.eid)
   184         req = self.request()
   184         req = self.request()
   185         req.form = {'eid': [peid, emaileid],
   185         req.form = {'eid': [peid, emaileid],
   186 
   186 
   187                     '__type:'+peid: u'CWUser',
   187                     '__type:'+peid: u'CWUser',
   188                     '_cw_edited_fields:'+peid: u'surname-subject',
   188                     '_cw_entity_fields:'+peid: u'surname-subject',
   189                     'surname-subject:'+peid: u'Di Masci',
   189                     'surname-subject:'+peid: u'Di Masci',
   190 
   190 
   191                     '__type:'+emaileid: u'EmailAddress',
   191                     '__type:'+emaileid: u'EmailAddress',
   192                     '_cw_edited_fields:'+emaileid: u'address-subject,use_email-object',
   192                     '_cw_entity_fields:'+emaileid: u'address-subject,use_email-object',
   193                     'address-subject:'+emaileid: u'adim@logilab.fr',
   193                     'address-subject:'+emaileid: u'adim@logilab.fr',
   194                     'use_email-object:'+emaileid: peid,
   194                     'use_email-object:'+emaileid: peid,
   195                     }
   195                     }
   196         path, params = self.expect_redirect_publish(req, 'edit')
   196         path, params = self.expect_redirect_publish(req, 'edit')
   197         email.clear_all_caches()
   197         email.cw_clear_all_caches()
   198         self.assertEqual(email.address, 'adim@logilab.fr')
   198         self.assertEqual(email.address, 'adim@logilab.fr')
   199 
   199 
   200 
   200 
   201     def test_password_confirm(self):
   201     def test_password_confirm(self):
   202         """test creation of two linked entities
   202         """test creation of two linked entities
   203         """
   203         """
   204         user = self.user()
   204         user = self.user()
   205         req = self.request()
   205         req = self.request()
   206         req.form = {'eid': 'X',
   206         req.form = {'eid': 'X',
   207                     '__cloned_eid:X': u(user.eid), '__type:X': 'CWUser',
   207                     '__cloned_eid:X': u(user.eid), '__type:X': 'CWUser',
   208                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   208                     '_cw_entity_fields:X': 'login-subject,upassword-subject',
   209                     'login-subject:X': u'toto',
   209                     'login-subject:X': u'toto',
   210                     'upassword-subject:X': u'toto',
   210                     'upassword-subject:X': u'toto',
   211                     }
   211                     }
   212         with self.assertRaises(ValidationError) as cm:
   212         with self.assertRaises(ValidationError) as cm:
   213             self.ctrl_publish(req)
   213             self.ctrl_publish(req)
   214         self.assertEqual(cm.exception.errors, {'upassword-subject': u'password and confirmation don\'t match'})
   214         self.assertEqual(cm.exception.errors, {'upassword-subject': u'password and confirmation don\'t match'})
   215         req = self.request()
   215         req = self.request()
   216         req.form = {'__cloned_eid:X': u(user.eid),
   216         req.form = {'__cloned_eid:X': u(user.eid),
   217                     'eid': 'X', '__type:X': 'CWUser',
   217                     'eid': 'X', '__type:X': 'CWUser',
   218                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   218                     '_cw_entity_fields:X': 'login-subject,upassword-subject',
   219                     'login-subject:X': u'toto',
   219                     'login-subject:X': u'toto',
   220                     'upassword-subject:X': u'toto',
   220                     'upassword-subject:X': u'toto',
   221                     'upassword-subject-confirm:X': u'tutu',
   221                     'upassword-subject-confirm:X': u'tutu',
   222                     }
   222                     }
   223         with self.assertRaises(ValidationError) as cm:
   223         with self.assertRaises(ValidationError) as cm:
   230                             {'data': Binary('yo')})[0][0]
   230                             {'data': Binary('yo')})[0][0]
   231         self.commit()
   231         self.commit()
   232         req = self.request(rollbackfirst=True)
   232         req = self.request(rollbackfirst=True)
   233         req.form = {'eid': ['X'],
   233         req.form = {'eid': ['X'],
   234                     '__type:X': 'Salesterm',
   234                     '__type:X': 'Salesterm',
   235                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   235                     '_cw_entity_fields:X': 'amount-subject,described_by_test-subject',
   236                     'amount-subject:X': u'-10',
   236                     'amount-subject:X': u'-10',
   237                     'described_by_test-subject:X': u(feid),
   237                     'described_by_test-subject:X': u(feid),
   238                 }
   238                 }
   239         with self.assertRaises(ValidationError) as cm:
   239         with self.assertRaises(ValidationError) as cm:
   240             self.ctrl_publish(req)
   240             self.ctrl_publish(req)
   241         self.assertEqual(cm.exception.errors, {'amount-subject': 'value must be >= 0'})
   241         self.assertEqual(cm.exception.errors, {'amount-subject': 'value -10 must be >= 0'})
   242         req = self.request(rollbackfirst=True)
   242         req = self.request(rollbackfirst=True)
   243         req.form = {'eid': ['X'],
   243         req.form = {'eid': ['X'],
   244                     '__type:X': 'Salesterm',
   244                     '__type:X': 'Salesterm',
   245                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   245                     '_cw_entity_fields:X': 'amount-subject,described_by_test-subject',
   246                     'amount-subject:X': u'110',
   246                     'amount-subject:X': u'110',
   247                     'described_by_test-subject:X': u(feid),
   247                     'described_by_test-subject:X': u(feid),
   248                     }
   248                     }
   249         with self.assertRaises(ValidationError) as cm:
   249         with self.assertRaises(ValidationError) as cm:
   250             self.ctrl_publish(req)
   250             self.ctrl_publish(req)
   251         self.assertEqual(cm.exception.errors, {'amount-subject': 'value must be <= 100'})
   251         self.assertEqual(cm.exception.errors, {'amount-subject': 'value 110 must be <= 100'})
   252         req = self.request(rollbackfirst=True)
   252         req = self.request(rollbackfirst=True)
   253         req.form = {'eid': ['X'],
   253         req.form = {'eid': ['X'],
   254                     '__type:X': 'Salesterm',
   254                     '__type:X': 'Salesterm',
   255                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   255                     '_cw_entity_fields:X': 'amount-subject,described_by_test-subject',
   256                     'amount-subject:X': u'10',
   256                     'amount-subject:X': u'10',
   257                     'described_by_test-subject:X': u(feid),
   257                     'described_by_test-subject:X': u(feid),
   258                     }
   258                     }
   259         self.expect_redirect_publish(req, 'edit')
   259         self.expect_redirect_publish(req, 'edit')
   260         # should be redirected on the created
   260         # should be redirected on the created
   296     def test_redirect_apply_button(self):
   296     def test_redirect_apply_button(self):
   297         redirectrql = rql_for_eid(4012) # whatever
   297         redirectrql = rql_for_eid(4012) # whatever
   298         req = self.request()
   298         req = self.request()
   299         req.form = {
   299         req.form = {
   300             'eid': 'A', '__maineid' : 'A',
   300             'eid': 'A', '__maineid' : 'A',
   301             '__type:A': 'BlogEntry', '_cw_edited_fields:A': 'content-subject,title-subject',
   301             '__type:A': 'BlogEntry', '_cw_entity_fields:A': 'content-subject,title-subject',
   302             'content-subject:A': u'"13:03:43"',
   302             'content-subject:A': u'"13:03:43"',
   303             'title-subject:A': u'huuu',
   303             'title-subject:A': u'huuu',
   304             '__redirectrql': redirectrql,
   304             '__redirectrql': redirectrql,
   305             '__redirectvid': 'primary',
   305             '__redirectvid': 'primary',
   306             '__redirectparams': 'toto=tutu&tata=titi',
   306             '__redirectparams': 'toto=tutu&tata=titi',
   319     def test_redirect_ok_button(self):
   319     def test_redirect_ok_button(self):
   320         redirectrql = rql_for_eid(4012) # whatever
   320         redirectrql = rql_for_eid(4012) # whatever
   321         req = self.request()
   321         req = self.request()
   322         req.form = {
   322         req.form = {
   323             'eid': 'A', '__maineid' : 'A',
   323             'eid': 'A', '__maineid' : 'A',
   324             '__type:A': 'BlogEntry', '_cw_edited_fields:A': 'content-subject,title-subject',
   324             '__type:A': 'BlogEntry', '_cw_entity_fields:A': 'content-subject,title-subject',
   325             'content-subject:A': u'"13:03:43"',
   325             'content-subject:A': u'"13:03:43"',
   326             'title-subject:A': u'huuu',
   326             'title-subject:A': u'huuu',
   327             '__redirectrql': redirectrql,
   327             '__redirectrql': redirectrql,
   328             '__redirectvid': 'primary',
   328             '__redirectvid': 'primary',
   329             '__redirectparams': 'toto=tutu&tata=titi',
   329             '__redirectparams': 'toto=tutu&tata=titi',
   375         cwetypeeid = u(cwetypeeid)
   375         cwetypeeid = u(cwetypeeid)
   376         req = self.request()
   376         req = self.request()
   377         req.form = {
   377         req.form = {
   378             'eid':      cwetypeeid,
   378             'eid':      cwetypeeid,
   379             '__type:'+cwetypeeid:  'CWEType',
   379             '__type:'+cwetypeeid:  'CWEType',
   380             '_cw_edited_fields:'+cwetypeeid: 'name-subject,final-subject,description-subject,read_permission-subject',
   380             '_cw_entity_fields:'+cwetypeeid: 'name-subject,final-subject,description-subject,read_permission-subject',
   381             'name-subject:'+cwetypeeid:     u'CWEType',
   381             'name-subject:'+cwetypeeid:     u'CWEType',
   382             'final-subject:'+cwetypeeid:    '',
   382             'final-subject:'+cwetypeeid:    '',
   383             'description-subject:'+cwetypeeid:     u'users group',
   383             'description-subject:'+cwetypeeid:     u'users group',
   384             'read_permission-subject:'+cwetypeeid:  groups,
   384             'read_permission-subject:'+cwetypeeid:  groups,
   385             }
   385             }
   399         this seems to be postgres (tsearch?) specific
   399         this seems to be postgres (tsearch?) specific
   400         """
   400         """
   401         req = self.request()
   401         req = self.request()
   402         req.form = {
   402         req.form = {
   403             'eid': 'A', '__maineid' : 'A',
   403             'eid': 'A', '__maineid' : 'A',
   404             '__type:A': 'BlogEntry', '_cw_edited_fields:A': 'title-subject,content-subject',
   404             '__type:A': 'BlogEntry', '_cw_entity_fields:A': 'title-subject,content-subject',
   405             'title-subject:A': u'"13:03:40"',
   405             'title-subject:A': u'"13:03:40"',
   406             'content-subject:A': u'"13:03:43"',}
   406             'content-subject:A': u'"13:03:43"',}
   407         path, params = self.expect_redirect_publish(req, 'edit')
   407         path, params = self.expect_redirect_publish(req, 'edit')
   408         self.failUnless(path.startswith('blogentry/'))
   408         self.failUnless(path.startswith('blogentry/'))
   409         eid = path.split('/')[1]
   409         eid = path.split('/')[1]
   416         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   416         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   417         req = self.request()
   417         req = self.request()
   418         req.form = {'eid': ['X', 'Y'],
   418         req.form = {'eid': ['X', 'Y'],
   419 
   419 
   420                     '__type:X': 'CWUser',
   420                     '__type:X': 'CWUser',
   421                     '_cw_edited_fields:X': 'login-subject,upassword-subject,in_group-subject',
   421                     '_cw_entity_fields:X': 'login-subject,upassword-subject,in_group-subject',
   422                     'login-subject:X': u'adim',
   422                     'login-subject:X': u'adim',
   423                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   423                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   424                     'in_group-subject:X': `gueid`,
   424                     'in_group-subject:X': `gueid`,
   425 
   425 
   426                     '__type:Y': 'EmailAddress',
   426                     '__type:Y': 'EmailAddress',
   427                     '_cw_edited_fields:Y': 'address-subject,alias-subject,use_email-object',
   427                     '_cw_entity_fields:Y': 'address-subject,alias-subject,use_email-object',
   428                     'address-subject:Y': u'',
   428                     'address-subject:Y': u'',
   429                     'alias-subject:Y': u'',
   429                     'alias-subject:Y': u'',
   430                     'use_email-object:Y': 'X',
   430                     'use_email-object:Y': 'X',
   431                     }
   431                     }
   432         with self.assertRaises(ValidationError) as cm:
   432         with self.assertRaises(ValidationError) as cm:
   436     def test_nonregr_copy(self):
   436     def test_nonregr_copy(self):
   437         user = self.user()
   437         user = self.user()
   438         req = self.request()
   438         req = self.request()
   439         req.form = {'__maineid' : 'X', 'eid': 'X',
   439         req.form = {'__maineid' : 'X', 'eid': 'X',
   440                     '__cloned_eid:X': user.eid, '__type:X': 'CWUser',
   440                     '__cloned_eid:X': user.eid, '__type:X': 'CWUser',
   441                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   441                     '_cw_entity_fields:X': 'login-subject,upassword-subject',
   442                     'login-subject:X': u'toto',
   442                     'login-subject:X': u'toto',
   443                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   443                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   444                     }
   444                     }
   445         path, params = self.expect_redirect_publish(req, 'edit')
   445         path, params = self.expect_redirect_publish(req, 'edit')
   446         self.assertEqual(path, 'cwuser/toto')
   446         self.assertEqual(path, 'cwuser/toto')
   460             self.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s',
   460             self.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s',
   461                          {'p' : p.eid, 'e' : e.eid})
   461                          {'p' : p.eid, 'e' : e.eid})
   462             req = self.request()
   462             req = self.request()
   463             req.form = {'eid': 'X',
   463             req.form = {'eid': 'X',
   464                         '__cloned_eid:X': p.eid, '__type:X': 'CWUser',
   464                         '__cloned_eid:X': p.eid, '__type:X': 'CWUser',
   465                         '_cw_edited_fields:X': 'login-subject,surname-subject',
   465                         '_cw_entity_fields:X': 'login-subject,surname-subject',
   466                         'login-subject': u'dodo',
   466                         'login-subject': u'dodo',
   467                         'surname-subject:X': u'Boom',
   467                         'surname-subject:X': u'Boom',
   468                         '__errorurl' : "whatever but required",
   468                         '__errorurl' : "whatever but required",
   469                         }
   469                         }
   470             # try to emulate what really happens in the web application
   470             # try to emulate what really happens in the web application