cubicweb/devtools/testlib.py
author Philippe Pepiot <ph@itsalwaysdns.eu>
Mon, 30 Mar 2020 15:17:10 +0200
changeset 12958 3667f6df1ec3
parent 12722 1a5eb9a9f5b4
permissions -rw-r--r--
[server] extract "no pooler" CnxSet class to a _BaseCnxSet class So we get rid of "if self._queue is None" in each method of _CnxSetPool Also add helper get_cnxset(source, size) to instantiate the correct pooler class.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11266
ea25d87a8537 [devtools] show DeprecationWarning during test execution
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11195
diff changeset
     1
# copyright 2003-2016 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11751
diff changeset
    18
"""Base classes and utilities for cubicweb tests"""
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11751
diff changeset
    19
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
import sys
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    21
import re
6631
26c303c3f1aa [test] make test independant from the working directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6590
diff changeset
    22
from os.path import dirname, join, abspath
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
from math import log
5102
04c84959cd85 [testlib] simple helper method to register temporary appobjects (hooks for instance) with a context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5055
diff changeset
    24
from contextlib import contextmanager
11182
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
    25
from inspect import isgeneratorfunction
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
    26
from itertools import chain
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
    27
from unittest import TestCase
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
    28
from urllib.parse import urlparse, parse_qs, unquote as urlunquote
10603
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
    29
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    30
import yams.schema
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    31
11184
2a7b98d91736 [testlib] Import nocoverage from logilab.common.testlib
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11182
diff changeset
    32
from logilab.common.testlib import Tags, nocoverage
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    33
from logilab.common.debugger import Debugger
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    34
from logilab.common.umessage import message_from_string
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
    35
from logilab.common.decorators import cached, classproperty, clear_cache, iclassmethod
12505
55014a79b2a5 Drop deprecated code in cubicweb.devtools
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12250
diff changeset
    36
from logilab.common.deprecation import class_deprecated
6720
43a38c093f6f [testlib] Use logilab.common.shellutils.getlogin instead of local hack.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6589
diff changeset
    37
from logilab.common.shellutils import getlogin
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
    39
from cubicweb import (ValidationError, NoSelectableObject, AuthenticationError,
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
    40
                      BadConnectionId)
12038
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
    41
from cubicweb import cwconfig, devtools, repoapi, server, web
8652
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
    42
from cubicweb.utils import json
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    43
from cubicweb.sobjects import notification
10219
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
    44
from cubicweb.web import Redirect, application, eid_param
6398
ea26eb5fd388 [test] send mail synchronously during tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6369
diff changeset
    45
from cubicweb.server.hook import SendMailOp
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    46
from cubicweb.devtools import SYSTEM_ENTITIES, SYSTEM_RELATIONS, VIEW_VALIDATORS
8930
6a02be304486 remove unused import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8725
diff changeset
    47
from cubicweb.devtools import fake, htmlparser, DEFAULT_EMPTY_DB_ID
11811
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
    48
from cubicweb.devtools.fill import insert_entity_queries, make_relations_queries
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
    49
from cubicweb.web.views.authentication import Session
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
11181
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    51
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    52
# provide a data directory for the test class ##################################
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    53
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    54
class BaseTestCase(TestCase):
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    55
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    56
    @classproperty
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    57
    @cached
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11270
diff changeset
    58
    def datadir(cls):  # pylint: disable=E0213
11181
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    59
        """helper attribute holding the standard test's data directory
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    60
        """
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    61
        mod = sys.modules[cls.__module__]
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    62
        return join(dirname(abspath(mod.__file__)), 'data')
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    63
    # cache it (use a class method to cache on class since TestCase is
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    64
    # instantiated for each test run)
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    65
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    66
    @classmethod
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    67
    def datapath(cls, *fname):
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    68
        """joins the object's datadir and `fname`"""
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    69
        return join(cls.datadir, *fname)
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    70
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    71
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    72
if hasattr(BaseTestCase, 'assertItemsEqual'):
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
    73
    BaseTestCase.assertCountEqual = BaseTestCase.assertItemsEqual
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
    74
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
    75
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    76
# low-level utilities ##########################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
class CubicWebDebugger(Debugger):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    79
    """special debugger class providing a 'view' function which saves some
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    80
    html into a temporary file and open a web browser to examinate it.
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    81
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    82
    def do_view(self, arg):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    83
        import webbrowser
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
        data = self._getval(arg)
10614
57dfde80df11 [py3k] file → open
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10612
diff changeset
    85
        with open('/tmp/toto.html', 'w') as toto:
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    86
            toto.write(data)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    87
        webbrowser.open('file:///tmp/toto.html')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    88
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
    89
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    90
def line_context_filter(line_no, center, before=3, after=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    91
    """return true if line are in context
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    92
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    93
    if after is None: after = before
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    94
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    95
    if after is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    96
        after = before
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    97
    return center - before <= line_no <= center + after
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
    99
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   100
def unprotected_entities(schema, strict=False):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   101
    """returned a set of each non final entity type, excluding "system" entities
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   102
    (eg CWGroup, CWUser...)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   103
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   104
    if strict:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   105
        protected_entities = yams.schema.BASE_TYPES
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   106
    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   107
        protected_entities = yams.schema.BASE_TYPES.union(SYSTEM_ENTITIES)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   108
    return set(schema.entities()) - protected_entities
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   109
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   110
8652
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
   111
class JsonValidator(object):
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
   112
    def parse_string(self, data):
10700
a6d9d27f4253 [web/views] port JSON views to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10689
diff changeset
   113
        return json.loads(data.decode('ascii'))
8652
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
   114
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   115
9427
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   116
@contextmanager
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   117
def real_error_handling(app):
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   118
    """By default, CubicWebTC `app` attribute (ie the publisher) is monkey
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   119
    patched so that unexpected error are raised rather than going through the
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   120
    `error_handler` method.
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   121
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   122
    By using this context manager you disable this monkey-patching temporarily.
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   123
    Hence when publishihng a request no error will be raised, you'll get
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   124
    req.status_out set to an HTTP error status code and the generated page will
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   125
    usually hold a traceback as HTML.
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   126
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   127
    >>> with real_error_handling(app):
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   128
    >>>     page = app.handle_request(req)
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   129
    """
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   130
    # remove the monkey patched error handler
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   131
    fake_error_handler = app.error_handler
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   132
    del app.error_handler
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   133
    # return the app
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   134
    yield app
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   135
    # restore
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   136
    app.error_handler = fake_error_handler
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   137
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   138
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   139
# email handling, to test emails sent by an application ########################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   140
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   141
MAILBOX = []
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   142
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   143
9363
d773589b6d46 [mail] allow to specify SMTP's MAIL FROM address to config.sendmails(). Closes #3373620
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9255
diff changeset
   144
class Email(object):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   145
    """you'll get instances of Email into MAILBOX during tests that trigger
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   146
    some notification.
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   147
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   148
    * `msg` is the original message object
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   149
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   150
    * `recipients` is a list of email address which are the recipients of this
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   151
      message
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   152
    """
9363
d773589b6d46 [mail] allow to specify SMTP's MAIL FROM address to config.sendmails(). Closes #3373620
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9255
diff changeset
   153
    def __init__(self, fromaddr, recipients, msg):
d773589b6d46 [mail] allow to specify SMTP's MAIL FROM address to config.sendmails(). Closes #3373620
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9255
diff changeset
   154
        self.fromaddr = fromaddr
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   155
        self.recipients = recipients
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   156
        self.msg = msg
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   157
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   158
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   159
    def message(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   160
        return message_from_string(self.msg)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   161
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   162
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   163
    def subject(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   164
        return self.message.get('Subject')
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   165
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   166
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   167
    def content(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   168
        return self.message.get_payload(decode=True)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   169
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   170
    def __repr__(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   171
        return '<Email to %s with subject %s>' % (','.join(self.recipients),
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   172
                                                  self.message.get('Subject'))
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   173
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   174
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   175
# the trick to get email into MAILBOX instead of actually sent: monkey patch
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   176
# cwconfig.SMTP object
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   177
class MockSMTP:
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   178
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   179
    def __init__(self, server, port):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   180
        pass
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   181
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   182
    def close(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   183
        pass
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   184
9363
d773589b6d46 [mail] allow to specify SMTP's MAIL FROM address to config.sendmails(). Closes #3373620
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9255
diff changeset
   185
    def sendmail(self, fromaddr, recipients, msg):
12719
9fb4a71f119d [py3] Pass bytes as "msg" to smtplib.SMTP.sendmail()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12577
diff changeset
   186
        MAILBOX.append(Email(fromaddr, recipients, msg.decode('utf-8')))
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   187
11821
7534b32c45e3 Fix (new) flake8 errors
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11811
diff changeset
   188
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   189
cwconfig.SMTP = MockSMTP
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   190
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   191
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   192
# Repoaccess utility ###############################################3###########
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   193
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   194
class RepoAccess(object):
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   195
    """An helper to easily create object to access the repo as a specific user
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   196
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   197
    Each RepoAccess have it own session.
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   198
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   199
    A repo access can create three type of object:
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   200
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   201
    .. automethod:: cubicweb.testlib.RepoAccess.cnx
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   202
    .. automethod:: cubicweb.testlib.RepoAccess.web_request
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   203
    """
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   204
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   205
    def __init__(self, repo, login, requestcls):
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   206
        self._repo = repo
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   207
        self._login = login
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   208
        self.requestcls = requestcls
12038
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
   209
        with repo.internal_cnx() as cnx:
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
   210
            self._user = cnx.find('CWUser', login=login).one()
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
   211
            self._user.cw_attr_cache['login'] = login
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   212
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9628
diff changeset
   213
    @contextmanager
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   214
    def cnx(self):
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   215
        """Context manager returning a server side connection for the user"""
12038
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
   216
        with repoapi.Connection(self._repo, self._user) as cnx:
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   217
            yield cnx
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   218
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   219
    # aliases for bw compat
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   220
    client_cnx = repo_cnx = cnx
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   221
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9628
diff changeset
   222
    @contextmanager
9570
14452b344d19 [devtools] add a 'method' argument to RepoAccess.web_request
David Douard <david.douard@logilab.fr>
parents: 9501
diff changeset
   223
    def web_request(self, url=None, headers={}, method='GET', **kwargs):
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   224
        """Context manager returning a web request pre-linked to a client cnx
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   225
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   226
        To commit and rollback use::
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   227
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   228
            req.cnx.commit()
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   229
            req.cnx.rolback()
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   230
        """
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   231
        session = kwargs.pop('session', Session(self._repo, self._user))
9570
14452b344d19 [devtools] add a 'method' argument to RepoAccess.web_request
David Douard <david.douard@logilab.fr>
parents: 9501
diff changeset
   232
        req = self.requestcls(self._repo.vreg, url=url, headers=headers,
14452b344d19 [devtools] add a 'method' argument to RepoAccess.web_request
David Douard <david.douard@logilab.fr>
parents: 9501
diff changeset
   233
                              method=method, form=kwargs)
12038
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
   234
        with self.cnx() as cnx:
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
   235
            # web request expect a session attribute on cnx referencing the web session
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   236
            cnx.session = session
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   237
            req.set_cnx(cnx)
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   238
            yield req
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   239
9667
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   240
    @contextmanager
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   241
    def shell(self):
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   242
        from cubicweb.server.migractions import ServerMigrationHelper
12038
3c60180481ac [devtools] Stop relying on Session to create connection in RepoAccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12036
diff changeset
   243
        with self.cnx() as cnx:
9667
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   244
            mih = ServerMigrationHelper(None, repo=self._repo, cnx=cnx,
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   245
                                        interactive=False,
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   246
                                        # hack so it don't try to load fs schema
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   247
                                        schema=1)
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   248
            yield mih
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   249
            cnx.commit()
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   250
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   251
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   252
# base class for cubicweb tests requiring a full cw environments ###############
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   253
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
   254
class CubicWebTC(BaseTestCase):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   255
    """abstract class for test using an apptest environment
