devtools/testlib.py
changeset 2650 18aec79ec3a3
parent 2234 1fbcf202882d
child 2657 de974465d381
equal deleted inserted replaced
2649:5d4a943695d1 2650:18aec79ec3a3
   183                   encapsulation the generated HTML
   183                   encapsulation the generated HTML
   184         """
   184         """
   185         req = req or rset and rset.req or self.request()
   185         req = req or rset and rset.req or self.request()
   186         req.form['vid'] = vid
   186         req.form['vid'] = vid
   187         kwargs['rset'] = rset
   187         kwargs['rset'] = rset
   188         view = self.vreg.select('views', vid, req, **kwargs)
   188         viewsreg = self.vreg['views']
       
   189         view = viewsreg.select(vid, req, **kwargs)
   189         # set explicit test description
   190         # set explicit test description
   190         if rset is not None:
   191         if rset is not None:
   191             self.set_description("testing %s, mod=%s (%s)" % (
   192             self.set_description("testing %s, mod=%s (%s)" % (
   192                 vid, view.__module__, rset.printable_rql()))
   193                 vid, view.__module__, rset.printable_rql()))
   193         else:
   194         else:
   195                 vid, view.__module__))
   196                 vid, view.__module__))
   196         if template is None: # raw view testing, no template
   197         if template is None: # raw view testing, no template
   197             viewfunc = view.render
   198             viewfunc = view.render
   198         else:
   199         else:
   199             kwargs['view'] = view
   200             kwargs['view'] = view
   200             templateview = self.vreg.select('views', template, req, **kwargs)
   201             templateview = viewsreg.select(template, req, **kwargs)
   201             viewfunc = lambda **k: self.vreg.main_template(req, template,
   202             viewfunc = lambda **k: viewsreg.main_template(req, template,
   202                                                            **kwargs)
   203                                                           **kwargs)
   203         kwargs.pop('rset')
   204         kwargs.pop('rset')
   204         return self._test_view(viewfunc, view, template, kwargs)
   205         return self._test_view(viewfunc, view, template, kwargs)
   205 
   206 
   206 
   207 
   207     def _test_view(self, viewfunc, view, template='main-template', kwargs={}):
   208     def _test_view(self, viewfunc, view, template='main-template', kwargs={}):
   270     def list_views_for(self, rset):
   271     def list_views_for(self, rset):
   271         """returns the list of views that can be applied on `rset`"""
   272         """returns the list of views that can be applied on `rset`"""
   272         req = rset.req
   273         req = rset.req
   273         only_once_vids = ('primary', 'secondary', 'text')
   274         only_once_vids = ('primary', 'secondary', 'text')
   274         req.data['ex'] = ValueError("whatever")
   275         req.data['ex'] = ValueError("whatever")
   275         for vid, views in self.vreg.registry('views').items():
   276         viewsvreg = self.vreg['views']
       
   277         for vid, views in viewsvreg.items():
   276             if vid[0] == '_':
   278             if vid[0] == '_':
   277                 continue
   279                 continue
   278             if rset.rowcount > 1 and vid in only_once_vids:
   280             if rset.rowcount > 1 and vid in only_once_vids:
   279                 continue
   281                 continue
   280             views = [view for view in views
   282             views = [view for view in views
   281                      if view.category != 'startupview'
   283                      if view.category != 'startupview'
   282                      and not issubclass(view, NotificationView)]
   284                      and not issubclass(view, NotificationView)]
   283             if views:
   285             if views:
   284                 try:
   286                 try:
   285                     view = self.vreg.select_best(views, req, rset=rset)
   287                     view = viewsvreg.select_best(views, req, rset=rset)
   286                     if view.linkable():
   288                     if view.linkable():
   287                         yield view
   289                         yield view
   288                     else:
   290                     else:
   289                         not_selected(self.vreg, view)
   291                         not_selected(self.vreg, view)
   290                     # else the view is expected to be used as subview and should
   292                     # else the view is expected to be used as subview and should
   293                     continue
   295                     continue
   294 
   296 
   295     def list_actions_for(self, rset):
   297     def list_actions_for(self, rset):
   296         """returns the list of actions that can be applied on `rset`"""
   298         """returns the list of actions that can be applied on `rset`"""
   297         req = rset.req
   299         req = rset.req
   298         for action in self.vreg.possible_objects('actions', req, rset=rset):
   300         for action in self.vreg['actions'].possible_objects(req, rset=rset):
   299             yield action
   301             yield action
   300 
   302 
   301     def list_boxes_for(self, rset):
   303     def list_boxes_for(self, rset):
   302         """returns the list of boxes that can be applied on `rset`"""
   304         """returns the list of boxes that can be applied on `rset`"""
   303         req = rset.req
   305         req = rset.req
   304         for box in self.vreg.possible_objects('boxes', req, rset=rset):
   306         for box in self.vreg['boxes'].possible_objects(req, rset=rset):
   305             yield box
   307             yield box
   306 
   308 
   307     def list_startup_views(self):
   309     def list_startup_views(self):
   308         """returns the list of startup views"""
   310         """returns the list of startup views"""
   309         req = self.request()
   311         req = self.request()
   310         for view in self.vreg.possible_views(req, None):
   312         for view in self.vreg['views'].possible_views(req, None):
   311             if view.category == 'startupview':
   313             if view.category == 'startupview':
   312                 yield view.id
   314                 yield view.id
   313             else:
   315             else:
   314                 not_selected(self.vreg, view)
   316                 not_selected(self.vreg, view)
   315 
   317 
   383 
   385 
   384 def vreg_instrumentize(testclass):
   386 def vreg_instrumentize(testclass):
   385     from cubicweb.devtools.apptest import TestEnvironment
   387     from cubicweb.devtools.apptest import TestEnvironment
   386     env = testclass._env = TestEnvironment('data', configcls=testclass.configcls,
   388     env = testclass._env = TestEnvironment('data', configcls=testclass.configcls,
   387                                            requestcls=testclass.requestcls)
   389                                            requestcls=testclass.requestcls)
   388     vreg = env.vreg
   390     for reg in env.vreg.values():
   389     vreg._selected = {}
   391         reg._selected = {}
   390     orig_select_best = vreg.__class__.select_best
   392         orig_select_best = reg.__class__.select_best
   391     def instr_select_best(self, *args, **kwargs):
   393         def instr_select_best(self, *args, **kwargs):
   392         selected = orig_select_best(self, *args, **kwargs)
   394             selected = orig_select_best(self, *args, **kwargs)
   393         try:
   395             try:
   394             self._selected[selected.__class__] += 1
   396                 self._selected[selected.__class__] += 1
   395         except KeyError:
   397             except KeyError:
   396             self._selected[selected.__class__] = 1
   398                 self._selected[selected.__class__] = 1
   397         except AttributeError:
   399             except AttributeError:
   398             pass # occurs on vreg used to restore database
   400                 pass # occurs on reg used to restore database
   399         return selected
   401             return selected
   400     vreg.__class__.select_best = instr_select_best
   402         reg.__class__.select_best = instr_select_best
   401 
   403 
   402 def print_untested_objects(testclass, skipregs=('hooks', 'etypes')):
   404 def print_untested_objects(testclass, skipregs=('hooks', 'etypes')):
   403     vreg = testclass._env.vreg
   405     for regname, reg in testclass._env.vreg.iteritems():
   404     for registry, vobjectsdict in vreg.items():
   406         if regname in skipregs:
   405         if registry in skipregs:
       
   406             continue
   407             continue
   407         for vobjects in vobjectsdict.values():
   408         for vobjects in reg.itervalues():
   408             for vobject in vobjects:
   409             for vobject in vobjects:
   409                 if not vreg._selected.get(vobject):
   410                 if not reg._selected.get(vobject):
   410                     print 'not tested', registry, vobject
   411                     print 'not tested', regname, vobject