web/test/unittest_views_basecontrollers.py
branchstable
changeset 6340 470d8e828fda
parent 5941 f6c890ad4fd4
child 6365 a15cc5e16178
equal deleted inserted replaced
6339:bdc3dc94d744 6340:470d8e828fda
    46 
    46 
    47     def test_noparam_edit(self):
    47     def test_noparam_edit(self):
    48         """check behaviour of this controller without any form parameter
    48         """check behaviour of this controller without any form parameter
    49         """
    49         """
    50         ex = self.assertRaises(ValidationError, self.ctrl_publish, self.request())
    50         ex = self.assertRaises(ValidationError, self.ctrl_publish, self.request())
    51         self.assertEquals(ex.errors, {None: u'no selected entities'})
    51         self.assertEqual(ex.errors, {None: u'no selected entities'})
    52 
    52 
    53     def test_validation_unique(self):
    53     def test_validation_unique(self):
    54         """test creation of two linked entities
    54         """test creation of two linked entities
    55         """
    55         """
    56         user = self.user()
    56         user = self.user()
    60                     'login-subject:X': u'admin',
    60                     'login-subject:X': u'admin',
    61                     'upassword-subject:X': u'toto',
    61                     'upassword-subject:X': u'toto',
    62                     'upassword-subject-confirm:X': u'toto',
    62                     'upassword-subject-confirm:X': u'toto',
    63                     }
    63                     }
    64         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
    64         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
    65         self.assertEquals(ex.errors, {'login-subject': 'the value "admin" is already used, use another one'})
    65         self.assertEqual(ex.errors, {'login-subject': 'the value "admin" is already used, use another one'})
    66 
    66 
    67     def test_user_editing_itself(self):
    67     def test_user_editing_itself(self):
    68         """checking that a manager user can edit itself
    68         """checking that a manager user can edit itself
    69         """
    69         """
    70         user = self.user()
    70         user = self.user()
    81             'firstname-subject:'+eid:   u'Sylvain',
    81             'firstname-subject:'+eid:   u'Sylvain',
    82             'in_group-subject:'+eid:  groups,
    82             'in_group-subject:'+eid:  groups,
    83             }
    83             }
    84         path, params = self.expect_redirect_publish(req, 'edit')
    84         path, params = self.expect_redirect_publish(req, 'edit')
    85         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}).get_entity(0, 0)
    85         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}).get_entity(0, 0)
    86         self.assertEquals(e.firstname, u'Sylvain')
    86         self.assertEqual(e.firstname, u'Sylvain')
    87         self.assertEquals(e.surname, u'Th\xe9nault')
    87         self.assertEqual(e.surname, u'Th\xe9nault')
    88         self.assertEquals(e.login, user.login)
    88         self.assertEqual(e.login, user.login)
    89         self.assertEquals([g.eid for g in e.in_group], groupeids)
    89         self.assertEqual([g.eid for g in e.in_group], groupeids)
    90 
    90 
    91     def test_user_can_change_its_password(self):
    91     def test_user_can_change_its_password(self):
    92         user = self.create_user('user')
    92         user = self.create_user('user')
    93         cnx = self.login('user')
    93         cnx = self.login('user')
    94         req = self.request()
    94         req = self.request()
   100             'upassword-subject:'+eid: 'tournicoton',
   100             'upassword-subject:'+eid: 'tournicoton',
   101             'upassword-subject-confirm:'+eid: 'tournicoton',
   101             'upassword-subject-confirm:'+eid: 'tournicoton',
   102             }
   102             }
   103         path, params = self.expect_redirect_publish(req, 'edit')
   103         path, params = self.expect_redirect_publish(req, 'edit')
   104         cnx.commit() # commit to check we don't get late validation error for instance
   104         cnx.commit() # commit to check we don't get late validation error for instance
   105         self.assertEquals(path, 'cwuser/user')
   105         self.assertEqual(path, 'cwuser/user')
   106         self.failIf('vid' in params)
   106         self.failIf('vid' in params)
   107 
   107 
   108     def test_user_editing_itself_no_relation(self):
   108     def test_user_editing_itself_no_relation(self):
   109         """checking we can edit an entity without specifying some required
   109         """checking we can edit an entity without specifying some required
   110         relations (meaning no changes)
   110         relations (meaning no changes)
   121             'firstname-subject:'+eid: u'Th\xe9nault',
   121             'firstname-subject:'+eid: u'Th\xe9nault',
   122             'surname-subject:'+eid:   u'Sylvain',
   122             'surname-subject:'+eid:   u'Sylvain',
   123             }
   123             }
   124         path, params = self.expect_redirect_publish(req, 'edit')
   124         path, params = self.expect_redirect_publish(req, 'edit')
   125         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}).get_entity(0, 0)
   125         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}).get_entity(0, 0)
   126         self.assertEquals(e.login, user.login)
   126         self.assertEqual(e.login, user.login)
   127         self.assertEquals(e.firstname, u'Th\xe9nault')
   127         self.assertEqual(e.firstname, u'Th\xe9nault')
   128         self.assertEquals(e.surname, u'Sylvain')
   128         self.assertEqual(e.surname, u'Sylvain')
   129         self.assertEquals([g.eid for g in e.in_group], groupeids)
   129         self.assertEqual([g.eid for g in e.in_group], groupeids)
   130         self.assertEquals(e.cw_adapt_to('IWorkflowable').state, 'activated')
   130         self.assertEqual(e.cw_adapt_to('IWorkflowable').state, 'activated')
   131 
   131 
   132 
   132 
   133     def test_create_multiple_linked(self):
   133     def test_create_multiple_linked(self):
   134         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   134         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   135         req = self.request()
   135         req = self.request()
   147                     'address-subject:Y': u'dima@logilab.fr',
   147                     'address-subject:Y': u'dima@logilab.fr',
   148                     'use_email-object:Y': 'X',
   148                     'use_email-object:Y': 'X',
   149                     }
   149                     }
   150         path, params = self.expect_redirect_publish(req, 'edit')
   150         path, params = self.expect_redirect_publish(req, 'edit')
   151         # should be redirected on the created person
   151         # should be redirected on the created person
   152         self.assertEquals(path, 'cwuser/adim')
   152         self.assertEqual(path, 'cwuser/adim')
   153         e = self.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0)
   153         e = self.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0)
   154         self.assertEquals(e.surname, 'Di Mascio')
   154         self.assertEqual(e.surname, 'Di Mascio')
   155         email = e.use_email[0]
   155         email = e.use_email[0]
   156         self.assertEquals(email.address, 'dima@logilab.fr')
   156         self.assertEqual(email.address, 'dima@logilab.fr')
   157 
   157 
   158     def test_edit_multiple_linked(self):
   158     def test_edit_multiple_linked(self):
   159         peid = u(self.create_user('adim').eid)
   159         peid = u(self.create_user('adim').eid)
   160         req = self.request()
   160         req = self.request()
   161         req.form = {'eid': [peid, 'Y'], '__maineid': peid,
   161         req.form = {'eid': [peid, 'Y'], '__maineid': peid,
   169                     'address-subject:Y': u'dima@logilab.fr',
   169                     'address-subject:Y': u'dima@logilab.fr',
   170                     'use_email-object:Y': peid,
   170                     'use_email-object:Y': peid,
   171                     }
   171                     }
   172         path, params = self.expect_redirect_publish(req, 'edit')
   172         path, params = self.expect_redirect_publish(req, 'edit')
   173         # should be redirected on the created person
   173         # should be redirected on the created person
   174         self.assertEquals(path, 'cwuser/adim')
   174         self.assertEqual(path, 'cwuser/adim')
   175         e = self.execute('Any P WHERE P surname "Di Masci"').get_entity(0, 0)
   175         e = self.execute('Any P WHERE P surname "Di Masci"').get_entity(0, 0)
   176         email = e.use_email[0]
   176         email = e.use_email[0]
   177         self.assertEquals(email.address, 'dima@logilab.fr')
   177         self.assertEqual(email.address, 'dima@logilab.fr')
   178 
   178 
   179         emaileid = u(email.eid)
   179         emaileid = u(email.eid)
   180         req = self.request()
   180         req = self.request()
   181         req.form = {'eid': [peid, emaileid],
   181         req.form = {'eid': [peid, emaileid],
   182 
   182 
   189                     'address-subject:'+emaileid: u'adim@logilab.fr',
   189                     'address-subject:'+emaileid: u'adim@logilab.fr',
   190                     'use_email-object:'+emaileid: peid,
   190                     'use_email-object:'+emaileid: peid,
   191                     }
   191                     }
   192         path, params = self.expect_redirect_publish(req, 'edit')
   192         path, params = self.expect_redirect_publish(req, 'edit')
   193         email.clear_all_caches()
   193         email.clear_all_caches()
   194         self.assertEquals(email.address, 'adim@logilab.fr')
   194         self.assertEqual(email.address, 'adim@logilab.fr')
   195 
   195 
   196 
   196 
   197     def test_password_confirm(self):
   197     def test_password_confirm(self):
   198         """test creation of two linked entities
   198         """test creation of two linked entities
   199         """
   199         """
   204                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   204                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   205                     'login-subject:X': u'toto',
   205                     'login-subject:X': u'toto',
   206                     'upassword-subject:X': u'toto',
   206                     'upassword-subject:X': u'toto',
   207                     }
   207                     }
   208         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   208         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   209         self.assertEquals(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'})
   209         self.assertEqual(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'})
   210         req = self.request()
   210         req = self.request()
   211         req.form = {'__cloned_eid:X': u(user.eid),
   211         req.form = {'__cloned_eid:X': u(user.eid),
   212                     'eid': 'X', '__type:X': 'CWUser',
   212                     'eid': 'X', '__type:X': 'CWUser',
   213                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   213                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   214                     'login-subject:X': u'toto',
   214                     'login-subject:X': u'toto',
   215                     'upassword-subject:X': u'toto',
   215                     'upassword-subject:X': u'toto',
   216                     'upassword-subject-confirm:X': u'tutu',
   216                     'upassword-subject-confirm:X': u'tutu',
   217                     }
   217                     }
   218         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   218         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   219         self.assertEquals(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'})
   219         self.assertEqual(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'})
   220 
   220 
   221 
   221 
   222     def test_interval_bound_constraint_success(self):
   222     def test_interval_bound_constraint_success(self):
   223         feid = self.execute('INSERT File X: X data_name "toto.txt", X data %(data)s',
   223         feid = self.execute('INSERT File X: X data_name "toto.txt", X data %(data)s',
   224                             {'data': Binary('yo')})[0][0]
   224                             {'data': Binary('yo')})[0][0]
   228                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   228                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   229                     'amount-subject:X': u'-10',
   229                     'amount-subject:X': u'-10',
   230                     'described_by_test-subject:X': u(feid),
   230                     'described_by_test-subject:X': u(feid),
   231                 }
   231                 }
   232         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   232         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   233         self.assertEquals(ex.errors, {'amount-subject': 'value must be >= 0'})
   233         self.assertEqual(ex.errors, {'amount-subject': 'value must be >= 0'})
   234         req = self.request()
   234         req = self.request()
   235         req.form = {'eid': ['X'],
   235         req.form = {'eid': ['X'],
   236                     '__type:X': 'Salesterm',
   236                     '__type:X': 'Salesterm',
   237                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   237                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   238                     'amount-subject:X': u'110',
   238                     'amount-subject:X': u'110',
   239                     'described_by_test-subject:X': u(feid),
   239                     'described_by_test-subject:X': u(feid),
   240                     }
   240                     }
   241         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   241         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   242         self.assertEquals(ex.errors, {'amount-subject': 'value must be <= 100'})
   242         self.assertEqual(ex.errors, {'amount-subject': 'value must be <= 100'})
   243         req = self.request()
   243         req = self.request()
   244         req.form = {'eid': ['X'],
   244         req.form = {'eid': ['X'],
   245                     '__type:X': 'Salesterm',
   245                     '__type:X': 'Salesterm',
   246                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   246                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   247                     'amount-subject:X': u'10',
   247                     'amount-subject:X': u'10',
   249                     }
   249                     }
   250         self.expect_redirect_publish(req, 'edit')
   250         self.expect_redirect_publish(req, 'edit')
   251         # should be redirected on the created
   251         # should be redirected on the created
   252         #eid = params['rql'].split()[-1]
   252         #eid = params['rql'].split()[-1]
   253         e = self.execute('Salesterm X').get_entity(0, 0)
   253         e = self.execute('Salesterm X').get_entity(0, 0)
   254         self.assertEquals(e.amount, 10)
   254         self.assertEqual(e.amount, 10)
   255 
   255 
   256     def test_req_pending_insert(self):
   256     def test_req_pending_insert(self):
   257         """make sure req's pending insertions are taken into account"""
   257         """make sure req's pending insertions are taken into account"""
   258         tmpgroup = self.request().create_entity('CWGroup', name=u"test")
   258         tmpgroup = self.request().create_entity('CWGroup', name=u"test")
   259         user = self.user()
   259         user = self.user()
   260         req = self.request(**req_form(user))
   260         req = self.request(**req_form(user))
   261         req.session.data['pending_insert'] = set([(user.eid, 'in_group', tmpgroup.eid)])
   261         req.session.data['pending_insert'] = set([(user.eid, 'in_group', tmpgroup.eid)])
   262         path, params = self.expect_redirect_publish(req, 'edit')
   262         path, params = self.expect_redirect_publish(req, 'edit')
   263         usergroups = [gname for gname, in
   263         usergroups = [gname for gname, in
   264                       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})]
   265         self.assertUnorderedIterableEquals(usergroups, ['managers', 'test'])
   265         self.assertItemsEqual(usergroups, ['managers', 'test'])
   266         self.assertEquals(get_pending_inserts(req), [])
   266         self.assertEqual(get_pending_inserts(req), [])
   267 
   267 
   268 
   268 
   269     def test_req_pending_delete(self):
   269     def test_req_pending_delete(self):
   270         """make sure req's pending deletions are taken into account"""
   270         """make sure req's pending deletions are taken into account"""
   271         user = self.user()
   271         user = self.user()
   272         groupeid = self.execute('INSERT CWGroup G: G name "test", U in_group G WHERE U eid %(x)s',
   272         groupeid = self.execute('INSERT CWGroup G: G name "test", U in_group G WHERE U eid %(x)s',
   273                                 {'x': user.eid})[0][0]
   273                                 {'x': user.eid})[0][0]
   274         usergroups = [gname for gname, in
   274         usergroups = [gname for gname, in
   275                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   275                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   276         # just make sure everything was set correctly
   276         # just make sure everything was set correctly
   277         self.assertUnorderedIterableEquals(usergroups, ['managers', 'test'])
   277         self.assertItemsEqual(usergroups, ['managers', 'test'])
   278         # now try to delete the relation
   278         # now try to delete the relation
   279         req = self.request(**req_form(user))
   279         req = self.request(**req_form(user))
   280         req.session.data['pending_delete'] = set([(user.eid, 'in_group', groupeid)])
   280         req.session.data['pending_delete'] = set([(user.eid, 'in_group', groupeid)])
   281         path, params = self.expect_redirect_publish(req, 'edit')
   281         path, params = self.expect_redirect_publish(req, 'edit')
   282         usergroups = [gname for gname, in
   282         usergroups = [gname for gname, in
   283                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   283                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   284         self.assertUnorderedIterableEquals(usergroups, ['managers'])
   284         self.assertItemsEqual(usergroups, ['managers'])
   285         self.assertEquals(get_pending_deletes(req), [])
   285         self.assertEqual(get_pending_deletes(req), [])
   286 
   286 
   287     # def test_custom_attribute_handler(self):
   287     # def test_custom_attribute_handler(self):
   288     #     def custom_login_edit(self, formparams, value, relations):
   288     #     def custom_login_edit(self, formparams, value, relations):
   289     #         formparams['login'] = value.upper()
   289     #         formparams['login'] = value.upper()
   290     #         relations.append('X login %(login)s')
   290     #         relations.append('X login %(login)s')
   298     #             '__type:'+eid:  'CWUser',
   298     #             '__type:'+eid:  'CWUser',
   299     #             'login:'+eid: u'foo',
   299     #             'login:'+eid: u'foo',
   300     #             }
   300     #             }
   301     #         path, params = self.expect_redirect_publish(req, 'edit')
   301     #         path, params = self.expect_redirect_publish(req, 'edit')
   302     #         rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x')
   302     #         rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x')
   303     #         self.assertEquals(rset[0][0], 'FOO')
   303     #         self.assertEqual(rset[0][0], 'FOO')
   304     #     finally:
   304     #     finally:
   305     #         del CWUser.custom_login_edit
   305     #         del CWUser.custom_login_edit
   306 
   306 
   307     def test_redirect_apply_button(self):
   307     def test_redirect_apply_button(self):
   308         redirectrql = rql_for_eid(4012) # whatever
   308         redirectrql = rql_for_eid(4012) # whatever
   319             '__action_apply': '',
   319             '__action_apply': '',
   320             }
   320             }
   321         path, params = self.expect_redirect_publish(req, 'edit')
   321         path, params = self.expect_redirect_publish(req, 'edit')
   322         self.failUnless(path.startswith('blogentry/'))
   322         self.failUnless(path.startswith('blogentry/'))
   323         eid = path.split('/')[1]
   323         eid = path.split('/')[1]
   324         self.assertEquals(params['vid'], 'edition')
   324         self.assertEqual(params['vid'], 'edition')
   325         self.assertNotEquals(int(eid), 4012)
   325         self.assertNotEquals(int(eid), 4012)
   326         self.assertEquals(params['__redirectrql'], redirectrql)
   326         self.assertEqual(params['__redirectrql'], redirectrql)
   327         self.assertEquals(params['__redirectvid'], 'primary')
   327         self.assertEqual(params['__redirectvid'], 'primary')
   328         self.assertEquals(params['__redirectparams'], 'toto=tutu&tata=titi')
   328         self.assertEqual(params['__redirectparams'], 'toto=tutu&tata=titi')
   329 
   329 
   330     def test_redirect_ok_button(self):
   330     def test_redirect_ok_button(self):
   331         redirectrql = rql_for_eid(4012) # whatever
   331         redirectrql = rql_for_eid(4012) # whatever
   332         req = self.request()
   332         req = self.request()
   333         req.form = {
   333         req.form = {
   339             '__redirectvid': 'primary',
   339             '__redirectvid': 'primary',
   340             '__redirectparams': 'toto=tutu&tata=titi',
   340             '__redirectparams': 'toto=tutu&tata=titi',
   341             '__form_id': 'edition',
   341             '__form_id': 'edition',
   342             }
   342             }
   343         path, params = self.expect_redirect_publish(req, 'edit')
   343         path, params = self.expect_redirect_publish(req, 'edit')
   344         self.assertEquals(path, 'view')
   344         self.assertEqual(path, 'view')
   345         self.assertEquals(params['rql'], redirectrql)
   345         self.assertEqual(params['rql'], redirectrql)
   346         self.assertEquals(params['vid'], 'primary')
   346         self.assertEqual(params['vid'], 'primary')
   347         self.assertEquals(params['tata'], 'titi')
   347         self.assertEqual(params['tata'], 'titi')
   348         self.assertEquals(params['toto'], 'tutu')
   348         self.assertEqual(params['toto'], 'tutu')
   349 
   349 
   350     def test_redirect_delete_button(self):
   350     def test_redirect_delete_button(self):
   351         req = self.request()
   351         req = self.request()
   352         eid = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   352         eid = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   353         req.form = {'eid': u(eid), '__type:%s'%eid: 'BlogEntry',
   353         req.form = {'eid': u(eid), '__type:%s'%eid: 'BlogEntry',
   354                     '__action_delete': ''}
   354                     '__action_delete': ''}
   355         path, params = self.expect_redirect_publish(req, 'edit')
   355         path, params = self.expect_redirect_publish(req, 'edit')
   356         self.assertEquals(path, 'blogentry')
   356         self.assertEqual(path, 'blogentry')
   357         self.assertIn('_cwmsgid', params)
   357         self.assertIn('_cwmsgid', params)
   358         eid = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid
   358         eid = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid
   359         self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s',
   359         self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s',
   360                      {'x': self.session.user.eid, 'e': eid})
   360                      {'x': self.session.user.eid, 'e': eid})
   361         self.commit()
   361         self.commit()
   362         req = req
   362         req = req
   363         req.form = {'eid': u(eid), '__type:%s'%eid: 'EmailAddress',
   363         req.form = {'eid': u(eid), '__type:%s'%eid: 'EmailAddress',
   364                     '__action_delete': ''}
   364                     '__action_delete': ''}
   365         path, params = self.expect_redirect_publish(req, 'edit')
   365         path, params = self.expect_redirect_publish(req, 'edit')
   366         self.assertEquals(path, 'cwuser/admin')
   366         self.assertEqual(path, 'cwuser/admin')
   367         self.assertIn('_cwmsgid', params)
   367         self.assertIn('_cwmsgid', params)
   368         eid1 = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   368         eid1 = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   369         eid2 = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid
   369         eid2 = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid
   370         req = self.request()
   370         req = self.request()
   371         req.form = {'eid': [u(eid1), u(eid2)],
   371         req.form = {'eid': [u(eid1), u(eid2)],
   372                     '__type:%s'%eid1: 'BlogEntry',
   372                     '__type:%s'%eid1: 'BlogEntry',
   373                     '__type:%s'%eid2: 'EmailAddress',
   373                     '__type:%s'%eid2: 'EmailAddress',
   374                     '__action_delete': ''}
   374                     '__action_delete': ''}
   375         path, params = self.expect_redirect_publish(req, 'edit')
   375         path, params = self.expect_redirect_publish(req, 'edit')
   376         self.assertEquals(path, 'view')
   376         self.assertEqual(path, 'view')
   377         self.assertIn('_cwmsgid', params)
   377         self.assertIn('_cwmsgid', params)
   378 
   378 
   379     def test_nonregr_eetype_etype_editing(self):
   379     def test_nonregr_eetype_etype_editing(self):
   380         """non-regression test checking that a manager user can edit a CWEType entity
   380         """non-regression test checking that a manager user can edit a CWEType entity
   381         """
   381         """
   395             'read_permission-subject:'+cwetypeeid:  groups,
   395             'read_permission-subject:'+cwetypeeid:  groups,
   396             }
   396             }
   397         try:
   397         try:
   398             path, params = self.expect_redirect_publish(req, 'edit')
   398             path, params = self.expect_redirect_publish(req, 'edit')
   399             e = self.execute('Any X WHERE X eid %(x)s', {'x': cwetypeeid}).get_entity(0, 0)
   399             e = self.execute('Any X WHERE X eid %(x)s', {'x': cwetypeeid}).get_entity(0, 0)
   400             self.assertEquals(e.name, 'CWEType')
   400             self.assertEqual(e.name, 'CWEType')
   401             self.assertEquals(sorted(g.eid for g in e.read_permission), groupeids)
   401             self.assertEqual(sorted(g.eid for g in e.read_permission), groupeids)
   402         finally:
   402         finally:
   403             # restore
   403             # restore
   404             self.execute('SET X read_permission Y WHERE X name "CWEType", Y eid IN (%s), NOT X read_permission Y' % (','.join(basegroups)))
   404             self.execute('SET X read_permission Y WHERE X name "CWEType", Y eid IN (%s), NOT X read_permission Y' % (','.join(basegroups)))
   405             self.commit()
   405             self.commit()
   406 
   406 
   417             'content-subject:A': u'"13:03:43"',}
   417             'content-subject:A': u'"13:03:43"',}
   418         path, params = self.expect_redirect_publish(req, 'edit')
   418         path, params = self.expect_redirect_publish(req, 'edit')
   419         self.failUnless(path.startswith('blogentry/'))
   419         self.failUnless(path.startswith('blogentry/'))
   420         eid = path.split('/')[1]
   420         eid = path.split('/')[1]
   421         e = self.execute('Any C, T WHERE C eid %(x)s, C content T', {'x': eid}).get_entity(0, 0)
   421         e = self.execute('Any C, T WHERE C eid %(x)s, C content T', {'x': eid}).get_entity(0, 0)
   422         self.assertEquals(e.title, '"13:03:40"')
   422         self.assertEqual(e.title, '"13:03:40"')
   423         self.assertEquals(e.content, '"13:03:43"')
   423         self.assertEqual(e.content, '"13:03:43"')
   424 
   424 
   425 
   425 
   426     def test_nonregr_multiple_empty_email_addr(self):
   426     def test_nonregr_multiple_empty_email_addr(self):
   427         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   427         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   428         req = self.request()
   428         req = self.request()
   439                     'address-subject:Y': u'',
   439                     'address-subject:Y': u'',
   440                     'alias-subject:Y': u'',
   440                     'alias-subject:Y': u'',
   441                     'use_email-object:Y': 'X',
   441                     'use_email-object:Y': 'X',
   442                     }
   442                     }
   443         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   443         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   444         self.assertEquals(ex.errors, {'address-subject': u'required field'})
   444         self.assertEqual(ex.errors, {'address-subject': u'required field'})
   445 
   445 
   446     def test_nonregr_copy(self):
   446     def test_nonregr_copy(self):
   447         user = self.user()
   447         user = self.user()
   448         req = self.request()
   448         req = self.request()
   449         req.form = {'__maineid' : 'X', 'eid': 'X',
   449         req.form = {'__maineid' : 'X', 'eid': 'X',
   451                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   451                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   452                     'login-subject:X': u'toto',
   452                     'login-subject:X': u'toto',
   453                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   453                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   454                     }
   454                     }
   455         path, params = self.expect_redirect_publish(req, 'edit')
   455         path, params = self.expect_redirect_publish(req, 'edit')
   456         self.assertEquals(path, 'cwuser/toto')
   456         self.assertEqual(path, 'cwuser/toto')
   457         e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0)
   457         e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0)
   458         self.assertEquals(e.login, 'toto')
   458         self.assertEqual(e.login, 'toto')
   459         self.assertEquals(e.in_group[0].name, 'managers')
   459         self.assertEqual(e.in_group[0].name, 'managers')
   460 
   460 
   461 
   461 
   462     def test_nonregr_rollback_on_validation_error(self):
   462     def test_nonregr_rollback_on_validation_error(self):
   463         p = self.create_user("doe")
   463         p = self.create_user("doe")
   464         # do not try to skip 'primary_email' for this test
   464         # do not try to skip 'primary_email' for this test
   486                 req = self.request()
   486                 req = self.request()
   487                 req.form['rql'] = 'Any X WHERE X eid %s' % p.eid
   487                 req.form['rql'] = 'Any X WHERE X eid %s' % p.eid
   488                 req.form['vid'] = 'copy'
   488                 req.form['vid'] = 'copy'
   489                 self.app_publish(req, 'view')
   489                 self.app_publish(req, 'view')
   490             rset = self.execute('CWUser P WHERE P surname "Boom"')
   490             rset = self.execute('CWUser P WHERE P surname "Boom"')
   491             self.assertEquals(len(rset), 0)
   491             self.assertEqual(len(rset), 0)
   492         finally:
   492         finally:
   493             p.__class__.skip_copy_for = old_skips
   493             p.__class__.skip_copy_for = old_skips
   494 
   494 
   495 
   495 
   496 class EmbedControllerTC(CubicWebTC):
   496 class EmbedControllerTC(CubicWebTC):
   558         self.failUnless(source.startswith('<div>'))
   558         self.failUnless(source.startswith('<div>'))
   559 
   559 
   560 #     def test_json_exec(self):
   560 #     def test_json_exec(self):
   561 #         rql = 'Any T,N WHERE T is Tag, T name N'
   561 #         rql = 'Any T,N WHERE T is Tag, T name N'
   562 #         ctrl = self.ctrl(self.request(mode='json', rql=rql, pageid='123'))
   562 #         ctrl = self.ctrl(self.request(mode='json', rql=rql, pageid='123'))
   563 #         self.assertEquals(ctrl.publish(),
   563 #         self.assertEqual(ctrl.publish(),
   564 #                           json_dumps(self.execute(rql).rows))
   564 #                           json_dumps(self.execute(rql).rows))
   565 
   565 
   566     def test_remote_add_existing_tag(self):
   566     def test_remote_add_existing_tag(self):
   567         self.remote_call('tag_entity', self.john.eid, ['python'])
   567         self.remote_call('tag_entity', self.john.eid, ['python'])
   568         self.assertUnorderedIterableEquals(
   568         self.assertItemsEqual(
   569             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   569             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   570             ['python', 'cubicweb'])
   570             ['python', 'cubicweb'])
   571         self.assertEquals(
   571         self.assertEqual(
   572             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   572             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   573             [['python']])
   573             [['python']])
   574 
   574 
   575     def test_remote_add_new_tag(self):
   575     def test_remote_add_new_tag(self):
   576         self.remote_call('tag_entity', self.john.eid, ['javascript'])
   576         self.remote_call('tag_entity', self.john.eid, ['javascript'])
   577         self.assertUnorderedIterableEquals(
   577         self.assertItemsEqual(
   578             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   578             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   579             ['python', 'cubicweb', 'javascript'])
   579             ['python', 'cubicweb', 'javascript'])
   580         self.assertEquals(
   580         self.assertEqual(
   581             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   581             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   582             [['javascript']])
   582             [['javascript']])
   583 
   583 
   584     def test_pending_insertion(self):
   584     def test_pending_insertion(self):
   585         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '13']])
   585         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '13']])
   586         deletes = get_pending_deletes(req)
   586         deletes = get_pending_deletes(req)
   587         self.assertEquals(deletes, [])
   587         self.assertEqual(deletes, [])
   588         inserts = get_pending_inserts(req)
   588         inserts = get_pending_inserts(req)
   589         self.assertEquals(inserts, ['12:tags:13'])
   589         self.assertEqual(inserts, ['12:tags:13'])
   590         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   590         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   591         deletes = get_pending_deletes(req)
   591         deletes = get_pending_deletes(req)
   592         self.assertEquals(deletes, [])
   592         self.assertEqual(deletes, [])
   593         inserts = get_pending_inserts(req)
   593         inserts = get_pending_inserts(req)
   594         self.assertEquals(inserts, ['12:tags:13', '12:tags:14'])
   594         self.assertEqual(inserts, ['12:tags:13', '12:tags:14'])
   595         inserts = get_pending_inserts(req, 12)
   595         inserts = get_pending_inserts(req, 12)
   596         self.assertEquals(inserts, ['12:tags:13', '12:tags:14'])
   596         self.assertEqual(inserts, ['12:tags:13', '12:tags:14'])
   597         inserts = get_pending_inserts(req, 13)
   597         inserts = get_pending_inserts(req, 13)
   598         self.assertEquals(inserts, ['12:tags:13'])
   598         self.assertEqual(inserts, ['12:tags:13'])
   599         inserts = get_pending_inserts(req, 14)
   599         inserts = get_pending_inserts(req, 14)
   600         self.assertEquals(inserts, ['12:tags:14'])
   600         self.assertEqual(inserts, ['12:tags:14'])
   601         req.remove_pending_operations()
   601         req.remove_pending_operations()
   602 
   602 
   603     def test_pending_deletion(self):
   603     def test_pending_deletion(self):
   604         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   604         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   605         inserts = get_pending_inserts(req)
   605         inserts = get_pending_inserts(req)
   606         self.assertEquals(inserts, [])
   606         self.assertEqual(inserts, [])
   607         deletes = get_pending_deletes(req)
   607         deletes = get_pending_deletes(req)
   608         self.assertEquals(deletes, ['12:tags:13'])
   608         self.assertEqual(deletes, ['12:tags:13'])
   609         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '14'])
   609         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '14'])
   610         inserts = get_pending_inserts(req)
   610         inserts = get_pending_inserts(req)
   611         self.assertEquals(inserts, [])
   611         self.assertEqual(inserts, [])
   612         deletes = get_pending_deletes(req)
   612         deletes = get_pending_deletes(req)
   613         self.assertEquals(deletes, ['12:tags:13', '12:tags:14'])
   613         self.assertEqual(deletes, ['12:tags:13', '12:tags:14'])
   614         deletes = get_pending_deletes(req, 12)
   614         deletes = get_pending_deletes(req, 12)
   615         self.assertEquals(deletes, ['12:tags:13', '12:tags:14'])
   615         self.assertEqual(deletes, ['12:tags:13', '12:tags:14'])
   616         deletes = get_pending_deletes(req, 13)
   616         deletes = get_pending_deletes(req, 13)
   617         self.assertEquals(deletes, ['12:tags:13'])
   617         self.assertEqual(deletes, ['12:tags:13'])
   618         deletes = get_pending_deletes(req, 14)
   618         deletes = get_pending_deletes(req, 14)
   619         self.assertEquals(deletes, ['12:tags:14'])
   619         self.assertEqual(deletes, ['12:tags:14'])
   620         req.remove_pending_operations()
   620         req.remove_pending_operations()
   621 
   621 
   622     def test_remove_pending_operations(self):
   622     def test_remove_pending_operations(self):
   623         self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   623         self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   624         _, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   624         _, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   625         inserts = get_pending_inserts(req)
   625         inserts = get_pending_inserts(req)
   626         self.assertEquals(inserts, ['12:tags:14'])
   626         self.assertEqual(inserts, ['12:tags:14'])
   627         deletes = get_pending_deletes(req)
   627         deletes = get_pending_deletes(req)
   628         self.assertEquals(deletes, ['12:tags:13'])
   628         self.assertEqual(deletes, ['12:tags:13'])
   629         req.remove_pending_operations()
   629         req.remove_pending_operations()
   630         self.assertEquals(get_pending_deletes(req), [])
   630         self.assertEqual(get_pending_deletes(req), [])
   631         self.assertEquals(get_pending_inserts(req), [])
   631         self.assertEqual(get_pending_inserts(req), [])
   632 
   632 
   633 
   633 
   634     def test_add_inserts(self):
   634     def test_add_inserts(self):
   635         res, req = self.remote_call('add_pending_inserts',
   635         res, req = self.remote_call('add_pending_inserts',
   636                                     [('12', 'tags', '13'), ('12', 'tags', '14')])
   636                                     [('12', 'tags', '13'), ('12', 'tags', '14')])
   637         inserts = get_pending_inserts(req)
   637         inserts = get_pending_inserts(req)
   638         self.assertEquals(inserts, ['12:tags:13', '12:tags:14'])
   638         self.assertEqual(inserts, ['12:tags:13', '12:tags:14'])
   639         req.remove_pending_operations()
   639         req.remove_pending_operations()
   640 
   640 
   641 
   641 
   642     # silly tests
   642     # silly tests
   643     def test_external_resource(self):
   643     def test_external_resource(self):
   644         self.assertEquals(self.remote_call('external_resource', 'RSS_LOGO')[0],
   644         self.assertEqual(self.remote_call('external_resource', 'RSS_LOGO')[0],
   645                           json_dumps(self.config.uiprops['RSS_LOGO']))
   645                           json_dumps(self.config.uiprops['RSS_LOGO']))
   646     def test_i18n(self):
   646     def test_i18n(self):
   647         self.assertEquals(self.remote_call('i18n', ['bimboom'])[0],
   647         self.assertEqual(self.remote_call('i18n', ['bimboom'])[0],
   648                           json_dumps(['bimboom']))
   648                           json_dumps(['bimboom']))
   649 
   649 
   650     def test_format_date(self):
   650     def test_format_date(self):
   651         self.assertEquals(self.remote_call('format_date', '2007-01-01 12:00:00')[0],
   651         self.assertEqual(self.remote_call('format_date', '2007-01-01 12:00:00')[0],
   652                           json_dumps('2007/01/01'))
   652                           json_dumps('2007/01/01'))
   653 
   653 
   654 
   654 
   655 
   655 
   656 
   656