web/test/unittest_views_basecontrollers.py
changeset 2773 b2530e3e0afb
parent 2661 f8df42c9da6b
child 3589 a5432f99f2d9
equal deleted inserted replaced
2767:58c519e5a31f 2773:b2530e3e0afb
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     7 """
     7 """
     8 import simplejson
     8 import simplejson
     9 
     9 
    10 from logilab.common.testlib import unittest_main, mock_object
    10 from logilab.common.testlib import unittest_main, mock_object
    11 from cubicweb.devtools.apptest import EnvBasedTC, ControllerTC
       
    12 
    11 
    13 from cubicweb import Binary, NoSelectableObject, ValidationError
    12 from cubicweb import Binary, NoSelectableObject, ValidationError
    14 from cubicweb.view import STRICT_DOCTYPE
    13 from cubicweb.view import STRICT_DOCTYPE
       
    14 from cubicweb.devtools.testlib import CubicWebTC
    15 from cubicweb.common.uilib import rql_for_eid
    15 from cubicweb.common.uilib import rql_for_eid
    16 
       
    17 from cubicweb.web import INTERNAL_FIELD_VALUE, Redirect, RequestError
    16 from cubicweb.web import INTERNAL_FIELD_VALUE, Redirect, RequestError
    18 
       
    19 from cubicweb.entities.authobjs import CWUser
    17 from cubicweb.entities.authobjs import CWUser
    20 
    18 
    21 
    19 
    22 class EditControllerTC(ControllerTC):
    20 class EditControllerTC(CubicWebTC):
    23     def setUp(self):
    21     def setUp(self):
    24         ControllerTC.setUp(self)
    22         CubicWebTC.setUp(self)
    25         self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read'))
    23         self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read'))
    26 
    24 
    27     def tearDown(self):
    25     def tearDown(self):
    28         ControllerTC.tearDown(self)
    26         CubicWebTC.tearDown(self)
    29         self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read'))
    27         self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read'))
    30 
    28 
    31     def test_noparam_edit(self):
    29     def test_noparam_edit(self):
    32         """check behaviour of this controller without any form parameter
    30         """check behaviour of this controller without any form parameter
    33         """
    31         """
    34 
    32         self.assertRaises(ValidationError, self.publish, self.request())
    35         self.req.form = {}
       
    36         self.assertRaises(ValidationError, self.publish, self.req)
       
    37 
    33 
    38     def test_validation_unique(self):
    34     def test_validation_unique(self):
    39         """test creation of two linked entities
    35         """test creation of two linked entities
    40         """
    36         """
    41         user = self.user()
    37         user = self.user()
    42         self.req.form = {'eid': 'X', '__type:X': 'CWUser',
    38         req = self.request()
    43                          'login:X': u'admin', 'edits-login:X': u'',
    39         req.form = {'eid': 'X', '__type:X': 'CWUser',
    44                          'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
    40                     'login:X': u'admin', 'edits-login:X': u'',
    45                          }
    41                     'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
    46         self.assertRaises(ValidationError, self.publish, self.req)
    42                     }
       
    43         self.assertRaises(ValidationError, self.publish, req)
    47 
    44 
    48 
    45 
    49     def test_user_editing_itself(self):
    46     def test_user_editing_itself(self):
    50         """checking that a manager user can edit itself
    47         """checking that a manager user can edit itself
    51         """
    48         """
    52         user = self.user()
    49         user = self.user()
    53         basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})]
    50         basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})]
    54         groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name in ("managers", "users")')]
    51         groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name in ("managers", "users")')]
    55         groups = [str(eid) for eid in groupeids]
    52         groups = [str(eid) for eid in groupeids]
    56         stateeid = [eid for eid, in self.execute('State S WHERE S name "activated"')][0]
    53         stateeid = [eid for eid, in self.execute('State S WHERE S name "activated"')][0]
    57         self.req.form = {
    54         req = self.request()
       
    55         req.form = {
    58             'eid':       `user.eid`,
    56             'eid':       `user.eid`,
    59             '__type:'+`user.eid`:    'CWUser',
    57             '__type:'+`user.eid`:    'CWUser',
    60             'login:'+`user.eid`:     unicode(user.login),
    58             'login:'+`user.eid`:     unicode(user.login),
    61             'firstname:'+`user.eid`: u'Th\xe9nault',
    59             'firstname:'+`user.eid`: u'Th\xe9nault',
    62             'surname:'+`user.eid`:   u'Sylvain',
    60             'surname:'+`user.eid`:   u'Sylvain',
    67             'edits-firstname:'+`user.eid`: u'',
    65             'edits-firstname:'+`user.eid`: u'',
    68             'edits-surname:'+`user.eid`:   u'',
    66             'edits-surname:'+`user.eid`:   u'',
    69             'edits-in_group:'+`user.eid`:  basegroups,
    67             'edits-in_group:'+`user.eid`:  basegroups,
    70             'edits-in_state:'+`user.eid`:  `stateeid`,
    68             'edits-in_state:'+`user.eid`:  `stateeid`,
    71             }
    69             }
    72         path, params = self.expect_redirect_publish()
    70         path, params = self.expect_redirect_publish(req)
    73         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}, 'x').get_entity(0, 0)
    71         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}, 'x').get_entity(0, 0)
    74         self.assertEquals(e.firstname, u'Th\xe9nault')
    72         self.assertEquals(e.firstname, u'Th\xe9nault')
    75         self.assertEquals(e.surname, u'Sylvain')
    73         self.assertEquals(e.surname, u'Sylvain')
    76         self.assertEquals(e.login, user.login)
    74         self.assertEquals(e.login, user.login)
    77         self.assertEquals([g.eid for g in e.in_group], groupeids)
    75         self.assertEquals([g.eid for g in e.in_group], groupeids)
    79 
    77 
    80     def test_user_can_change_its_password(self):
    78     def test_user_can_change_its_password(self):
    81         user = self.create_user('user')
    79         user = self.create_user('user')
    82         cnx = self.login('user')
    80         cnx = self.login('user')
    83         req = self.request()
    81         req = self.request()
    84         #self.assertEquals(self.ctrl.schema['CWUser']._groups['read'],
       
    85         #                  ('managers', 'users'))
       
    86         req.form = {
    82         req.form = {
    87             'eid': `user.eid`, '__type:'+`user.eid`: 'CWUser',
    83             'eid': `user.eid`, '__type:'+`user.eid`: 'CWUser',
    88             '__maineid' : str(user.eid),
    84             '__maineid' : str(user.eid),
    89             'upassword:'+`user.eid`: 'tournicoton',
    85             'upassword:'+`user.eid`: 'tournicoton',
    90             'upassword-confirm:'+`user.eid`: 'tournicoton',
    86             'upassword-confirm:'+`user.eid`: 'tournicoton',
    99         """checking we can edit an entity without specifying some required
    95         """checking we can edit an entity without specifying some required
   100         relations (meaning no changes)
    96         relations (meaning no changes)
   101         """
    97         """
   102         user = self.user()
    98         user = self.user()
   103         groupeids = [eid for eid, in self.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})]
    99         groupeids = [eid for eid, in self.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})]
   104         self.req.form = {
   100         req = self.request()
       
   101         req.form = {
   105             'eid':       `user.eid`,
   102             'eid':       `user.eid`,
   106             '__type:'+`user.eid`:    'CWUser',
   103             '__type:'+`user.eid`:    'CWUser',
   107             'login:'+`user.eid`:     unicode(user.login),
   104             'login:'+`user.eid`:     unicode(user.login),
   108             'firstname:'+`user.eid`: u'Th\xe9nault',
   105             'firstname:'+`user.eid`: u'Th\xe9nault',
   109             'surname:'+`user.eid`:   u'Sylvain',
   106             'surname:'+`user.eid`:   u'Sylvain',
   110             #
   107             #
   111             'edits-login:'+`user.eid`:     unicode(user.login),
   108             'edits-login:'+`user.eid`:     unicode(user.login),
   112             'edits-firstname:'+`user.eid`: u'',
   109             'edits-firstname:'+`user.eid`: u'',
   113             'edits-surname:'+`user.eid`:   u'',
   110             'edits-surname:'+`user.eid`:   u'',
   114             }
   111             }
   115         path, params = self.expect_redirect_publish()
   112         path, params = self.expect_redirect_publish(req)
   116         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}, 'x').get_entity(0, 0)
   113         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}, 'x').get_entity(0, 0)
   117         self.assertEquals(e.login, user.login)
   114         self.assertEquals(e.login, user.login)
   118         self.assertEquals(e.firstname, u'Th\xe9nault')
   115         self.assertEquals(e.firstname, u'Th\xe9nault')
   119         self.assertEquals(e.surname, u'Sylvain')
   116         self.assertEquals(e.surname, u'Sylvain')
   120         self.assertEquals([g.eid for g in e.in_group], groupeids)
   117         self.assertEquals([g.eid for g in e.in_group], groupeids)
   122         self.assertEquals([s.eid for s in e.in_state], stateeids)
   119         self.assertEquals([s.eid for s in e.in_state], stateeids)
   123 
   120 
   124 
   121 
   125     def test_create_multiple_linked(self):
   122     def test_create_multiple_linked(self):
   126         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   123         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   127         self.req.form = {'eid': ['X', 'Y'],
   124         req = self.request()
   128 
   125         req.form = {'eid': ['X', 'Y'],
   129                          '__type:X': 'CWUser',
   126 
   130                          '__maineid' : 'X',
   127                     '__type:X': 'CWUser',
   131                          'login:X': u'adim', 'edits-login:X': u'',
   128                     '__maineid' : 'X',
   132                          'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
   129                     'login:X': u'adim', 'edits-login:X': u'',
   133                          'surname:X': u'Di Mascio', 'edits-surname:X': '',
   130                     'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
   134 
   131                     'surname:X': u'Di Mascio', 'edits-surname:X': '',
   135                          'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE,
   132 
   136 
   133                     'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE,
   137                          '__type:Y': 'EmailAddress',
   134 
   138                          'address:Y': u'dima@logilab.fr', 'edits-address:Y': '',
   135                     '__type:Y': 'EmailAddress',
   139                          'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE,
   136                     'address:Y': u'dima@logilab.fr', 'edits-address:Y': '',
   140                          }
   137                     'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE,
   141         path, params = self.expect_redirect_publish()
   138                     }
       
   139         path, params = self.expect_redirect_publish(req)
   142         # should be redirected on the created person
   140         # should be redirected on the created person
   143         self.assertEquals(path, 'cwuser/adim')
   141         self.assertEquals(path, 'cwuser/adim')
   144         e = self.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0)
   142         e = self.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0)
   145         self.assertEquals(e.surname, 'Di Mascio')
   143         self.assertEquals(e.surname, 'Di Mascio')
   146         email = e.use_email[0]
   144         email = e.use_email[0]
   147         self.assertEquals(email.address, 'dima@logilab.fr')
   145         self.assertEquals(email.address, 'dima@logilab.fr')
   148 
   146 
   149     def test_edit_multiple_linked(self):
   147     def test_edit_multiple_linked(self):
   150         peid = self.create_user('adim').eid
   148         peid = self.create_user('adim').eid
   151         self.req.form = {'eid': [`peid`, 'Y'],
   149         req = self.request()
   152                          '__type:%s'%peid: 'CWUser',
   150         req.form = {'eid': [`peid`, 'Y'],
   153                          'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: '',
   151                     '__type:%s'%peid: 'CWUser',
   154 
   152                     'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: '',
   155                          '__type:Y': 'EmailAddress',
   153 
   156                          'address:Y': u'dima@logilab.fr', 'edits-address:Y': '',
   154                     '__type:Y': 'EmailAddress',
   157                          'use_email:%s'%peid: 'Y', 'edits-use_email:%s'%peid: INTERNAL_FIELD_VALUE,
   155                     'address:Y': u'dima@logilab.fr', 'edits-address:Y': '',
   158 
   156                     'use_email:%s'%peid: 'Y', 'edits-use_email:%s'%peid: INTERNAL_FIELD_VALUE,
   159                          '__redirectrql': 'Any X WHERE X eid %s'%peid,
   157 
   160                          }
   158                     '__redirectrql': 'Any X WHERE X eid %s'%peid,
   161         path, params = self.expect_redirect_publish()
   159                     }
       
   160         path, params = self.expect_redirect_publish(req)
   162         # should be redirected on the created person
   161         # should be redirected on the created person
   163         eid = params['rql'].split()[-1]
   162         eid = params['rql'].split()[-1]
   164         e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0)
   163         e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0)
   165         self.assertEquals(e.surname, 'Di Masci')
   164         self.assertEquals(e.surname, 'Di Masci')
   166         email = e.use_email[0]
   165         email = e.use_email[0]
   167         self.assertEquals(email.address, 'dima@logilab.fr')
   166         self.assertEquals(email.address, 'dima@logilab.fr')
   168 
   167 
   169         emaileid = email.eid
   168         emaileid = email.eid
   170         self.req.form = {'eid': [`peid`, `emaileid`],
   169         req = self.request()
       
   170         req.form = {'eid': [`peid`, `emaileid`],
   171                          '__type:%s'%peid: 'CWUser',
   171                          '__type:%s'%peid: 'CWUser',
   172                          'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: 'Di Masci',
   172                          'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: 'Di Masci',
   173                          '__type:%s'%emaileid: 'EmailAddress',
   173                          '__type:%s'%emaileid: 'EmailAddress',
   174                          'address:%s'%emaileid: u'adim@logilab.fr', 'edits-address:%s'%emaileid: 'dima@logilab.fr',
   174                          'address:%s'%emaileid: u'adim@logilab.fr', 'edits-address:%s'%emaileid: 'dima@logilab.fr',
   175                          'use_email:%s'%peid: `emaileid`, 'edits-use_email:%s'%peid: `emaileid`,
   175                          'use_email:%s'%peid: `emaileid`, 'edits-use_email:%s'%peid: `emaileid`,
   176                          '__redirectrql': 'Any X WHERE X eid %s'%peid,
   176                          '__redirectrql': 'Any X WHERE X eid %s'%peid,
   177                          }
   177                          }
   178         path, params = self.expect_redirect_publish()
   178         path, params = self.expect_redirect_publish(req)
   179         # should be redirected on the created person
   179         # should be redirected on the created person
   180         eid = params['rql'].split()[-1]
   180         eid = params['rql'].split()[-1]
   181         e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0)
   181         e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0)
   182         self.assertEquals(e.surname, 'Di Masci')
   182         self.assertEquals(e.surname, 'Di Masci')
   183         email = e.use_email[0]
   183         email = e.use_email[0]
   186 
   186 
   187     def test_password_confirm(self):
   187     def test_password_confirm(self):
   188         """test creation of two linked entities
   188         """test creation of two linked entities
   189         """
   189         """
   190         user = self.user()
   190         user = self.user()
   191         self.req.form = {'__cloned_eid:X': user.eid,
   191         req = self.request()
   192                          'eid': 'X', '__type:X': 'CWUser',
   192         req.form = {'__cloned_eid:X': user.eid,
   193                          'login:X': u'toto', 'edits-login:X': u'',
   193                     'eid': 'X', '__type:X': 'CWUser',
   194                          'upassword:X': u'toto', 'edits-upassword:X': u'',
   194                     'login:X': u'toto', 'edits-login:X': u'',
   195                          }
   195                     'upassword:X': u'toto', 'edits-upassword:X': u'',
   196         self.assertRaises(ValidationError, self.publish, self.req)
   196                     }
   197         self.req.form = {'__cloned_eid:X': user.eid,
   197         self.assertRaises(ValidationError, self.publish, req)
   198                          'eid': 'X', '__type:X': 'CWUser',
   198         req = self.request()
   199                          'login:X': u'toto', 'edits-login:X': u'',
   199         req.form = {'__cloned_eid:X': user.eid,
   200                          'upassword:X': u'toto', 'upassword-confirm:X': u'tutu', 'edits-upassword:X': u'',
   200                     'eid': 'X', '__type:X': 'CWUser',
   201                          }
   201                     'login:X': u'toto', 'edits-login:X': u'',
   202         self.assertRaises(ValidationError, self.publish, self.req)
   202                     'upassword:X': u'toto',
       
   203                     'upassword-confirm:X': u'tutu', 'edits-upassword:X': u'',
       
   204                     }
       
   205         self.assertRaises(ValidationError, self.publish, req)
   203 
   206 
   204 
   207 
   205     def test_interval_bound_constraint_success(self):
   208     def test_interval_bound_constraint_success(self):
   206         feid = self.execute('INSERT File X: X name "toto.txt", X data %(data)s',
   209         feid = self.execute('INSERT File X: X name "toto.txt", X data %(data)s',
   207                             {'data': Binary('yo')})[0][0]
   210                             {'data': Binary('yo')})[0][0]
   208         self.req.form = {'eid': ['X'],
   211         req = self.request()
   209                          '__type:X': 'Salesterm',
   212         req.form = {'eid': ['X'],
   210                          'amount:X': u'-10', 'edits-amount:X': '',
   213                     '__type:X': 'Salesterm',
   211                          'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE,
   214                     'amount:X': u'-10', 'edits-amount:X': '',
   212                          }
   215                     'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE,
   213         self.assertRaises(ValidationError, self.publish, self.req)
   216                 }
   214         self.req.form = {'eid': ['X'],
   217         self.assertRaises(ValidationError, self.publish, req)
   215                          '__type:X': 'Salesterm',
   218         req = self.request()
   216                          'amount:X': u'110', 'edits-amount:X': '',
   219         req.form = {'eid': ['X'],
   217                          'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE,
   220                     '__type:X': 'Salesterm',
   218                          }
   221                     'amount:X': u'110', 'edits-amount:X': '',
   219         self.assertRaises(ValidationError, self.publish, self.req)
   222                     'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE,
   220         self.req.form = {'eid': ['X'],
   223                     }
   221                          '__type:X': 'Salesterm',
   224         self.assertRaises(ValidationError, self.publish, req)
   222                          'amount:X': u'10', 'edits-amount:X': '',
   225         req = self.request()
   223                          'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE,
   226         req.form = {'eid': ['X'],
   224                          }
   227                     '__type:X': 'Salesterm',
   225         self.expect_redirect_publish()
   228                     'amount:X': u'10', 'edits-amount:X': '',
       
   229                     'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE,
       
   230                     }
       
   231         self.expect_redirect_publish(req)
   226         # should be redirected on the created
   232         # should be redirected on the created
   227         #eid = params['rql'].split()[-1]
   233         #eid = params['rql'].split()[-1]
   228         e = self.execute('Salesterm X').get_entity(0, 0)
   234         e = self.execute('Salesterm X').get_entity(0, 0)
   229         self.assertEquals(e.amount, 10)
   235         self.assertEquals(e.amount, 10)
   230 
   236 
   231     def test_req_pending_insert(self):
   237     def test_req_pending_insert(self):
   232         """make sure req's pending insertions are taken into account"""
   238         """make sure req's pending insertions are taken into account"""
   233         tmpgroup = self.add_entity('CWGroup', name=u"test")
   239         tmpgroup = self.add_entity('CWGroup', name=u"test")
   234         user = self.user()
   240         user = self.user()
   235         self.req.set_session_data('pending_insert', set([(user.eid, 'in_group', tmpgroup.eid)]))
   241         req = self.request()
   236         path, params = self.expect_redirect_publish()
   242         req.set_session_data('pending_insert', set([(user.eid, 'in_group', tmpgroup.eid)]))
       
   243         path, params = self.expect_redirect_publish(req)
   237         usergroups = [gname for gname, in
   244         usergroups = [gname for gname, in
   238                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   245                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   239         self.assertUnorderedIterableEquals(usergroups, ['managers', 'test'])
   246         self.assertUnorderedIterableEquals(usergroups, ['managers', 'test'])
   240         self.assertEquals(self.req.get_pending_inserts(), [])
   247         self.assertEquals(req.get_pending_inserts(), [])
   241 
   248 
   242 
   249 
   243     def test_req_pending_delete(self):
   250     def test_req_pending_delete(self):
   244         """make sure req's pending deletions are taken into account"""
   251         """make sure req's pending deletions are taken into account"""
   245         user = self.user()
   252         user = self.user()
   248         usergroups = [gname for gname, in
   255         usergroups = [gname for gname, in
   249                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   256                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   250         # just make sure everything was set correctly
   257         # just make sure everything was set correctly
   251         self.assertUnorderedIterableEquals(usergroups, ['managers', 'test'])
   258         self.assertUnorderedIterableEquals(usergroups, ['managers', 'test'])
   252         # now try to delete the relation
   259         # now try to delete the relation
   253         self.req.set_session_data('pending_delete', set([(user.eid, 'in_group', groupeid)]))
   260         req = self.request()
   254         path, params = self.expect_redirect_publish()
   261         req.set_session_data('pending_delete', set([(user.eid, 'in_group', groupeid)]))
       
   262         path, params = self.expect_redirect_publish(req)
   255         usergroups = [gname for gname, in
   263         usergroups = [gname for gname, in
   256                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   264                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   257         self.assertUnorderedIterableEquals(usergroups, ['managers'])
   265         self.assertUnorderedIterableEquals(usergroups, ['managers'])
   258         self.assertEquals(self.req.get_pending_deletes(), [])
   266         self.assertEquals(req.get_pending_deletes(), [])
   259 
   267 
   260     def test_custom_attribute_handler(self):
   268     def test_custom_attribute_handler(self):
   261         def custom_login_edit(self, formparams, value, relations):
   269         def custom_login_edit(self, formparams, value, relations):
   262             formparams['login'] = value.upper()
   270             formparams['login'] = value.upper()
   263             relations.append('X login %(login)s')
   271             relations.append('X login %(login)s')
   264         CWUser.custom_login_edit = custom_login_edit
   272         CWUser.custom_login_edit = custom_login_edit
   265         try:
   273         try:
   266             user = self.user()
   274             user = self.user()
   267             eid = repr(user.eid)
   275             eid = repr(user.eid)
   268             self.req.form = {
   276             req = self.request()
       
   277             req.form = {
   269                 'eid': eid,
   278                 'eid': eid,
   270                 '__type:'+eid:  'CWUser',
   279                 '__type:'+eid:  'CWUser',
   271                 'login:'+eid: u'foo',
   280                 'login:'+eid: u'foo',
   272                 'edits-login:'+eid:  unicode(user.login),
   281                 'edits-login:'+eid:  unicode(user.login),
   273                 }
   282                 }
   274             path, params = self.expect_redirect_publish()
   283             path, params = self.expect_redirect_publish(req)
   275             rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x')
   284             rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x')
   276             self.assertEquals(rset[0][0], 'FOO')
   285             self.assertEquals(rset[0][0], 'FOO')
   277         finally:
   286         finally:
   278             del CWUser.custom_login_edit
   287             del CWUser.custom_login_edit
   279 
   288 
   280     def test_redirect_apply_button(self):
   289     def test_redirect_apply_button(self):
   281         redirectrql = rql_for_eid(4012) # whatever
   290         redirectrql = rql_for_eid(4012) # whatever
   282         self.req.form = {
   291         req = self.request()
   283                          'eid': 'A', '__type:A': 'BlogEntry',
   292         req.form = {
   284                          '__maineid' : 'A',
   293             'eid': 'A', '__type:A': 'BlogEntry',
   285                          'content:A': u'"13:03:43"', 'edits-content:A': '',
   294             '__maineid' : 'A',
   286                          'title:A': u'huuu', 'edits-title:A': '',
   295             'content:A': u'"13:03:43"', 'edits-content:A': '',
   287                          '__redirectrql': redirectrql,
   296             'title:A': u'huuu', 'edits-title:A': '',
   288                          '__redirectvid': 'primary',
   297             '__redirectrql': redirectrql,
   289                          '__redirectparams': 'toto=tutu&tata=titi',
   298             '__redirectvid': 'primary',
   290                          '__form_id': 'edition',
   299             '__redirectparams': 'toto=tutu&tata=titi',
   291                          '__action_apply': '',
   300             '__form_id': 'edition',
   292                          }
   301             '__action_apply': '',
   293         path, params = self.expect_redirect_publish()
   302             }
       
   303         path, params = self.expect_redirect_publish(req)
   294         self.failUnless(path.startswith('blogentry/'))
   304         self.failUnless(path.startswith('blogentry/'))
   295         eid = path.split('/')[1]
   305         eid = path.split('/')[1]
   296         self.assertEquals(params['vid'], 'edition')
   306         self.assertEquals(params['vid'], 'edition')
   297         self.assertNotEquals(int(eid), 4012)
   307         self.assertNotEquals(int(eid), 4012)
   298         self.assertEquals(params['__redirectrql'], redirectrql)
   308         self.assertEquals(params['__redirectrql'], redirectrql)
   299         self.assertEquals(params['__redirectvid'], 'primary')
   309         self.assertEquals(params['__redirectvid'], 'primary')
   300         self.assertEquals(params['__redirectparams'], 'toto=tutu&tata=titi')
   310         self.assertEquals(params['__redirectparams'], 'toto=tutu&tata=titi')
   301 
   311 
   302     def test_redirect_ok_button(self):
   312     def test_redirect_ok_button(self):
   303         redirectrql = rql_for_eid(4012) # whatever
   313         redirectrql = rql_for_eid(4012) # whatever
   304         self.req.form = {
   314         req = self.request()
   305                          'eid': 'A', '__type:A': 'BlogEntry',
   315         req.form = {
   306                          '__maineid' : 'A',
   316             'eid': 'A', '__type:A': 'BlogEntry',
   307                          'content:A': u'"13:03:43"', 'edits-content:A': '',
   317             '__maineid' : 'A',
   308                          'title:A': u'huuu', 'edits-title:A': '',
   318             'content:A': u'"13:03:43"', 'edits-content:A': '',
   309                          '__redirectrql': redirectrql,
   319             'title:A': u'huuu', 'edits-title:A': '',
   310                          '__redirectvid': 'primary',
   320             '__redirectrql': redirectrql,
   311                          '__redirectparams': 'toto=tutu&tata=titi',
   321             '__redirectvid': 'primary',
   312                          '__form_id': 'edition',
   322             '__redirectparams': 'toto=tutu&tata=titi',
   313                          }
   323             '__form_id': 'edition',
   314         path, params = self.expect_redirect_publish()
   324             }
       
   325         path, params = self.expect_redirect_publish(req)
   315         self.assertEquals(path, 'view')
   326         self.assertEquals(path, 'view')
   316         self.assertEquals(params['rql'], redirectrql)
   327         self.assertEquals(params['rql'], redirectrql)
   317         self.assertEquals(params['vid'], 'primary')
   328         self.assertEquals(params['vid'], 'primary')
   318         self.assertEquals(params['tata'], 'titi')
   329         self.assertEquals(params['tata'], 'titi')
   319         self.assertEquals(params['toto'], 'tutu')
   330         self.assertEquals(params['toto'], 'tutu')
   320 
   331 
   321     def test_redirect_delete_button(self):
   332     def test_redirect_delete_button(self):
   322         eid = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid
   333         eid = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid
   323         self.req.form = {'eid': str(eid), '__type:%s'%eid: 'BlogEntry',
   334         req = self.request()
   324                          '__action_delete': ''}
   335         req.form = {'eid': str(eid), '__type:%s'%eid: 'BlogEntry',
   325         path, params = self.expect_redirect_publish()
   336                     '__action_delete': ''}
       
   337         path, params = self.expect_redirect_publish(req)
   326         self.assertEquals(path, 'blogentry')
   338         self.assertEquals(path, 'blogentry')
   327         self.assertEquals(params, {u'__message': u'entity deleted'})
   339         self.assertEquals(params, {u'__message': u'entity deleted'})
   328         eid = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid
   340         eid = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid
   329         self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s',
   341         self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s',
   330                      {'x': self.session().user.eid, 'e': eid}, 'x')
   342                      {'x': self.session.user.eid, 'e': eid}, 'x')
   331         self.commit()
   343         self.commit()
   332         self.req.form = {'eid': str(eid), '__type:%s'%eid: 'EmailAddress',
   344         req = self.request()
   333                          '__action_delete': ''}
   345         req.form = {'eid': str(eid), '__type:%s'%eid: 'EmailAddress',
   334         path, params = self.expect_redirect_publish()
   346                     '__action_delete': ''}
       
   347         path, params = self.expect_redirect_publish(req)
   335         self.assertEquals(path, 'cwuser/admin')
   348         self.assertEquals(path, 'cwuser/admin')
   336         self.assertEquals(params, {u'__message': u'entity deleted'})
   349         self.assertEquals(params, {u'__message': u'entity deleted'})
   337         eid1 = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid
   350         eid1 = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid
   338         eid2 = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid
   351         eid2 = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid
   339         self.req.form = {'eid': [str(eid1), str(eid2)],
   352         req = self.request()
   340                          '__type:%s'%eid1: 'BlogEntry',
   353         req.form = {'eid': [str(eid1), str(eid2)],
   341                          '__type:%s'%eid2: 'EmailAddress',
   354                     '__type:%s'%eid1: 'BlogEntry',
   342                          '__action_delete': ''}
   355                     '__type:%s'%eid2: 'EmailAddress',
   343         path, params = self.expect_redirect_publish()
   356                     '__action_delete': ''}
       
   357         path, params = self.expect_redirect_publish(req)
   344         self.assertEquals(path, 'view')
   358         self.assertEquals(path, 'view')
   345         self.assertEquals(params, {u'__message': u'entities deleted'})
   359         self.assertEquals(params, {u'__message': u'entities deleted'})
   346 
   360 
   347     def test_nonregr_egroup_etype_editing(self):
   361     def test_nonregr_egroup_etype_editing(self):
   348         """non-regression test checking that a manager user can edit a CWEType entity (CWGroup)
   362         """non-regression test checking that a manager user can edit a CWEType entity (CWGroup)
   349         """
   363         """
   350         groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name "managers"')]
   364         groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name "managers"')]
   351         groups = [str(eid) for eid in groupeids]
   365         groups = [str(eid) for eid in groupeids]
   352         eeetypeeid = self.execute('CWEType X WHERE X name "CWGroup"')[0][0]
   366         eeetypeeid = self.execute('CWEType X WHERE X name "CWGroup"')[0][0]
   353         basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X read_permission G, X eid %(x)s', {'x': eeetypeeid})]
   367         basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X read_permission G, X eid %(x)s', {'x': eeetypeeid})]
   354         self.req.form = {
   368         req = self.request()
   355                 'eid':      `eeetypeeid`,
   369         req.form = {
   356                 '__type:'+`eeetypeeid`:   'CWEType',
   370             'eid':      `eeetypeeid`,
   357                 'name:'+`eeetypeeid`:     u'CWGroup',
   371             '__type:'+`eeetypeeid`:   'CWEType',
   358                 'final:'+`eeetypeeid`:    False,
   372             'name:'+`eeetypeeid`:     u'CWGroup',
   359                 'meta:'+`eeetypeeid`:     True,
   373             'final:'+`eeetypeeid`:    False,
   360                 'description:'+`eeetypeeid`:     u'users group',
   374             'meta:'+`eeetypeeid`:     True,
   361                 'read_permission:'+`eeetypeeid`:  groups,
   375             'description:'+`eeetypeeid`:     u'users group',
   362                 #
   376             'read_permission:'+`eeetypeeid`:  groups,
   363                 'edits-name:'+`eeetypeeid`:     u'CWGroup',
   377             #
   364                 'edits-final:'+`eeetypeeid`:    False,
   378             'edits-name:'+`eeetypeeid`:     u'CWGroup',
   365                 'edits-meta:'+`eeetypeeid`:     True,
   379             'edits-final:'+`eeetypeeid`:    False,
   366                 'edits-description:'+`eeetypeeid`:     u'users group',
   380             'edits-meta:'+`eeetypeeid`:     True,
   367                 'edits-read_permission:'+`eeetypeeid`:  basegroups,
   381             'edits-description:'+`eeetypeeid`:     u'users group',
   368                 }
   382             'edits-read_permission:'+`eeetypeeid`:  basegroups,
       
   383             }
   369         try:
   384         try:
   370             path, params = self.expect_redirect_publish()
   385             path, params = self.expect_redirect_publish(req)
   371             e = self.execute('Any X WHERE X eid %(x)s', {'x': eeetypeeid}, 'x').get_entity(0, 0)
   386             e = self.execute('Any X WHERE X eid %(x)s', {'x': eeetypeeid}, 'x').get_entity(0, 0)
   372             self.assertEquals(e.name, 'CWGroup')
   387             self.assertEquals(e.name, 'CWGroup')
   373             self.assertEquals([g.eid for g in e.read_permission], groupeids)
   388             self.assertEquals([g.eid for g in e.read_permission], groupeids)
   374         finally:
   389         finally:
   375             # restore
   390             # restore
   381         """
   396         """
   382         groupeids = sorted(eid for eid, in self.execute('CWGroup G WHERE G name in ("managers", "users")'))
   397         groupeids = sorted(eid for eid, in self.execute('CWGroup G WHERE G name in ("managers", "users")'))
   383         groups = [str(eid) for eid in groupeids]
   398         groups = [str(eid) for eid in groupeids]
   384         eeetypeeid = self.execute('CWEType X WHERE X name "CWEType"')[0][0]
   399         eeetypeeid = self.execute('CWEType X WHERE X name "CWEType"')[0][0]
   385         basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X read_permission G, X eid %(x)s', {'x': eeetypeeid})]
   400         basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X read_permission G, X eid %(x)s', {'x': eeetypeeid})]
   386         self.req.form = {
   401         req = self.request()
   387                 'eid':      `eeetypeeid`,
   402         req.form = {
   388                 '__type:'+`eeetypeeid`:  'CWEType',
   403             'eid':      `eeetypeeid`,
   389                 'name:'+`eeetypeeid`:     u'CWEType',
   404             '__type:'+`eeetypeeid`:  'CWEType',
   390                 'final:'+`eeetypeeid`:    False,
   405             'name:'+`eeetypeeid`:     u'CWEType',
   391                 'meta:'+`eeetypeeid`:     True,
   406             'final:'+`eeetypeeid`:    False,
   392                 'description:'+`eeetypeeid`:     u'users group',
   407             'meta:'+`eeetypeeid`:     True,
   393                 'read_permission:'+`eeetypeeid`:  groups,
   408             'description:'+`eeetypeeid`:     u'users group',
   394 
   409             'read_permission:'+`eeetypeeid`:  groups,
   395                 'edits-name:'+`eeetypeeid`:     u'CWEType',
   410 
   396                 'edits-final:'+`eeetypeeid`:    False,
   411             'edits-name:'+`eeetypeeid`:     u'CWEType',
   397                 'edits-meta:'+`eeetypeeid`:     True,
   412             'edits-final:'+`eeetypeeid`:    False,
   398                 'edits-description:'+`eeetypeeid`:     u'users group',
   413             'edits-meta:'+`eeetypeeid`:     True,
   399                 'edits-read_permission:'+`eeetypeeid`:  basegroups,
   414             'edits-description:'+`eeetypeeid`:     u'users group',
   400                 }
   415             'edits-read_permission:'+`eeetypeeid`:  basegroups,
       
   416             }
   401         try:
   417         try:
   402             path, params = self.expect_redirect_publish()
   418             path, params = self.expect_redirect_publish(req)
   403             e = self.execute('Any X WHERE X eid %(x)s', {'x': eeetypeeid}, 'x').get_entity(0, 0)
   419             e = self.execute('Any X WHERE X eid %(x)s', {'x': eeetypeeid}, 'x').get_entity(0, 0)
   404             self.assertEquals(e.name, 'CWEType')
   420             self.assertEquals(e.name, 'CWEType')
   405             self.assertEquals(sorted(g.eid for g in e.read_permission), groupeids)
   421             self.assertEquals(sorted(g.eid for g in e.read_permission), groupeids)
   406         finally:
   422         finally:
   407             # restore
   423             # restore
   411     def test_nonregr_strange_text_input(self):
   427     def test_nonregr_strange_text_input(self):
   412         """non-regression test checking text input containing "13:03:43"
   428         """non-regression test checking text input containing "13:03:43"
   413 
   429 
   414         this seems to be postgres (tsearch?) specific
   430         this seems to be postgres (tsearch?) specific
   415         """
   431         """
   416         self.req.form = {
   432         req = self.request()
   417                          'eid': 'A', '__type:A': 'BlogEntry',
   433         req.form = {
   418                          '__maineid' : 'A',
   434             'eid': 'A', '__type:A': 'BlogEntry',
   419                          'title:A': u'"13:03:40"', 'edits-title:A': '',
   435             '__maineid' : 'A',
   420                          'content:A': u'"13:03:43"', 'edits-content:A': ''}
   436             'title:A': u'"13:03:40"', 'edits-title:A': '',
   421         path, params = self.expect_redirect_publish()
   437             'content:A': u'"13:03:43"', 'edits-content:A': ''}
       
   438         path, params = self.expect_redirect_publish(req)
   422         self.failUnless(path.startswith('blogentry/'))
   439         self.failUnless(path.startswith('blogentry/'))
   423         eid = path.split('/')[1]
   440         eid = path.split('/')[1]
   424         e = self.execute('Any C, T WHERE C eid %(x)s, C content T', {'x': eid}, 'x').get_entity(0, 0)
   441         e = self.execute('Any C, T WHERE C eid %(x)s, C content T', {'x': eid}, 'x').get_entity(0, 0)
   425         self.assertEquals(e.title, '"13:03:40"')
   442         self.assertEquals(e.title, '"13:03:40"')
   426         self.assertEquals(e.content, '"13:03:43"')
   443         self.assertEquals(e.content, '"13:03:43"')
   427 
   444 
   428 
   445 
   429     def test_nonregr_multiple_empty_email_addr(self):
   446     def test_nonregr_multiple_empty_email_addr(self):
   430         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   447         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   431         self.req.form = {'eid': ['X', 'Y'],
   448         req = self.request()
   432 
   449         req.form = {'eid': ['X', 'Y'],
   433                          '__type:X': 'CWUser',
   450 
   434                          'login:X': u'adim', 'edits-login:X': u'',
   451                     '__type:X': 'CWUser',
   435                          'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
   452                     'login:X': u'adim', 'edits-login:X': u'',
   436                          'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE,
   453                     'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
   437 
   454                     'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE,
   438                          '__type:Y': 'EmailAddress',
   455 
   439                          'address:Y': u'', 'edits-address:Y': '',
   456                     '__type:Y': 'EmailAddress',
   440                          'alias:Y': u'', 'edits-alias:Y': '',
   457                     'address:Y': u'', 'edits-address:Y': '',
   441                          'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE,
   458                     'alias:Y': u'', 'edits-alias:Y': '',
   442                          }
   459                     'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE,
   443         self.assertRaises(ValidationError, self.publish, self.req)
   460                     }
       
   461         self.assertRaises(ValidationError, self.publish, req)
   444 
   462 
   445     def test_nonregr_copy(self):
   463     def test_nonregr_copy(self):
   446         user = self.user()
   464         user = self.user()
   447         self.req.form = {'__cloned_eid:X': user.eid,
   465         req = self.request()
   448                          'eid': 'X', '__type:X': 'CWUser',
   466         req.form = {'__cloned_eid:X': user.eid,
   449                          '__maineid' : 'X',
   467                     'eid': 'X', '__type:X': 'CWUser',
   450                          'login:X': u'toto', 'edits-login:X': u'',
   468                     '__maineid' : 'X',
   451                          'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
   469                     'login:X': u'toto', 'edits-login:X': u'',
   452                          }
   470                     'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'',
   453         path, params = self.expect_redirect_publish()
   471                     }
       
   472         path, params = self.expect_redirect_publish(req)
   454         self.assertEquals(path, 'cwuser/toto')
   473         self.assertEquals(path, 'cwuser/toto')
   455         e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0)
   474         e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0)
   456         self.assertEquals(e.login, 'toto')
   475         self.assertEquals(e.login, 'toto')
   457         self.assertEquals(e.in_group[0].name, 'managers')
   476         self.assertEquals(e.in_group[0].name, 'managers')
   458 
   477 
   464         p.__class__.skip_copy_for = ()
   483         p.__class__.skip_copy_for = ()
   465         try:
   484         try:
   466             e = self.add_entity('EmailAddress', address=u'doe@doe.com')
   485             e = self.add_entity('EmailAddress', address=u'doe@doe.com')
   467             self.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s',
   486             self.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s',
   468                          {'p' : p.eid, 'e' : e.eid})
   487                          {'p' : p.eid, 'e' : e.eid})
   469             self.req.form = {'__cloned_eid:X': p.eid,
   488             req = self.request()
   470                              'eid': 'X', '__type:X': 'CWUser',
   489             req.form = {'__cloned_eid:X': p.eid,
   471                              'login': u'dodo', 'edits-login': u'dodo',
   490                         'eid': 'X', '__type:X': 'CWUser',
   472                              'surname:X': u'Boom', 'edits-surname:X': u'',
   491                         'login': u'dodo', 'edits-login': u'dodo',
   473                              '__errorurl' : "whatever but required",
   492                         'surname:X': u'Boom', 'edits-surname:X': u'',
       
   493                         '__errorurl' : "whatever but required",
   474                              }
   494                              }
   475             # try to emulate what really happens in the web application
   495             # try to emulate what really happens in the web application
   476             # 1/ validate form => EditController.publish raises a ValidationError
   496             # 1/ validate form => EditController.publish raises a ValidationError
   477             #    which fires a Redirect
   497             #    which fires a Redirect
   478             # 2/ When re-publishing the copy form, the publisher implicitly commits
   498             # 2/ When re-publishing the copy form, the publisher implicitly commits
   479             try:
   499             try:
   480                 self.env.app.publish('edit', self.req)
   500                 self.app.publish('edit', req)
   481             except Redirect:
   501             except Redirect:
   482                 self.req.form['rql'] = 'Any X WHERE X eid %s' % p.eid
   502                 req.form['rql'] = 'Any X WHERE X eid %s' % p.eid
   483                 self.req.form['vid'] = 'copy'
   503                 req.form['vid'] = 'copy'
   484                 self.env.app.publish('view', self.req)
   504                 self.app.publish('view', req)
   485             rset = self.execute('CWUser P WHERE P surname "Boom"')
   505             rset = self.execute('CWUser P WHERE P surname "Boom"')
   486             self.assertEquals(len(rset), 0)
   506             self.assertEquals(len(rset), 0)
   487         finally:
   507         finally:
   488             p.__class__.skip_copy_for = old_skips
   508             p.__class__.skip_copy_for = old_skips
   489 
   509 
   490 
   510 
   491 class EmbedControllerTC(EnvBasedTC):
   511 class EmbedControllerTC(CubicWebTC):
   492 
   512 
   493     def test_nonregr_embed_publish(self):
   513     def test_nonregr_embed_publish(self):
   494         # This test looks a bit stupid but at least it will probably
   514         # This test looks a bit stupid but at least it will probably
   495         # fail if the controller API changes and if EmbedController is not
   515         # fail if the controller API changes and if EmbedController is not
   496         # updated (which is what happened before this test)
   516         # updated (which is what happened before this test)
   498         req.form['url'] = 'http://intranet.logilab.fr/'
   518         req.form['url'] = 'http://intranet.logilab.fr/'
   499         controller = self.vreg['controllers'].select('embed', req)
   519         controller = self.vreg['controllers'].select('embed', req)
   500         result = controller.publish(rset=None)
   520         result = controller.publish(rset=None)
   501 
   521 
   502 
   522 
   503 class ReportBugControllerTC(EnvBasedTC):
   523 class ReportBugControllerTC(CubicWebTC):
   504 
   524 
   505     def test_usable_by_guets(self):
   525     def test_usable_by_guets(self):
   506         req = self.request()
   526         self.login('anon')
   507         self.vreg['controllers'].select('reportbug', req)
   527         self.vreg['controllers'].select('reportbug', self.request())
   508 
   528 
   509 
   529 
   510 class SendMailControllerTC(EnvBasedTC):
   530 class SendMailControllerTC(CubicWebTC):
   511 
   531 
   512     def test_not_usable_by_guets(self):
   532     def test_not_usable_by_guets(self):
   513         self.login('anon')
   533         self.login('anon')
   514         req = self.request()
   534         self.assertRaises(NoSelectableObject,
   515         self.assertRaises(NoSelectableObject, self.env.vreg['controllers'].select, 'sendmail', req)
   535                           self.vreg['controllers'].select, 'sendmail', self.request())
   516 
   536 
   517 
   537 
   518 
   538 
   519 class JSONControllerTC(EnvBasedTC):
   539 class JSONControllerTC(CubicWebTC):
   520 
   540 
   521     def ctrl(self, req=None):
   541     def ctrl(self, req=None):
   522         req = req or self.request(url='http://whatever.fr/')
   542         req = req or self.request(url='http://whatever.fr/')
   523         return self.vreg['controllers'].select('json', req)
   543         return self.vreg['controllers'].select('json', req)
   524 
   544