hooks/test/unittest_hooks.py
changeset 9852 4c1969c173fa
parent 9361 0542a85fe667
child 9853 4ddae5c156f6
equal deleted inserted replaced
9851:42a874c666b1 9852:4c1969c173fa
     1 # -*- coding: utf-8 -*-
     1 # -*- coding: utf-8 -*-
     2 # copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     2 # copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     3 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     3 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     4 #
     4 #
     5 # This file is part of CubicWeb.
     5 # This file is part of CubicWeb.
     6 #
     6 #
     7 # CubicWeb is free software: you can redistribute it and/or modify it under the
     7 # CubicWeb is free software: you can redistribute it and/or modify it under the
    28 from cubicweb.devtools.testlib import CubicWebTC
    28 from cubicweb.devtools.testlib import CubicWebTC
    29 
    29 
    30 class CoreHooksTC(CubicWebTC):
    30 class CoreHooksTC(CubicWebTC):
    31 
    31 
    32     def test_inlined(self):
    32     def test_inlined(self):
    33         self.assertEqual(self.repo.schema['sender'].inlined, True)
    33         with self.admin_access.repo_cnx() as cnx:
    34         self.execute('INSERT EmailAddress X: X address "toto@logilab.fr", X alias "hop"')
    34             self.assertEqual(self.repo.schema['sender'].inlined, True)
    35         self.execute('INSERT EmailPart X: X content_format "text/plain", X ordernum 1, X content "this is a test"')
    35             cnx.execute('INSERT EmailAddress X: X address "toto@logilab.fr", X alias "hop"')
    36         eeid = self.execute('INSERT Email X: X messageid "<1234>", X subject "test", X sender Y, X recipients Y, X parts P '
    36             cnx.execute('INSERT EmailPart X: X content_format "text/plain", X ordernum 1, '
    37                             'WHERE Y is EmailAddress, P is EmailPart')[0][0]
    37                         'X content "this is a test"')
    38         self.execute('SET X sender Y WHERE X is Email, Y is EmailAddress')
    38             eeid = cnx.execute('INSERT Email X: X messageid "<1234>", X subject "test", '
    39         rset = self.execute('Any S WHERE X sender S, X eid %s' % eeid)
    39                                'X sender Y, X recipients Y, X parts P '
    40         self.assertEqual(len(rset), 1)
    40                                'WHERE Y is EmailAddress, P is EmailPart')[0][0]
       
    41             cnx.execute('SET X sender Y WHERE X is Email, Y is EmailAddress')
       
    42             rset = cnx.execute('Any S WHERE X sender S, X eid %s' % eeid)
       
    43             self.assertEqual(len(rset), 1)
    41 
    44 
    42     def test_symmetric(self):
    45     def test_symmetric(self):
    43         req = self.request()
    46         with self.admin_access.repo_cnx() as cnx:
    44         u1 = self.create_user(req, u'1')
    47             u1 = self.create_user(cnx, u'1')
    45         u2 = self.create_user(req, u'2')
    48             u2 = self.create_user(cnx, u'2')
    46         u3 = self.create_user(req, u'3')
    49             u3 = self.create_user(cnx, u'3')
    47         ga = req.create_entity('CWGroup', name=u'A')
    50             ga = cnx.create_entity('CWGroup', name=u'A')
    48         gb = req.create_entity('CWGroup', name=u'B')
    51             gb = cnx.create_entity('CWGroup', name=u'B')
    49         u1.cw_set(friend=u2)
    52             u1.cw_set(friend=u2)
    50         u2.cw_set(friend=u3)
    53             u2.cw_set(friend=u3)
    51         ga.cw_set(friend=gb)
    54             ga.cw_set(friend=gb)
    52         ga.cw_set(friend=u1)
    55             ga.cw_set(friend=u1)
    53         self.commit()
    56             cnx.commit()
    54         req = self.request()
    57             for l1, l2 in ((u'1', u'2'),
    55         for l1, l2 in ((u'1', u'2'),
    58                            (u'2', u'3')):
    56                        (u'2', u'3')):
    59                 self.assertTrue(cnx.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s',
    57             self.assertTrue(req.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s',
    60                                             {'l1': l1, 'l2': l2}))
    58                                         {'l1': l1, 'l2': l2}))
    61                 self.assertTrue(cnx.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s',
    59             self.assertTrue(req.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s',
    62                                             {'l1': l1, 'l2': l2}))
    60                                         {'l1': l1, 'l2': l2}))
    63             self.assertTrue(cnx.execute('Any GA,GB WHERE GA friend GB, GA name "A", GB name "B"'))
    61         self.assertTrue(req.execute('Any GA,GB WHERE GA friend GB, GA name "A", GB name "B"'))
    64             self.assertTrue(cnx.execute('Any GA,GB WHERE GB friend GA, GA name "A", GB name "B"'))
    62         self.assertTrue(req.execute('Any GA,GB WHERE GB friend GA, GA name "A", GB name "B"'))
    65             self.assertTrue(cnx.execute('Any GA,U1 WHERE GA friend U1, GA name "A", U1 login "1"'))
    63         self.assertTrue(req.execute('Any GA,U1 WHERE GA friend U1, GA name "A", U1 login "1"'))
    66             self.assertTrue(cnx.execute('Any GA,U1 WHERE U1 friend GA, GA name "A", U1 login "1"'))
    64         self.assertTrue(req.execute('Any GA,U1 WHERE U1 friend GA, GA name "A", U1 login "1"'))
    67             self.assertFalse(cnx.execute('Any GA,U WHERE GA friend U, GA name "A", U login "2"'))
    65         self.assertFalse(req.execute('Any GA,U WHERE GA friend U, GA name "A", U login "2"'))
    68             for l1, l2 in ((u'1', u'3'),
    66         for l1, l2 in ((u'1', u'3'),
    69                            (u'3', u'1')):
    67                        (u'3', u'1')):
    70                 self.assertFalse(cnx.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s',
    68             self.assertFalse(req.execute('Any U1,U2 WHERE U1 friend U2, U1 login %(l1)s, U2 login %(l2)s',
    71                                              {'l1': l1, 'l2': l2}))
    69                                          {'l1': l1, 'l2': l2}))
    72                 self.assertFalse(cnx.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s',
    70             self.assertFalse(req.execute('Any U1,U2 WHERE U2 friend U1, U1 login %(l1)s, U2 login %(l2)s',
    73                                              {'l1': l1, 'l2': l2}))
    71                                          {'l1': l1, 'l2': l2}))
       
    72 
    74 
    73     def test_html_tidy_hook(self):
    75     def test_html_tidy_hook(self):
    74         req = self.request()
    76         with self.admin_access.web_request() as req:
    75         entity = req.create_entity('Workflow', name=u'wf1',
    77             entity = req.create_entity('Workflow', name=u'wf1',
    76                                    description_format=u'text/html',
    78                                        description_format=u'text/html',
    77                                    description=u'yo')
    79                                        description=u'yo')
    78         self.assertEqual(entity.description, u'yo')
    80             self.assertEqual(entity.description, u'yo')
    79         entity = req.create_entity('Workflow', name=u'wf2',
    81             entity = req.create_entity('Workflow', name=u'wf2',
    80                                    description_format=u'text/html',
    82                                        description_format=u'text/html',
    81                                    description=u'<b>yo')
    83                                        description=u'<b>yo')
    82         self.assertEqual(entity.description, u'<b>yo</b>')
    84             self.assertEqual(entity.description, u'<b>yo</b>')
    83         entity = req.create_entity('Workflow', name=u'wf3',
    85             entity = req.create_entity('Workflow', name=u'wf3',
    84                                    description_format=u'text/html',
    86                                        description_format=u'text/html',
    85                                    description=u'<b>yo</b>')
    87                                        description=u'<b>yo</b>')
    86         self.assertEqual(entity.description, u'<b>yo</b>')
    88             self.assertEqual(entity.description, u'<b>yo</b>')
    87         entity = req.create_entity('Workflow', name=u'wf4',
    89             entity = req.create_entity('Workflow', name=u'wf4',
    88                                    description_format=u'text/html',
    90                                        description_format=u'text/html',
    89                                    description=u'<b>R&D</b>')
    91                                        description=u'<b>R&D</b>')
    90         self.assertEqual(entity.description, u'<b>R&amp;D</b>')
    92             self.assertEqual(entity.description, u'<b>R&amp;D</b>')
    91         entity = req.create_entity('Workflow', name=u'wf5',
    93             entity = req.create_entity('Workflow', name=u'wf5',
    92                                    description_format=u'text/html',
    94                                        description_format=u'text/html',
    93                                    description=u"<div>c&apos;est <b>l'ét&eacute;")
    95                                        description=u"<div>c&apos;est <b>l'ét&eacute;")
    94         self.assertEqual(entity.description, u"<div>c'est <b>l'été</b></div>")
    96             self.assertEqual(entity.description, u"<div>c'est <b>l'été</b></div>")
    95 
    97 
    96     def test_nonregr_html_tidy_hook_no_update(self):
    98     def test_nonregr_html_tidy_hook_no_update(self):
    97         entity = self.request().create_entity('Workflow', name=u'wf1',
    99         with self.admin_access.web_request() as req:
    98                                               description_format=u'text/html',
   100             entity = req.create_entity('Workflow', name=u'wf1',
    99                                               description=u'yo')
   101                                        description_format=u'text/html',
   100         entity.cw_set(name=u'wf2')
   102                                        description=u'yo')
   101         self.assertEqual(entity.description, u'yo')
   103             entity.cw_set(name=u'wf2')
   102         entity.cw_set(description=u'R&D<p>yo')
   104             self.assertEqual(entity.description, u'yo')
   103         self.assertEqual(entity.description, u'R&amp;D<p>yo</p>')
   105             entity.cw_set(description=u'R&D<p>yo')
       
   106             self.assertEqual(entity.description, u'R&amp;D<p>yo</p>')
   104 
   107 
   105     def test_metadata_cwuri(self):
   108     def test_metadata_cwuri(self):
   106         entity = self.request().create_entity('Workflow', name=u'wf1')
   109         with self.admin_access.repo_cnx() as cnx:
   107         self.assertEqual(entity.cwuri, self.repo.config['base-url'] + str(entity.eid))
   110             entity = cnx.create_entity('Workflow', name=u'wf1')
       
   111             self.assertEqual(entity.cwuri, self.repo.config['base-url'] + str(entity.eid))
   108 
   112 
   109     def test_metadata_creation_modification_date(self):
   113     def test_metadata_creation_modification_date(self):
   110         _now = datetime.now()
   114         with self.admin_access.repo_cnx() as cnx:
   111         entity = self.request().create_entity('Workflow', name=u'wf1')
   115             _now = datetime.now()
   112         self.assertEqual((entity.creation_date - _now).seconds, 0)
   116             entity = cnx.create_entity('Workflow', name=u'wf1')
   113         self.assertEqual((entity.modification_date - _now).seconds, 0)
   117             self.assertEqual((entity.creation_date - _now).seconds, 0)
       
   118             self.assertEqual((entity.modification_date - _now).seconds, 0)
   114 
   119 
   115     def test_metadata_created_by(self):
   120     def test_metadata_created_by(self):
   116         entity = self.request().create_entity('Bookmark', title=u'wf1', path=u'/view')
   121         with self.admin_access.repo_cnx() as cnx:
   117         self.commit() # fire operations
   122             entity = cnx.create_entity('Bookmark', title=u'wf1', path=u'/view')
   118         self.assertEqual(len(entity.created_by), 1) # make sure we have only one creator
   123             cnx.commit() # fire operations
   119         self.assertEqual(entity.created_by[0].eid, self.session.user.eid)
   124             self.assertEqual(len(entity.created_by), 1) # make sure we have only one creator
       
   125             self.assertEqual(entity.created_by[0].eid, self.session.user.eid)
   120 
   126 
   121     def test_metadata_owned_by(self):
   127     def test_metadata_owned_by(self):
   122         entity = self.request().create_entity('Bookmark', title=u'wf1', path=u'/view')
   128         with self.admin_access.repo_cnx() as cnx:
   123         self.commit() # fire operations
   129             entity = cnx.create_entity('Bookmark', title=u'wf1', path=u'/view')
   124         self.assertEqual(len(entity.owned_by), 1) # make sure we have only one owner
   130             cnx.commit() # fire operations
   125         self.assertEqual(entity.owned_by[0].eid, self.session.user.eid)
   131             self.assertEqual(len(entity.owned_by), 1) # make sure we have only one owner
       
   132             self.assertEqual(entity.owned_by[0].eid, self.session.user.eid)
   126 
   133 
   127     def test_user_login_stripped(self):
   134     def test_user_login_stripped(self):
   128         req = self.request()
   135         with self.admin_access.repo_cnx() as cnx:
   129         u = self.create_user(req, '  joe  ')
   136             u = self.create_user(cnx, '  joe  ')
   130         tname = self.execute('Any L WHERE E login L, E eid %(e)s',
   137             tname = cnx.execute('Any L WHERE E login L, E eid %(e)s',
   131                              {'e': u.eid})[0][0]
   138                                 {'e': u.eid})[0][0]
   132         self.assertEqual(tname, 'joe')
   139             self.assertEqual(tname, 'joe')
   133         self.execute('SET X login " jijoe " WHERE X eid %(x)s', {'x': u.eid})
   140             cnx.execute('SET X login " jijoe " WHERE X eid %(x)s', {'x': u.eid})
   134         tname = self.execute('Any L WHERE E login L, E eid %(e)s',
   141             tname = cnx.execute('Any L WHERE E login L, E eid %(e)s',
   135                              {'e': u.eid})[0][0]
   142                                 {'e': u.eid})[0][0]
   136         self.assertEqual(tname, 'jijoe')
   143             self.assertEqual(tname, 'jijoe')
   137 
   144 
   138 
   145 
   139 
   146 
   140 class UserGroupHooksTC(CubicWebTC):
   147 class UserGroupHooksTC(CubicWebTC):
   141 
   148 
   142     def test_user_synchronization(self):
   149     def test_user_synchronization(self):
   143         req = self.request()
   150         with self.admin_access.repo_cnx() as cnx:
   144         self.create_user(req, 'toto', password='hop', commit=False)
   151             self.create_user(cnx, 'toto', password='hop', commit=False)
   145         self.assertRaises(AuthenticationError,
   152             self.assertRaises(AuthenticationError,
   146                           self.repo.connect, u'toto', password='hop')
   153                               self.repo.connect, u'toto', password='hop')
   147         self.commit()
   154             cnx.commit()
   148         cnxid = self.repo.connect(u'toto', password='hop')
   155             cnxid = self.repo.connect(u'toto', password='hop')
   149         self.assertNotEqual(cnxid, self.session.id)
   156             self.assertNotEqual(cnxid, self.session.id)
   150         self.execute('DELETE CWUser X WHERE X login "toto"')
   157             cnx.execute('DELETE CWUser X WHERE X login "toto"')
   151         self.repo.execute(cnxid, 'State X')
   158             self.repo.execute(cnxid, 'State X')
   152         self.commit()
   159             cnx.commit()
   153         self.assertRaises(BadConnectionId,
   160             self.assertRaises(BadConnectionId,
   154                           self.repo.execute, cnxid, 'State X')
   161                               self.repo.execute, cnxid, 'State X')
   155 
   162 
   156     def test_user_group_synchronization(self):
   163     def test_user_group_synchronization(self):
   157         user = self.session.user
   164         with self.admin_access.repo_cnx() as cnx:
   158         self.assertEqual(user.groups, set(('managers',)))
   165             user = cnx.user
   159         self.execute('SET X in_group G WHERE X eid %s, G name "guests"' % user.eid)
   166             self.assertEqual(user.groups, set(('managers',)))
   160         self.assertEqual(user.groups, set(('managers',)))
   167             cnx.execute('SET X in_group G WHERE X eid %s, G name "guests"' % user.eid)
   161         self.commit()
   168             self.assertEqual(user.groups, set(('managers',)))
   162         self.assertEqual(user.groups, set(('managers', 'guests')))
   169             cnx.commit()
   163         self.execute('DELETE X in_group G WHERE X eid %s, G name "guests"' % user.eid)
   170             self.assertEqual(user.groups, set(('managers', 'guests')))
   164         self.assertEqual(user.groups, set(('managers', 'guests')))
   171             cnx.execute('DELETE X in_group G WHERE X eid %s, G name "guests"' % user.eid)
   165         self.commit()
   172             self.assertEqual(user.groups, set(('managers', 'guests')))
   166         self.assertEqual(user.groups, set(('managers',)))
   173             cnx.commit()
       
   174             self.assertEqual(user.groups, set(('managers',)))
   167 
   175 
   168     def test_user_composite_owner(self):
   176     def test_user_composite_owner(self):
   169         req = self.request()
   177         with self.admin_access.repo_cnx() as cnx:
   170         ueid = self.create_user(req, 'toto').eid
   178             self.create_user(cnx, 'toto').eid
   171         # composite of euser should be owned by the euser regardless of who created it
   179             # composite of euser should be owned by the euser regardless of who created it
   172         self.execute('INSERT EmailAddress X: X address "toto@logilab.fr", U use_email X '
   180             cnx.execute('INSERT EmailAddress X: X address "toto@logilab.fr", U use_email X '
   173                      'WHERE U login "toto"')
   181                          'WHERE U login "toto"')
   174         self.commit()
   182             cnx.commit()
   175         self.assertEqual(self.execute('Any A WHERE X owned_by U, U use_email X,'
   183             self.assertEqual(cnx.execute('Any A WHERE X owned_by U, U use_email X,'
   176                                        'U login "toto", X address A')[0][0],
   184                                            'U login "toto", X address A')[0][0],
   177                           'toto@logilab.fr')
   185                               'toto@logilab.fr')
   178 
   186 
   179     def test_no_created_by_on_deleted_entity(self):
   187     def test_no_created_by_on_deleted_entity(self):
   180         eid = self.execute('INSERT EmailAddress X: X address "toto@logilab.fr"')[0][0]
   188         with self.admin_access.repo_cnx() as cnx:
   181         self.execute('DELETE EmailAddress X WHERE X eid %s' % eid)
   189             eid = cnx.execute('INSERT EmailAddress X: X address "toto@logilab.fr"')[0][0]
   182         self.commit()
   190             cnx.execute('DELETE EmailAddress X WHERE X eid %s' % eid)
   183         self.assertFalse(self.execute('Any X WHERE X created_by Y, X eid >= %(x)s', {'x': eid}))
   191             cnx.commit()
       
   192             self.assertFalse(cnx.execute('Any X WHERE X created_by Y, X eid >= %(x)s', {'x': eid}))
   184 
   193 
   185 
   194 
   186 
   195 
   187 class SchemaHooksTC(CubicWebTC):
   196 class SchemaHooksTC(CubicWebTC):
   188 
   197 
   189     def test_duplicate_etype_error(self):
   198     def test_duplicate_etype_error(self):
   190         # check we can't add a CWEType or CWRType entity if it already exists one
   199         with self.admin_access.repo_cnx() as cnx:
   191         # with the same name
   200             # check we can't add a CWEType or CWRType entity if it already exists one
   192         self.assertRaises(ValidationError,
   201             # with the same name
   193                           self.execute, 'INSERT CWEType X: X name "CWUser"')
   202             self.assertRaises(ValidationError,
   194         self.assertRaises(ValidationError,
   203                               cnx.execute, 'INSERT CWEType X: X name "CWUser"')
   195                           self.execute, 'INSERT CWRType X: X name "in_group"')
   204             cnx.rollback()
       
   205             self.assertRaises(ValidationError,
       
   206                               cnx.execute, 'INSERT CWRType X: X name "in_group"')
   196 
   207 
   197     def test_validation_unique_constraint(self):
   208     def test_validation_unique_constraint(self):
   198         with self.assertRaises(ValidationError) as cm:
   209         with self.admin_access.repo_cnx() as cnx:
   199             self.execute('INSERT CWUser X: X login "admin"')
   210             with self.assertRaises(ValidationError) as cm:
   200         ex = cm.exception
   211                 cnx.execute('INSERT CWUser X: X login "admin"')
   201         ex.translate(unicode)
   212             ex = cm.exception
   202         self.assertIsInstance(ex.entity, int)
   213             ex.translate(unicode)
   203         self.assertEqual(ex.errors, {'login-subject': 'the value "admin" is already used, use another one'})
   214             self.assertIsInstance(ex.entity, int)
       
   215             self.assertEqual(ex.errors, {'login-subject': 'the value "admin" is already used, use another one'})
   204 
   216 
   205 
   217 
   206 if __name__ == '__main__':
   218 if __name__ == '__main__':
   207     from logilab.common.testlib import unittest_main
   219     from logilab.common.testlib import unittest_main
   208     unittest_main()
   220     unittest_main()