389 return sorted((a.id, a.__class__) |
389 return sorted((a.id, a.__class__) |
390 for a in self.vreg['views'].possible_views(req, rset=rset)) |
390 for a in self.vreg['views'].possible_views(req, rset=rset)) |
391 |
391 |
392 def pactions(self, req, rset, |
392 def pactions(self, req, rset, |
393 skipcategories=('addrelated', 'siteactions', 'useractions')): |
393 skipcategories=('addrelated', 'siteactions', 'useractions')): |
394 return [(a.id, a.__class__) |
394 return [(a.__regid__, a.__class__) |
395 for a in self.vreg['actions'].poss_visible_objects(req, rset=rset) |
395 for a in self.vreg['actions'].poss_visible_objects(req, rset=rset) |
396 if a.category not in skipcategories] |
396 if a.category not in skipcategories] |
397 |
397 |
398 def pactions_by_cats(self, req, rset, categories=('addrelated',)): |
398 def pactions_by_cats(self, req, rset, categories=('addrelated',)): |
399 return [(a.id, a.__class__) |
399 return [(a.__regid__, a.__class__) |
400 for a in self.vreg['actions'].poss_visible_objects(req, rset=rset) |
400 for a in self.vreg['actions'].poss_visible_objects(req, rset=rset) |
401 if a.category in categories] |
401 if a.category in categories] |
402 |
402 |
403 def pactionsdict(self, req, rset, |
403 def pactionsdict(self, req, rset, |
404 skipcategories=('addrelated', 'siteactions', 'useractions')): |
404 skipcategories=('addrelated', 'siteactions', 'useractions')): |
466 def list_startup_views(self): |
466 def list_startup_views(self): |
467 """returns the list of startup views""" |
467 """returns the list of startup views""" |
468 req = self.request() |
468 req = self.request() |
469 for view in self.vreg['views'].possible_views(req, None): |
469 for view in self.vreg['views'].possible_views(req, None): |
470 if view.category == 'startupview': |
470 if view.category == 'startupview': |
471 yield view.id |
471 yield view.__regid__ |
472 else: |
472 else: |
473 not_selected(self.vreg, view) |
473 not_selected(self.vreg, view) |
474 |
474 |
475 # web ui testing utilities ################################################# |
475 # web ui testing utilities ################################################# |
476 |
476 |
603 except: |
603 except: |
604 # hijack exception: generative tests stop when the exception |
604 # hijack exception: generative tests stop when the exception |
605 # is not an AssertionError |
605 # is not an AssertionError |
606 klass, exc, tcbk = sys.exc_info() |
606 klass, exc, tcbk = sys.exc_info() |
607 try: |
607 try: |
608 msg = '[%s in %s] %s' % (klass, view.id, exc) |
608 msg = '[%s in %s] %s' % (klass, view.__regid__, exc) |
609 except: |
609 except: |
610 msg = '[%s in %s] undisplayable exception' % (klass, view.id) |
610 msg = '[%s in %s] undisplayable exception' % (klass, view.__regid__) |
611 if output is not None: |
611 if output is not None: |
612 position = getattr(exc, "position", (0,))[0] |
612 position = getattr(exc, "position", (0,))[0] |
613 if position: |
613 if position: |
614 # define filter |
614 # define filter |
615 output = output.splitlines() |
615 output = output.splitlines() |
626 |
626 |
627 @nocoverage |
627 @nocoverage |
628 def _check_html(self, output, view, template='main-template'): |
628 def _check_html(self, output, view, template='main-template'): |
629 """raises an exception if the HTML is invalid""" |
629 """raises an exception if the HTML is invalid""" |
630 try: |
630 try: |
631 validatorclass = self.vid_validators[view.id] |
631 validatorclass = self.vid_validators[view.__regid__] |
632 except KeyError: |
632 except KeyError: |
633 if template is None: |
633 if template is None: |
634 default_validator = htmlparser.HTMLValidator |
634 default_validator = htmlparser.HTMLValidator |
635 else: |
635 else: |
636 default_validator = htmlparser.DTDValidator |
636 default_validator = htmlparser.DTDValidator |
792 for k, v in propdefs.items(): |
792 for k, v in propdefs.items(): |
793 if k.endswith('visible') and not v['default']: |
793 if k.endswith('visible') and not v['default']: |
794 propdefs[k]['default'] = True |
794 propdefs[k]['default'] = True |
795 for view in self.list_views_for(rset): |
795 for view in self.list_views_for(rset): |
796 backup_rset = rset._prepare_copy(rset.rows, rset.description) |
796 backup_rset = rset._prepare_copy(rset.rows, rset.description) |
797 yield InnerTest(self._testname(rset, view.id, 'view'), |
797 yield InnerTest(self._testname(rset, view.__regid__, 'view'), |
798 self.view, view.id, rset, |
798 self.view, view.__regid__, rset, |
799 rset.req.reset_headers(), 'main-template') |
799 rset.req.reset_headers(), 'main-template') |
800 # We have to do this because some views modify the |
800 # We have to do this because some views modify the |
801 # resultset's syntax tree |
801 # resultset's syntax tree |
802 rset = backup_rset |
802 rset = backup_rset |
803 for action in self.list_actions_for(rset): |
803 for action in self.list_actions_for(rset): |
804 yield InnerTest(self._testname(rset, action.id, 'action'), self._test_action, action) |
804 yield InnerTest(self._testname(rset, action.__regid__, 'action'), self._test_action, action) |
805 for box in self.list_boxes_for(rset): |
805 for box in self.list_boxes_for(rset): |
806 yield InnerTest(self._testname(rset, box.id, 'box'), box.render) |
806 yield InnerTest(self._testname(rset, box.__regid__, 'box'), box.render) |
807 |
807 |
808 @staticmethod |
808 @staticmethod |
809 def _testname(rset, objid, objtype): |
809 def _testname(rset, objid, objtype): |
810 return '%s_%s_%s' % ('_'.join(rset.column_types(0)), objid, objtype) |
810 return '%s_%s_%s' % ('_'.join(rset.column_types(0)), objid, objtype) |
811 |
811 |