web/test/unittest_viewselector.py
changeset 2773 b2530e3e0afb
parent 2657 de974465d381
child 2783 493f527aed1e
equal deleted inserted replaced
2767:58c519e5a31f 2773:b2530e3e0afb
     2 """XXX rename, split, reorganize this
     2 """XXX rename, split, reorganize this
     3 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     3 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     4 """
     4 """
     5 from logilab.common.testlib import unittest_main
     5 from logilab.common.testlib import unittest_main
     6 
     6 
     7 from cubicweb.devtools.apptest import EnvBasedTC
     7 from cubicweb.devtools.testlib import CubicWebTC
     8 from cubicweb import CW_SOFTWARE_ROOT as BASE, Binary
     8 from cubicweb import CW_SOFTWARE_ROOT as BASE, Binary
     9 from cubicweb.selectors import (match_user_groups, implements,
     9 from cubicweb.selectors import (match_user_groups, implements,
    10                                 specified_etype_implements, rql_condition,
    10                                 specified_etype_implements, rql_condition,
    11                                 traced_selection)
    11                                 traced_selection)
    12 from cubicweb.web import NoSelectableObject
    12 from cubicweb.web import NoSelectableObject
    24                ('manage', actions.ManageAction),
    24                ('manage', actions.ManageAction),
    25                ('schema', schema.ViewSchemaAction),
    25                ('schema', schema.ViewSchemaAction),
    26                ('siteinfo', actions.SiteInfoAction),
    26                ('siteinfo', actions.SiteInfoAction),
    27                ]
    27                ]
    28 
    28 
    29 class ViewSelectorTC(EnvBasedTC):
    29 class ViewSelectorTC(CubicWebTC):
    30 
    30 
    31     def setup_database(self):
    31     def setup_database(self):
    32         self.add_entity('BlogEntry', title=u"une news !", content=u"cubicweb c'est beau")
    32         self.add_entity('BlogEntry', title=u"une news !", content=u"cubicweb c'est beau")
    33         self.add_entity('Bookmark', title=u"un signet !", path=u"view?vid=index")
    33         self.add_entity('Bookmark', title=u"un signet !", path=u"view?vid=index")
    34         self.add_entity('EmailAddress', address=u"devel@logilab.fr", alias=u'devel')
    34         self.add_entity('EmailAddress', address=u"devel@logilab.fr", alias=u'devel')
    76                               ('propertiesform', cwproperties.CWPropertiesForm),
    76                               ('propertiesform', cwproperties.CWPropertiesForm),
    77                               ('schema', schema.SchemaView),
    77                               ('schema', schema.SchemaView),
    78                               ('systempropertiesform', cwproperties.SystemCWPropertiesForm)])
    78                               ('systempropertiesform', cwproperties.SystemCWPropertiesForm)])
    79 
    79 
    80     def test_possible_views_noresult(self):
    80     def test_possible_views_noresult(self):
    81         rset, req = self.env.get_rset_and_req('Any X WHERE X eid 999999')
    81         rset, req = self.rset_and_req('Any X WHERE X eid 999999')
    82         self.assertListEqual(self.pviews(req, rset),
    82         self.assertListEqual(self.pviews(req, rset),
    83                              [])
    83                              [])
    84 
    84 
    85     def test_possible_views_one_egroup(self):
    85     def test_possible_views_one_egroup(self):
    86         rset, req = self.env.get_rset_and_req('CWGroup X WHERE X name "managers"')
    86         rset, req = self.rset_and_req('CWGroup X WHERE X name "managers"')
    87         self.assertListEqual(self.pviews(req, rset),
    87         self.assertListEqual(self.pviews(req, rset),
    88                              [('adaptedlist', baseviews.AdaptedListView),
    88                              [('adaptedlist', baseviews.AdaptedListView),
    89                               ('csvexport', csvexport.CSVRsetView),
    89                               ('csvexport', csvexport.CSVRsetView),
    90                               ('ecsvexport', csvexport.CSVEntityView),
    90                               ('ecsvexport', csvexport.CSVEntityView),
    91                               ('editable-table', tableview.EditableTableView),
    91                               ('editable-table', tableview.EditableTableView),
   104                               ('xbel', xbel.XbelView),
   104                               ('xbel', xbel.XbelView),
   105                               ('xml', xmlrss.XMLView),
   105                               ('xml', xmlrss.XMLView),
   106                               ])
   106                               ])
   107 
   107 
   108     def test_possible_views_multiple_egroups(self):
   108     def test_possible_views_multiple_egroups(self):
   109         rset, req = self.env.get_rset_and_req('CWGroup X')
   109         rset, req = self.rset_and_req('CWGroup X')
   110         self.assertListEqual(self.pviews(req, rset),
   110         self.assertListEqual(self.pviews(req, rset),
   111                              [('adaptedlist', baseviews.AdaptedListView),
   111                              [('adaptedlist', baseviews.AdaptedListView),
   112                               ('csvexport', csvexport.CSVRsetView),
   112                               ('csvexport', csvexport.CSVRsetView),
   113                               ('ecsvexport', csvexport.CSVEntityView),
   113                               ('ecsvexport', csvexport.CSVEntityView),
   114                               ('editable-table', tableview.EditableTableView),
   114                               ('editable-table', tableview.EditableTableView),
   128                               ('xml', xmlrss.XMLView),
   128                               ('xml', xmlrss.XMLView),
   129                               ])
   129                               ])
   130 
   130 
   131     def test_propertiesform_admin(self):
   131     def test_propertiesform_admin(self):
   132         assert self.vreg['views']['propertiesform']
   132         assert self.vreg['views']['propertiesform']
   133         rset1, req1 = self.env.get_rset_and_req('CWUser X WHERE X login "admin"')
   133         rset1, req1 = self.rset_and_req('CWUser X WHERE X login "admin"')
   134         rset2, req2 = self.env.get_rset_and_req('CWUser X WHERE X login "anon"')
   134         rset2, req2 = self.rset_and_req('CWUser X WHERE X login "anon"')
   135         self.failUnless(self.vreg['views'].select('propertiesform', req1, rset=None))
   135         self.failUnless(self.vreg['views'].select('propertiesform', req1, rset=None))
   136         self.failUnless(self.vreg['views'].select('propertiesform', req1, rset=rset1))
   136         self.failUnless(self.vreg['views'].select('propertiesform', req1, rset=rset1))
   137         self.failUnless(self.vreg['views'].select('propertiesform', req2, rset=rset2))
   137         self.failUnless(self.vreg['views'].select('propertiesform', req2, rset=rset2))
   138 
   138 
   139     def test_propertiesform_anon(self):
   139     def test_propertiesform_anon(self):
   140         self.login('anon')
   140         self.login('anon')
   141         rset1, req1 = self.env.get_rset_and_req('CWUser X WHERE X login "admin"')
   141         rset1, req1 = self.rset_and_req('CWUser X WHERE X login "admin"')
   142         rset2, req2 = self.env.get_rset_and_req('CWUser X WHERE X login "anon"')
   142         rset2, req2 = self.rset_and_req('CWUser X WHERE X login "anon"')
   143         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=None)
   143         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=None)
   144         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=rset1)
   144         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=rset1)
   145         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=rset2)
   145         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=rset2)
   146 
   146 
   147     def test_propertiesform_jdoe(self):
   147     def test_propertiesform_jdoe(self):
   148         self.create_user('jdoe')
   148         self.create_user('jdoe')
   149         self.login('jdoe')
   149         self.login('jdoe')
   150         rset1, req1 = self.env.get_rset_and_req('CWUser X WHERE X login "admin"')
   150         rset1, req1 = self.rset_and_req('CWUser X WHERE X login "admin"')
   151         rset2, req2 = self.env.get_rset_and_req('CWUser X WHERE X login "jdoe"')
   151         rset2, req2 = self.rset_and_req('CWUser X WHERE X login "jdoe"')
   152         self.failUnless(self.vreg['views'].select('propertiesform', req1, rset=None))
   152         self.failUnless(self.vreg['views'].select('propertiesform', req1, rset=None))
   153         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=rset1)
   153         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req1, rset=rset1)
   154         self.failUnless(self.vreg['views'].select('propertiesform', req2, rset=rset2))
   154         self.failUnless(self.vreg['views'].select('propertiesform', req2, rset=rset2))
   155 
   155 
   156     def test_possible_views_multiple_different_types(self):
   156     def test_possible_views_multiple_different_types(self):
   157         rset, req = self.env.get_rset_and_req('Any X')
   157         rset, req = self.rset_and_req('Any X')
   158         self.assertListEqual(self.pviews(req, rset),
   158         self.assertListEqual(self.pviews(req, rset),
   159                              [('csvexport', csvexport.CSVRsetView),
   159                              [('csvexport', csvexport.CSVRsetView),
   160                               ('ecsvexport', csvexport.CSVEntityView),
   160                               ('ecsvexport', csvexport.CSVEntityView),
   161                               ('editable-table', tableview.EditableTableView),
   161                               ('editable-table', tableview.EditableTableView),
   162                               ('filetree', treeview.FileTreeView),
   162                               ('filetree', treeview.FileTreeView),
   174                               ('xbel', xbel.XbelView),
   174                               ('xbel', xbel.XbelView),
   175                               ('xml', xmlrss.XMLView),
   175                               ('xml', xmlrss.XMLView),
   176                               ])
   176                               ])
   177 
   177 
   178     def test_possible_views_any_rset(self):
   178     def test_possible_views_any_rset(self):
   179         rset, req = self.env.get_rset_and_req('Any N, X WHERE X in_group Y, Y name N')
   179         rset, req = self.rset_and_req('Any N, X WHERE X in_group Y, Y name N')
   180         self.assertListEqual(self.pviews(req, rset),
   180         self.assertListEqual(self.pviews(req, rset),
   181                              [('csvexport', csvexport.CSVRsetView),
   181                              [('csvexport', csvexport.CSVRsetView),
   182                               ('editable-table', tableview.EditableTableView),
   182                               ('editable-table', tableview.EditableTableView),
   183                               ('rsetxml', xmlrss.XMLRsetView),
   183                               ('rsetxml', xmlrss.XMLRsetView),
   184                               ('table', tableview.TableView),
   184                               ('table', tableview.TableView),
   185                               ])
   185                               ])
   186 
   186 
   187     def test_possible_views_multiple_eusers(self):
   187     def test_possible_views_multiple_eusers(self):
   188         rset, req = self.env.get_rset_and_req('CWUser X')
   188         rset, req = self.rset_and_req('CWUser X')
   189         self.assertListEqual(self.pviews(req, rset),
   189         self.assertListEqual(self.pviews(req, rset),
   190                              [('adaptedlist', baseviews.AdaptedListView),
   190                              [('adaptedlist', baseviews.AdaptedListView),
   191                               ('csvexport', csvexport.CSVRsetView),
   191                               ('csvexport', csvexport.CSVRsetView),
   192                               ('ecsvexport', csvexport.CSVEntityView),
   192                               ('ecsvexport', csvexport.CSVEntityView),
   193                               ('editable-table', tableview.EditableTableView),
   193                               ('editable-table', tableview.EditableTableView),
   216                              {'useractions': USERACTIONS,
   216                              {'useractions': USERACTIONS,
   217                               'siteactions': SITEACTIONS,
   217                               'siteactions': SITEACTIONS,
   218 
   218 
   219                               })
   219                               })
   220     def test_possible_actions_no_entity(self):
   220     def test_possible_actions_no_entity(self):
   221         rset, req = self.env.get_rset_and_req('Any X WHERE X eid 999999')
   221         rset, req = self.rset_and_req('Any X WHERE X eid 999999')
   222         self.assertDictEqual(self.pactions(req, rset),
   222         self.assertDictEqual(self.pactions(req, rset),
   223                              {'useractions': USERACTIONS,
   223                              {'useractions': USERACTIONS,
   224                               'siteactions': SITEACTIONS,
   224                               'siteactions': SITEACTIONS,
   225                               })
   225                               })
   226 
   226 
   227     def test_possible_actions_same_type_entities(self):
   227     def test_possible_actions_same_type_entities(self):
   228         rset, req = self.env.get_rset_and_req('CWGroup X')
   228         rset, req = self.rset_and_req('CWGroup X')
   229         self.assertDictEqual(self.pactions(req, rset),
   229         self.assertDictEqual(self.pactions(req, rset),
   230                              {'useractions': USERACTIONS,
   230                              {'useractions': USERACTIONS,
   231                               'siteactions': SITEACTIONS,
   231                               'siteactions': SITEACTIONS,
   232                               'mainactions': [('muledit', actions.MultipleEditAction)],
   232                               'mainactions': [('muledit', actions.MultipleEditAction)],
   233                               'moreactions': [('delete', actions.DeleteAction),
   233                               'moreactions': [('delete', actions.DeleteAction),
   234                                               ('addentity', actions.AddNewAction)],
   234                                               ('addentity', actions.AddNewAction)],
   235                               })
   235                               })
   236 
   236 
   237     def test_possible_actions_different_types_entities(self):
   237     def test_possible_actions_different_types_entities(self):
   238         rset, req = self.env.get_rset_and_req('Any X')
   238         rset, req = self.rset_and_req('Any X')
   239         self.assertDictEqual(self.pactions(req, rset),
   239         self.assertDictEqual(self.pactions(req, rset),
   240                              {'useractions': USERACTIONS,
   240                              {'useractions': USERACTIONS,
   241                               'siteactions': SITEACTIONS,
   241                               'siteactions': SITEACTIONS,
   242                               'moreactions': [('delete', actions.DeleteAction)],
   242                               'moreactions': [('delete', actions.DeleteAction)],
   243                               })
   243                               })
   244 
   244 
   245     def test_possible_actions_final_entities(self):
   245     def test_possible_actions_final_entities(self):
   246         rset, req = self.env.get_rset_and_req('Any N, X WHERE X in_group Y, Y name N')
   246         rset, req = self.rset_and_req('Any N, X WHERE X in_group Y, Y name N')
   247         self.assertDictEqual(self.pactions(req, rset),
   247         self.assertDictEqual(self.pactions(req, rset),
   248                              {'useractions': USERACTIONS,
   248                              {'useractions': USERACTIONS,
   249                               'siteactions': SITEACTIONS})
   249                               'siteactions': SITEACTIONS})
   250 
   250 
   251     def test_possible_actions_eetype_cwuser_entity(self):
   251     def test_possible_actions_eetype_cwuser_entity(self):
   252         rset, req = self.env.get_rset_and_req('CWEType X WHERE X name "CWUser"')
   252         rset, req = self.rset_and_req('CWEType X WHERE X name "CWUser"')
   253         self.assertDictEqual(self.pactions(req, rset),
   253         self.assertDictEqual(self.pactions(req, rset),
   254                              {'useractions': USERACTIONS,
   254                              {'useractions': USERACTIONS,
   255                               'siteactions': SITEACTIONS,
   255                               'siteactions': SITEACTIONS,
   256                               'mainactions': [('edit', actions.ModifyAction),
   256                               'mainactions': [('edit', actions.ModifyAction),
   257                                               ('workflow', workflow.ViewWorkflowAction),],
   257                                               ('workflow', workflow.ViewWorkflowAction),],
   289                              self.vreg['views'].select, 'primary', req, rset=rset)
   289                              self.vreg['views'].select, 'primary', req, rset=rset)
   290         self.failUnlessRaises(NoSelectableObject,
   290         self.failUnlessRaises(NoSelectableObject,
   291                              self.vreg['views'].select, 'table', req, rset=rset)
   291                              self.vreg['views'].select, 'table', req, rset=rset)
   292 
   292 
   293         # no entity
   293         # no entity
   294         rset, req = self.env.get_rset_and_req('Any X WHERE X eid 999999')
   294         rset, req = self.rset_and_req('Any X WHERE X eid 999999')
   295         self.failUnlessRaises(NoSelectableObject,
   295         self.failUnlessRaises(NoSelectableObject,
   296                               self.vreg['views'].select, 'index', req, rset=rset)
   296                               self.vreg['views'].select, 'index', req, rset=rset)
   297         self.failUnlessRaises(NoSelectableObject,
   297         self.failUnlessRaises(NoSelectableObject,
   298                               self.vreg['views'].select, 'creation', req, rset=rset)
   298                               self.vreg['views'].select, 'creation', req, rset=rset)
   299         self.failUnlessRaises(NoSelectableObject,
   299         self.failUnlessRaises(NoSelectableObject,
   300                               self.vreg['views'].select, 'primary', req, rset=rset)
   300                               self.vreg['views'].select, 'primary', req, rset=rset)
   301         self.failUnlessRaises(NoSelectableObject,
   301         self.failUnlessRaises(NoSelectableObject,
   302                              self.vreg['views'].select, 'table', req, rset=rset)
   302                              self.vreg['views'].select, 'table', req, rset=rset)
   303         # one entity
   303         # one entity
   304         rset, req = self.env.get_rset_and_req('CWGroup X WHERE X name "managers"')
   304         rset, req = self.rset_and_req('CWGroup X WHERE X name "managers"')
   305         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   305         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   306                              primary.PrimaryView)
   306                              primary.PrimaryView)
   307         self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
   307         self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
   308                              baseviews.ListView)
   308                              baseviews.ListView)
   309         self.assertIsInstance(self.vreg['views'].select('edition', req, rset=rset),
   309         self.assertIsInstance(self.vreg['views'].select('edition', req, rset=rset),
   313         self.failUnlessRaises(NoSelectableObject,
   313         self.failUnlessRaises(NoSelectableObject,
   314                               self.vreg['views'].select, 'creation', req, rset=rset)
   314                               self.vreg['views'].select, 'creation', req, rset=rset)
   315         self.failUnlessRaises(NoSelectableObject,
   315         self.failUnlessRaises(NoSelectableObject,
   316                               self.vreg['views'].select, 'index', req, rset=rset)
   316                               self.vreg['views'].select, 'index', req, rset=rset)
   317         # list of entities of the same type
   317         # list of entities of the same type
   318         rset, req = self.env.get_rset_and_req('CWGroup X')
   318         rset, req = self.rset_and_req('CWGroup X')
   319         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   319         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   320                              primary.PrimaryView)
   320                              primary.PrimaryView)
   321         self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
   321         self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
   322                              baseviews.ListView)
   322                              baseviews.ListView)
   323         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   323         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   324                              tableview.TableView)
   324                              tableview.TableView)
   325         self.failUnlessRaises(NoSelectableObject,
   325         self.failUnlessRaises(NoSelectableObject,
   326                               self.vreg['views'].select, 'creation', req, rset=rset)
   326                               self.vreg['views'].select, 'creation', req, rset=rset)
   327         # list of entities of different types
   327         # list of entities of different types
   328         rset, req = self.env.get_rset_and_req('Any X')
   328         rset, req = self.rset_and_req('Any X')
   329         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   329         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   330                                   primary.PrimaryView)
   330                                   primary.PrimaryView)
   331         self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
   331         self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
   332                                   baseviews.ListView)
   332                                   baseviews.ListView)
   333         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   333         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   335         self.failUnlessRaises(NoSelectableObject,
   335         self.failUnlessRaises(NoSelectableObject,
   336                              self.vreg['views'].select, 'creation', req, rset=rset)
   336                              self.vreg['views'].select, 'creation', req, rset=rset)
   337         self.failUnlessRaises(NoSelectableObject,
   337         self.failUnlessRaises(NoSelectableObject,
   338                               self.vreg['views'].select, 'index', req, rset=rset)
   338                               self.vreg['views'].select, 'index', req, rset=rset)
   339         # whatever
   339         # whatever
   340         rset, req = self.env.get_rset_and_req('Any N, X WHERE X in_group Y, Y name N')
   340         rset, req = self.rset_and_req('Any N, X WHERE X in_group Y, Y name N')
   341         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   341         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   342                                   tableview.TableView)
   342                                   tableview.TableView)
   343         self.failUnlessRaises(NoSelectableObject,
   343         self.failUnlessRaises(NoSelectableObject,
   344                               self.vreg['views'].select, 'index', req, rset=rset)
   344                               self.vreg['views'].select, 'index', req, rset=rset)
   345         self.failUnlessRaises(NoSelectableObject,
   345         self.failUnlessRaises(NoSelectableObject,
   349         self.failUnlessRaises(NoSelectableObject,
   349         self.failUnlessRaises(NoSelectableObject,
   350                              self.vreg['views'].select, 'list', req, rset=rset)
   350                              self.vreg['views'].select, 'list', req, rset=rset)
   351         self.failUnlessRaises(NoSelectableObject,
   351         self.failUnlessRaises(NoSelectableObject,
   352                              self.vreg['views'].select, 'edition', req, rset=rset)
   352                              self.vreg['views'].select, 'edition', req, rset=rset)
   353         # mixed query
   353         # mixed query
   354         rset, req = self.env.get_rset_and_req('Any U,G WHERE U is CWUser, G is CWGroup')
   354         rset, req = self.rset_and_req('Any U,G WHERE U is CWUser, G is CWGroup')
   355         self.failUnlessRaises(NoSelectableObject,
   355         self.failUnlessRaises(NoSelectableObject,
   356                               self.vreg['views'].select, 'edition', req, rset=rset)
   356                               self.vreg['views'].select, 'edition', req, rset=rset)
   357         self.failUnlessRaises(NoSelectableObject,
   357         self.failUnlessRaises(NoSelectableObject,
   358                               self.vreg['views'].select, 'creation', req, rset=rset)
   358                               self.vreg['views'].select, 'creation', req, rset=rset)
   359         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   359         self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
   360                               tableview.TableView)
   360                               tableview.TableView)
   361 
   361 
   362     def test_interface_selector(self):
   362     def test_interface_selector(self):
   363         image = self.add_entity('Image', name=u'bim.png', data=Binary('bim'))
   363         image = self.add_entity('Image', name=u'bim.png', data=Binary('bim'))
   364         # image primary view priority
   364         # image primary view priority
   365         rset, req = self.env.get_rset_and_req('Image X WHERE X name "bim.png"')
   365         rset, req = self.rset_and_req('Image X WHERE X name "bim.png"')
   366         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   366         self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
   367                               idownloadable.IDownloadablePrimaryView)
   367                               idownloadable.IDownloadablePrimaryView)
   368 
   368 
   369 
   369 
   370     def test_score_entity_selector(self):
   370     def test_score_entity_selector(self):
   371         image = self.add_entity('Image', name=u'bim.png', data=Binary('bim'))
   371         image = self.add_entity('Image', name=u'bim.png', data=Binary('bim'))
   372         # image primary view priority
   372         # image primary view priority
   373         rset, req = self.env.get_rset_and_req('Image X WHERE X name "bim.png"')
   373         rset, req = self.rset_and_req('Image X WHERE X name "bim.png"')
   374         self.assertIsInstance(self.vreg['views'].select('image', req, rset=rset),
   374         self.assertIsInstance(self.vreg['views'].select('image', req, rset=rset),
   375                               idownloadable.ImageView)
   375                               idownloadable.ImageView)
   376         fileobj = self.add_entity('File', name=u'bim.txt', data=Binary('bim'))
   376         fileobj = self.add_entity('File', name=u'bim.txt', data=Binary('bim'))
   377         # image primary view priority
   377         # image primary view priority
   378         rset, req = self.env.get_rset_and_req('File X WHERE X name "bim.txt"')
   378         rset, req = self.rset_and_req('File X WHERE X name "bim.txt"')
   379         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'image', req, rset=rset)
   379         self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'image', req, rset=rset)
   380 
   380 
   381 
   381 
   382 
   382 
   383     def _test_view(self, vid, rql, args):
   383     def _test_view(self, vid, rql, args):
   384         if rql is None:
   384         if rql is None:
   385             rset = None
   385             rset = None
   386             req = self.request()
   386             req = self.request()
   387         else:
   387         else:
   388             rset, req = self.env.get_rset_and_req(rql)
   388             rset, req = self.rset_and_req(rql)
   389         try:
   389         try:
   390             self.vreg['views'].render(vid, req, rset=rset, **args)
   390             self.vreg['views'].render(vid, req, rset=rset, **args)
   391         except:
   391         except:
   392             print vid, rset, args
   392             print vid, rset, args
   393             raise
   393             raise
   436     def tearDown(self):
   436     def tearDown(self):
   437         super(RQLActionTC, self).tearDown()
   437         super(RQLActionTC, self).tearDown()
   438         del self.vreg['actions']['testaction']
   438         del self.vreg['actions']['testaction']
   439 
   439 
   440     def test(self):
   440     def test(self):
   441         rset, req = self.env.get_rset_and_req('CWEType X WHERE X name "CWEType"')
   441         rset, req = self.rset_and_req('CWEType X WHERE X name "CWEType"')
   442         self.assertDictEqual(self.pactions(req, rset),
   442         self.assertDictEqual(self.pactions(req, rset),
   443                              {'useractions': USERACTIONS,
   443                              {'useractions': USERACTIONS,
   444                               'siteactions': SITEACTIONS,
   444                               'siteactions': SITEACTIONS,
   445                               'mainactions': [('edit', actions.ModifyAction)],
   445                               'mainactions': [('edit', actions.ModifyAction)],
   446                               'moreactions': [('managepermission', actions.ManagePermissionsAction),
   446                               'moreactions': [('managepermission', actions.ManagePermissionsAction),
   447                                               ('delete', actions.DeleteAction),
   447                                               ('delete', actions.DeleteAction),
   448                                               ('copy', actions.CopyAction),
   448                                               ('copy', actions.CopyAction),
   449                                               ('testaction', CWETypeRQLAction),
   449                                               ('testaction', CWETypeRQLAction),
   450                                               ],
   450                                               ],
   451                               })
   451                               })
   452         rset, req = self.env.get_rset_and_req('CWEType X WHERE X name "CWRType"')
   452         rset, req = self.rset_and_req('CWEType X WHERE X name "CWRType"')
   453         self.assertDictEqual(self.pactions(req, rset),
   453         self.assertDictEqual(self.pactions(req, rset),
   454                              {'useractions': USERACTIONS,
   454                              {'useractions': USERACTIONS,
   455                               'siteactions': SITEACTIONS,
   455                               'siteactions': SITEACTIONS,
   456                               'mainactions': [('edit', actions.ModifyAction)],
   456                               'mainactions': [('edit', actions.ModifyAction)],
   457                               'moreactions': [('managepermission', actions.ManagePermissionsAction),
   457                               'moreactions': [('managepermission', actions.ManagePermissionsAction),