# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""unit tests for selectors mechanism"""fromlogilab.common.testlibimportTestCase,unittest_mainfromcubicwebimportBinaryfromcubicweb.devtools.testlibimportCubicWebTCfromcubicweb.appobjectimportSelector,AndSelector,OrSelectorfromcubicweb.selectorsimportis_instance,adaptable,match_user_groupsfromcubicweb.interfacesimportIDownloadablefromcubicweb.webimportactionclass_1_(Selector):def__call__(self,*args,**kwargs):return1class_0_(Selector):def__call__(self,*args,**kwargs):return0def_2_(*args,**kwargs):return2classSelectorsTC(TestCase):deftest_basic_and(self):selector=_1_()&_1_()self.assertEquals(selector(None),2)selector=_1_()&_0_()self.assertEquals(selector(None),0)selector=_0_()&_1_()self.assertEquals(selector(None),0)deftest_basic_or(self):selector=_1_()|_1_()self.assertEquals(selector(None),1)selector=_1_()|_0_()self.assertEquals(selector(None),1)selector=_0_()|_1_()self.assertEquals(selector(None),1)selector=_0_()|_0_()self.assertEquals(selector(None),0)deftest_selector_and_function(self):selector=_1_()&_2_self.assertEquals(selector(None),3)selector=_2_&_1_()self.assertEquals(selector(None),3)deftest_three_and(self):selector=_1_()&_1_()&_1_()self.assertEquals(selector(None),3)selector=_1_()&_0_()&_1_()self.assertEquals(selector(None),0)selector=_0_()&_1_()&_1_()self.assertEquals(selector(None),0)deftest_three_or(self):selector=_1_()|_1_()|_1_()self.assertEquals(selector(None),1)selector=_1_()|_0_()|_1_()self.assertEquals(selector(None),1)selector=_0_()|_1_()|_1_()self.assertEquals(selector(None),1)selector=_0_()|_0_()|_0_()self.assertEquals(selector(None),0)deftest_composition(self):selector=(_1_()&_1_())&(_1_()&_1_())self.failUnless(isinstance(selector,AndSelector))self.assertEquals(len(selector.selectors),4)self.assertEquals(selector(None),4)selector=(_1_()&_0_())|(_1_()&_1_())self.failUnless(isinstance(selector,OrSelector))self.assertEquals(len(selector.selectors),2)self.assertEquals(selector(None),2)deftest_search_selectors(self):sel=is_instance('something')self.assertIs(sel.search_selector(is_instance),sel)csel=AndSelector(sel,Selector())self.assertIs(csel.search_selector(is_instance),sel)csel=AndSelector(Selector(),sel)self.assertIs(csel.search_selector(is_instance),sel)deftest_inplace_and(self):selector=_1_()selector&=_1_()selector&=_1_()self.assertEquals(selector(None),3)selector=_1_()selector&=_0_()selector&=_1_()self.assertEquals(selector(None),0)selector=_0_()selector&=_1_()selector&=_1_()self.assertEquals(selector(None),0)selector=_0_()selector&=_0_()selector&=_0_()self.assertEquals(selector(None),0)deftest_inplace_or(self):selector=_1_()selector|=_1_()selector|=_1_()self.assertEquals(selector(None),1)selector=_1_()selector|=_0_()selector|=_1_()self.assertEquals(selector(None),1)selector=_0_()selector|=_1_()selector|=_1_()self.assertEquals(selector(None),1)selector=_0_()selector|=_0_()selector|=_0_()self.assertEquals(selector(None),0)classImplementsSelectorTC(CubicWebTC):deftest_etype_priority(self):req=self.request()f=req.create_entity('File',data_name=u'hop.txt',data=Binary('hop'))rset=f.as_rset()anyscore=is_instance('Any')(f.__class__,req,rset=rset)idownscore=adaptable('IDownloadable')(f.__class__,req,rset=rset)self.failUnless(idownscore>anyscore,(idownscore,anyscore))filescore=is_instance('File')(f.__class__,req,rset=rset)self.failUnless(filescore>idownscore,(filescore,idownscore))deftest_etype_inheritance_no_yams_inheritance(self):cls=self.vreg['etypes'].etype_class('Personne')self.failIf(is_instance('Societe').score_class(cls,self.request()))deftest_yams_inheritance(self):cls=self.vreg['etypes'].etype_class('Transition')self.assertEquals(is_instance('BaseTransition').score_class(cls,self.request()),3)classMatchUserGroupsTC(CubicWebTC):deftest_owners_group(self):"""tests usage of 'owners' group with match_user_group"""classSomeAction(action.Action):__regid__='yo'category='foo'__select__=match_user_groups('owners')self.vreg._loadedmods[__name__]={}self.vreg.register(SomeAction)SomeAction.__registered__(self.vreg['actions'])self.failUnless(SomeActioninself.vreg['actions']['yo'],self.vreg['actions'])try:# login as a simple userself.create_user('john')self.login('john')# it should not be possible to use SomeAction not owned objectsreq=self.request()rset=req.execute('Any G WHERE G is CWGroup, G name "managers"')self.failIf('yo'indict(self.pactions(req,rset)))# insert a new card, and check that we can use SomeAction on our objectself.execute('INSERT Card C: C title "zoubidou"')self.commit()req=self.request()rset=req.execute('Card C WHERE C title "zoubidou"')self.failUnless('yo'indict(self.pactions(req,rset)),self.pactions(req,rset))# make sure even managers can't use the actionself.restore_connection()req=self.request()rset=req.execute('Card C WHERE C title "zoubidou"')self.failIf('yo'indict(self.pactions(req,rset)))finally:delself.vreg[SomeAction.__registry__][SomeAction.__regid__]if__name__=='__main__':unittest_main()