cubicweb/web/test/unittest_viewselector.py
changeset 11057 0b59724cb3f2
parent 10704 73367a56ee41
child 12567 26744ad37953
equal deleted inserted replaced
11052:058bb3dc685f 11057:0b59724cb3f2
       
     1 # -*- coding: utf-8 -*-
       
     2 # copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
       
     3 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
       
     4 #
       
     5 # This file is part of CubicWeb.
       
     6 #
       
     7 # CubicWeb is free software: you can redistribute it and/or modify it under the
       
     8 # terms of the GNU Lesser General Public License as published by the Free
       
     9 # Software Foundation, either version 2.1 of the License, or (at your option)
       
    10 # any later version.
       
    11 #
       
    12 # CubicWeb is distributed in the hope that it will be useful, but WITHOUT
       
    13 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
       
    14 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
       
    15 # details.
       
    16 #
       
    17 # You should have received a copy of the GNU Lesser General Public License along
       
    18 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
       
    19 """XXX rename, split, reorganize this"""
       
    20 from __future__ import print_function
       
    21 
       
    22 from logilab.common.testlib import unittest_main
       
    23 
       
    24 from cubicweb.devtools.testlib import CubicWebTC
       
    25 from cubicweb import Binary, UnknownProperty
       
    26 from cubicweb.predicates import (is_instance,
       
    27                                  specified_etype_implements, rql_condition)
       
    28 from cubicweb.web import NoSelectableObject
       
    29 from cubicweb.web.action import Action
       
    30 
       
    31 from cubicweb.web.views import (primary, baseviews, tableview,
       
    32                                 editforms, management, actions, startup, cwuser, schema, xbel,
       
    33                                 vcard, owl, treeview, idownloadable, wdoc, debug, cwuser,
       
    34                                 cwproperties, cwsources, xmlrss, rdf, csvexport, json,
       
    35                                 undohistory)
       
    36 
       
    37 
       
    38 USERACTIONS = [actions.UserPreferencesAction,
       
    39                actions.UserInfoAction,
       
    40                actions.LogoutAction]
       
    41 SITEACTIONS = [actions.ManageAction]
       
    42 FOOTERACTIONS = [wdoc.HelpAction,
       
    43                  wdoc.AboutAction,
       
    44                  actions.PoweredByAction]
       
    45 MANAGEACTIONS = [actions.SiteConfigurationAction,
       
    46                  schema.ViewSchemaAction,
       
    47                  cwuser.ManageUsersAction,
       
    48                  cwsources.ManageSourcesAction,
       
    49                  debug.SiteInfoAction]
       
    50 
       
    51 if hasattr(rdf, 'RDFView'): # not available if rdflib not installed
       
    52     RDFVIEWS = [('rdf', rdf.RDFView), ('n3rdf', rdf.RDFN3View)]
       
    53 else:
       
    54     RDFVIEWS = []
       
    55 
       
    56 class ViewSelectorTC(CubicWebTC):
       
    57 
       
    58     def setup_database(self):
       
    59         with self.admin_access.repo_cnx() as cnx:
       
    60             cnx.create_entity('BlogEntry', title=u"une news !", content=u"cubicweb c'est beau")
       
    61             cnx.create_entity('Bookmark', title=u"un signet !", path=u"view?vid=index")
       
    62             cnx.create_entity('EmailAddress', address=u"devel@logilab.fr", alias=u'devel')
       
    63             cnx.create_entity('Tag', name=u'x')
       
    64             cnx.commit()
       
    65 
       
    66 class VRegistryTC(ViewSelectorTC):
       
    67     """test the view selector"""
       
    68 
       
    69     def _test_registered(self, registry, content):
       
    70         try:
       
    71             expected = getattr(self, 'all_%s' % registry)
       
    72         except AttributeError:
       
    73             return
       
    74         if registry == 'hooks':
       
    75             self.assertEqual(len(content), expected, content)
       
    76             return
       
    77         try:
       
    78             self.assertSetEqual(list(content), expected)
       
    79         except Exception:
       
    80             print(registry, sorted(expected), sorted(content))
       
    81             print('no more', [v for v in expected if not v in content])
       
    82             print('missing', [v for v in content if not v in expected])
       
    83             raise
       
    84 
       
    85     def setUp(self):
       
    86         super(VRegistryTC, self).setUp()
       
    87         assert self.vreg['views']['propertiesform']
       
    88 
       
    89     def test_possible_views_none_rset(self):
       
    90         with self.admin_access.web_request() as req:
       
    91             self.assertListEqual(self.pviews(req, None),
       
    92                                  [('cw.sources-management', cwsources.CWSourcesManagementView),
       
    93                                   ('cw.users-and-groups-management', cwuser.UsersAndGroupsManagementView),
       
    94                                   ('gc', debug.GCView),
       
    95                                   ('index', startup.IndexView),
       
    96                                   ('info', debug.ProcessInformationView),
       
    97                                   ('manage', startup.ManageView),
       
    98                                   ('owl', owl.OWLView),
       
    99                                   ('propertiesform', cwproperties.CWPropertiesForm),
       
   100                                   ('registry', debug.RegistryView),
       
   101                                   ('schema', schema.SchemaView),
       
   102                                   ('siteinfo', debug.SiteInfoView),
       
   103                                   ('systempropertiesform', cwproperties.SystemCWPropertiesForm),
       
   104                                   ('undohistory', undohistory.UndoHistoryView)])
       
   105 
       
   106     def test_possible_views_noresult(self):
       
   107         with self.admin_access.web_request() as req:
       
   108             rset = req.execute('Any X WHERE X eid 999999')
       
   109             self.assertListEqual(self.pviews(req, rset),
       
   110                     [('csvexport', csvexport.CSVRsetView),
       
   111                      ('ecsvexport', csvexport.CSVEntityView),
       
   112                      ('ejsonexport', json.JsonEntityView),
       
   113                      ('jsonexport', json.JsonRsetView),
       
   114                      ])
       
   115 
       
   116     def test_possible_views_one_egroup(self):
       
   117         with self.admin_access.web_request() as req:
       
   118             rset = req.execute('CWGroup X WHERE X name "managers"')
       
   119             self.assertCountEqual(self.pviews(req, rset),
       
   120                                   RDFVIEWS +
       
   121                                   [('csvexport', csvexport.CSVRsetView),
       
   122                                    ('ecsvexport', csvexport.CSVEntityView),
       
   123                                    ('ejsonexport', json.JsonEntityView),
       
   124                                    ('filetree', treeview.FileTreeView),
       
   125                                    ('jsonexport', json.JsonRsetView),
       
   126                                    ('list', baseviews.ListView),
       
   127                                    ('oneline', baseviews.OneLineView),
       
   128                                    ('owlabox', owl.OWLABOXView),
       
   129                                    ('primary', cwuser.CWGroupPrimaryView),
       
   130                                    ('rsetxml', xmlrss.XMLRsetView),
       
   131                                    ('rss', xmlrss.RSSView),
       
   132                                    ('sameetypelist', baseviews.SameETypeListView),
       
   133                                    ('security', management.SecurityManagementView),
       
   134                                    ('table', tableview.RsetTableView),
       
   135                                    ('text', baseviews.TextView),
       
   136                                    ('treeview', treeview.TreeView),
       
   137                                    ('xbel', xbel.XbelView),
       
   138                                    ('xml', xmlrss.XMLView)])
       
   139 
       
   140     def test_possible_views_multiple_egroups(self):
       
   141         with self.admin_access.web_request() as req:
       
   142             rset = req.execute('CWGroup X')
       
   143             self.assertCountEqual(self.pviews(req, rset),
       
   144                                   RDFVIEWS +
       
   145                                   [('csvexport', csvexport.CSVRsetView),
       
   146                                    ('ecsvexport', csvexport.CSVEntityView),
       
   147                                    ('ejsonexport', json.JsonEntityView),
       
   148                                    ('filetree', treeview.FileTreeView),
       
   149                                    ('jsonexport', json.JsonRsetView),
       
   150                                    ('list', baseviews.ListView),
       
   151                                    ('oneline', baseviews.OneLineView),
       
   152                                    ('owlabox', owl.OWLABOXView),
       
   153                                    ('primary', cwuser.CWGroupPrimaryView),
       
   154                                    ('rsetxml', xmlrss.XMLRsetView),
       
   155                                    ('rss', xmlrss.RSSView),
       
   156                                    ('sameetypelist', baseviews.SameETypeListView),
       
   157                                    ('security', management.SecurityManagementView),
       
   158                                    ('table', tableview.RsetTableView),
       
   159                                    ('text', baseviews.TextView),
       
   160                                    ('treeview', treeview.TreeView),
       
   161                                    ('xbel', xbel.XbelView),
       
   162                                    ('xml', xmlrss.XMLView),
       
   163                                    ])
       
   164 
       
   165     def test_propertiesform_admin(self):
       
   166         assert self.vreg['views']['propertiesform']
       
   167         with self.admin_access.web_request() as req:
       
   168             rset1 = req.execute('CWUser X WHERE X login "admin"')
       
   169             self.assertTrue(self.vreg['views'].select('propertiesform', req, rset=None))
       
   170             self.assertTrue(self.vreg['views'].select('propertiesform', req, rset=rset1))
       
   171             rset2 = req.execute('CWUser X WHERE X login "anon"')
       
   172             self.assertTrue(self.vreg['views'].select('propertiesform', req, rset=rset2))
       
   173 
       
   174     def test_propertiesform_anon(self):
       
   175         with self.new_access(u'anon').web_request() as req:
       
   176             rset1 = req.execute('CWUser X WHERE X login "admin"')
       
   177             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req, rset=None)
       
   178             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req, rset=rset1)
       
   179             rset2 = req.execute('CWUser X WHERE X login "anon"')
       
   180             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req, rset=rset2)
       
   181 
       
   182     def test_propertiesform_jdoe(self):
       
   183         with self.admin_access.repo_cnx() as cnx:
       
   184             self.create_user(cnx, u'jdoe')
       
   185             cnx.commit()
       
   186         with self.new_access(u'jdoe').web_request() as req:
       
   187             rset1 = req.execute('CWUser X WHERE X login "admin"')
       
   188             rset2 = req.execute('CWUser X WHERE X login "jdoe"')
       
   189             self.assertTrue(self.vreg['views'].select('propertiesform', req, rset=None))
       
   190             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'propertiesform', req, rset=rset1)
       
   191             self.assertTrue(self.vreg['views'].select('propertiesform', req, rset=rset2))
       
   192 
       
   193     def test_possible_views_multiple_different_types(self):
       
   194         with self.admin_access.web_request() as req:
       
   195             rset = req.execute('Any X')
       
   196             self.assertCountEqual(self.pviews(req, rset),
       
   197                                   RDFVIEWS +
       
   198                                   [('csvexport', csvexport.CSVRsetView),
       
   199                                    ('ecsvexport', csvexport.CSVEntityView),
       
   200                                    ('ejsonexport', json.JsonEntityView),
       
   201                                    ('filetree', treeview.FileTreeView),
       
   202                                    ('jsonexport', json.JsonRsetView),
       
   203                                    ('list', baseviews.ListView),
       
   204                                    ('oneline', baseviews.OneLineView),
       
   205                                    ('owlabox', owl.OWLABOXView),
       
   206                                    ('primary', primary.PrimaryView),
       
   207                                    ('rsetxml', xmlrss.XMLRsetView),
       
   208                                    ('rss', xmlrss.RSSView),
       
   209                                    ('security', management.SecurityManagementView),
       
   210                                    ('table', tableview.RsetTableView),
       
   211                                    ('text', baseviews.TextView),
       
   212                                    ('treeview', treeview.TreeView),
       
   213                                    ('xbel', xbel.XbelView),
       
   214                                    ('xml', xmlrss.XMLView),
       
   215                                   ])
       
   216 
       
   217     def test_possible_views_any_rset(self):
       
   218         with self.admin_access.web_request() as req:
       
   219             rset = req.execute('Any N, X WHERE X in_group Y, Y name N')
       
   220             self.assertListEqual(self.pviews(req, rset),
       
   221                                  [('csvexport', csvexport.CSVRsetView),
       
   222                                   ('jsonexport', json.JsonRsetView),
       
   223                                   ('rsetxml', xmlrss.XMLRsetView),
       
   224                                   ('table', tableview.RsetTableView),
       
   225                                   ])
       
   226 
       
   227     def test_possible_views_multiple_eusers(self):
       
   228         with self.admin_access.web_request() as req:
       
   229             rset = req.execute('CWUser X')
       
   230             self.assertCountEqual(self.pviews(req, rset),
       
   231                                   RDFVIEWS +
       
   232                                   [('csvexport', csvexport.CSVRsetView),
       
   233                                    ('ecsvexport', csvexport.CSVEntityView),
       
   234                                    ('ejsonexport', json.JsonEntityView),
       
   235                                    ('filetree', treeview.FileTreeView),
       
   236                                    ('foaf', cwuser.FoafView),
       
   237                                    ('jsonexport', json.JsonRsetView),
       
   238                                    ('list', baseviews.ListView),
       
   239                                    ('oneline', baseviews.OneLineView),
       
   240                                    ('owlabox', owl.OWLABOXView),
       
   241                                    ('primary', primary.PrimaryView),
       
   242                                    ('rsetxml', xmlrss.XMLRsetView),
       
   243                                    ('rss', xmlrss.RSSView),
       
   244                                    ('sameetypelist', baseviews.SameETypeListView),
       
   245                                    ('security', management.SecurityManagementView),
       
   246                                    ('table', tableview.RsetTableView),
       
   247                                    ('text', baseviews.TextView),
       
   248                                    ('treeview', treeview.TreeView),
       
   249                                    ('vcard', vcard.VCardCWUserView),
       
   250                                    ('xbel', xbel.XbelView),
       
   251                                    ('xml', xmlrss.XMLView),
       
   252                                    ])
       
   253 
       
   254     def test_possible_actions_none_rset(self):
       
   255         with self.admin_access.web_request() as req:
       
   256             self.assertDictEqual(self.pactionsdict(req, None, skipcategories=()),
       
   257                                  {'useractions': USERACTIONS,
       
   258                                   'siteactions': SITEACTIONS,
       
   259                                   'manage': MANAGEACTIONS,
       
   260                                   'footer': FOOTERACTIONS})
       
   261 
       
   262     def test_possible_actions_no_entity(self):
       
   263         with self.admin_access.web_request() as req:
       
   264             rset = req.execute('Any X WHERE X eid 999999')
       
   265             self.assertDictEqual(self.pactionsdict(req, rset, skipcategories=()),
       
   266                                  {'useractions': USERACTIONS,
       
   267                                   'siteactions': SITEACTIONS,
       
   268                                   'manage': MANAGEACTIONS,
       
   269                                   'footer': FOOTERACTIONS,
       
   270                                   })
       
   271 
       
   272     def test_possible_actions_same_type_entities(self):
       
   273         with self.admin_access.web_request() as req:
       
   274             rset = req.execute('CWGroup X')
       
   275             self.assertDictEqual(self.pactionsdict(req, rset, skipcategories=()),
       
   276                                  {'useractions': USERACTIONS,
       
   277                                   'siteactions': SITEACTIONS,
       
   278                                   'manage': MANAGEACTIONS,
       
   279                                   'footer': FOOTERACTIONS,
       
   280                                   'mainactions': [actions.MultipleEditAction],
       
   281                                   'moreactions': [actions.DeleteAction,
       
   282                                                   actions.AddNewAction]})
       
   283 
       
   284     def test_possible_actions_different_types_entities(self):
       
   285         with self.admin_access.web_request() as req:
       
   286             rset = req.execute('Any X')
       
   287             self.assertDictEqual(self.pactionsdict(req, rset, skipcategories=()),
       
   288                                  {'useractions': USERACTIONS,
       
   289                                   'siteactions': SITEACTIONS,
       
   290                                   'manage': MANAGEACTIONS,
       
   291                                   'footer': FOOTERACTIONS,
       
   292                                   'moreactions': [actions.DeleteAction],
       
   293                                   })
       
   294 
       
   295     def test_possible_actions_final_entities(self):
       
   296         with self.admin_access.web_request() as req:
       
   297             rset = req.execute('Any N, X WHERE X in_group Y, Y name N')
       
   298             self.assertDictEqual(self.pactionsdict(req, rset, skipcategories=()),
       
   299                                  {'useractions': USERACTIONS,
       
   300                                   'siteactions': SITEACTIONS,
       
   301                                   'manage': MANAGEACTIONS,
       
   302                                   'footer': FOOTERACTIONS,
       
   303                                   })
       
   304 
       
   305     def test_possible_actions_eetype_cwuser_entity(self):
       
   306         with self.admin_access.web_request() as req:
       
   307             rset = req.execute('CWEType X WHERE X name "CWUser"')
       
   308             self.assertDictEqual(self.pactionsdict(req, rset, skipcategories=()),
       
   309                                  {'useractions': USERACTIONS,
       
   310                                   'siteactions': SITEACTIONS,
       
   311                                   'manage': MANAGEACTIONS,
       
   312                                   'footer': FOOTERACTIONS,
       
   313                                   'mainactions': [actions.ModifyAction,
       
   314                                                   actions.ViewSameCWEType],
       
   315                                   'moreactions': [actions.ManagePermissionsAction,
       
   316                                                   actions.AddRelatedActions,
       
   317                                                   actions.DeleteAction,
       
   318                                                   actions.CopyAction,
       
   319                                                   ],
       
   320                                   })
       
   321 
       
   322 
       
   323     def test_select_creation_form(self):
       
   324         rset = None
       
   325         with self.admin_access.web_request() as req:
       
   326             # creation form
       
   327             req.form['etype'] = 'CWGroup'
       
   328             self.assertIsInstance(self.vreg['views'].select('creation', req, rset=rset),
       
   329                                   editforms.CreationFormView)
       
   330 
       
   331         with self.admin_access.web_request() as req:
       
   332             # custom creation form
       
   333             class CWUserCreationForm(editforms.CreationFormView):
       
   334                 __select__ = specified_etype_implements('CWUser')
       
   335 
       
   336             self.vreg._loadedmods[__name__] = {}
       
   337             self.vreg.register(CWUserCreationForm)
       
   338             req.form['etype'] = 'CWUser'
       
   339 
       
   340             self.assertIsInstance(self.vreg['views'].select('creation', req, rset=rset),
       
   341                                   CWUserCreationForm)
       
   342 
       
   343     def test_select_view(self):
       
   344         # no entity
       
   345         rset = None
       
   346         with self.admin_access.web_request() as req:
       
   347             self.assertIsInstance(self.vreg['views'].select('index', req, rset=rset),
       
   348                                   startup.IndexView)
       
   349             self.assertRaises(NoSelectableObject,
       
   350                               self.vreg['views'].select, 'primary', req, rset=rset)
       
   351             self.assertRaises(NoSelectableObject,
       
   352                               self.vreg['views'].select, 'table', req, rset=rset)
       
   353 
       
   354             # no entity
       
   355             rset = req.execute('Any X WHERE X eid 999999')
       
   356             self.assertRaises(NoSelectableObject,
       
   357                               self.vreg['views'].select, 'index', req, rset=rset)
       
   358             self.assertRaises(NoSelectableObject,
       
   359                               self.vreg['views'].select, 'creation', req, rset=rset)
       
   360             self.assertRaises(NoSelectableObject,
       
   361                               self.vreg['views'].select, 'primary', req, rset=rset)
       
   362             self.assertRaises(NoSelectableObject,
       
   363                               self.vreg['views'].select, 'table', req, rset=rset)
       
   364             # one entity
       
   365             rset = req.execute('CWGroup X WHERE X name "managers"')
       
   366             self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
       
   367                                   primary.PrimaryView)
       
   368             self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
       
   369                                   baseviews.ListView)
       
   370             self.assertIsInstance(self.vreg['views'].select('edition', req, rset=rset),
       
   371                                   editforms.EditionFormView)
       
   372             self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
       
   373                                   tableview.RsetTableView)
       
   374             self.assertRaises(NoSelectableObject,
       
   375                               self.vreg['views'].select, 'creation', req, rset=rset)
       
   376             self.assertRaises(NoSelectableObject,
       
   377                               self.vreg['views'].select, 'index', req, rset=rset)
       
   378             # list of entities of the same type
       
   379             rset = req.execute('CWGroup X')
       
   380             self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
       
   381                                   primary.PrimaryView)
       
   382             self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
       
   383                                   baseviews.ListView)
       
   384             self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
       
   385                                   tableview.RsetTableView)
       
   386             self.assertRaises(NoSelectableObject,
       
   387                               self.vreg['views'].select, 'creation', req, rset=rset)
       
   388             # list of entities of different types
       
   389             rset = req.execute('Any X')
       
   390             self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
       
   391                                   primary.PrimaryView)
       
   392             self.assertIsInstance(self.vreg['views'].select('list', req, rset=rset),
       
   393                                   baseviews.ListView)
       
   394             self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
       
   395                                   tableview.RsetTableView)
       
   396             self.assertRaises(NoSelectableObject,
       
   397                               self.vreg['views'].select, 'creation', req, rset=rset)
       
   398             self.assertRaises(NoSelectableObject,
       
   399                               self.vreg['views'].select, 'index', req, rset=rset)
       
   400             # whatever
       
   401             rset = req.execute('Any N, X WHERE X in_group Y, Y name N')
       
   402             self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
       
   403                                   tableview.RsetTableView)
       
   404             self.assertRaises(NoSelectableObject,
       
   405                               self.vreg['views'].select, 'index', req, rset=rset)
       
   406             self.assertRaises(NoSelectableObject,
       
   407                               self.vreg['views'].select, 'creation', req, rset=rset)
       
   408             self.assertRaises(NoSelectableObject,
       
   409                               self.vreg['views'].select, 'primary', req, rset=rset)
       
   410             self.assertRaises(NoSelectableObject,
       
   411                               self.vreg['views'].select, 'list', req, rset=rset)
       
   412             self.assertRaises(NoSelectableObject,
       
   413                               self.vreg['views'].select, 'edition', req, rset=rset)
       
   414             # mixed query
       
   415             rset = req.execute('Any U,G WHERE U is CWUser, G is CWGroup')
       
   416             self.assertRaises(NoSelectableObject,
       
   417                               self.vreg['views'].select, 'edition', req, rset=rset)
       
   418             self.assertRaises(NoSelectableObject,
       
   419                               self.vreg['views'].select, 'creation', req, rset=rset)
       
   420             self.assertIsInstance(self.vreg['views'].select('table', req, rset=rset),
       
   421                                   tableview.RsetTableView)
       
   422 
       
   423     def test_interface_selector(self):
       
   424         with self.admin_access.web_request() as req:
       
   425             req.create_entity('File', data_name=u'bim.png', data=Binary(b'bim'))
       
   426             # image primary view priority
       
   427             rset = req.execute('File X WHERE X data_name "bim.png"')
       
   428             self.assertIsInstance(self.vreg['views'].select('primary', req, rset=rset),
       
   429                                   idownloadable.IDownloadablePrimaryView)
       
   430 
       
   431 
       
   432     def test_score_entity_selector(self):
       
   433         with self.admin_access.web_request() as req:
       
   434             req.create_entity('File', data_name=u'bim.png', data=Binary(b'bim'))
       
   435             # image/ehtml primary view priority
       
   436             rset = req.execute('File X WHERE X data_name "bim.png"')
       
   437             self.assertIsInstance(self.vreg['views'].select('image', req, rset=rset),
       
   438                                   idownloadable.ImageView)
       
   439             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'ehtml', req, rset=rset)
       
   440 
       
   441             fileobj = req.create_entity('File', data_name=u'bim.html', data=Binary(b'<html>bam</html'))
       
   442             # image/ehtml primary view priority
       
   443             rset = req.execute('File X WHERE X data_name "bim.html"')
       
   444             self.assertIsInstance(self.vreg['views'].select('ehtml', req, rset=rset),
       
   445                                   idownloadable.EHTMLView)
       
   446             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'image', req, rset=rset)
       
   447 
       
   448             fileobj = req.create_entity('File', data_name=u'bim.txt', data=Binary(b'boum'))
       
   449             # image/ehtml primary view priority
       
   450             rset = req.execute('File X WHERE X data_name "bim.txt"')
       
   451             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'image', req, rset=rset)
       
   452             self.assertRaises(NoSelectableObject, self.vreg['views'].select, 'ehtml', req, rset=rset)
       
   453 
       
   454 
       
   455     def _test_view(self, vid, rql, args):
       
   456         with self.admin_access.web_request() as req:
       
   457             if rql is None:
       
   458                 rset = None
       
   459             else:
       
   460                 rset = req.execute(rql)
       
   461             try:
       
   462                 obj = self.vreg['views'].select(vid, req, rset=rset, **args)
       
   463                 return obj.render(**args)
       
   464             except Exception:
       
   465                 print(vid, rset, args)
       
   466                 raise
       
   467 
       
   468     def test_form(self):
       
   469         for vid, rql, args in (
       
   470             #('creation', 'Any X WHERE X eid 999999', {}),
       
   471             ('edition', 'CWGroup X WHERE X name "managers"', {}),
       
   472             ('copy', 'CWGroup X WHERE X name "managers"', {}),
       
   473             ('muledit', 'CWGroup X', {}),
       
   474             #('muledit', 'Any X', {}),
       
   475             ):
       
   476             self._test_view(vid, rql, args)
       
   477 
       
   478 
       
   479     def test_properties(self):
       
   480         self.assertEqual(sorted(k for k in self.vreg['propertydefs']
       
   481                                 if k.startswith('ctxcomponents.edit_box')),
       
   482                          ['ctxcomponents.edit_box.context',
       
   483                           'ctxcomponents.edit_box.order',
       
   484                           'ctxcomponents.edit_box.visible'])
       
   485         self.assertEqual([k for k in self.vreg['propertyvalues']
       
   486                           if not k.startswith('system.version')],
       
   487                          [])
       
   488         self.assertEqual(self.vreg.property_value('ctxcomponents.edit_box.visible'), True)
       
   489         self.assertEqual(self.vreg.property_value('ctxcomponents.edit_box.order'), 2)
       
   490         self.assertEqual(self.vreg.property_value('ctxcomponents.possible_views_box.visible'), False)
       
   491         self.assertEqual(self.vreg.property_value('ctxcomponents.possible_views_box.order'), 10)
       
   492         self.assertRaises(UnknownProperty, self.vreg.property_value, 'ctxcomponents.actions_box')
       
   493 
       
   494 
       
   495 
       
   496 class CWETypeRQLAction(Action):
       
   497     __regid__ = 'testaction'
       
   498     __select__ = is_instance('CWEType') & rql_condition('X name "CWEType"')
       
   499     title = 'bla'
       
   500 
       
   501 
       
   502 class RQLActionTC(ViewSelectorTC):
       
   503 
       
   504     def setUp(self):
       
   505         super(RQLActionTC, self).setUp()
       
   506         self.vreg._loadedmods[__name__] = {}
       
   507         self.vreg.register(CWETypeRQLAction)
       
   508         actionsreg = self.vreg['actions']
       
   509         actionsreg['testaction'][0].__registered__(actionsreg)
       
   510 
       
   511     def tearDown(self):
       
   512         super(RQLActionTC, self).tearDown()
       
   513         del self.vreg['actions']['testaction']
       
   514 
       
   515     def test(self):
       
   516         with self.admin_access.web_request() as req:
       
   517             rset = req.execute('CWEType X WHERE X name "CWEType"')
       
   518             self.assertDictEqual(self.pactionsdict(req, rset, skipcategories=()),
       
   519                                  {'useractions': USERACTIONS,
       
   520                                   'siteactions': SITEACTIONS,
       
   521                                   'footer': FOOTERACTIONS,
       
   522                                   'manage': MANAGEACTIONS,
       
   523                                   'mainactions': [actions.ModifyAction, actions.ViewSameCWEType],
       
   524                                   'moreactions': [actions.ManagePermissionsAction,
       
   525                                                   actions.AddRelatedActions,
       
   526                                                   actions.DeleteAction,
       
   527                                                   actions.CopyAction,
       
   528                                                   CWETypeRQLAction,
       
   529                                                   ],
       
   530                                   })
       
   531             rset = req.execute('CWEType X WHERE X name "CWRType"')
       
   532             self.assertDictEqual(self.pactionsdict(req, rset, skipcategories=()),
       
   533                                  {'useractions': USERACTIONS,
       
   534                                   'siteactions': SITEACTIONS,
       
   535                                   'footer': FOOTERACTIONS,
       
   536                                   'manage': MANAGEACTIONS,
       
   537                                   'mainactions': [actions.ModifyAction, actions.ViewSameCWEType],
       
   538                                   'moreactions': [actions.ManagePermissionsAction,
       
   539                                                   actions.AddRelatedActions,
       
   540                                                   actions.DeleteAction,
       
   541                                                   actions.CopyAction,]
       
   542                                   })
       
   543 
       
   544 
       
   545 
       
   546 if __name__ == '__main__':
       
   547     unittest_main()