# -*- coding: utf-8 -*-"""XXX rename, split, reorganize this:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""fromlogilab.common.testlibimportunittest_mainfromcubicweb.devtools.apptestimportEnvBasedTCfromcubicwebimportCW_SOFTWARE_ROOTasBASE,Binaryfromcubicweb.selectorsimport(match_user_groups,implements,specified_etype_implements,rql_condition,traced_selection)fromcubicweb.webimportNoSelectableObjectfromcubicweb.web.actionimportActionfromcubicweb.web.viewsimport(primary,baseviews,tableview,editforms,calendar,management,embedding,actions,startup,cwuser,schema,xbel,vcard,owl,treeview,idownloadable,wdoc,debug,cwproperties,workflow,xmlrss,csvexport)USERACTIONS=[('myprefs',actions.UserPreferencesAction),('myinfos',actions.UserInfoAction),('logout',actions.LogoutAction)]SITEACTIONS=[('siteconfig',actions.SiteConfigurationAction),('manage',actions.ManageAction),('schema',schema.ViewSchemaAction),('siteinfo',actions.SiteInfoAction),]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('EmailAddress',address=u"devel@logilab.fr",alias=u'devel')self.add_entity('Tag',name=u'x')defpactions(self,req,rset):resdict=self.vreg['actions'].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]raisedefsetUp(self):super(VRegistryTC,self).setUp()assertself.vreg['views']['propertiesform']deftest_possible_views_none_rset(self):req=self.request()self.assertListEqual(self.pviews(req,None),[('changelog',wdoc.ChangeLogView),('debug',debug.DebugView),('index',startup.IndexView),('info',management.ProcessInformationView),('manage',startup.ManageView),('owl',owl.OWLView),('propertiesform',cwproperties.CWPropertiesForm),('registry',startup.RegistryView),('schema',schema.SchemaView),('systempropertiesform',cwproperties.SystemCWPropertiesForm)])deftest_possible_views_noresult(self):rset,req=self.env.get_rset_and_req('Any X WHERE X eid 999999')self.assertListEqual(self.pviews(req,rset),[])deftest_possible_views_one_egroup(self):rset,req=self.env.get_rset_and_req('CWGroup X WHERE X name "managers"')self.assertListEqual(self.pviews(req,rset),[('adaptedlist',baseviews.AdaptedListView),('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',primary.PrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',xmlrss.XMLView),])deftest_possible_views_multiple_egroups(self):rset,req=self.env.get_rset_and_req('CWGroup X')self.assertListEqual(self.pviews(req,rset),[('adaptedlist',baseviews.AdaptedListView),('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',primary.PrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',xmlrss.XMLView),])deftest_propertiesform_admin(self):assertself.vreg['views']['propertiesform']rset1,req1=self.env.get_rset_and_req('CWUser X WHERE X login "admin"')rset2,req2=self.env.get_rset_and_req('CWUser X WHERE X login "anon"')self.failUnless(self.vreg['views'].select('propertiesform',req1,rset=None))self.failUnless(self.vreg['views'].select('propertiesform',req1,rset=rset1))self.failUnless(self.vreg['views'].select('propertiesform',req2,rset=rset2))deftest_propertiesform_anon(self):self.login('anon')rset1,req1=self.env.get_rset_and_req('CWUser X WHERE X login "admin"')rset2,req2=self.env.get_rset_and_req('CWUser X WHERE X login "anon"')self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=None)self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=rset1)self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=rset2)deftest_propertiesform_jdoe(self):self.create_user('jdoe')self.login('jdoe')rset1,req1=self.env.get_rset_and_req('CWUser X WHERE X login "admin"')rset2,req2=self.env.get_rset_and_req('CWUser X WHERE X login "jdoe"')self.failUnless(self.vreg['views'].select('propertiesform',req1,rset=None))self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=rset1)self.failUnless(self.vreg['views'].select('propertiesform',req2,rset=rset2))deftest_possible_views_multiple_different_types(self):rset,req=self.env.get_rset_and_req('Any X')self.assertListEqual(self.pviews(req,rset),[('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',primary.PrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',xmlrss.XMLView),])deftest_possible_views_any_rset(self):rset,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',csvexport.CSVRsetView),('editable-table',tableview.EditableTableView),('rsetxml',xmlrss.XMLRsetView),('table',tableview.TableView),])deftest_possible_views_multiple_eusers(self):rset,req=self.env.get_rset_and_req('CWUser X')self.assertListEqual(self.pviews(req,rset),[('adaptedlist',baseviews.AdaptedListView),('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('foaf',cwuser.FoafView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',primary.PrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('vcard',vcard.VCardCWUserView),('wfhistory',workflow.WFHistoryView),('xbel',xbel.XbelView),('xml',xmlrss.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('CWGroup 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_cwuser_entity(self):rset,req=self.env.get_rset_and_req('CWEType X WHERE X name "CWUser"')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'mainactions':[('edit',actions.ModifyAction),('workflow',workflow.ViewWorkflowAction),],'moreactions':[('managepermission',actions.ManagePermissionsAction),('delete',actions.DeleteAction),('copy',actions.CopyAction),],})deftest_select_creation_form(self):rset=Nonereq=self.request()# creation formreq.form['etype']='CWGroup'self.assertIsInstance(self.vreg['views'].select('creation',req,rset=rset),editforms.CreationFormView)delreq.form['etype']# custom creation formclassCWUserCreationForm(editforms.CreationFormView):__select__=specified_etype_implements('CWUser')self.vreg._loadedmods[__name__]={}self.vreg.register_appobject_class(CWUserCreationForm)req.form['etype']='CWUser'self.assertIsInstance(self.vreg['views'].select('creation',req,rset=rset),CWUserCreationForm)deftest_select_view(self):# no entityrset=Nonereq=self.request()self.assertIsInstance(self.vreg['views'].select('index',req,rset=rset),startup.IndexView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'primary',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'table',req,rset=rset)# no entityrset,req=self.env.get_rset_and_req('Any X WHERE X eid 999999')self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'primary',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'table',req,rset=rset)# one entityrset,req=self.env.get_rset_and_req('CWGroup X WHERE X name "managers"')self.assertIsInstance(self.vreg['views'].select('primary',req,rset=rset),primary.PrimaryView)self.assertIsInstance(self.vreg['views'].select('list',req,rset=rset),baseviews.ListView)self.assertIsInstance(self.vreg['views'].select('edition',req,rset=rset),editforms.EditionFormView)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)# list of entities of the same typerset,req=self.env.get_rset_and_req('CWGroup X')self.assertIsInstance(self.vreg['views'].select('primary',req,rset=rset),primary.PrimaryView)self.assertIsInstance(self.vreg['views'].select('list',req,rset=rset),baseviews.ListView)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)# list of entities of different typesrset,req=self.env.get_rset_and_req('Any X')self.assertIsInstance(self.vreg['views'].select('primary',req,rset=rset),primary.PrimaryView)self.assertIsInstance(self.vreg['views'].select('list',req,rset=rset),baseviews.ListView)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)# whateverrset,req=self.env.get_rset_and_req('Any N, X WHERE X in_group Y, Y name N')self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'primary',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'list',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'edition',req,rset=rset)# mixed queryrset,req=self.env.get_rset_and_req('Any U,G WHERE U is CWUser, G is CWGroup')self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'edition',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)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['views'].select('primary',req,rset=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['views'].select('image',req,rset=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['views'].select,'image',req,rset=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['views'].render(vid,req,rset=rset,**args)except:printvid,rset,argsraisedeftest_form(self):forvid,rql,argsin(#('creation', 'Any X WHERE X eid 999999', {}),('edition','CWGroup X WHERE X name "managers"',{}),('copy','CWGroup X WHERE X name "managers"',{}),('muledit','CWGroup 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')classCWETypeRQLAction(Action):id='testaction'__select__=implements('CWEType')&rql_condition('X name "CWEType"')title='bla'classRQLActionTC(ViewSelectorTC):defsetUp(self):super(RQLActionTC,self).setUp()self.vreg._loadedmods[__name__]={}self.vreg.register_appobject_class(CWETypeRQLAction)deftearDown(self):super(RQLActionTC,self).tearDown()delself.vreg['actions']['testaction']deftest(self):rset,req=self.env.get_rset_and_req('CWEType X WHERE X name "CWEType"')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'mainactions':[('edit',actions.ModifyAction)],'moreactions':[('managepermission',actions.ManagePermissionsAction),('delete',actions.DeleteAction),('copy',actions.CopyAction),('testaction',CWETypeRQLAction),],})rset,req=self.env.get_rset_and_req('CWEType X WHERE X name "CWRType"')self.assertDictEqual(self.pactions(req,rset),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'mainactions':[('edit',actions.ModifyAction)],'moreactions':[('managepermission',actions.ManagePermissionsAction),('delete',actions.DeleteAction),('copy',actions.CopyAction),],})if__name__=='__main__':unittest_main()