update _render_attribute / _render_relation prototype to gain more control on label through uicfg (for attributes and relations). Keep bw compat for crm/iliane
# -*- coding: utf-8 -*-"""unit tests for cubicweb.entities.base module:organization: Logilab:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""fromlogilab.common.testlibimportunittest_mainfromlogilab.common.decoratorsimportclear_cachefromlogilab.common.interfaceimportimplementsfromcubicweb.devtools.apptestimportEnvBasedTCfromcubicwebimportValidationErrorfromcubicweb.interfacesimportIMileStone,IWorkflowablefromcubicweb.entitiesimportAnyEntityfromcubicweb.web.widgetsimportAutoCompletionWidgetclassBaseEntityTC(EnvBasedTC):defsetup_database(self):self.member=self.create_user('member')classMetadataTC(BaseEntityTC):deftest_creator(self):self.login(u'member')entity=self.add_entity('Bookmark',title=u"hello",path=u'project/cubicweb')self.commit()self.assertEquals(entity.creator.eid,self.member.eid)self.assertEquals(entity.dc_creator(),u'member')deftest_type(self):self.assertEquals(self.member.dc_type(),'cwuser')deftest_entity_meta_attributes(self):# XXX move to yamsself.assertEquals(self.schema['CWUser'].meta_attributes(),{})self.assertEquals(dict((str(k),v)fork,vinself.schema['State'].meta_attributes().iteritems()),{'description_format':('format','description')})classEmailAddressTC(BaseEntityTC):deftest_canonical_form(self):email1=self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"').get_entity(0,0)email2=self.execute('INSERT EmailAddress X: X address "maarten@philips.com"').get_entity(0,0)email3=self.execute('INSERT EmailAddress X: X address "toto@logilab.fr"').get_entity(0,0)email1.set_relations(prefered_form=email2)self.assertEquals(email1.prefered.eid,email2.eid)self.assertEquals(email2.prefered.eid,email2.eid)self.assertEquals(email3.prefered.eid,email3.eid)deftest_mangling(self):email=self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"').get_entity(0,0)self.assertEquals(email.display_address(),'maarten.ter.huurne@philips.com')self.assertEquals(email.printable_value('address'),'maarten.ter.huurne@philips.com')self.vreg.config.global_set_option('mangle-emails',True)self.assertEquals(email.display_address(),'maarten.ter.huurne at philips dot com')self.assertEquals(email.printable_value('address'),'maarten.ter.huurne at philips dot com')email=self.execute('INSERT EmailAddress X: X address "syt"').get_entity(0,0)self.assertEquals(email.display_address(),'syt')self.assertEquals(email.printable_value('address'),'syt')classCWUserTC(BaseEntityTC):deftest_complete(self):e=self.entity('CWUser X WHERE X login "admin"')e.complete()deftest_matching_groups(self):e=self.entity('CWUser X WHERE X login "admin"')self.failUnless(e.matching_groups('managers'))self.failIf(e.matching_groups('xyz'))self.failUnless(e.matching_groups(('xyz','managers')))self.failIf(e.matching_groups(('xyz','abcd')))deftest_dc_title_and_name(self):e=self.entity('CWUser U WHERE U login "member"')self.assertEquals(e.dc_title(),'member')self.assertEquals(e.name(),'member')e.set_attributes(firstname=u'bouah')self.assertEquals(e.dc_title(),'member')self.assertEquals(e.name(),u'bouah')e.set_attributes(surname=u'lôt')self.assertEquals(e.dc_title(),'member')self.assertEquals(e.name(),u'bouah lôt')deftest_allowed_massmail_keys(self):e=self.entity('CWUser U WHERE U login "member"')# Bytes/Password attributes should be omitedself.assertEquals(e.allowed_massmail_keys(),set(('surname','firstname','login','last_login_time','creation_date','modification_date','cwuri','eid')))classInterfaceTC(EnvBasedTC):deftest_nonregr_subclasses_and_mixins_interfaces(self):CWUser=self.vreg['etypes'].etype_class('CWUser')self.failUnless(implements(CWUser,IWorkflowable))classMyUser(CWUser):__implements__=(IMileStone,)self.vreg._loadedmods[__name__]={}self.vreg.register_appobject_class(MyUser)self.vreg['etypes'].initialization_completed()MyUser_=self.vreg['etypes'].etype_class('CWUser')# a copy is done systematicallyself.failUnless(issubclass(MyUser_,MyUser))self.failUnless(implements(MyUser_,IMileStone))self.failUnless(implements(MyUser_,IWorkflowable))# original class should not have beed modified, only the copyself.failUnless(implements(MyUser,IMileStone))self.failIf(implements(MyUser,IWorkflowable))classSpecializedEntityClassesTC(EnvBasedTC):defselect_eclass(self,etype):# clear selector cacheclear_cache(self.vreg['etypes'],'etype_class')returnself.vreg['etypes'].etype_class(etype)deftest_etype_class_selection_and_specialization(self):# no specific class for Subdivisions, the default one should be selectedeclass=self.select_eclass('SubDivision')self.failUnless(eclass.__autogenerated__)#self.assertEquals(eclass.__bases__, (AnyEntity,))# build class from most generic to most specific and make# sure the most specific is always selectedself.vreg._loadedmods[__name__]={}foretypein('Company','Division','SubDivision'):classFoo(AnyEntity):id=etypeself.vreg.register_appobject_class(Foo)eclass=self.select_eclass('SubDivision')self.failUnless(eclass.__autogenerated__)self.failIf(eclassisFoo)ifetype=='SubDivision':self.assertEquals(eclass.__bases__,(Foo,))else:self.assertEquals(eclass.__bases__[0].__bases__,(Foo,))# check Division eclass is still selected for plain Division entitieseclass=self.select_eclass('Division')self.assertEquals(eclass.id,'Division')if__name__=='__main__':unittest_main()