5267
7bac6791bbc2 [devtools] do not forbid use of postgres as a source for tests (but it still needs proper dump/restore support)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5229
diff changeset
   256
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   257
    attributes:
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   258
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   259
    * `vreg`, the vregistry
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   260
    * `schema`, self.vreg.schema
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   261
    * `config`, cubicweb configuration
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
   262
    * `cnx`, repoapi connection to the repository using an admin user
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   263
    * `session`, server side session associated to `cnx`
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   264
    * `app`, the cubicweb publisher (for web testing)
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   265
    * `repo`, the repository object
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   266
    * `admlogin`, login of the admin user
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   267
    * `admpassword`, password of the admin user
6694
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   268
    * `shell`, create and use shell environment
11014
9c9f5e913f9c [devtools] Move attribute docstring to correct location
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10997
diff changeset
   269
    * `anonymous_allowed`: flag telling if anonymous browsing should be allowed
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   270
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   271
    appid = 'data'
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   272
    configcls = devtools.ApptestConfiguration
9570
14452b344d19 [devtools] add a 'method' argument to RepoAccess.web_request
David Douard <david.douard@logilab.fr>
parents: 9501
diff changeset
   273
    requestcls = fake.FakeRequest
11181
2a7fb3422ae1 [devtools] stop using lgc.testlib.TestCase
Julien Cristau <julien.cristau@logilab.fr>
parents: 11165
diff changeset
   274
    tags = Tags('cubicweb', 'cw_repo')
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   275
    test_db_id = DEFAULT_EMPTY_DB_ID
9043
97c3bb9a7c99 [testlib] move repo and related attribute back on Instance instead of Class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
   276
9929
16163ee1cdf9 [tests] Move 'anonymous_allowed' property from CubicWebServerTC to CubicWebTC
Christophe de Vienne <christophe@unlish.com>
parents: 9845
diff changeset
   277
    # anonymous is logged by default in cubicweb test cases
16163ee1cdf9 [tests] Move 'anonymous_allowed' property from CubicWebServerTC to CubicWebTC
Christophe de Vienne <christophe@unlish.com>
parents: 9845
diff changeset
   278
    anonymous_allowed = True
16163ee1cdf9 [tests] Move 'anonymous_allowed' property from CubicWebServerTC to CubicWebTC
Christophe de Vienne <christophe@unlish.com>
parents: 9845
diff changeset
   279
11270
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   280
    @classmethod
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   281
    def setUpClass(cls):
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   282
        test_module_file = sys.modules[cls.__module__].__file__
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   283
        assert 'config' not in cls.__dict__, (
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   284
            '%s has a config class attribute before entering setUpClass. '
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   285
            'Let CubicWebTC.setUpClass instantiate it and modify it afterwards.' % cls)
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   286
        cls.config = cls.configcls(cls.appid, test_module_file)
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   287
        cls.config.mode = 'test'
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   288
9043
97c3bb9a7c99 [testlib] move repo and related attribute back on Instance instead of Class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
   289
    def __init__(self, *args, **kwargs):
97c3bb9a7c99 [testlib] move repo and related attribute back on Instance instead of Class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
   290
        self.repo = None
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   291
        self._open_access = set()
9043
97c3bb9a7c99 [testlib] move repo and related attribute back on Instance instead of Class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
   292
        super(CubicWebTC, self).__init__(*args, **kwargs)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   293
11182
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   294
    def run(self, *args, **kwds):
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   295
        testMethod = getattr(self, self._testMethodName)
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   296
        if isgeneratorfunction(testMethod):
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   297
            raise RuntimeError(
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   298
                '%s appears to be a generative test. This is not handled '
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   299
                'anymore, use subTest API instead.' % self)
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   300
        return super(CubicWebTC, self).run(*args, **kwds)
66c44d3d97af [devtools/testlib] Issue a RuntimeError when a generative tests is detected
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11181
diff changeset
   301
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   302
    # repository connection handling ###########################################
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9628
diff changeset
   303
9117
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   304
    def new_access(self, login):
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   305
        """provide a new RepoAccess object for a given user
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   306
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   307
        The access is automatically closed at the end of the test."""
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   308
        access = RepoAccess(self.repo, login, self.requestcls)
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   309
        self._open_access.add(access)
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   310
        return access
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   311
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   312
    def _close_access(self):
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   313
        while self._open_access:
9628
2997f81cde19 [devtools] properly close open access on tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9627
diff changeset
   314
            try:
12027
c62c80f20a82 [repo] Stop closing session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11929
diff changeset
   315
                self._open_access.pop()
9628
2997f81cde19 [devtools] properly close open access on tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9627
diff changeset
   316
            except BadConnectionId:
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   317
                continue  # already closed
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   318
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   319
    def _init_repo(self):
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   320
        """init the repository and connection to it.
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   321
        """
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   322
        # get or restore and working db.
9790
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   323
        db_handler = devtools.get_test_db_handler(self.config, self.init_config)
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   324
        db_handler.build_db_cache(self.test_db_id, self.pre_setup_database)
9070
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   325
        db_handler.restore_database(self.test_db_id)
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   326
        self.repo = db_handler.get_repo(startup=True)
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   327
        # get an admin session (without actual login)
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   328
        login = db_handler.config.default_admin_config['login']
9118
bb9e19df9a05 [testlib] add an default testcase.adminaccess (and use it for default session)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9117
diff changeset
   329
        self.admin_access = self.new_access(login)
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   330
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   331
    # config management ########################################################
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   332
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   333
    @classmethod  # XXX could be turned into a regular method
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   334
    def init_config(cls, config):
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   335
        """configuration initialization hooks.
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   336
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   337
        You may only want to override here the configuraton logic.
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   338
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   339
        Otherwise, consider to use a different :class:`ApptestConfiguration`
9790
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   340
        defined in the `configcls` class attribute.
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   341
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   342
        This method will be called by the database handler once the config has
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   343
        been properly bootstrapped.
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   344
        """
