override clear_all_caches to clear cwetype_workflow cache
# -*- 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.entities.authobjsimportCWUserfromcubicweb.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')})classCWUserTC(BaseEntityTC):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')self.execute(u'SET X firstname "bouah" WHERE X is CWUser, X login "member"')self.assertEquals(e.dc_title(),'member')self.assertEquals(e.name(),u'bouah')self.execute(u'SET X surname "lôt" WHERE X is CWUser, X login "member"')self.assertEquals(e.dc_title(),'member')self.assertEquals(e.name(),u'bouah lôt')classEmailAddressTC(BaseEntityTC):deftest_canonical_form(self):eid1=self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"')[0][0]eid2=self.execute('INSERT EmailAddress X: X address "maarten@philips.com", X canonical TRUE')[0][0]self.execute('SET X identical_to Y WHERE X eid %s, Y eid %s'%(eid1,eid2))email1=self.entity('Any X WHERE X eid %(x)s',{'x':eid1},'x')email2=self.entity('Any X WHERE X eid %(x)s',{'x':eid2},'x')self.assertEquals(email1.canonical_form().eid,eid2)self.assertEquals(email2.canonical_form(),email2)eid3=self.execute('INSERT EmailAddress X: X address "toto@logilab.fr"')[0][0]email3=self.entity('Any X WHERE X eid %s'%eid3)self.assertEquals(email3.canonical_form(),None)deftest_mangling(self):eid=self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"')[0][0]email=self.entity('Any X WHERE X eid %(x)s',{'x':eid},'x')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')eid=self.execute('INSERT EmailAddress X: X address "syt"')[0][0]email=self.entity('Any X WHERE X eid %(x)s',{'x':eid},'x')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')))classInterfaceTC(EnvBasedTC):deftest_nonregr_subclasses_and_mixins_interfaces(self):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')self.failUnless(MyUserisMyUser_)self.failUnless(implements(MyUser_,IMileStone))self.failUnless(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')ifetype=='SubDivision':self.failUnless(eclassisFoo)else:self.failUnless(eclass.__autogenerated__)self.assertEquals(eclass.__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()