web/test/unittest_views_basecontrollers.py
changeset 6366 1806148d6ce8
parent 6365 a15cc5e16178
child 6410 2e7a7b0829ed
equal deleted inserted replaced
6333:e3994fcc21c3 6366:1806148d6ce8
    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]
       
   225         self.commit()
   225         req = self.request()
   226         req = self.request()
   226         req.form = {'eid': ['X'],
   227         req.form = {'eid': ['X'],
   227                     '__type:X': 'Salesterm',
   228                     '__type:X': 'Salesterm',
   228                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   229                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   229                     'amount-subject:X': u'-10',
   230                     'amount-subject:X': u'-10',
   230                     'described_by_test-subject:X': u(feid),
   231                     'described_by_test-subject:X': u(feid),
   231                 }
   232                 }
   232         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   233         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   233         self.assertEquals(ex.errors, {'amount-subject': 'value must be >= 0'})
   234         self.assertEqual(ex.errors, {'amount-subject': 'value must be >= 0'})
   234         req = self.request()
   235         req = self.request()
   235         req.form = {'eid': ['X'],
   236         req.form = {'eid': ['X'],
   236                     '__type:X': 'Salesterm',
   237                     '__type:X': 'Salesterm',
   237                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   238                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   238                     'amount-subject:X': u'110',
   239                     'amount-subject:X': u'110',
   239                     'described_by_test-subject:X': u(feid),
   240                     'described_by_test-subject:X': u(feid),
   240                     }
   241                     }
   241         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   242         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   242         self.assertEquals(ex.errors, {'amount-subject': 'value must be <= 100'})
   243         self.assertEqual(ex.errors, {'amount-subject': 'value must be <= 100'})
   243         req = self.request()
   244         req = self.request()
   244         req.form = {'eid': ['X'],
   245         req.form = {'eid': ['X'],
   245                     '__type:X': 'Salesterm',
   246                     '__type:X': 'Salesterm',
   246                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   247                     '_cw_edited_fields:X': 'amount-subject,described_by_test-subject',
   247                     'amount-subject:X': u'10',
   248                     'amount-subject:X': u'10',
   249                     }
   250                     }
   250         self.expect_redirect_publish(req, 'edit')
   251         self.expect_redirect_publish(req, 'edit')
   251         # should be redirected on the created
   252         # should be redirected on the created
   252         #eid = params['rql'].split()[-1]
   253         #eid = params['rql'].split()[-1]
   253         e = self.execute('Salesterm X').get_entity(0, 0)
   254         e = self.execute('Salesterm X').get_entity(0, 0)
   254         self.assertEquals(e.amount, 10)
   255         self.assertEqual(e.amount, 10)
   255 
   256 
   256     def test_req_pending_insert(self):
   257     def test_req_pending_insert(self):
   257         """make sure req's pending insertions are taken into account"""
   258         """make sure req's pending insertions are taken into account"""
   258         tmpgroup = self.request().create_entity('CWGroup', name=u"test")
   259         tmpgroup = self.request().create_entity('CWGroup', name=u"test")
   259         user = self.user()
   260         user = self.user()
   260         req = self.request(**req_form(user))
   261         req = self.request(**req_form(user))
   261         req.session.data['pending_insert'] = set([(user.eid, 'in_group', tmpgroup.eid)])
   262         req.session.data['pending_insert'] = set([(user.eid, 'in_group', tmpgroup.eid)])
   262         path, params = self.expect_redirect_publish(req, 'edit')
   263         path, params = self.expect_redirect_publish(req, 'edit')
   263         usergroups = [gname for gname, in
   264         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})]
   265                       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'])
   266         self.assertItemsEqual(usergroups, ['managers', 'test'])
   266         self.assertEquals(get_pending_inserts(req), [])
   267         self.assertEqual(get_pending_inserts(req), [])
   267 
   268 
   268 
   269 
   269     def test_req_pending_delete(self):
   270     def test_req_pending_delete(self):
   270         """make sure req's pending deletions are taken into account"""
   271         """make sure req's pending deletions are taken into account"""
   271         user = self.user()
   272         user = self.user()
   272         groupeid = self.execute('INSERT CWGroup G: G name "test", U in_group G WHERE U eid %(x)s',
   273         groupeid = self.execute('INSERT CWGroup G: G name "test", U in_group G WHERE U eid %(x)s',
   273                                 {'x': user.eid})[0][0]
   274                                 {'x': user.eid})[0][0]
   274         usergroups = [gname for gname, in
   275         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})]
   276                       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
   277         # just make sure everything was set correctly
   277         self.assertUnorderedIterableEquals(usergroups, ['managers', 'test'])
   278         self.assertItemsEqual(usergroups, ['managers', 'test'])
   278         # now try to delete the relation
   279         # now try to delete the relation
   279         req = self.request(**req_form(user))
   280         req = self.request(**req_form(user))
   280         req.session.data['pending_delete'] = set([(user.eid, 'in_group', groupeid)])
   281         req.session.data['pending_delete'] = set([(user.eid, 'in_group', groupeid)])
   281         path, params = self.expect_redirect_publish(req, 'edit')
   282         path, params = self.expect_redirect_publish(req, 'edit')
   282         usergroups = [gname for gname, in
   283         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})]
   284                       self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})]
   284         self.assertUnorderedIterableEquals(usergroups, ['managers'])
   285         self.assertItemsEqual(usergroups, ['managers'])
   285         self.assertEquals(get_pending_deletes(req), [])
   286         self.assertEqual(get_pending_deletes(req), [])
   286 
   287 
   287     # def test_custom_attribute_handler(self):
   288     # def test_custom_attribute_handler(self):
   288     #     def custom_login_edit(self, formparams, value, relations):
   289     #     def custom_login_edit(self, formparams, value, relations):
   289     #         formparams['login'] = value.upper()
   290     #         formparams['login'] = value.upper()
   290     #         relations.append('X login %(login)s')
   291     #         relations.append('X login %(login)s')
   298     #             '__type:'+eid:  'CWUser',
   299     #             '__type:'+eid:  'CWUser',
   299     #             'login:'+eid: u'foo',
   300     #             'login:'+eid: u'foo',
   300     #             }
   301     #             }
   301     #         path, params = self.expect_redirect_publish(req, 'edit')
   302     #         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')
   303     #         rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x')
   303     #         self.assertEquals(rset[0][0], 'FOO')
   304     #         self.assertEqual(rset[0][0], 'FOO')
   304     #     finally:
   305     #     finally:
   305     #         del CWUser.custom_login_edit
   306     #         del CWUser.custom_login_edit
   306 
   307 
   307     def test_redirect_apply_button(self):
   308     def test_redirect_apply_button(self):
   308         redirectrql = rql_for_eid(4012) # whatever
   309         redirectrql = rql_for_eid(4012) # whatever
   319             '__action_apply': '',
   320             '__action_apply': '',
   320             }
   321             }
   321         path, params = self.expect_redirect_publish(req, 'edit')
   322         path, params = self.expect_redirect_publish(req, 'edit')
   322         self.failUnless(path.startswith('blogentry/'))
   323         self.failUnless(path.startswith('blogentry/'))
   323         eid = path.split('/')[1]
   324         eid = path.split('/')[1]
   324         self.assertEquals(params['vid'], 'edition')
   325         self.assertEqual(params['vid'], 'edition')
   325         self.assertNotEquals(int(eid), 4012)
   326         self.assertNotEquals(int(eid), 4012)
   326         self.assertEquals(params['__redirectrql'], redirectrql)
   327         self.assertEqual(params['__redirectrql'], redirectrql)
   327         self.assertEquals(params['__redirectvid'], 'primary')
   328         self.assertEqual(params['__redirectvid'], 'primary')
   328         self.assertEquals(params['__redirectparams'], 'toto=tutu&tata=titi')
   329         self.assertEqual(params['__redirectparams'], 'toto=tutu&tata=titi')
   329 
   330 
   330     def test_redirect_ok_button(self):
   331     def test_redirect_ok_button(self):
   331         redirectrql = rql_for_eid(4012) # whatever
   332         redirectrql = rql_for_eid(4012) # whatever
   332         req = self.request()
   333         req = self.request()
   333         req.form = {
   334         req.form = {
   339             '__redirectvid': 'primary',
   340             '__redirectvid': 'primary',
   340             '__redirectparams': 'toto=tutu&tata=titi',
   341             '__redirectparams': 'toto=tutu&tata=titi',
   341             '__form_id': 'edition',
   342             '__form_id': 'edition',
   342             }
   343             }
   343         path, params = self.expect_redirect_publish(req, 'edit')
   344         path, params = self.expect_redirect_publish(req, 'edit')
   344         self.assertEquals(path, 'view')
   345         self.assertEqual(path, 'view')
   345         self.assertEquals(params['rql'], redirectrql)
   346         self.assertEqual(params['rql'], redirectrql)
   346         self.assertEquals(params['vid'], 'primary')
   347         self.assertEqual(params['vid'], 'primary')
   347         self.assertEquals(params['tata'], 'titi')
   348         self.assertEqual(params['tata'], 'titi')
   348         self.assertEquals(params['toto'], 'tutu')
   349         self.assertEqual(params['toto'], 'tutu')
   349 
   350 
   350     def test_redirect_delete_button(self):
   351     def test_redirect_delete_button(self):
   351         req = self.request()
   352         req = self.request()
   352         eid = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   353         eid = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   353         req.form = {'eid': u(eid), '__type:%s'%eid: 'BlogEntry',
   354         req.form = {'eid': u(eid), '__type:%s'%eid: 'BlogEntry',
   354                     '__action_delete': ''}
   355                     '__action_delete': ''}
   355         path, params = self.expect_redirect_publish(req, 'edit')
   356         path, params = self.expect_redirect_publish(req, 'edit')
   356         self.assertEquals(path, 'blogentry')
   357         self.assertEqual(path, 'blogentry')
   357         self.assertIn('_cwmsgid', params)
   358         self.assertIn('_cwmsgid', params)
   358         eid = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid
   359         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',
   360         self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s',
   360                      {'x': self.session.user.eid, 'e': eid})
   361                      {'x': self.session.user.eid, 'e': eid})
   361         self.commit()
   362         self.commit()
   362         req = req
   363         req = req
   363         req.form = {'eid': u(eid), '__type:%s'%eid: 'EmailAddress',
   364         req.form = {'eid': u(eid), '__type:%s'%eid: 'EmailAddress',
   364                     '__action_delete': ''}
   365                     '__action_delete': ''}
   365         path, params = self.expect_redirect_publish(req, 'edit')
   366         path, params = self.expect_redirect_publish(req, 'edit')
   366         self.assertEquals(path, 'cwuser/admin')
   367         self.assertEqual(path, 'cwuser/admin')
   367         self.assertIn('_cwmsgid', params)
   368         self.assertIn('_cwmsgid', params)
   368         eid1 = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   369         eid1 = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid
   369         eid2 = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid
   370         eid2 = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid
   370         req = self.request()
   371         req = self.request()
   371         req.form = {'eid': [u(eid1), u(eid2)],
   372         req.form = {'eid': [u(eid1), u(eid2)],
   372                     '__type:%s'%eid1: 'BlogEntry',
   373                     '__type:%s'%eid1: 'BlogEntry',
   373                     '__type:%s'%eid2: 'EmailAddress',
   374                     '__type:%s'%eid2: 'EmailAddress',
   374                     '__action_delete': ''}
   375                     '__action_delete': ''}
   375         path, params = self.expect_redirect_publish(req, 'edit')
   376         path, params = self.expect_redirect_publish(req, 'edit')
   376         self.assertEquals(path, 'view')
   377         self.assertEqual(path, 'view')
   377         self.assertIn('_cwmsgid', params)
   378         self.assertIn('_cwmsgid', params)
   378 
   379 
   379     def test_nonregr_eetype_etype_editing(self):
   380     def test_nonregr_eetype_etype_editing(self):
   380         """non-regression test checking that a manager user can edit a CWEType entity
   381         """non-regression test checking that a manager user can edit a CWEType entity
   381         """
   382         """
   395             'read_permission-subject:'+cwetypeeid:  groups,
   396             'read_permission-subject:'+cwetypeeid:  groups,
   396             }
   397             }
   397         try:
   398         try:
   398             path, params = self.expect_redirect_publish(req, 'edit')
   399             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)
   400             e = self.execute('Any X WHERE X eid %(x)s', {'x': cwetypeeid}).get_entity(0, 0)
   400             self.assertEquals(e.name, 'CWEType')
   401             self.assertEqual(e.name, 'CWEType')
   401             self.assertEquals(sorted(g.eid for g in e.read_permission), groupeids)
   402             self.assertEqual(sorted(g.eid for g in e.read_permission), groupeids)
   402         finally:
   403         finally:
   403             # restore
   404             # restore
   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.execute('SET X read_permission Y WHERE X name "CWEType", Y eid IN (%s), NOT X read_permission Y' % (','.join(basegroups)))
   405             self.commit()
   406             self.commit()
   406 
   407 
   417             'content-subject:A': u'"13:03:43"',}
   418             'content-subject:A': u'"13:03:43"',}
   418         path, params = self.expect_redirect_publish(req, 'edit')
   419         path, params = self.expect_redirect_publish(req, 'edit')
   419         self.failUnless(path.startswith('blogentry/'))
   420         self.failUnless(path.startswith('blogentry/'))
   420         eid = path.split('/')[1]
   421         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)
   422         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"')
   423         self.assertEqual(e.title, '"13:03:40"')
   423         self.assertEquals(e.content, '"13:03:43"')
   424         self.assertEqual(e.content, '"13:03:43"')
   424 
   425 
   425 
   426 
   426     def test_nonregr_multiple_empty_email_addr(self):
   427     def test_nonregr_multiple_empty_email_addr(self):
   427         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   428         gueid = self.execute('CWGroup G WHERE G name "users"')[0][0]
   428         req = self.request()
   429         req = self.request()
   439                     'address-subject:Y': u'',
   440                     'address-subject:Y': u'',
   440                     'alias-subject:Y': u'',
   441                     'alias-subject:Y': u'',
   441                     'use_email-object:Y': 'X',
   442                     'use_email-object:Y': 'X',
   442                     }
   443                     }
   443         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   444         ex = self.assertRaises(ValidationError, self.ctrl_publish, req)
   444         self.assertEquals(ex.errors, {'address-subject': u'required field'})
   445         self.assertEqual(ex.errors, {'address-subject': u'required field'})
   445 
   446 
   446     def test_nonregr_copy(self):
   447     def test_nonregr_copy(self):
   447         user = self.user()
   448         user = self.user()
   448         req = self.request()
   449         req = self.request()
   449         req.form = {'__maineid' : 'X', 'eid': 'X',
   450         req.form = {'__maineid' : 'X', 'eid': 'X',
   451                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   452                     '_cw_edited_fields:X': 'login-subject,upassword-subject',
   452                     'login-subject:X': u'toto',
   453                     'login-subject:X': u'toto',
   453                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   454                     'upassword-subject:X': u'toto', 'upassword-subject-confirm:X': u'toto',
   454                     }
   455                     }
   455         path, params = self.expect_redirect_publish(req, 'edit')
   456         path, params = self.expect_redirect_publish(req, 'edit')
   456         self.assertEquals(path, 'cwuser/toto')
   457         self.assertEqual(path, 'cwuser/toto')
   457         e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0)
   458         e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0)
   458         self.assertEquals(e.login, 'toto')
   459         self.assertEqual(e.login, 'toto')
   459         self.assertEquals(e.in_group[0].name, 'managers')
   460         self.assertEqual(e.in_group[0].name, 'managers')
   460 
   461 
   461 
   462 
   462     def test_nonregr_rollback_on_validation_error(self):
   463     def test_nonregr_rollback_on_validation_error(self):
   463         p = self.create_user("doe")
   464         p = self.create_user("doe")
   464         # do not try to skip 'primary_email' for this test
   465         # do not try to skip 'primary_email' for this test
   486                 req = self.request()
   487                 req = self.request()
   487                 req.form['rql'] = 'Any X WHERE X eid %s' % p.eid
   488                 req.form['rql'] = 'Any X WHERE X eid %s' % p.eid
   488                 req.form['vid'] = 'copy'
   489                 req.form['vid'] = 'copy'
   489                 self.app_publish(req, 'view')
   490                 self.app_publish(req, 'view')
   490             rset = self.execute('CWUser P WHERE P surname "Boom"')
   491             rset = self.execute('CWUser P WHERE P surname "Boom"')
   491             self.assertEquals(len(rset), 0)
   492             self.assertEqual(len(rset), 0)
   492         finally:
   493         finally:
   493             p.__class__.skip_copy_for = old_skips
   494             p.__class__.skip_copy_for = old_skips
   494 
   495 
   495 
   496 
   496 class EmbedControllerTC(CubicWebTC):
   497 class EmbedControllerTC(CubicWebTC):
   558         self.failUnless(source.startswith('<div>'))
   559         self.failUnless(source.startswith('<div>'))
   559 
   560 
   560 #     def test_json_exec(self):
   561 #     def test_json_exec(self):
   561 #         rql = 'Any T,N WHERE T is Tag, T name N'
   562 #         rql = 'Any T,N WHERE T is Tag, T name N'
   562 #         ctrl = self.ctrl(self.request(mode='json', rql=rql, pageid='123'))
   563 #         ctrl = self.ctrl(self.request(mode='json', rql=rql, pageid='123'))
   563 #         self.assertEquals(ctrl.publish(),
   564 #         self.assertEqual(ctrl.publish(),
   564 #                           json_dumps(self.execute(rql).rows))
   565 #                           json_dumps(self.execute(rql).rows))
   565 
   566 
   566     def test_remote_add_existing_tag(self):
   567     def test_remote_add_existing_tag(self):
   567         self.remote_call('tag_entity', self.john.eid, ['python'])
   568         self.remote_call('tag_entity', self.john.eid, ['python'])
   568         self.assertUnorderedIterableEquals(
   569         self.assertItemsEqual(
   569             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   570             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   570             ['python', 'cubicweb'])
   571             ['python', 'cubicweb'])
   571         self.assertEquals(
   572         self.assertEqual(
   572             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   573             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   573             [['python']])
   574             [['python']])
   574 
   575 
   575     def test_remote_add_new_tag(self):
   576     def test_remote_add_new_tag(self):
   576         self.remote_call('tag_entity', self.john.eid, ['javascript'])
   577         self.remote_call('tag_entity', self.john.eid, ['javascript'])
   577         self.assertUnorderedIterableEquals(
   578         self.assertItemsEqual(
   578             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   579             [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')],
   579             ['python', 'cubicweb', 'javascript'])
   580             ['python', 'cubicweb', 'javascript'])
   580         self.assertEquals(
   581         self.assertEqual(
   581             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   582             self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows,
   582             [['javascript']])
   583             [['javascript']])
   583 
   584 
   584     def test_pending_insertion(self):
   585     def test_pending_insertion(self):
   585         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '13']])
   586         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '13']])
   586         deletes = get_pending_deletes(req)
   587         deletes = get_pending_deletes(req)
   587         self.assertEquals(deletes, [])
   588         self.assertEqual(deletes, [])
   588         inserts = get_pending_inserts(req)
   589         inserts = get_pending_inserts(req)
   589         self.assertEquals(inserts, ['12:tags:13'])
   590         self.assertEqual(inserts, ['12:tags:13'])
   590         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   591         res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   591         deletes = get_pending_deletes(req)
   592         deletes = get_pending_deletes(req)
   592         self.assertEquals(deletes, [])
   593         self.assertEqual(deletes, [])
   593         inserts = get_pending_inserts(req)
   594         inserts = get_pending_inserts(req)
   594         self.assertEquals(inserts, ['12:tags:13', '12:tags:14'])
   595         self.assertEqual(inserts, ['12:tags:13', '12:tags:14'])
   595         inserts = get_pending_inserts(req, 12)
   596         inserts = get_pending_inserts(req, 12)
   596         self.assertEquals(inserts, ['12:tags:13', '12:tags:14'])
   597         self.assertEqual(inserts, ['12:tags:13', '12:tags:14'])
   597         inserts = get_pending_inserts(req, 13)
   598         inserts = get_pending_inserts(req, 13)
   598         self.assertEquals(inserts, ['12:tags:13'])
   599         self.assertEqual(inserts, ['12:tags:13'])
   599         inserts = get_pending_inserts(req, 14)
   600         inserts = get_pending_inserts(req, 14)
   600         self.assertEquals(inserts, ['12:tags:14'])
   601         self.assertEqual(inserts, ['12:tags:14'])
   601         req.remove_pending_operations()
   602         req.remove_pending_operations()
   602 
   603 
   603     def test_pending_deletion(self):
   604     def test_pending_deletion(self):
   604         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   605         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   605         inserts = get_pending_inserts(req)
   606         inserts = get_pending_inserts(req)
   606         self.assertEquals(inserts, [])
   607         self.assertEqual(inserts, [])
   607         deletes = get_pending_deletes(req)
   608         deletes = get_pending_deletes(req)
   608         self.assertEquals(deletes, ['12:tags:13'])
   609         self.assertEqual(deletes, ['12:tags:13'])
   609         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '14'])
   610         res, req = self.remote_call('add_pending_delete', ['12', 'tags', '14'])
   610         inserts = get_pending_inserts(req)
   611         inserts = get_pending_inserts(req)
   611         self.assertEquals(inserts, [])
   612         self.assertEqual(inserts, [])
   612         deletes = get_pending_deletes(req)
   613         deletes = get_pending_deletes(req)
   613         self.assertEquals(deletes, ['12:tags:13', '12:tags:14'])
   614         self.assertEqual(deletes, ['12:tags:13', '12:tags:14'])
   614         deletes = get_pending_deletes(req, 12)
   615         deletes = get_pending_deletes(req, 12)
   615         self.assertEquals(deletes, ['12:tags:13', '12:tags:14'])
   616         self.assertEqual(deletes, ['12:tags:13', '12:tags:14'])
   616         deletes = get_pending_deletes(req, 13)
   617         deletes = get_pending_deletes(req, 13)
   617         self.assertEquals(deletes, ['12:tags:13'])
   618         self.assertEqual(deletes, ['12:tags:13'])
   618         deletes = get_pending_deletes(req, 14)
   619         deletes = get_pending_deletes(req, 14)
   619         self.assertEquals(deletes, ['12:tags:14'])
   620         self.assertEqual(deletes, ['12:tags:14'])
   620         req.remove_pending_operations()
   621         req.remove_pending_operations()
   621 
   622 
   622     def test_remove_pending_operations(self):
   623     def test_remove_pending_operations(self):
   623         self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   624         self.remote_call('add_pending_delete', ['12', 'tags', '13'])
   624         _, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   625         _, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']])
   625         inserts = get_pending_inserts(req)
   626         inserts = get_pending_inserts(req)
   626         self.assertEquals(inserts, ['12:tags:14'])
   627         self.assertEqual(inserts, ['12:tags:14'])
   627         deletes = get_pending_deletes(req)
   628         deletes = get_pending_deletes(req)
   628         self.assertEquals(deletes, ['12:tags:13'])
   629         self.assertEqual(deletes, ['12:tags:13'])
   629         req.remove_pending_operations()
   630         req.remove_pending_operations()
   630         self.assertEquals(get_pending_deletes(req), [])
   631         self.assertEqual(get_pending_deletes(req), [])
   631         self.assertEquals(get_pending_inserts(req), [])
   632         self.assertEqual(get_pending_inserts(req), [])
   632 
   633 
   633 
   634 
   634     def test_add_inserts(self):
   635     def test_add_inserts(self):
   635         res, req = self.remote_call('add_pending_inserts',
   636         res, req = self.remote_call('add_pending_inserts',
   636                                     [('12', 'tags', '13'), ('12', 'tags', '14')])
   637                                     [('12', 'tags', '13'), ('12', 'tags', '14')])
   637         inserts = get_pending_inserts(req)
   638         inserts = get_pending_inserts(req)
   638         self.assertEquals(inserts, ['12:tags:13', '12:tags:14'])
   639         self.assertEqual(inserts, ['12:tags:13', '12:tags:14'])
   639         req.remove_pending_operations()
   640         req.remove_pending_operations()
   640 
   641 
   641 
   642 
   642     # silly tests
   643     # silly tests
   643     def test_external_resource(self):
   644     def test_external_resource(self):
   644         self.assertEquals(self.remote_call('external_resource', 'RSS_LOGO')[0],
   645         self.assertEqual(self.remote_call('external_resource', 'RSS_LOGO')[0],
   645                           json_dumps(self.config.uiprops['RSS_LOGO']))
   646                           json_dumps(self.config.uiprops['RSS_LOGO']))
   646     def test_i18n(self):
   647     def test_i18n(self):
   647         self.assertEquals(self.remote_call('i18n', ['bimboom'])[0],
   648         self.assertEqual(self.remote_call('i18n', ['bimboom'])[0],
   648                           json_dumps(['bimboom']))
   649                           json_dumps(['bimboom']))
   649 
   650 
   650     def test_format_date(self):
   651     def test_format_date(self):
   651         self.assertEquals(self.remote_call('format_date', '2007-01-01 12:00:00')[0],
   652         self.assertEqual(self.remote_call('format_date', '2007-01-01 12:00:00')[0],
   652                           json_dumps('2007/01/01'))
   653                           json_dumps('2007/01/01'))
   653 
   654 
   654 
   655 
   655 
   656 
   656 
   657