entities/test/unittest_base.py
changeset 9858 4266e13fd5c1
parent 9440 6880674c1a26
child 9859 fc978ff7f381
equal deleted inserted replaced
9857:618d45655865 9858:4266e13fd5c1
     1 # -*- coding: utf-8 -*-
     1 # -*- coding: utf-8 -*-
     2 # copyright 2003-2010 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
    19 """unit tests for cubicweb.entities.base module
    19 """unit tests for cubicweb.entities.base module
    20 """
    20 """
    21 
    21 
    22 from logilab.common.testlib import unittest_main
    22 from logilab.common.testlib import unittest_main
    23 from logilab.common.decorators import clear_cache
    23 from logilab.common.decorators import clear_cache
    24 from logilab.common.interface import implements
       
    25 
    24 
    26 from cubicweb.devtools.testlib import CubicWebTC
    25 from cubicweb.devtools.testlib import CubicWebTC
    27 
    26 
    28 from cubicweb.entities import AnyEntity
    27 from cubicweb.entities import AnyEntity
    29 
    28 
    30 
    29 
    31 class BaseEntityTC(CubicWebTC):
    30 class BaseEntityTC(CubicWebTC):
    32 
    31 
    33     def setup_database(self):
    32     def setup_database(self):
    34         req = self.request()
    33         with self.admin_access.repo_cnx() as cnx:
    35         self.member = self.create_user(req, 'member')
    34             self.member = self.create_user(cnx, 'member')
    36 
    35             cnx.commit()
    37 
    36 
    38 
    37 
    39 class MetadataTC(BaseEntityTC):
    38 class MetadataTC(BaseEntityTC):
    40 
    39 
    41     def test_creator(self):
    40     def test_creator(self):
    42         self.login(u'member')
    41         with self.new_access('member').repo_cnx() as cnx:
    43         entity = self.request().create_entity('Bookmark', title=u"hello", path=u'project/cubicweb')
    42             entity = cnx.create_entity('Bookmark', title=u"hello", path=u'project/cubicweb')
    44         self.commit()
    43             cnx.commit()
    45         self.assertEqual(entity.creator.eid, self.member.eid)
    44             self.assertEqual(entity.creator.eid, self.member.eid)
    46         self.assertEqual(entity.dc_creator(), u'member')
    45             self.assertEqual(entity.dc_creator(), u'member')
    47 
    46 
    48     def test_type(self):
    47     def test_type(self):
    49         #dc_type may be translated
    48         #dc_type may be translated
    50         self.assertEqual(self.member.dc_type(), 'CWUser')
    49         self.assertEqual(self.member.dc_type(), 'CWUser')
    51 
    50 
    54         self.assertEqual(self.member.cw_etype, 'CWUser')
    53         self.assertEqual(self.member.cw_etype, 'CWUser')
    55 
    54 
    56     def test_entity_meta_attributes(self):
    55     def test_entity_meta_attributes(self):
    57         # XXX move to yams
    56         # XXX move to yams
    58         self.assertEqual(self.schema['CWUser'].meta_attributes(), {})
    57         self.assertEqual(self.schema['CWUser'].meta_attributes(), {})
    59         self.assertEqual(dict((str(k), v) for k, v in self.schema['State'].meta_attributes().iteritems()),
    58         self.assertEqual(dict((str(k), v)
       
    59                               for k, v in self.schema['State'].meta_attributes().iteritems()),
    60                           {'description_format': ('format', 'description')})
    60                           {'description_format': ('format', 'description')})
    61 
    61 
    62     def test_fti_rql_method(self):
    62     def test_fti_rql_method(self):
    63         eclass = self.vreg['etypes'].etype_class('EmailAddress')
    63         with self.admin_access.web_request() as req:
    64         self.assertEqual(['Any X, ALIAS, ADDRESS WHERE X is EmailAddress, '
    64             eclass = self.vreg['etypes'].etype_class('EmailAddress')
    65                           'X alias ALIAS, X address ADDRESS'],
    65             self.assertEqual(['Any X, ALIAS, ADDRESS WHERE X is EmailAddress, '
    66                          eclass.cw_fti_index_rql_queries(self.request()))
    66                               'X alias ALIAS, X address ADDRESS'],
       
    67                              eclass.cw_fti_index_rql_queries(req))
    67 
    68 
    68 
    69 
    69 class EmailAddressTC(BaseEntityTC):
    70 class EmailAddressTC(BaseEntityTC):
       
    71 
    70     def test_canonical_form(self):
    72     def test_canonical_form(self):
    71         email1 = self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"').get_entity(0, 0)
    73         with self.admin_access.repo_cnx() as cnx:
    72         email2 = self.execute('INSERT EmailAddress X: X address "maarten@philips.com"').get_entity(0, 0)
    74             email1 = cnx.execute('INSERT EmailAddress X: '
    73         email3 = self.execute('INSERT EmailAddress X: X address "toto@logilab.fr"').get_entity(0, 0)
    75                                  'X address "maarten.ter.huurne@philips.com"').get_entity(0, 0)
    74         email1.cw_set(prefered_form=email2)
    76             email2 = cnx.execute('INSERT EmailAddress X: '
    75         self.assertEqual(email1.prefered.eid, email2.eid)
    77                                  'X address "maarten@philips.com"').get_entity(0, 0)
    76         self.assertEqual(email2.prefered.eid, email2.eid)
    78             email3 = cnx.execute('INSERT EmailAddress X: '
    77         self.assertEqual(email3.prefered.eid, email3.eid)
    79                                  'X address "toto@logilab.fr"').get_entity(0, 0)
       
    80             email1.cw_set(prefered_form=email2)
       
    81             self.assertEqual(email1.prefered.eid, email2.eid)
       
    82             self.assertEqual(email2.prefered.eid, email2.eid)
       
    83             self.assertEqual(email3.prefered.eid, email3.eid)
    78 
    84 
    79     def test_mangling(self):
    85     def test_mangling(self):
    80         email = self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"').get_entity(0, 0)
    86         with self.admin_access.repo_cnx() as cnx:
    81         self.assertEqual(email.display_address(), 'maarten.ter.huurne@philips.com')
    87             email = cnx.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"').get_entity(0, 0)
    82         self.assertEqual(email.printable_value('address'), 'maarten.ter.huurne@philips.com')
    88             self.assertEqual(email.display_address(), 'maarten.ter.huurne@philips.com')
    83         self.vreg.config.global_set_option('mangle-emails', True)
    89             self.assertEqual(email.printable_value('address'), 'maarten.ter.huurne@philips.com')
    84         try:
    90             self.vreg.config.global_set_option('mangle-emails', True)
    85             self.assertEqual(email.display_address(), 'maarten.ter.huurne at philips dot com')
    91             try:
    86             self.assertEqual(email.printable_value('address'), 'maarten.ter.huurne at philips dot com')
    92                 self.assertEqual(email.display_address(), 'maarten.ter.huurne at philips dot com')
    87             email = self.execute('INSERT EmailAddress X: X address "syt"').get_entity(0, 0)
    93                 self.assertEqual(email.printable_value('address'), 'maarten.ter.huurne at philips dot com')
    88             self.assertEqual(email.display_address(), 'syt')
    94                 email = cnx.execute('INSERT EmailAddress X: X address "syt"').get_entity(0, 0)
    89             self.assertEqual(email.printable_value('address'), 'syt')
    95                 self.assertEqual(email.display_address(), 'syt')
    90         finally:
    96                 self.assertEqual(email.printable_value('address'), 'syt')
    91             self.vreg.config.global_set_option('mangle-emails', False)
    97             finally:
       
    98                 self.vreg.config.global_set_option('mangle-emails', False)
    92 
    99 
    93     def test_printable_value_escape(self):
   100     def test_printable_value_escape(self):
    94         email = self.execute('INSERT EmailAddress X: X address "maarten&ter@philips.com"').get_entity(0, 0)
   101         with self.admin_access.repo_cnx() as cnx:
    95         self.assertEqual(email.printable_value('address'), 'maarten&ter@philips.com')
   102             email = cnx.execute('INSERT EmailAddress X: '
    96         self.assertEqual(email.printable_value('address', format='text/plain'), 'maarten&ter@philips.com')
   103                                 'X address "maarten&ter@philips.com"').get_entity(0, 0)
       
   104             self.assertEqual(email.printable_value('address'),
       
   105                              'maarten&ter@philips.com')
       
   106             self.assertEqual(email.printable_value('address', format='text/plain'),
       
   107                              'maarten&ter@philips.com')
    97 
   108 
    98 class CWUserTC(BaseEntityTC):
   109 class CWUserTC(BaseEntityTC):
    99 
   110 
   100     def test_complete(self):
   111     def test_complete(self):
   101         e = self.execute('CWUser X WHERE X login "admin"').get_entity(0, 0)
   112         with self.admin_access.repo_cnx() as cnx:
   102         e.complete()
   113             e = cnx.execute('CWUser X WHERE X login "admin"').get_entity(0, 0)
       
   114             e.complete()
   103 
   115 
   104     def test_matching_groups(self):
   116     def test_matching_groups(self):
   105         e = self.execute('CWUser X WHERE X login "admin"').get_entity(0, 0)
   117         with self.admin_access.repo_cnx() as cnx:
   106         self.assertTrue(e.matching_groups('managers'))
   118             e = cnx.execute('CWUser X WHERE X login "admin"').get_entity(0, 0)
   107         self.assertFalse(e.matching_groups('xyz'))
   119             self.assertTrue(e.matching_groups('managers'))
   108         self.assertTrue(e.matching_groups(('xyz', 'managers')))
   120             self.assertFalse(e.matching_groups('xyz'))
   109         self.assertFalse(e.matching_groups(('xyz', 'abcd')))
   121             self.assertTrue(e.matching_groups(('xyz', 'managers')))
       
   122             self.assertFalse(e.matching_groups(('xyz', 'abcd')))
   110 
   123 
   111     def test_dc_title_and_name(self):
   124     def test_dc_title_and_name(self):
   112         e = self.execute('CWUser U WHERE U login "member"').get_entity(0, 0)
   125         with self.admin_access.repo_cnx() as cnx:
   113         self.assertEqual(e.dc_title(), 'member')
   126             e = cnx.execute('CWUser U WHERE U login "member"').get_entity(0, 0)
   114         self.assertEqual(e.name(), 'member')
   127             self.assertEqual(e.dc_title(), 'member')
   115         e.cw_set(firstname=u'bouah')
   128             self.assertEqual(e.name(), 'member')
   116         self.assertEqual(e.dc_title(), 'member')
   129             e.cw_set(firstname=u'bouah')
   117         self.assertEqual(e.name(), u'bouah')
   130             self.assertEqual(e.dc_title(), 'member')
   118         e.cw_set(surname=u'lôt')
   131             self.assertEqual(e.name(), u'bouah')
   119         self.assertEqual(e.dc_title(), 'member')
   132             e.cw_set(surname=u'lôt')
   120         self.assertEqual(e.name(), u'bouah lôt')
   133             self.assertEqual(e.dc_title(), 'member')
       
   134             self.assertEqual(e.name(), u'bouah lôt')
   121 
   135 
   122     def test_allowed_massmail_keys(self):
   136     def test_allowed_massmail_keys(self):
   123         e = self.execute('CWUser U WHERE U login "member"').get_entity(0, 0)
   137         with self.admin_access.repo_cnx() as cnx:
   124         # Bytes/Password attributes should be omited
   138             e = cnx.execute('CWUser U WHERE U login "member"').get_entity(0, 0)
   125         self.assertEqual(e.cw_adapt_to('IEmailable').allowed_massmail_keys(),
   139             # Bytes/Password attributes should be omited
   126                           set(('surname', 'firstname', 'login', 'last_login_time',
   140             self.assertEqual(e.cw_adapt_to('IEmailable').allowed_massmail_keys(),
   127                                'creation_date', 'modification_date', 'cwuri', 'eid'))
   141                               set(('surname', 'firstname', 'login', 'last_login_time',
   128                           )
   142                                    'creation_date', 'modification_date', 'cwuri', 'eid'))
       
   143                               )
   129 
   144 
   130     def test_cw_instantiate_object_relation(self):
   145     def test_cw_instantiate_object_relation(self):
   131         """ a weird non regression test """
   146         """ a weird non regression test """
   132         e = self.execute('CWUser U WHERE U login "member"').get_entity(0, 0)
   147         with self.admin_access.repo_cnx() as cnx:
   133         self.request().create_entity('CWGroup', name=u'logilab', reverse_in_group=e)
   148             e = cnx.execute('CWUser U WHERE U login "member"').get_entity(0, 0)
       
   149             cnx.create_entity('CWGroup', name=u'logilab', reverse_in_group=e)
   134 
   150 
   135 
   151 
   136 class HTMLtransformTC(BaseEntityTC):
   152 class HTMLtransformTC(BaseEntityTC):
   137 
   153 
   138     def test_sanitized_html(self):
   154     def test_sanitized_html(self):
   139         r = self.request()
   155         with self.admin_access.repo_cnx() as cnx:
   140         c = r.create_entity('Company', name=u'Babar',
   156             c = cnx.create_entity('Company', name=u'Babar',
   141                             description=u"""
   157                                   description=u"""
   142 Title
   158 Title
   143 =====
   159 =====
   144 
   160 
   145 Elephant management best practices.
   161 Elephant management best practices.
   146 
   162 
   147 .. raw:: html
   163 .. raw:: html
   148 
   164 
   149    <script>alert("coucou")</script>
   165    <script>alert("coucou")</script>
   150 """, description_format=u'text/rest')
   166 """, description_format=u'text/rest')
   151         self.commit()
   167             cnx.commit()
   152         c.cw_clear_all_caches()
   168             c.cw_clear_all_caches()
   153         self.assertIn('alert', c.printable_value('description', format='text/plain'))
   169             self.assertIn('alert',
   154         self.assertNotIn('alert', c.printable_value('description', format='text/html'))
   170                           c.printable_value('description', format='text/plain'))
       
   171             self.assertNotIn('alert',
       
   172                              c.printable_value('description', format='text/html'))
   155 
   173 
   156 
   174 
   157 class SpecializedEntityClassesTC(CubicWebTC):
   175 class SpecializedEntityClassesTC(CubicWebTC):
   158 
   176 
   159     def select_eclass(self, etype):
   177     def select_eclass(self, etype):