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 |