# 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"""fromoperatorimporteq,lt,le,gtfromlogilab.common.testlibimportTestCase,unittest_mainfromcubicwebimportBinaryfromcubicweb.devtools.testlibimportCubicWebTCfromcubicweb.appobjectimportSelector,AndSelector,OrSelectorfromcubicweb.selectorsimport(is_instance,adaptable,match_user_groups,multi_lines_rset)fromcubicweb.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.assertEqual(selector(None),2)selector=_1_()&_0_()self.assertEqual(selector(None),0)selector=_0_()&_1_()self.assertEqual(selector(None),0)deftest_basic_or(self):selector=_1_()|_1_()self.assertEqual(selector(None),1)selector=_1_()|_0_()self.assertEqual(selector(None),1)selector=_0_()|_1_()self.assertEqual(selector(None),1)selector=_0_()|_0_()self.assertEqual(selector(None),0)deftest_selector_and_function(self):selector=_1_()&_2_self.assertEqual(selector(None),3)selector=_2_&_1_()self.assertEqual(selector(None),3)deftest_three_and(self):selector=_1_()&_1_()&_1_()self.assertEqual(selector(None),3)selector=_1_()&_0_()&_1_()self.assertEqual(selector(None),0)selector=_0_()&_1_()&_1_()self.assertEqual(selector(None),0)deftest_three_or(self):selector=_1_()|_1_()|_1_()self.assertEqual(selector(None),1)selector=_1_()|_0_()|_1_()self.assertEqual(selector(None),1)selector=_0_()|_1_()|_1_()self.assertEqual(selector(None),1)selector=_0_()|_0_()|_0_()self.assertEqual(selector(None),0)deftest_composition(self):selector=(_1_()&_1_())&(_1_()&_1_())self.failUnless(isinstance(selector,AndSelector))self.assertEqual(len(selector.selectors),4)self.assertEqual(selector(None),4)selector=(_1_()&_0_())|(_1_()&_1_())self.failUnless(isinstance(selector,OrSelector))self.assertEqual(len(selector.selectors),2)self.assertEqual(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.assertEqual(selector(None),3)selector=_1_()selector&=_0_()selector&=_1_()self.assertEqual(selector(None),0)selector=_0_()selector&=_1_()selector&=_1_()self.assertEqual(selector(None),0)selector=_0_()selector&=_0_()selector&=_0_()self.assertEqual(selector(None),0)deftest_inplace_or(self):selector=_1_()selector|=_1_()selector|=_1_()self.assertEqual(selector(None),1)selector=_1_()selector|=_0_()selector|=_1_()self.assertEqual(selector(None),1)selector=_0_()selector|=_1_()selector|=_1_()self.assertEqual(selector(None),1)selector=_0_()selector|=_0_()selector|=_0_()self.assertEqual(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.assertEqual(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__]classMultiLinesRsetSelectorTC(CubicWebTC):defsetUp(self):super(MultiLinesRsetSelectorTC,self).setUp()self.req=self.request()self.req.execute('INSERT CWGroup G: G name "group1"')self.req.execute('INSERT CWGroup G: G name "group2"')self.commit()self.rset=self.req.execute('Any G WHERE G is CWGroup')deftest_default_op_in_selector(self):expected=len(self.rset)selector=multi_lines_rset(expected)self.assertEqual(selector(None,self.req,self.rset),1)self.assertEqual(selector(None,self.req,None),0)selector=multi_lines_rset(expected+1)self.assertEqual(selector(None,self.req,self.rset),0)self.assertEqual(selector(None,self.req,None),0)selector=multi_lines_rset(expected-1)self.assertEqual(selector(None,self.req,self.rset),0)self.assertEqual(selector(None,self.req,None),0)deftest_without_rset(self):expected=len(self.rset)selector=multi_lines_rset(expected)self.assertEqual(selector(None,self.req,None),0)selector=multi_lines_rset(expected+1)self.assertEqual(selector(None,self.req,None),0)selector=multi_lines_rset(expected-1)self.assertEqual(selector(None,self.req,None),0)deftest_with_operators(self):expected=len(self.rset)# Format 'expected', 'operator', 'assert'testdata=((expected,eq,1),(expected+1,eq,0),(expected-1,eq,0),(expected,le,1),(expected+1,le,1),(expected-1,le,0),(expected-1,gt,1),(expected,gt,0),(expected+1,gt,0),(expected+1,lt,1),(expected,lt,0),(expected-1,lt,0))for(expected,operator,assertion)intestdata:selector=multi_lines_rset(expected,operator)yieldself.assertEqual,selector(None,self.req,self.rset),assertionif__name__=='__main__':unittest_main()