pyrorql source now ignore external eids which are themselves coming from another external source already in use by the repository (should have the same uri)
# -*- coding: iso-8859-1 -*-"""XXX rename, split, reorganize this"""importos.pathasospfromlogilab.common.testlibimportTestCase,unittest_mainfromcubicweb.devtools.apptestimportEnvBasedTCfromcubicwebimportCW_SOFTWARE_ROOTasBASE,Binaryfromcubicweb.common.selectorsimportmatch_user_groupfromcubicweb.web._exceptionsimportNoSelectableObjectfromcubicweb.web.actionimportActionfromcubicweb.web.viewsimport(baseviews,tableview,baseforms,calendar,management,embedding,actions,startup,euser,schemaentities,xbel,vcard,treeview,idownloadable,wdoc,debug)fromcubicweb.entities.libimportCardfromcubicweb.interfacesimportIMileStoneUSERACTIONS=[('myprefs',actions.UserPreferencesAction),('myinfos',actions.UserInfoAction),('logout',actions.LogoutAction)]SITEACTIONS=[('siteconfig',actions.SiteConfigurationAction),('manage',actions.ManageAction),('schema',actions.ViewSchemaAction)]classViewSelectorTC(EnvBasedTC):defsetup_database(self):self.add_entity('BlogEntry',title=u"une news !",content=u"cubicweb c'est beau")self.add_entity('Bookmark',title=u"un signet !",path=u"view?vid=index")self.add_entity('Card',title=u'mandatory',content=u"DoC !")self.add_entity('EmailAddress',address=u"devel@logilab.fr",alias=u'devel')self.add_entity('Tag',name=u'x')defpactions(self,req,rset):resdict=self.vreg.possible_actions(req,rset)forcat,actionsinresdict.items():resdict[cat]=[(a.id,a.__class__)forainactions]returnresdictclassVRegistryTC(ViewSelectorTC):"""test the view selector"""def_test_registered(self,registry,content):try:expected=getattr(self,'all_%s'%registry)exceptAttributeError:returnifregistry=='hooks':self.assertEquals(len(content),expected,content)returntry:self.assertSetEqual(content.keys(),expected)except:printregistry,sorted(expected),sorted(content.keys())print'no more',[vforvinexpectedifnotvincontent.keys()]print'missing',[vforvincontent.keys()ifnotvinexpected]raisedeftest_possible_views(self):# no entityreq=self.request()self.assertListEqual(self.pviews(req,None),[('changelog',wdoc.ChangeLogView),('debug',debug.DebugView),('epropertiesform',management.EpropertiesForm),('index',startup.IndexView),('info',management.ProcessInformationView),('manage',startup.ManageView),('owl',startup.OWLView),('schema',startup.SchemaView),('systemepropertiesform',management.SystemEpropertiesForm)])# no entity but etyperset,req=self.env.get_rset_and_req('Any X WHERE X eid 999999')self.assertListEqual(self.pviews(req,rset),[#('changelog', wdoc.ChangeLogView),#('epropertiesform', management.EpropertiesForm),#('index', startup.IndexView),#('info', management.ProcessInformationView),#('manage', startup.ManageView),#('schema', startup.SchemaView),#('systemepropertiesform', management.SystemEpropertiesForm)])# one entityrset,req=self.env.get_rset_and_req('EGroup X WHERE X name "managers"')self.assertListEqual(self.pviews(req,rset),[('csvexport',baseviews.CSVRsetView),('ecsvexport',baseviews.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('primary',baseviews.PrimaryView),('rsetxml',baseviews.XMLRsetView),('rss',baseviews.RssView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',baseviews.XmlView),])# list of entities of the same typerset,req=self.env.get_rset_and_req('EGroup X')self.assertListEqual(self.pviews(req,rset),[('csvexport',baseviews.CSVRsetView),('ecsvexport',baseviews.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('primary',baseviews.PrimaryView),('rsetxml',baseviews.XMLRsetView),('rss',baseviews.RssView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',baseviews.XmlView),])# list of entities of different typesrset,req=self.env.get_rset_and_req('Any X')self.assertListEqual(self.pviews(req,rset),[('csvexport',baseviews.CSVRsetView),('ecsvexport',baseviews.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('primary',baseviews.PrimaryView),('rsetxml',baseviews.XMLRsetView),('rss',baseviews.RssView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',baseviews.XmlView),])# whateverrset,req=self.env.get_rset_and_req('Any N, X WHERE X in_group Y, Y name N')self.assertListEqual(self.pviews(req,rset),[('csvexport',baseviews.CSVRsetView),('editable-table',tableview.EditableTableView),('rsetxml',baseviews.XMLRsetView),('table',tableview.TableView),])# list of euser entitiesrset,req=self.env.get_rset_and_req('EUser X')self.assertListEqual(self.pviews(req,rset),[('csvexport',baseviews.CSVRsetView),('ecsvexport',baseviews.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('primary',euser.EUserPrimaryView),('rsetxml',baseviews.XMLRsetView),('rss',baseviews.RssView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('vcard',vcard.VCardEUserView),('xbel',xbel.XbelView),('xml',baseviews.XmlView),])deftest_possible_actions_none_rset(self):req=self.request()self.assertDictEqual(self.pactions(req,None),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,})deftest_possible_actions_no_entity(self):rset,req=self.env.get_rset_and_req('Any X WHERE X eid 999999')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,})deftest_possible_actions_same_type_entities(self):rset,req=self.env.get_rset_and_req('EGroup X')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'mainactions':[('muledit',actions.MultipleEditAction)],'moreactions':[('delete',actions.DeleteAction),('addentity',actions.AddNewAction)],})deftest_possible_actions_different_types_entities(self):rset,req=self.env.get_rset_and_req('Any X')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'moreactions':[('delete',actions.DeleteAction)],})deftest_possible_actions_final_entities(self):rset,req=self.env.get_rset_and_req('Any N, X WHERE X in_group Y, Y name N')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS})deftest_possible_actions_eetype_euser_entity(self):rset,req=self.env.get_rset_and_req('EEType X WHERE X name "EUser"')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'mainactions':[('edit',actions.ModifyAction),('workflow',schemaentities.ViewWorkflowAction),],'moreactions':[('delete',actions.DeleteAction),('copy',actions.CopyAction)],})deftest_load_subinterface_based_vojects(self):self.vreg._lastmodifs={}# clear cacheself.vreg.register_objects([osp.join(BASE,'web','views','iprogress.py')])# check progressbar was kickedself.failIf('progressbar'inself.vreg['views'])classMyCard(Card):__implements__=(IMileStone,)self.vreg.register_vobject_class(MyCard)self.vreg._lastmodifs={}# clear cacheself.vreg.register_objects([osp.join(BASE,'web','views','iprogress.py')])# check progressbar isn't kickedself.assertEquals(len(self.vreg['views']['progressbar']),1)deftest_select_creation_form(self):rset=Nonereq=self.request()# creation formreq.form['etype']='EGroup'self.assertIsInstance(self.vreg.select_view('creation',req,rset),baseforms.CreationForm)delreq.form['etype']# custom creation formclassEUserCreationForm(baseforms.CreationForm):accepts=('EUser',)self.vreg.register_vobject_class(EUserCreationForm)req.form['etype']='EUser'self.assertIsInstance(self.vreg.select_view('creation',req,rset),EUserCreationForm)deftest_select_view(self):# no entityrset=Nonereq=self.request()self.assertIsInstance(self.vreg.select_view('index',req,rset),startup.IndexView)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'primary',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'table',req,rset)# no entityrset,req=self.env.get_rset_and_req('Any X WHERE X eid 999999')self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'index',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'creation',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'primary',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'table',req,rset)# one entityrset,req=self.env.get_rset_and_req('EGroup X WHERE X name "managers"')self.assertIsInstance(self.vreg.select_view('primary',req,rset),baseviews.PrimaryView)self.assertIsInstance(self.vreg.select_view('list',req,rset),baseviews.ListView)self.assertIsInstance(self.vreg.select_view('edition',req,rset),baseforms.EditionForm)self.assertIsInstance(self.vreg.select_view('table',req,rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'creation',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'index',req,rset)# list of entities of the same typerset,req=self.env.get_rset_and_req('EGroup X')self.assertIsInstance(self.vreg.select_view('primary',req,rset),baseviews.PrimaryView)self.assertIsInstance(self.vreg.select_view('list',req,rset),baseviews.ListView)self.assertIsInstance(self.vreg.select_view('table',req,rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'creation',req,rset)# list of entities of different typesrset,req=self.env.get_rset_and_req('Any X')self.assertIsInstance(self.vreg.select_view('primary',req,rset),baseviews.PrimaryView)self.assertIsInstance(self.vreg.select_view('list',req,rset),baseviews.ListView)self.assertIsInstance(self.vreg.select_view('table',req,rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'creation',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'index',req,rset)# whateverrset,req=self.env.get_rset_and_req('Any N, X WHERE X in_group Y, Y name N')self.assertIsInstance(self.vreg.select_view('table',req,rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'index',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'creation',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'primary',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'list',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'edition',req,rset)# mixed queryrset,req=self.env.get_rset_and_req('Any U,G WHERE U is EUser, G is EGroup')self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'edition',req,rset)self.failUnlessRaises(NoSelectableObject,self.vreg.select_view,'creation',req,rset)self.assertIsInstance(self.vreg.select_view('table',req,rset),tableview.TableView)# euser primary view priorityrset,req=self.env.get_rset_and_req('EUser X WHERE X login "admin"')self.assertIsInstance(self.vreg.select_view('primary',req,rset),euser.EUserPrimaryView)self.assertIsInstance(self.vreg.select_view('text',req,rset),baseviews.TextView)deftest_interface_selector(self):image=self.add_entity('Image',name=u'bim.png',data=Binary('bim'))# image primary view priorityrset,req=self.env.get_rset_and_req('Image X WHERE X name "bim.png"')self.assertIsInstance(self.vreg.select_view('primary',req,rset),idownloadable.IDownloadablePrimaryView)deftest_score_entity_selector(self):image=self.add_entity('Image',name=u'bim.png',data=Binary('bim'))# image primary view priorityrset,req=self.env.get_rset_and_req('Image X WHERE X name "bim.png"')self.assertIsInstance(self.vreg.select_view('image',req,rset),idownloadable.ImageView)fileobj=self.add_entity('File',name=u'bim.txt',data=Binary('bim'))# image primary view priorityrset,req=self.env.get_rset_and_req('File X WHERE X name "bim.txt"')self.assertRaises(NoSelectableObject,self.vreg.select_view,'image',req,rset)def_test_view(self,vid,rql,args):ifrqlisNone:rset=Nonereq=self.request()else:rset,req=self.env.get_rset_and_req(rql)try:self.vreg.render('views',vid,req,rset=rset,**args)except:printvid,rset,argsraisedeftest_form(self):forvid,rql,argsin(#('creation', 'Any X WHERE X eid 999999', {}),('edition','EGroup X WHERE X name "managers"',{}),('copy','EGroup X WHERE X name "managers"',{}),('muledit','EGroup X',{}),#('muledit', 'Any X', {}),):self._test_view(vid,rql,args)deftest_properties(self):self.assertEquals(sorted(kforkinself.vreg['propertydefs'].keys()ifk.startswith('boxes.edit_box')),['boxes.edit_box.context','boxes.edit_box.order','boxes.edit_box.visible'])self.assertEquals([kforkinself.vreg['propertyvalues'].keys()ifnotk.startswith('system.version')],[])self.assertEquals(self.vreg.property_value('boxes.edit_box.visible'),True)self.assertEquals(self.vreg.property_value('boxes.edit_box.order'),2)self.assertEquals(self.vreg.property_value('boxes.possible_views_box.visible'),False)self.assertEquals(self.vreg.property_value('boxes.possible_views_box.order'),10)self.assertRaises(KeyError,self.vreg.property_value,'boxes.actions_box')deftest_owners_match_user_group(self):"""tests usage of 'owners' group with match_user_group"""classSomeAction(Action):id='yo'category='foo'__selectors__=(match_user_group,)require_groups=('owners',)self.vreg.register_vobject_class(SomeAction)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 objectsrset,req=self.env.get_rset_and_req('Any G WHERE G is EGroup, G name "managers"')self.failIf('foo'inself.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()rset,req=self.env.get_rset_and_req('Card C WHERE C title "zoubidou"')self.failUnless('foo'inself.pactions(req,rset))# make sure even managers can't use the actionself.restore_connection()rset,req=self.env.get_rset_and_req('Card C WHERE C title "zoubidou"')self.failIf('foo'inself.pactions(req,rset))finally:delself.vreg[SomeAction.__registry__][SomeAction.id]fromcubicweb.web.actionimportEntityActionclassEETypeRQLAction(EntityAction):id='testaction'accepts=('EEType',)condition='X name "EEType"'title='bla'classRQLActionTC(ViewSelectorTC):defsetUp(self):super(RQLActionTC,self).setUp()self.vreg.register_vobject_class(EETypeRQLAction)deftearDown(self):super(RQLActionTC,self).tearDown()delself.vreg._registries['actions']['testaction']deftest(self):rset,req=self.env.get_rset_and_req('EEType X WHERE X name "EEType"')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'mainactions':[('edit',actions.ModifyAction)],'moreactions':[('delete',actions.DeleteAction),('copy',actions.CopyAction),('testaction',EETypeRQLAction)],})rset,req=self.env.get_rset_and_req('EEType X WHERE X name "ERType"')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'mainactions':[('edit',actions.ModifyAction)],'moreactions':[('delete',actions.DeleteAction),('copy',actions.CopyAction)],})if__name__=='__main__':unittest_main()