10017
58c7a075c793 [devtools/testlib] Use actual 'admin' user configuration values
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9933
diff changeset
   345
        admincfg = config.default_admin_config
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   346
        cls.admlogin = admincfg['login']
10017
58c7a075c793 [devtools/testlib] Use actual 'admin' user configuration values
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9933
diff changeset
   347
        cls.admpassword = admincfg['password']
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   348
        # uncomment the line below if you want rql queries to be logged
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   349
        # config.global_set_option('query-log-file',
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   350
        #                          '/tmp/test_rql_log.' + `os.getpid()`)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   351
        config.global_set_option('log-file', None)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   352
        # set default-dest-addrs to a dumb email address to avoid mailbox or
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   353
        # mail queue pollution
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   354
        config.global_set_option('default-dest-addrs', ['whatever'])
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   355
        send_to = '%s@logilab.fr' % getlogin()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   356
        config.global_set_option('sender-addr', send_to)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   357
        config.global_set_option('default-dest-addrs', send_to)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   358
        config.global_set_option('sender-name', 'cubicweb-test')
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   359
        config.global_set_option('sender-addr', 'cubicweb-test@logilab.fr')
6432
30bde2b7fea2 restore line dropped in 6424:f443a2b8a5c7 which is necessary to have proper base-url on test server config (used for ms tests at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   360
        # default_base_url on config class isn't enough for TestServerConfiguration
6439
fe0fb6f95ff0 [test] we must consider default_base_url()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6432
diff changeset
   361
        config.global_set_option('base-url', config.default_base_url())
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   362
9043
97c3bb9a7c99 [testlib] move repo and related attribute back on Instance instead of Class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
   363
    @property
97c3bb9a7c99 [testlib] move repo and related attribute back on Instance instead of Class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
   364
    def vreg(self):
97c3bb9a7c99 [testlib] move repo and related attribute back on Instance instead of Class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
   365
        return self.repo.vreg
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   366
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   367
    # global resources accessors ###############################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   368
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   369
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   370
    def schema(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   371
        """return the application schema"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   372
        return self.vreg.schema
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   373
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   374
    def set_option(self, optname, value):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   375
        self.config.global_set_option(optname, value)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   376
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   377
    def set_debug(self, debugmode):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   378
        server.set_debug(debugmode)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   379
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   380
    def debugged(self, debugmode):
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   381
        return server.debugged(debugmode)
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   382
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   383
    # default test setup and teardown #########################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   384
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   385
    def setUp(self):
11270
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   386
        assert hasattr(self, 'config'), (
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   387
            'It seems that CubicWebTC.setUpClass has not been called. '
a9dc97b87ced [devtools] set .config in setUpClass instead of using a cache in a classproperty
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
   388
            'Missing super() call in %s?' % self.setUpClass)
6398
ea26eb5fd388 [test] send mail synchronously during tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6369
diff changeset
   389
        # monkey patch send mail operation so emails are sent synchronously
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   390
        self._patch_SendMailOp()
11069
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   391
        previous_failure = self.__class__.__dict__.get('_repo_init_failed')
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   392
        if previous_failure is not None:
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   393
            self.skipTest('repository is not initialised: %r' % previous_failure)
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   394
        try:
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   395
            self._init_repo()
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   396
        except Exception as ex:
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   397
            self.__class__._repo_init_failed = ex
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   398
            raise
020de2d09c0f [devtools/testlib] Disable pause trace in setUp
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   399
        self.addCleanup(self._close_access)
10937
eb05348b0e2d [devtools] Disable anonymous login right before executing tests
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10837
diff changeset
   400
        self.config.set_anonymous_allowed(self.anonymous_allowed)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   401
        self.setup_database()
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   402
        MAILBOX[:] = []  # reset mailbox
5175
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   403
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   404
    def tearDown(self):
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   405
        while self._cleanups:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   406
            cleanup, args, kwargs = self._cleanups.pop(-1)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   407
            cleanup(*args, **kwargs)
10112
ff7f86d8393d [devtools] call turn_repo_off in tearDown (closes #4673491)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10108
diff changeset
   408
        self.repo.turn_repo_off()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   409
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   410
    def _patch_SendMailOp(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   411
        # monkey patch send mail operation so emails are sent synchronously
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   412
        _old_mail_postcommit_event = SendMailOp.postcommit_event
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   413
        SendMailOp.postcommit_event = SendMailOp.sendmails
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   414
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   415
        def reverse_SendMailOp_monkey_patch():
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   416
            SendMailOp.postcommit_event = _old_mail_postcommit_event
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   417
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   418
        self.addCleanup(reverse_SendMailOp_monkey_patch)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   419
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   420
    def setup_database(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   421
        """add your database setup code by overriding this method"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   422
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   423
    @classmethod
9933
3674f249ab1d [devtools] pre_setup_database takes a Connection, not a Session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9931
diff changeset
   424
    def pre_setup_database(cls, cnx, config):
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   425
        """add your pre database setup code by overriding this method
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   426
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   427
        Do not forget to set the cls.test_db_id value to enable caching of the
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   428
        result.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   429
        """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   430
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   431
    # user / session management ###############################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   432
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   433
    @iclassmethod  # XXX turn into a class method
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   434
    def create_user(self, req, login=None, groups=('users',), password=None,
7337
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   435
                    email=None, commit=True, **kwargs):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   436
        """create and return a new user entity"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   437
        if password is None:
10363
e1ebf3d12098 [devtools] remove the remaining bw compat for old-style tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10356
diff changeset
   438
            password = login
10259
2be01bb6f9de [devtools] accept str objects in CubicWebTC.new_access and .create_user
Julien Cristau <julien.cristau@logilab.fr>
parents: 10112
diff changeset
   439
        user = req.create_entity('CWUser', login=login,
5055
14906474c55d [testlib] create_user support extra kwargs to give to create_entity(CWUser)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5036
diff changeset
   440
                                 upassword=password, **kwargs)
14906474c55d [testlib] create_user support extra kwargs to give to create_entity(CWUser)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5036
diff changeset
   441
        req.execute('SET X in_group G WHERE X eid %%(x)s, G name IN(%s)'
7038
fe0afc4e8ebb [testlib] fix rql generation bug w/ groups given as unicode string
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6979
diff changeset
   442
                    % ','.join(repr(str(g)) for g in groups),
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   443
                    {'x': user.eid})
7337
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   444
        if email is not None:
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   445
            req.create_entity('EmailAddress', address=email,
7337
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   446
                              reverse_primary_email=user)
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
   447
        user.cw_clear_relation_cache('in_group', 'subject')
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   448
        if commit:
12577
2508ba96fad2 [devtools/testlib] avoid hidding AttributeError in create_user()
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 12250
diff changeset
   449
            getattr(req, 'cnx', req).commit()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   450
        return user
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   451
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   452
    # other utilities #########################################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   453
5102
04c84959cd85 [testlib] simple helper method to register temporary appobjects (hooks for instance) with a context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5055
diff changeset
   454
    @contextmanager
04c84959cd85 [testlib] simple helper method to register temporary appobjects (hooks for instance) with a context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5055
diff changeset
   455
    def temporary_appobjects(self, *appobjects):
04c84959cd85 [testlib] simple helper method to register temporary appobjects (hooks for instance) with a context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5055
diff changeset
   456
        self.vreg._loadedmods.setdefault(self.__module__, {})
04c84959cd85 [testlib] simple helper method to register temporary appobjects (hooks for instance) with a context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5055
diff changeset
   457
        for obj in appobjects:
04c84959cd85 [testlib] simple helper method to register temporary appobjects (hooks for instance) with a context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5055
diff changeset
   458
            self.vreg.register(obj)
9212
0d346a0a1451 [testlib] temporary_appobjects should call __registered__ if it exists. Closes #3064075
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8978
diff changeset
   459
            registered = getattr(obj, '__registered__', None)
0d346a0a1451 [testlib] temporary_appobjects should call __registered__ if it exists. Closes #3064075
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8978
diff changeset
   460
            if registered:
0d346a0a1451 [testlib] temporary_appobjects should call __registered__ if it exists. Closes #3064075
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8978
diff changeset
   461
                for registry in obj.__registries__:
0d346a0a1451 [testlib] temporary_appobjects should call __registered__ if it exists. Closes #3064075
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8978
diff changeset
   462
                    registered(self.vreg[registry])
5128
e5d300d75519 [python] take care to this detail of @contextmanager: if an unhandled exception occurs in the block, it is reraised inside the generator at the point where the yield occurred
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5102
diff changeset
   463
        try:
e5d300d75519 [python] take care to this detail of @contextmanager: if an unhandled exception occurs in the block, it is reraised inside the generator at the point where the yield occurred
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5102
diff changeset
   464
            yield
e5d300d75519 [python] take care to this detail of @contextmanager: if an unhandled exception occurs in the block, it is reraised inside the generator at the point where the yield occurred
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5102
diff changeset
   465
        finally:
e5d300d75519 [python] take care to this detail of @contextmanager: if an unhandled exception occurs in the block, it is reraised inside the generator at the point where the yield occurred
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5102
diff changeset
   466
            for obj in appobjects:
e5d300d75519 [python] take care to this detail of @contextmanager: if an unhandled exception occurs in the block, it is reraised inside the generator at the point where the yield occurred
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5102
diff changeset
   467
                self.vreg.unregister(obj)
5102
04c84959cd85 [testlib] simple helper method to register temporary appobjects (hooks for instance) with a context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5055
diff changeset
   468
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   469
    @contextmanager
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   470
    def temporary_permissions(self, *perm_overrides, **perm_kwoverrides):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   471
        """Set custom schema permissions within context.
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   472
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   473
        There are two ways to call this method, which may be used together :
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   474
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   475
        * using positional argument(s):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   476
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   477
          .. sourcecode:: python
8480
086cff6a306a [book] fix build warnings/errors. Closes #2430042
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8463
diff changeset
   478
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   479
                rdef = self.schema['CWUser'].rdef('login')
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   480
                with self.temporary_permissions((rdef, {'read': ()})):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   481
                    ...
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   482
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   483
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   484
        * using named argument(s):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   485
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   486
          .. sourcecode:: python
8480
086cff6a306a [book] fix build warnings/errors. Closes #2430042
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8463
diff changeset
   487
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   488
                with self.temporary_permissions(CWUser={'read': ()}):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   489
                    ...
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   490
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
   491
        Usually the former will be preferred to override permissions on a
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   492
        relation definition, while the latter is well suited for entity types.
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   493
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
   494
        The allowed keys in the permission dictionary depend on the schema type
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   495
        (entity type / relation definition). Resulting permissions will be
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   496
        similar to `orig_permissions.update(partial_perms)`.
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   497
        """
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   498
        torestore = []
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10651
diff changeset
   499
        for erschema, etypeperms in chain(perm_overrides, perm_kwoverrides.items()):
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   500
            if isinstance(erschema, str):
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   501
                erschema = self.schema[erschema]
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10651
diff changeset
   502
            for action, actionperms in etypeperms.items():
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   503
                origperms = erschema.permissions[action]
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   504
                erschema.set_action_permissions(action, actionperms)
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   505
                torestore.append([erschema, action, origperms])
10639
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   506
        try:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   507
            yield
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   508
        finally:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   509
            for erschema, action, permissions in torestore:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   510
                if action is None:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   511
                    erschema.permissions = permissions
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   512
                else:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   513
                    erschema.set_action_permissions(action, permissions)
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   514
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   515
    def assertModificationDateGreater(self, entity, olddate):
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   516
        entity.cw_attr_cache.pop('modification_date', None)
10638
243e96db0004 [devtools] Use TestCase.assertGreater
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10219
diff changeset
   517
        self.assertGreater(entity.modification_date, olddate)
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   518
9424
5027afeb5739 [testlib] Fix assertMessageEqual
Julien Cristau <julien.cristau@logilab.fr>
parents: 9212
diff changeset
   519
    def assertMessageEqual(self, req, params, expected_msg):
7441
b70f4f4c8620 [testlib] add convenience assertion method to check __message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7439
diff changeset
   520
        msg = req.session.data[params['_cwmsgid']]
9424
5027afeb5739 [testlib] Fix assertMessageEqual
Julien Cristau <julien.cristau@logilab.fr>
parents: 9212
diff changeset
   521
        self.assertEqual(expected_msg, msg)
7441
b70f4f4c8620 [testlib] add convenience assertion method to check __message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7439
diff changeset
   522
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   523
    # workflow utilities #######################################################
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   524
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   525
    def assertPossibleTransitions(self, entity, expected):
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   526
        transitions = entity.cw_adapt_to('IWorkflowable').possible_transitions()
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   527
        self.assertListEqual(sorted(tr.name for tr in transitions),
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   528
                             sorted(expected))
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   529
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   530
    # views and actions registries inspection ##################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   531
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   532
    def pviews(self, req, rset):
3468
b02fa4db2868 [tests] make unittest_viewselectors pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3454
diff changeset
   533
        return sorted((a.__regid__, a.__class__)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   534
                      for a in self.vreg['views'].possible_views(req, rset=rset))
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   535
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   536
    def pactions(self, req, rset,
6967
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   537
                 skipcategories=('addrelated', 'siteactions', 'useractions',
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   538
                                 'footer', 'manage')):
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   539
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   540
                for a in self.vreg['actions'].poss_visible_objects(req, rset=rset)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   541
                if a.category not in skipcategories]
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   542
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   543
    def pactions_by_cats(self, req, rset, categories=('addrelated',)):
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   544
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   545
                for a in self.vreg['actions'].poss_visible_objects(req, rset=rset)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   546
                if a.category in categories]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   547
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   548
    def pactionsdict(self, req, rset,
6967
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   549
                     skipcategories=('addrelated', 'siteactions', 'useractions',
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   550
                                     'footer', 'manage')):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   551
        res = {}
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   552
        for a in self.vreg['actions'].poss_visible_objects(req, rset=rset):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   553
            if a.category not in skipcategories:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   554
                res.setdefault(a.category, []).append(a.__class__)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   555
        return res
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   556
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   557
    def action_submenu(self, req, rset, id):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   558
        return self._test_action(self.vreg['actions'].select(id, req, rset=rset))
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   559
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   560
    def _test_action(self, action):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   561
        class fake_menu(list):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   562
            @property
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   563
            def items(self):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   564
                return self
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   565
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   566
        class fake_box(object):
6800
3f3d576b87d9 [web action] refactor box menu handling, fixing #1401943 on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6774
diff changeset
   567
            def action_link(self, action, **kwargs):
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   568
                return (action.title, action.url())
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   569
        submenu = fake_menu()
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   570
        action.fill_menu(fake_box(), submenu)
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   571
        return submenu
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   572
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   573
    def list_views_for(self, rset):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   574
        """returns the list of views that can be applied on `rset`"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   575
        req = rset.req
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   576
        only_once_vids = ('primary', 'secondary', 'text')
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   577
        req.data['ex'] = ValueError("whatever")
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   578
        viewsvreg = self.vreg['views']
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   579
        for vid, views in viewsvreg.items():
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   580
            if vid[0] == '_':
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   581
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   582
            if rset.rowcount > 1 and vid in only_once_vids:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   583
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   584
            views = [view for view in views
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   585
                     if view.category != 'startupview'
6454
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
   586
                     and not issubclass(view, notification.NotificationView)
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
   587
                     and not isinstance(view, class_deprecated)]
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   588
            if views:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   589
                try:
2774
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2770 2773
diff changeset
   590
                    view = viewsvreg._select_best(views, req, rset=rset)
7272
771f594c12a2 [vreg] vregistry._select_best was needlessly instanciating NoSelectableObject (closes #1626708)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7222
diff changeset
   591
                    if view is None:
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   592
                        raise NoSelectableObject((req,), {'rset': rset}, views)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   593
                    if view.linkable():
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   594
                        yield view
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   595
                    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   596
                        not_selected(self.vreg, view)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   597
                    # else the view is expected to be used as subview and should
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   598
                    # not be tested directly
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   599
                except NoSelectableObject:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   600
                    continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   601
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   602
    def list_actions_for(self, rset):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   603
        """returns the list of actions that can be applied on `rset`"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   604
        req = rset.req
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   605
        for action in self.vreg['actions'].possible_objects(req, rset=rset):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   606
            yield action
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   607
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   608
    def list_boxes_for(self, rset):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   609
        """returns the list of boxes that can be applied on `rset`"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   610
        req = rset.req
11874
ea1d92b677b5 [views/optimization] Ensure we call rset.possible_actions with the same argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11821
diff changeset
   611
        for box in self.vreg['ctxcomponents'].possible_objects(req, rset=rset,
ea1d92b677b5 [views/optimization] Ensure we call rset.possible_actions with the same argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11821
diff changeset
   612
                                                               view=None):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   613
            yield box
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   614
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   615
    def list_startup_views(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   616
        """returns the list of startup views"""
9836
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   617
        with self.admin_access.web_request() as req:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   618
            for view in self.vreg['views'].possible_views(req, None):
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   619
                if view.category == 'startupview':
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   620
                    yield view.__regid__
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   621
                else:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   622
                    not_selected(self.vreg, view)
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   623
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   624
    # web ui testing utilities #################################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   625
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   626
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   627
    @cached
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   628
    def app(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   629
        """return a cubicweb publisher"""
9031
6ff29f2879da web/application: instantiate the repository outside of CubicWebPublisher
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9030
diff changeset
   630
        publisher = application.CubicWebPublisher(self.repo, self.config)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   631
4137
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   632
        def raise_error_handler(*args, **kwargs):
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   633
            raise
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   634
4137
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   635
        publisher.error_handler = raise_error_handler
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   636
        return publisher
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   637
9845
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   638
    @contextmanager
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   639
    def remote_calling(self, fname, *args, **kwargs):
9845
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   640
        """remote json call simulation"""
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   641
        args = [json.dumps(arg) for arg in args]
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   642
        with self.admin_access.web_request(fname=fname, pageid='123', arg=args, **kwargs) as req:
9845
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   643
            ctrl = self.vreg['controllers'].select('ajax', req)
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   644
            yield ctrl.publish(), req
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   645
12505
55014a79b2a5 Drop deprecated code in cubicweb.devtools
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12250
diff changeset
   646
    def app_handle_request(self, req):
11725
904ee9cd0cf9 [web/application] remove `path` argument from CubicwebPublisher methods
Laura Médioni <laura.medioni@logilab.fr>
parents: 11699
diff changeset
   647
        return self.app.core_handle(req)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   648
8720
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   649
    def ctrl_publish(self, req, ctrl='edit', rset=None):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   650
        """call the publish method of the edit controller"""
5942
f7768f44b4ac [tests] make sure controllers created by ctrl_publish() have a valid appli attribute
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5813
diff changeset
   651
        ctrl = self.vreg['controllers'].select(ctrl, req, appli=self.app)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   652
        try:
8720
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   653
            result = ctrl.publish(rset)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   654
            req.cnx.commit()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   655
        except web.Redirect:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   656
            req.cnx.commit()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   657
            raise
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   658
        return result
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   659
10219
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   660
    @staticmethod
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   661
    def fake_form(formid, field_dict=None, entity_field_dicts=()):
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   662
        """Build _cw.form dictionnary to fake posting of some standard cubicweb form
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   663
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   664
        * `formid`, the form id, usually form's __regid__
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   665
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   666
        * `field_dict`, dictionary of name:value for fields that are not tied to an entity
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   667
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   668
        * `entity_field_dicts`, list of (entity, dictionary) where dictionary contains name:value
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   669
          for fields that are not tied to the given entity
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   670
        """
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   671
        assert field_dict or entity_field_dicts, \
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   672
            'field_dict and entity_field_dicts arguments must not be both unspecified'
10219
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   673
        if field_dict is None:
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   674
            field_dict = {}
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   675
        form = {'__form_id': formid}
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   676
        fields = []
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   677
        for field, value in field_dict.items():
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   678
            fields.append(field)
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   679
            form[field] = value
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   680
10219
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   681
        def _add_entity_field(entity, field, value):
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   682
            entity_fields.append(field)
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   683
            form[eid_param(field, entity.eid)] = value
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   684
10219
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   685
        for entity, field_dict in entity_field_dicts:
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   686
            if '__maineid' not in form:
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   687
                form['__maineid'] = entity.eid
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   688
            entity_fields = []
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   689
            form.setdefault('eid', []).append(entity.eid)
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   690
            _add_entity_field(entity, '__type', entity.cw_etype)
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   691
            for field, value in field_dict.items():
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   692
                _add_entity_field(entity, field, value)
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   693
            if entity_fields:
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   694
                form[eid_param('_cw_entity_fields', entity.eid)] = ','.join(entity_fields)
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   695
        if fields:
10468
3f27669634d2 [devtools] Sort _cw_fields in fake_form
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10363
diff changeset
   696
            form['_cw_fields'] = ','.join(sorted(fields))
10219
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   697
        return form
eacb8ea38bf5 [devtools] add a method on CubicWebTC to fake data posted by standard cw forms. Closes #4985805
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10112
diff changeset
   698
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   699
    @contextmanager
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   700
    def admin_request_from_url(self, url):
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   701
        """parses `url` and builds the corresponding CW-web request
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   702
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   703
        req.form will be setup using the url's query string
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   704
        """
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   705
        with self.admin_access.web_request(url=url) as req:
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   706
            if isinstance(url, str):
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   707
                url = url.encode(req.encoding)  # req.setup_params() expects encoded strings
10603
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
   708
            querystring = urlparse(url)[-2]
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
   709
            params = parse_qs(querystring)
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   710
            req.setup_params(params)
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   711
            yield req
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   712
8720
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   713
    def url_publish(self, url, data=None):
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   714
        """takes `url`, uses application's app_resolver to find the appropriate
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   715
        controller and result set, then publishes the result.
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   716
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   717
        To simulate post of www-form-encoded data, give a `data` dictionary
d2f01aaae8c0 [testlib] url_publish should give url to the request and the rset returned by the path evaluator to ctrl_publish. Closes #2557468
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8696
diff changeset
   718
        containing desired key/value associations.
6166
fc47b4e06d94 [devtools] add url_publish() method on CubicWebTC to test a full publishing process from the url_resolver to the html generation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6165
diff changeset
   719
fc47b4e06d94 [devtools] add url_publish() method on CubicWebTC to test a full publishing process from the url_resolver to the html generation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6165
diff changeset
   720
        This should pretty much correspond to what occurs in a real CW server
fc47b4e06d94 [devtools] add url_publish() method on CubicWebTC to test a full publishing process from the url_resolver to the html generation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6165
diff changeset
   721
        except the apache-rewriter component is not called.
fc47b4e06d94 [devtools] add url_publish() method on CubicWebTC to test a full publishing process from the url_resolver to the html generation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6165
diff changeset
   722
        """
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   723
        with self.admin_request_from_url(url) as req:
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   724
            if data is not None:
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   725
                req.form.update(data)
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   726
            ctrlid, rset = self.app.url_resolver.process(req, req.relative_path(False))
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   727
            return self.ctrl_publish(req, ctrlid, rset)
6166
fc47b4e06d94 [devtools] add url_publish() method on CubicWebTC to test a full publishing process from the url_resolver to the html generation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6165
diff changeset
   728
8721
b399c87df63c [devtools] add http_publish to CubicWebTC (closes #2565882)
Julien Cristau <julien.cristau@logilab.fr>
parents: 8720
diff changeset
   729
    def http_publish(self, url, data=None):
9427
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   730
        """like `url_publish`, except this returns a http response, even in case
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   731
        of errors. You may give form parameters using the `data` argument.
9c13ebd45cb6 [test api] extract a context manager to temporarily disable app.error_handler monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9424
diff changeset
   732
        """
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   733
        with self.admin_request_from_url(url) as req:
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   734
            if data is not None:
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   735
                req.form.update(data)
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   736
            with real_error_handling(self.app):
11801
7a7ce3da28fb Drop a cw 3.24 warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11800
diff changeset
   737
                result = self.app_handle_request(req)
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   738
            return result, req
6166
fc47b4e06d94 [devtools] add url_publish() method on CubicWebTC to test a full publishing process from the url_resolver to the html generation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6165
diff changeset
   739
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   740
    @staticmethod
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   741
    def _parse_location(req, location):
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   742
        try:
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   743
            path, params = location.split('?', 1)
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   744
        except ValueError:
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   745
            path = location
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   746
            params = {}
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   747
        else:
11811
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   748
            def cleanup(p):
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   749
                return (p[0], urlunquote(p[1]))
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   750
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   751
            params = dict(cleanup(p.split('=', 1)) for p in params.split('&') if p)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   752
        if path.startswith(req.base_url()):  # may be relative
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   753
            path = path[len(req.base_url()):]
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   754
        return path, params
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   755
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   756
    def expect_redirect(self, callback, req):
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   757
        """call the given callback with req as argument, expecting to get a
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   758
        Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   759
        """
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   760
        try:
4719
aaed3f813ef8 kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4690
diff changeset
   761
            callback(req)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8694
diff changeset
   762
        except Redirect as ex:
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   763
            return self._parse_location(req, ex.location)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   764
        else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   765
            self.fail('expected a Redirect exception')
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   766
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   767
    def expect_redirect_handle_request(self, req, path='edit'):
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   768
        """call the publish method of the application publisher, expecting to
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   769
        get a Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   770
        """
11725
904ee9cd0cf9 [web/application] remove `path` argument from CubicwebPublisher methods
Laura Médioni <laura.medioni@logilab.fr>
parents: 11699
diff changeset
   771
        if req.relative_path(False) != path:
904ee9cd0cf9 [web/application] remove `path` argument from CubicwebPublisher methods
Laura Médioni <laura.medioni@logilab.fr>
parents: 11699
diff changeset
   772
            req._url = path
904ee9cd0cf9 [web/application] remove `path` argument from CubicwebPublisher methods
Laura Médioni <laura.medioni@logilab.fr>
parents: 11699
diff changeset
   773
        self.app_handle_request(req)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   774
        self.assertTrue(300 <= req.status_out < 400, req.status_out)
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   775
        location = req.get_response_header('location')
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   776
        return self._parse_location(req, location)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   777
7163
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   778
    def set_auth_mode(self, authmode, anonuser=None):
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   779
        self.set_option('auth-mode', authmode)
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   780
        self.set_option('anonymous-user', anonuser)
7071
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   781
        if anonuser is None:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   782
            self.config.anonymous_credential = None
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   783
        else:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   784
            self.config.anonymous_credential = (anonuser, anonuser)
7163
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   785
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   786
    def init_authentication(self, authmode, anonuser=None):
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   787
        self.set_auth_mode(authmode, anonuser)
9039
488255d1cf3b [testlib] rework request building in init_authentication
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9031
diff changeset
   788
        req = self.requestcls(self.vreg, url='login')
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   789
        sh = self.app.session_handler
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   790
        authm = sh.session_manager.authmanager
4916
4b8cdda342ae fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   791
        authm.anoninfo = self.vreg.config.anonymous_user()
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5177
diff changeset
   792
        authm.anoninfo = authm.anoninfo[0], {'password': authm.anoninfo[1]}
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   793
        # not properly cleaned between tests
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   794
        self.open_sessions = sh.session_manager._sessions = {}
12049
2e67aab22219 [test] Simplify CWTC's init_authentication and assertAuthSuccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12043
diff changeset
   795
        return req
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   796
12049
2e67aab22219 [test] Simplify CWTC's init_authentication and assertAuthSuccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12043
diff changeset
   797
    def assertAuthSuccess(self, req, nbsessions=1):
9019
e08f9c55dab5 [application] call req.set_session in application.main_handle_request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9017
diff changeset
   798
        session = self.app.get_session(req)
11699
b48020a80dc3 Store user groups and properties as session data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11462
diff changeset
   799
        cnx = session.new_cnx()
b48020a80dc3 Store user groups and properties as session data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11462
diff changeset
   800
        with cnx:
b48020a80dc3 Store user groups and properties as session data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11462
diff changeset
   801
            req.set_cnx(cnx)
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   802
        self.assertEqual(len(self.open_sessions), nbsessions, self.open_sessions)
12049
2e67aab22219 [test] Simplify CWTC's init_authentication and assertAuthSuccess
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12043
diff changeset
   803
        self.assertEqual(req.user.login, self.admlogin)
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   804
        self.assertEqual(session.anonymous_session, False)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   805
3676
fa170564e1a0 optional nbsessions arg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3657
diff changeset
   806
    def assertAuthFailure(self, req, nbsessions=0):
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8978
diff changeset
   807
        with self.assertRaises(AuthenticationError):
9019
e08f9c55dab5 [application] call req.set_session in application.main_handle_request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9017
diff changeset
   808
            self.app.get_session(req)
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8978
diff changeset
   809
        # +0 since we do not track the opened session
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8978
diff changeset
   810
        self.assertEqual(len(self.open_sessions), nbsessions)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   811
        clear_cache(req, 'get_authorization')
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   812
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   813
    # content validation #######################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   814
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   815
    # validators are used to validate (XML, DTD, whatever) view's content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   816
    # validators availables are :
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   817
    #  DTDValidator : validates XML + declared DTD
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   818
    #  SaxOnlyValidator : guarantees XML is well formed
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   819
    #  None : do not try to validate anything
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   820
    # validators used must be imported from from.devtools.htmlparser
534
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   821
    content_type_validators = {
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   822
        # maps MIME type : validator name
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   823
        #
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   824
        # do not set html validators here, we need HTMLValidator for html
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   825
        # snippets
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   826
        # 'text/html': DTDValidator,
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   827
        # 'application/xhtml+xml': DTDValidator,
8971
062e40f41b57 [testlib] SaxOnlyValidator is deprecated, use XMLValidator instead
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8930
diff changeset
   828
        'application/xml': htmlparser.XMLValidator,
062e40f41b57 [testlib] SaxOnlyValidator is deprecated, use XMLValidator instead
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8930
diff changeset
   829
        'text/xml': htmlparser.XMLValidator,
8652
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
   830
        'application/json': JsonValidator,
534
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   831
        'text/plain': None,
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   832
        'text/comma-separated-values': None,
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   833
        'text/x-vcard': None,
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   834
        'text/calendar': None,
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
   835
        'image/png': None,
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11270
diff changeset
   836
    }
562
bdadb26c4a3c old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents: 549
diff changeset
   837
    # maps vid : validator name (override content_type_validators)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   838
    vid_validators = dict((vid, htmlparser.VALMAP[valkey])
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10651
diff changeset
   839
                          for vid, valkey in VIEW_VALIDATORS.items())
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
   840
2058
7ef12c03447c nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   841
    def view(self, vid, rset=None, req=None, template='main-template',
7ef12c03447c nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   842
             **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   843
        """This method tests the view `vid` on `rset` using `template`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   844
6109
47d9c0e0f7b7 integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5974
diff changeset
   845
        If no error occurred while rendering the view, the HTML is analyzed
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   846
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   847
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   848
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   849
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   850
        """
8628
b236b91836c0 [test] fix req default value handling in CubicWebTC.view (closes #2544376)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8497
diff changeset
   851
        if req is None:
11462
2046b3a4da5d [devtools] CWTC.request is gone, don't attempt to use it in CWTC.view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11348
diff changeset
   852
            assert rset is not None, 'you must supply at least one of rset or req'
2046b3a4da5d [devtools] CWTC.request is gone, don't attempt to use it in CWTC.view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11348
diff changeset
   853
            req = rset.req
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   854
        req.form['vid'] = vid
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2234
diff changeset
   855
        viewsreg = self.vreg['views']
8497
7f71e366cb5e [testlib] consider rset for template / view selection (closes #2447183)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8480
diff changeset
   856
        view = viewsreg.select(vid, req, rset=rset, **kwargs)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   857
        if template is None:  # raw view testing, no template
1773
789ee507a8e0 use render
sylvain.thenault@logilab.fr
parents: 1605
diff changeset
   858
            viewfunc = view.render
829
ea092805d8f8 The main template is now a simple view, there's no need to monkey patch TheMainTemplate._select_view_and_rset
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 823
diff changeset
   859
        else:
ea092805d8f8 The main template is now a simple view, there's no need to monkey patch TheMainTemplate._select_view_and_rset
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 823
diff changeset
   860
            kwargs['view'] = view
11811
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   861
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   862
            def viewfunc(**k):
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   863
                return viewsreg.main_template(req, template,
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   864
                                              rset=rset, **kwargs)
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11801
diff changeset
   865
829
ea092805d8f8 The main template is now a simple view, there's no need to monkey patch TheMainTemplate._select_view_and_rset
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 823
diff changeset
   866
        return self._test_view(viewfunc, view, template, kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   867
829
ea092805d8f8 The main template is now a simple view, there's no need to monkey patch TheMainTemplate._select_view_and_rset
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 823
diff changeset
   868
    def _test_view(self, viewfunc, view, template='main-template', kwargs={}):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   869
        """this method does the actual call to the view
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   870
6109
47d9c0e0f7b7 integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5974
diff changeset
   871
        If no error occurred while rendering the view, the HTML is analyzed
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   872
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   873
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   874
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   875
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   876
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   877
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   878
            output = viewfunc(**kwargs)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   879
        except Exception:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   880
            # hijack exception: generative tests stop when the exception
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   881
            # is not an AssertionError
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   882
            klass, exc, tcbk = sys.exc_info()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   883
            try:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   884
                msg = '[%s in %s] %s' % (klass, view.__regid__, exc)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   885
            except Exception:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   886
                msg = '[%s in %s] undisplayable exception' % (klass, view.__regid__)
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   887
            raise AssertionError(msg).with_traceback(sys.exc_info()[-1])
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   888
        return self._check_html(output, view, template)
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
   889
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   890
    def get_validator(self, view=None, content_type=None, output=None):
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   891
        if view is not None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   892
            try:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   893
                return self.vid_validators[view.__regid__]()
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   894
            except KeyError:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   895
                if content_type is None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   896
                    content_type = view.content_type
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   897
        if content_type is None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   898
            content_type = 'text/html'
8978
269548f2306e [testlib] fix page validator selection. Closes #2869456
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8975
diff changeset
   899
        if content_type in ('text/html', 'application/xhtml+xml') and output:
10689
49a62b8f6d43 [py3k] unicode vs str vs bytes vs the world
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10687
diff changeset
   900
            if output.startswith(b'<!DOCTYPE html>'):
8978
269548f2306e [testlib] fix page validator selection. Closes #2869456
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8975
diff changeset
   901
                # only check XML well-formness since HTMLValidator isn't html5
269548f2306e [testlib] fix page validator selection. Closes #2869456
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8975
diff changeset
   902
                # compatible and won't like various other extensions
269548f2306e [testlib] fix page validator selection. Closes #2869456
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8975
diff changeset
   903
                default_validator = htmlparser.XMLSyntaxValidator
10689
49a62b8f6d43 [py3k] unicode vs str vs bytes vs the world
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10687
diff changeset
   904
            elif output.startswith(b'<?xml'):
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   905
                default_validator = htmlparser.DTDValidator
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   906
            else:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   907
                default_validator = htmlparser.HTMLValidator
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   908
        else:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   909
            default_validator = None
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   910
        validatorclass = self.content_type_validators.get(content_type,
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   911
                                                          default_validator)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   912
        if validatorclass is None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   913
            return
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   914
        return validatorclass()
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   915
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   916
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   917
    def _check_html(self, output, view, template='main-template'):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   918
        """raises an exception if the HTML is invalid"""
6772
68bb0943d192 [test, html validation] make validator selection somewhat smarter (at least it works properly when content is demoted from xhtml to html, making the XMLDemotingValidator class useless
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6721
diff changeset
   919
        output = output.strip()
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   920
        if isinstance(output, str):
10755
4c48d3bab38c [devtools] CubicWebTC._check_html may have to deal with unicode or bytes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10700
diff changeset
   921
            # XXX
4c48d3bab38c [devtools] CubicWebTC._check_html may have to deal with unicode or bytes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10700
diff changeset
   922
            output = output.encode('utf-8')
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   923
        validator = self.get_validator(view, output=output)
6979
a8fbcf9b6572 [testlib] take care, validator may be None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6978
diff changeset
   924
        if validator is None:
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   925
            return output  # return raw output if no validator is defined
4346
02f12f39bae5 XXX quick fix html validation by removing <canvas>
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   926
        if isinstance(validator, htmlparser.DTDValidator):
02f12f39bae5 XXX quick fix html validation by removing <canvas>
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   927
            # XXX remove <canvas> used in progress widget, unknown in html dtd
02f12f39bae5 XXX quick fix html validation by removing <canvas>
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   928
            output = re.sub('<canvas.*?></canvas>', '', output)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
   929
        return self.assertWellFormed(validator, output.strip(), context=view.__regid__)
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   930
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   931
    def assertWellFormed(self, validator, content, context=None):
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   932
        try:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   933
            return validator.parse_string(content)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   934
        except Exception:
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   935
            # hijack exception: generative tests stop when the exception
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   936
            # is not an AssertionError
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   937
            klass, exc, tcbk = sys.exc_info()
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   938
            if context is None:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   939
                msg = u'[%s]' % (klass,)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   940
            else:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   941
                msg = u'[%s in %s]' % (klass, context)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   942
            msg = msg.encode(sys.getdefaultencoding(), 'replace')
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   943
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   944
            try:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   945
                str_exc = str(exc)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   946
            except Exception:
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   947
                str_exc = 'undisplayable exception'
10689
49a62b8f6d43 [py3k] unicode vs str vs bytes vs the world
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10687
diff changeset
   948
            msg += str_exc.encode(sys.getdefaultencoding(), 'replace')
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   949
            if content is not None:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   950
                position = getattr(exc, "position", (0,))[0]
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   951
                if position:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   952
                    # define filter
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   953
                    if isinstance(content, bytes):
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12505
diff changeset
   954
                        content = str(content, sys.getdefaultencoding(), 'replace')
8975
045e449617ad [testlib] repreprocess content so contextual display has a chance to show the proper line. Closes #2869481
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8971
diff changeset
   955
                    content = validator.preprocess_data(content)
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   956
                    content = content.splitlines()
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   957
                    width = int(log(len(content), 10)) + 1
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   958
                    line_template = " %" + ("%i" % width) + "i: %s"
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   959
                    # XXX no need to iterate the whole file except to get
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   960
                    # the line number
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   961
                    content = u'\n'.join(line_template % (idx + 1, line)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   962
                                         for idx, line in enumerate(content)
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11270
diff changeset
   963
                                         if line_context_filter(idx + 1, position))
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   964
                    msg += u'\nfor content:\n%s' % content
10590
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
   965
            exc = AssertionError(msg)
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
   966
            exc.__traceback__ = tcbk
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
   967
            raise exc
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   968
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   969
    def assertDocTestFile(self, testfile):
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   970
        # doctest returns tuple (failure_count, test_count)
10562
0c492a2720f1 [devtools] fix CubicWebTC.assertDocTestFile (closes #5930028)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10468
diff changeset
   971
        with self.admin_access.shell() as mih:
0c492a2720f1 [devtools] fix CubicWebTC.assertDocTestFile (closes #5930028)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10468
diff changeset
   972
            result = mih.process_script(testfile)
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   973
        if result[0] and result[1]:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   974
            raise self.failureException("doctest file '%s' failed"
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   975
                                        % testfile)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   976
7060
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   977
    # notifications ############################################################
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   978
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   979
    def assertSentEmail(self, subject, recipients=None, nb_msgs=None):
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   980
        """test recipients in system mailbox for given email subject
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   981
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   982
        :param subject: email subject to find in mailbox
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   983
        :param recipients: list of email recipients
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   984
        :param nb_msgs: expected number of entries
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   985
        :returns: list of matched emails
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   986
        """
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   987
        messages = [email for email in MAILBOX
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   988
                    if email.message.get('Subject') == subject]
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   989
        if recipients is not None:
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   990
            sent_to = set()
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   991
            for msg in messages:
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   992
                sent_to.update(msg.recipients)
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   993
            self.assertSetEqual(set(recipients), sent_to)
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   994
        if nb_msgs is not None:
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   995
            self.assertEqual(len(MAILBOX), nb_msgs)
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   996
        return messages
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   997
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   998
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   999
# auto-populating test classes and utilities ###################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1000
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1001
# XXX cleanup unprotected_entities & all mess
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1002
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1003
def how_many_dict(schema, cnx, how_many, skip):
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1004
    """given a schema, compute how many entities by type we need to be able to
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1005
    satisfy relations cardinality.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1006
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1007
    The `how_many` argument tells how many entities of which type we want at
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1008
    least.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1009
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1010
    Return a dictionary with entity types as key, and the number of entities for
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1011
    this type as value.
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1012
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1013
    relmap = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1014
    for rschema in schema.relations():
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
  1015
        if rschema.final:
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1016
            continue
4053
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
  1017
        for subj, obj in rschema.rdefs:
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
  1018
            card = rschema.rdef(subj, obj).cardinality
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1019
            # if the relation is mandatory, we'll need at least as many subj and
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1020
            # obj to satisfy it
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1021
            if card[0] in '1+' and card[1] in '1?':
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1022
                # subj has to be linked to at least one obj,
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1023
                # but obj can be linked to only one subj
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1024
                # -> we need at least as many subj as obj to satisfy
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1025
                #    cardinalities for this relation
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1026
                relmap.setdefault((rschema, subj), []).append(str(obj))
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1027
            if card[1] in '1+' and card[0] in '1?':
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1028
                # reverse subj and obj in the above explanation
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1029
                relmap.setdefault((rschema, obj), []).append(str(subj))
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1030
    unprotected = unprotected_entities(schema)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
  1031
    for etype in skip:  # XXX (syt) duh? explain or kill
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1032
        unprotected.add(etype)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1033
    howmanydict = {}
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1034
    # step 1, compute a base number of each entity types: number of already
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1035
    # existing entities of this type + `how_many`
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1036
    for etype in unprotected_entities(schema, strict=True):
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1037
        howmanydict[str(etype)] = cnx.execute('Any COUNT(X) WHERE X is %s' % etype)[0][0]
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1038
        if etype in unprotected:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1039
            howmanydict[str(etype)] += how_many
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1040
    # step 2, augment nb entity per types to satisfy cardinality constraints,
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1041
    # by recomputing for each relation that constrained an entity type:
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1042
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1043
    # new num for etype = max(current num, sum(num for possible target etypes))
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1044
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1045
    # XXX we should first check there is no cycle then propagate changes
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10651
diff changeset
  1046
    for (rschema, etype), targets in relmap.items():
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1047
        relfactor = sum(howmanydict[e] for e in targets)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1048
        howmanydict[str(etype)] = max(relfactor, howmanydict[etype])
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1049
    return howmanydict
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1050
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1051
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1052
class AutoPopulateTest(CubicWebTC):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1053
    """base class for test with auto-populating of the database"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1054
    __abstract__ = True
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1055
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1056
    test_db_id = 'autopopulate'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1057
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1058
    tags = CubicWebTC.tags | Tags('autopopulated')
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1059
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1060
    pdbclass = CubicWebDebugger
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1061
    # this is a hook to be able to define a list of rql queries
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1062
    # that are application dependent and cannot be guessed automatically
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1063
    application_rql = []
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1064
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1065
    no_auto_populate = ()
3734
b2107f68176c ignored_relations should be a set
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3720
diff changeset
  1066
    ignored_relations = set()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1067
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
  1068
    def to_test_etypes(self):
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
  1069
        return unprotected_entities(self.schema, strict=True)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1070
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1071
    def custom_populate(self, how_many, cnx):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1072
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1073
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1074
    def post_populate(self, cnx):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1075
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1076
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1077
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1078
    def auto_populate(self, how_many):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1079
        """this method populates the database with `how_many` entities
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1080
        of each possible type. It also inserts random relations between them
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1081
        """
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
  1082
        with self.admin_access.cnx() as cnx:
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1083
            with cnx.security_enabled(read=False, write=False):
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1084
                self._auto_populate(cnx, how_many)
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1085
                cnx.commit()
5004
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
  1086
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1087
    def _auto_populate(self, cnx, how_many):
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1088
        self.custom_populate(how_many, cnx)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1089
        vreg = self.vreg
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1090
        howmanydict = how_many_dict(self.schema, cnx, how_many, self.no_auto_populate)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1091
        for etype in unprotected_entities(self.schema):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1092
            if etype in self.no_auto_populate:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1093
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1094
            nb = howmanydict.get(etype, how_many)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1095
            for rql, args in insert_entity_queries(etype, self.schema, vreg, nb):
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1096
                cnx.execute(rql, args)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1097
        edict = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1098
        for etype in unprotected_entities(self.schema, strict=True):
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1099
            rset = cnx.execute('%s X' % etype)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1100
            edict[str(etype)] = set(row[0] for row in rset.rows)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1101
        existingrels = {}
4036
137be4878127 [mq]: fix_set_addition
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 4016
diff changeset
  1102
        ignored_relations = SYSTEM_RELATIONS | self.ignored_relations
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1103
        for rschema in self.schema.relations():
11086
c9641ee0b652 [devtools] don't auto-populate virtual relations
Julien Cristau <julien.cristau@logilab.fr>
parents: 11076
diff changeset
  1104
            if rschema.final or rschema in ignored_relations or rschema.rule:
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1105
                continue
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1106
            rset = cnx.execute('DISTINCT Any X,Y WHERE X %s Y' % rschema)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1107
            existingrels.setdefault(rschema.type, set()).update((x, y) for x, y in rset)
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1108
        q = make_relations_queries(self.schema, edict, cnx, ignored_relations,
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1109
                                   existingrels=existingrels)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1110
        for rql, args in q:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1111
            try:
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1112
                cnx.execute(rql, args)
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8694
diff changeset
  1113
            except ValidationError as ex:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1114
                # failed to satisfy some constraint
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
  1115
                print('error in automatic db population', ex)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
  1116
                cnx.commit_state = None  # reset uncommitable flag
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1117
        self.post_populate(cnx)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1118
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1119
    def iter_individual_rsets(self, etypes=None, limit=None):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1120
        etypes = etypes or self.to_test_etypes()
9836
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1121
        with self.admin_access.web_request() as req:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1122
            for etype in etypes:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1123
                if limit:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1124
                    rql = 'Any X LIMIT %s WHERE X is %s' % (limit, etype)
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1125
                else:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1126
                    rql = 'Any X WHERE X is %s' % etype
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1127
                rset = req.execute(rql)
10609
e2d8e81bfe68 [py3k] import range using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10603
diff changeset
  1128
                for row in range(len(rset)):
9836
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1129
                    if limit and row > limit:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1130
                        break
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1131
                    # XXX iirk
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1132
                    rset2 = rset.limit(limit=1, offset=row)
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1133
                    yield rset2
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1134
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1135
    def iter_automatic_rsets(self, limit=10):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1136
        """generates basic resultsets for each entity type"""
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
  1137
        etypes = self.to_test_etypes()
2219
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
  1138
        if not etypes:
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
  1139
            return
9836
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1140
        with self.admin_access.web_request() as req:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1141
            for etype in etypes:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1142
                yield req.execute('Any X LIMIT %s WHERE X is %s' % (limit, etype))
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1143
            etype1 = etypes.pop()
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1144
            try:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1145
                etype2 = etypes.pop()
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1146
            except KeyError:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1147
                etype2 = etype1
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1148
            # test a mixed query (DISTINCT/GROUP to avoid getting duplicate
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1149
            # X which make muledit view failing for instance (html validation fails
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1150
            # because of some duplicate "id" attributes)
10974
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
  1151
            yield req.execute('DISTINCT Any X, MAX(Y) GROUPBY X WHERE X is %s, Y is %s' %
6557833657d6 a bit of pep8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10937
diff changeset
  1152
                              (etype1, etype2))
9836
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1153
            # test some application-specific queries if defined
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1154
            for rql in self.application_rql:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1155
                yield req.execute(rql)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1156
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1157
    def _test_everything_for(self, rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1158
        """this method tries to find everything that can be tested
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1159
        for `rset` and yields a callable test (as needed in generative tests)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1160
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1161
        propdefs = self.vreg['propertydefs']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1162
        # make all components visible
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1163
        for k, v in propdefs.items():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1164
            if k.endswith('visible') and not v['default']:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1165
                propdefs[k]['default'] = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1166
        for view in self.list_views_for(rset):
3764
034aa14b740a drop _prepare_copy method from rset in favor of a more generic copy method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
  1167
            backup_rset = rset.copy(rset.rows, rset.description)
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1168
            with self.subTest(name=self._testname(rset, view.__regid__, 'view')):
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1169
                self.view(view.__regid__, rset,
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1170
                          rset.req.reset_headers(), 'main-template')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1171
            # We have to do this because some views modify the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1172
            # resultset's syntax tree
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1173
            rset = backup_rset
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1174
        for action in self.list_actions_for(rset):
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1175
            with self.subTest(name=self._testname(rset, action.__regid__, 'action')):
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1176
                self._test_action(action)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1177
        for box in self.list_boxes_for(rset):
6140
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
  1178
            w = [].append
11862
316ebf88f5b3 [devtools] named context for boxes subTest for consistency
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11821
diff changeset
  1179
            with self.subTest(name=self._testname(rset, box.__regid__, 'box')):
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1180
                box.render(w)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1181
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1182
    @staticmethod
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1183
    def _testname(rset, objid, objtype):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1184
        return '%s_%s_%s' % ('_'.join(rset.column_types(0)), objid, objtype)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1185
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1186
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1187
# concrete class for automated application testing  ############################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1188
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1189
class AutomaticWebTest(AutoPopulateTest):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1190
    """import this if you wan automatic tests to be ran"""
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1191
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1192
    tags = AutoPopulateTest.tags | Tags('web', 'generated')
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1193
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1194
    def setUp(self):
10837
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
  1195
        if self.__class__ is AutomaticWebTest:
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
  1196
            # Prevent direct use of AutomaticWebTest to avoid database caching
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
  1197
            # issues.
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
  1198
            return
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1199
        super(AutomaticWebTest, self).setUp()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1200
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1201
        # access to self.app for proper initialization of the authentication
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1202
        # machinery (else some views may fail)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1203
        self.app
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1204
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1205
    def test_one_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1206
        self.auto_populate(1)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1207
        for rset in self.iter_automatic_rsets(limit=1):
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1208
            self._test_everything_for(rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1209
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1210
    def test_ten_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1211
        self.auto_populate(10)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1212
        for rset in self.iter_automatic_rsets(limit=10):
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1213
            self._test_everything_for(rset)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1214
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1215
    def test_startup_views(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1216
        for vid in self.list_startup_views():
9836
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1217
            with self.admin_access.web_request() as req:
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1218
                with self.subTest(vid=vid):
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11069
diff changeset
  1219
                    self.view(vid, None, req)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1220
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1221
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1222
# registry instrumentization ###################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1223
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1224
def not_selected(vreg, appobject):
534
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
  1225
    try:
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1226
        vreg._selected[appobject.__class__] -= 1
534
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
  1227
    except (KeyError, AttributeError):
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
  1228
        pass
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1229
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1230
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1231
# def vreg_instrumentize(testclass):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1232
#     # XXX broken
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1233
#     from cubicweb.devtools.apptest import TestEnvironment
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1234
#     env = testclass._env = TestEnvironment('data', configcls=testclass.configcls)
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10662
diff changeset
  1235
#     for reg in env.vreg.values():
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1236
#         reg._selected = {}
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1237
#         try:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1238
#             orig_select_best = reg.__class__.__orig_select_best
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1239
#         except Exception:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1240
#             orig_select_best = reg.__class__._select_best
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1241
#         def instr_select_best(self, *args, **kwargs):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1242
#             selected = orig_select_best(self, *args, **kwargs)
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1243
#             try:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1244
#                 self._selected[selected.__class__] += 1
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1245
#             except KeyError:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1246
#                 self._selected[selected.__class__] = 1
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1247
#             except AttributeError:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1248
#                 pass # occurs on reg used to restore database
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1249
#             return selected
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1250
#         reg.__class__._select_best = instr_select_best
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1251
#         reg.__class__.__orig_select_best = orig_select_best
534
1368c80276bc refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents: 514
diff changeset
  1252
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1253
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1254
# def print_untested_objects(testclass, skipregs=('hooks', 'etypes')):
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10651
diff changeset
  1255
#     for regname, reg in testclass._env.vreg.items():
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1256
#         if regname in skipregs:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1257
#             continue
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10662
diff changeset
  1258
#         for appobjects in reg.values():
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1259
#             for appobject in appobjects:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1260
#                 if not reg._selected.get(appobject):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1261
#                     print 'not tested', regname, appobject