devtools/testlib.py
author Julien Cristau <julien.cristau@logilab.fr>
Mon, 09 Nov 2015 16:21:29 +0100
changeset 10879 3193d9ede8dd
parent 10837 b71511460a4f
child 10937 eb05348b0e2d
permissions -rw-r--r--
[dataimport] drop extra indirection through MassiveObjectStore._initialized dict We already have self.__dict__, no need to add another one for a static set of keys.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
     1
# copyright 2003-2014 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/>.
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5786
diff changeset
    18
"""this module contains base classes and utilities for cubicweb tests"""
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    19
from __future__ import print_function
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
    20
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
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
    24
import re
6631
26c303c3f1aa [test] make test independant from the working directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6590
diff changeset
    25
from os.path import dirname, join, abspath
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
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
    27
from contextlib import contextmanager
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
    28
from warnings import warn
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
    29
from itertools import chain
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    30
10675
e0db937f5add [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
    31
from six import text_type, string_types
10609
e2d8e81bfe68 [py3k] import range using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10603
diff changeset
    32
from six.moves import range
10603
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
    33
from six.moves.urllib.parse import urlparse, parse_qs, unquote as urlunquote
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
    34
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    35
import yams.schema
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
    37
from logilab.common.testlib import TestCase, InnerTest, Tags
10108
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
    38
from logilab.common.pytest import nocoverage, pause_trace
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    39
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
    40
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
    41
from logilab.common.decorators import cached, classproperty, clear_cache, iclassmethod
6454
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
    42
from logilab.common.deprecation import deprecated, 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
    43
from logilab.common.shellutils import getlogin
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
    45
from cubicweb import (ValidationError, NoSelectableObject, AuthenticationError,
9628
2997f81cde19 [devtools] properly close open access on tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9627
diff changeset
    46
                      ProgrammingError, BadConnectionId)
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
    47
from cubicweb import cwconfig, devtools, web, server, repoapi
8652
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
    48
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
    49
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
    50
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
    51
from cubicweb.server.hook import SendMailOp
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
    52
from cubicweb.server.session import Session
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    53
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
    54
from cubicweb.devtools import fake, htmlparser, DEFAULT_EMPTY_DB_ID
5389
809d3b5b3d31 [python2.6] careful: json-py provides a json package. We don't want that.
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5377
diff changeset
    55
from cubicweb.utils import json
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    56
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    57
# low-level utilities ##########################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
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
    60
    """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
    61
    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
    62
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
    def do_view(self, arg):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
        import webbrowser
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
        data = self._getval(arg)
10614
57dfde80df11 [py3k] file → open
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10612
diff changeset
    66
        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
    67
            toto.write(data)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
        webbrowser.open('file:///tmp/toto.html')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
def line_context_filter(line_no, center, before=3, after=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
    """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
    72
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    73
    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
    74
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
    if after is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
        after = before
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
    return center - before <= line_no <= center + after
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
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
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
    80
    """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
    81
    (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
    82
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    83
    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
    84
        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
    85
    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    86
        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
    87
    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
    88
8652
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
    89
class JsonValidator(object):
7812093e21f7 [testlib] test_view now parse json data, closes #2557467
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8628
diff changeset
    90
    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
    91
        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
    92
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
    93
@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
    94
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
    95
    """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
    96
    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
    97
    `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
    98
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
    99
    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
   100
    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
   101
    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
   102
    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
   103
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
   104
    >>> 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
   105
    >>>     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
   106
    """
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
   107
    # 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
   108
    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
   109
    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
   110
    # 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
   111
    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
   112
    # 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
   113
    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
   114
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   115
# 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
   116
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   117
MAILBOX = []
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   118
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
   119
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
   120
    """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
   121
    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
   122
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   123
    * `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
   124
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   125
    * `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
   126
      message
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   127
    """
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
   128
    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
   129
        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
   130
        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
   131
        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
   132
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   133
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   134
    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
   135
        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
   136
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   137
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   138
    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
   139
        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
   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
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   142
    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
   143
        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
   144
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   145
    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
   146
        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
   147
                                                  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
   148
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   149
# 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
   150
# 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
   151
class MockSMTP:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   152
    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
   153
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   154
    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
   155
        pass
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
   156
    def sendmail(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
   157
        MAILBOX.append(Email(fromaddr, recipients, msg))
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   158
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   159
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
   160
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   161
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
   162
# 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
   163
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   164
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
   165
    """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
   166
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   167
    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
   168
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   169
    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
   170
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   171
    .. 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
   172
    .. 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
   173
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   174
    The RepoAccess need to be closed to destroy the associated 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
   175
    TestCase usually take care of this aspect for the 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
   176
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   177
    .. automethod:: cubicweb.testlib.RepoAccess.close
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   178
    """
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   179
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   180
    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
   181
        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
   182
        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
   183
        self.requestcls = requestcls
9757
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   184
        self._session = self._unsafe_connect(login)
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   185
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   186
    def _unsafe_connect(self, login, **kwargs):
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   187
        """ a completely unsafe connect method for the tests """
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   188
        # use an internal connection
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   189
        with self._repo.internal_cnx() as cnx:
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   190
            # try to get a user object
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   191
            user = cnx.find('CWUser', login=login).one()
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
            user.groups
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
            user.properties
9757
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   194
            user.login
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   195
            session = Session(user, self._repo)
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   196
            self._repo._sessions[session.sessionid] = session
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   197
            user._cw = user.cw_rset.req = session
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   198
        with session.new_cnx() as cnx:
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   199
            self._repo.hm.call_hooks('session_open', cnx)
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   200
            # commit connection at this point in case write operation has been
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   201
            # done during `session_open` hooks
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   202
            cnx.commit()
6eb7f361fba0 [testlib] complete the RepoAccess object (closes #3843614)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9667
diff changeset
   203
        return session
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
   204
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9628
diff changeset
   205
    @contextmanager
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   206
    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
   207
        """Context manager returning a server side connection for the 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
   208
        with self._session.new_cnx() as 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
   209
            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
   210
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   211
    # aliases for bw compat
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   212
    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
   213
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9628
diff changeset
   214
    @contextmanager
9570
14452b344d19 [devtools] add a 'method' argument to RepoAccess.web_request
David Douard <david.douard@logilab.fr>
parents: 9501
diff changeset
   215
    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
   216
        """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
   217
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
        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
   219
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   220
            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
   221
            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
   222
        """
9570
14452b344d19 [devtools] add a 'method' argument to RepoAccess.web_request
David Douard <david.douard@logilab.fr>
parents: 9501
diff changeset
   223
        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
   224
                              method=method, form=kwargs)
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   225
        with self._session.new_cnx() as cnx:
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   226
            if 'ecache' in cnx.transaction_data:
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   227
                del cnx.transaction_data['ecache']
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
   228
            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
   229
            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
   230
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   231
    def close(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
   232
        """Close the session associated to the RepoAccess"""
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   233
        if self._session is not None:
9501
2904e2ba81a0 [testlib] Use session.sessionid instead of deprecated session.id
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   234
            self._repo.close(self._session.sessionid)
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
   235
        self._session = None
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   236
9667
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   237
    @contextmanager
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   238
    def shell(self):
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   239
        from cubicweb.server.migractions import ServerMigrationHelper
10353
d9a1e7939ee6 [migractions] remove any session related leftovers
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   240
        with self._session.new_cnx() as cnx:
9667
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   241
            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
   242
                                        interactive=False,
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   243
                                        # 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
   244
                                        schema=1)
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   245
            yield mih
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   246
            cnx.commit()
4714d4afd4ea [devtools] add 'shell' method to RepoAccess, deprecate CubicWebTC's
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   247
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
   248
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   249
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   250
# 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
   251
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   252
class CubicWebTC(TestCase):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   253
    """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
   254
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   255
    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
   256
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   257
    * `vreg`, the vregistry
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   258
    * `schema`, self.vreg.schema
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   259
    * `config`, cubicweb configuration
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
   260
    * `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
   261
    * `session`, server side session associated to `cnx`
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   262
    * `app`, the cubicweb publisher (for web testing)
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   263
    * `repo`, the repository object
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   264
    * `admlogin`, login of the admin user
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   265
    * `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
   266
    * `shell`, create and use shell environment
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   267
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   268
    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
   269
    configcls = devtools.ApptestConfiguration
9570
14452b344d19 [devtools] add a 'method' argument to RepoAccess.web_request
David Douard <david.douard@logilab.fr>
parents: 9501
diff changeset
   270
    requestcls = fake.FakeRequest
6441
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6439
diff changeset
   271
    tags = TestCase.tags | Tags('cubicweb', 'cw_repo')
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   272
    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
   273
9929
16163ee1cdf9 [tests] Move 'anonymous_allowed' property from CubicWebServerTC to CubicWebTC
Christophe de Vienne <christophe@unlish.com>
parents: 9845
diff changeset
   274
    # 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
   275
    anonymous_allowed = True
16163ee1cdf9 [tests] Move 'anonymous_allowed' property from CubicWebServerTC to CubicWebTC
Christophe de Vienne <christophe@unlish.com>
parents: 9845
diff changeset
   276
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
   277
    def __init__(self, *args, **kwargs):
9070
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   278
        self._admin_session = None
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
   279
        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
   280
        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
   281
        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
   282
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   283
    # repository connection handling ###########################################
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9628
diff changeset
   284
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
   285
    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
   286
        """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
   287
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   288
        The access is automatically closed at the end of the test."""
10687
d394bfcd8c25 [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10675
diff changeset
   289
        login = text_type(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
   290
        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
   291
        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
   292
        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
   293
e25c5abc667c [testlib] introduce a RepoAccess class to easily create connection and request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9114
diff changeset
   294
    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
   295
        while self._open_access:
9628
2997f81cde19 [devtools] properly close open access on tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9627
diff changeset
   296
            try:
2997f81cde19 [devtools] properly close open access on tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9627
diff changeset
   297
                self._open_access.pop().close()
2997f81cde19 [devtools] properly close open access on tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9627
diff changeset
   298
            except BadConnectionId:
2997f81cde19 [devtools] properly close open access on tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9627
diff changeset
   299
                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
   300
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   301
    @property
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   302
    def session(self):
10363
e1ebf3d12098 [devtools] remove the remaining bw compat for old-style tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10356
diff changeset
   303
        """return admin session"""
9070
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   304
        return self._admin_session
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   305
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   306
    #XXX this doesn't need to a be classmethod anymore
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   307
    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
   308
        """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
   309
        """
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   310
        # 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
   311
        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
   312
        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
   313
        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
   314
        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
   315
        # get an admin session (without actual login)
10687
d394bfcd8c25 [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10675
diff changeset
   316
        login = text_type(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
   317
        self.admin_access = self.new_access(login)
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
   318
        self._admin_session = self.admin_access._session
9044
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   319
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   320
cfec5cc46008 [testlib] gather all repository access logic in one place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9043
diff changeset
   321
    # 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
   322
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   323
    @classproperty
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   324
    def config(cls):
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   325
        """return the configuration object
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   326
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   327
        Configuration is cached on the test 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
   328
        """
10837
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
   329
        if cls is CubicWebTC:
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
   330
            # Prevent direct use of CubicWebTC directly to avoid database
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
   331
            # caching issues
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
   332
            return 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
   333
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   334
            return cls.__dict__['_config']
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   335
        except KeyError:
6631
26c303c3f1aa [test] make test independant from the working directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6590
diff changeset
   336
            home = abspath(join(dirname(sys.modules[cls.__module__].__file__), cls.appid))
6585
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6469
diff changeset
   337
            config = cls._config = cls.configcls(cls.appid, apphome=home)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   338
            config.mode = 'test'
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   339
            return config
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   340
9790
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   341
    @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
   342
    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
   343
        """configuration initialization hooks.
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   344
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   345
        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
   346
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   347
        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
   348
        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
   349
0872ac2a1db0 [testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9757
diff changeset
   350
        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
   351
        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
   352
        """
10017
58c7a075c793 [devtools/testlib] Use actual 'admin' user configuration values
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9933
diff changeset
   353
        admincfg = config.default_admin_config
10675
e0db937f5add [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   354
        cls.admlogin = text_type(admincfg['login'])
10017
58c7a075c793 [devtools/testlib] Use actual 'admin' user configuration values
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9933
diff changeset
   355
        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
   356
        # uncomment the line below if you want rql queries to be logged
3163
edfe43ceaa35 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   357
        #config.global_set_option('query-log-file',
edfe43ceaa35 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   358
        #                         '/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
   359
        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
   360
        # 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
   361
        # 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
   362
        config.global_set_option('default-dest-addrs', ['whatever'])
6720
43a38c093f6f [testlib] Use logilab.common.shellutils.getlogin instead of local hack.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6589
diff changeset
   363
        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
   364
        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
   365
        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
   366
        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
   367
        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
   368
        # 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
   369
        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
   370
        # web resources
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   371
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   372
            config.global_set_option('embed-allowed', re.compile('.*'))
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   373
        except Exception: # not in server only configuration
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   374
            pass
9929
16163ee1cdf9 [tests] Move 'anonymous_allowed' property from CubicWebServerTC to CubicWebTC
Christophe de Vienne <christophe@unlish.com>
parents: 9845
diff changeset
   375
        config.set_anonymous_allowed(cls.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
   376
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
   377
    @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
   378
    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
   379
        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
   380
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   381
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   382
    # 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
   383
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   384
    @property
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 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
   386
        """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
   387
        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
   388
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   389
    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
   390
        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
   391
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   392
    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
   393
        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
   394
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   395
    def debugged(self, debugmode):
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   396
        return server.debugged(debugmode)
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   397
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   398
    # 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
   399
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   400
    def setUp(self):
6398
ea26eb5fd388 [test] send mail synchronously during tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6369
diff changeset
   401
        # 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
   402
        self._patch_SendMailOp()
10108
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   403
        with pause_trace():
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   404
            previous_failure = self.__class__.__dict__.get('_repo_init_failed')
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   405
            if previous_failure is not None:
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   406
                self.skipTest('repository is not initialised: %r' % previous_failure)
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   407
            try:
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   408
                self._init_repo()
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   409
            except Exception as ex:
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   410
                self.__class__._repo_init_failed = ex
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   411
                raise
129af90b2364 [devtools] Use the pause_trace context manager instead of pause_tracing/resume_tracing
Christophe de Vienne <christophe@unlish.com>
parents: 10017
diff changeset
   412
            self.addCleanup(self._close_access)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   413
        self.setup_database()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   414
        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
   415
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   416
    def tearDown(self):
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   417
        # XXX hack until logilab.common.testlib is fixed
9070
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   418
        if self._admin_session is not None:
10346
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10335
diff changeset
   419
            self.repo.close(self._admin_session.sessionid)
9070
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   420
            self._admin_session = None
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   421
        while self._cleanups:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   422
            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
   423
            cleanup(*args, **kwargs)
10112
ff7f86d8393d [devtools] call turn_repo_off in tearDown (closes #4673491)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10108
diff changeset
   424
        self.repo.turn_repo_off()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   425
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   426
    def _patch_SendMailOp(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   427
        # 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
   428
        _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
   429
        SendMailOp.postcommit_event = SendMailOp.sendmails
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   430
        def reverse_SendMailOp_monkey_patch():
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   431
            SendMailOp.postcommit_event = _old_mail_postcommit_event
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   432
        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
   433
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   434
    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
   435
        """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
   436
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   437
    @classmethod
9933
3674f249ab1d [devtools] pre_setup_database takes a Connection, not a Session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9931
diff changeset
   438
    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
   439
        """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
   440
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   441
        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
   442
        result.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   443
        """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   444
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   445
    # 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
   446
9631
c51a05b5dcb8 [devtools] deprecate CWTC.user()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9630
diff changeset
   447
    @deprecated('[3.19] explicitly use RepoAccess object in test instead')
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
    def user(self, req=None):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   449
        """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
   450
        if req is None:
9070
4a803380f718 PARTIAL: Using the repoapi in test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9044
diff changeset
   451
            return self.request().user
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
        else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   453
            return req.user
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   454
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
   455
    @iclassmethod # XXX turn into a class method
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
   456
    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
   457
                    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
   458
        """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
   459
        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
   460
            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
   461
        if login is not None:
10687
d394bfcd8c25 [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10675
diff changeset
   462
            login = text_type(login)
10259
2be01bb6f9de [devtools] accept str objects in CubicWebTC.new_access and .create_user
Julien Cristau <julien.cristau@logilab.fr>
parents: 10112
diff changeset
   463
        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
   464
                                 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
   465
        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
   466
                    % ','.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
   467
                    {'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
   468
        if email is not None:
10687
d394bfcd8c25 [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10675
diff changeset
   469
            req.create_entity('EmailAddress', address=text_type(email),
7337
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   470
                              reverse_primary_email=user)
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
   471
        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
   472
        if commit:
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
   473
            try:
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
   474
                req.commit() # req is a session
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
   475
            except AttributeError:
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
   476
                req.cnx.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
   477
        return user
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   478
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   479
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   480
    # 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
   481
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
   482
    @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
   483
    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
   484
        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
   485
        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
   486
            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
   487
            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
   488
            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
   489
                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
   490
                    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
   491
        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
   492
            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
   493
        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
   494
            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
   495
                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
   496
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   497
    @contextmanager
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   498
    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
   499
        """Set custom schema permissions within context.
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   500
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   501
        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
   502
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   503
        * using positional argument(s):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   504
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   505
          .. sourcecode:: python
8480
086cff6a306a [book] fix build warnings/errors. Closes #2430042
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8463
diff changeset
   506
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   507
                rdef = self.schema['CWUser'].rdef('login')
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   508
                with self.temporary_permissions((rdef, {'read': ()})):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   509
                    ...
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   510
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   511
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   512
        * using named argument(s):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   513
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   514
          .. sourcecode:: python
8480
086cff6a306a [book] fix build warnings/errors. Closes #2430042
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8463
diff changeset
   515
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   516
                with self.temporary_permissions(CWUser={'read': ()}):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   517
                    ...
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   518
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
   519
        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
   520
        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
   521
9580
abaae1496ba4 [book] Update documentation for new repoapi
Julien Cristau <julien.cristau@logilab.fr>
parents: 9570
diff changeset
   522
        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
   523
        (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
   524
        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
   525
        """
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   526
        torestore = []
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10651
diff changeset
   527
        for erschema, etypeperms in chain(perm_overrides, perm_kwoverrides.items()):
10612
84468b90e9c1 [py3k] basestring → six.string_types
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10609
diff changeset
   528
            if isinstance(erschema, string_types):
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   529
                erschema = self.schema[erschema]
10662
10942ed172de [py3k] dict.iteritems → dict.items
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10651
diff changeset
   530
            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
   531
                origperms = erschema.permissions[action]
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   532
                erschema.set_action_permissions(action, actionperms)
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   533
                torestore.append([erschema, action, origperms])
10639
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   534
        try:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   535
            yield
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   536
        finally:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   537
            for erschema, action, permissions in torestore:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   538
                if action is None:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   539
                    erschema.permissions = permissions
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   540
                else:
1ed205146ee2 [devtools] Fix CubicWebTC.temporary_permissions
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10638
diff changeset
   541
                    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
   542
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   543
    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
   544
        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
   545
        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
   546
9424
5027afeb5739 [testlib] Fix assertMessageEqual
Julien Cristau <julien.cristau@logilab.fr>
parents: 9212
diff changeset
   547
    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
   548
        msg = req.session.data[params['_cwmsgid']]
9424
5027afeb5739 [testlib] Fix assertMessageEqual
Julien Cristau <julien.cristau@logilab.fr>
parents: 9212
diff changeset
   549
        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
   550
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   551
    # 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
   552
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   553
    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
   554
        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
   555
        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
   556
                             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
   557
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   558
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   559
    # views and actions registries inspection ##################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   560
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   561
    def pviews(self, req, rset):
3468
b02fa4db2868 [tests] make unittest_viewselectors pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3454
diff changeset
   562
        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
   563
                      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
   564
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   565
    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
   566
                 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
   567
                                 '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
   568
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   569
                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
   570
                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
   571
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   572
    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
   573
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   574
                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
   575
                if a.category in categories]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   576
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   577
    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
   578
                     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
   579
                                     '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
   580
        res = {}
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   581
        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
   582
            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
   583
                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
   584
        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
   585
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   586
    def action_submenu(self, req, rset, id):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   587
        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
   588
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   589
    def _test_action(self, action):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   590
        class fake_menu(list):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   591
            @property
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   592
            def items(self):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   593
                return self
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   594
        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
   595
            def action_link(self, action, **kwargs):
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   596
                return (action.title, action.url())
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   597
        submenu = fake_menu()
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   598
        action.fill_menu(fake_box(), submenu)
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   599
        return submenu
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   600
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   601
    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
   602
        """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
   603
        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
   604
        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
   605
        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
   606
        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
   607
        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
   608
            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
   609
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   610
            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
   611
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   612
            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
   613
                     if view.category != 'startupview'
6454
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
   614
                     and not issubclass(view, notification.NotificationView)
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
   615
                     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
   616
            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
   617
                try:
2774
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2770 2773
diff changeset
   618
                    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
   619
                    if view is None:
771f594c12a2 [vreg] vregistry._select_best was needlessly instanciating NoSelectableObject (closes #1626708)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7222
diff changeset
   620
                        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
   621
                    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
   622
                        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
   623
                    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   624
                        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
   625
                    # 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
   626
                    # 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
   627
                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
   628
                    continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   629
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   630
    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
   631
        """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
   632
        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
   633
        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
   634
            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
   635
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   636
    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
   637
        """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
   638
        req = rset.req
6141
b8287e54b528 [web api] unify 'contentnav' (VComponent) and 'boxes' registries as 'ctxcomponents' (CtxComponent)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6140
diff changeset
   639
        for box in self.vreg['ctxcomponents'].possible_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
   640
            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
   641
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   642
    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
   643
        """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
   644
        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
   645
            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
   646
                if view.category == 'startupview':
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   647
                    yield view.__regid__
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   648
                else:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
   649
                    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
   650
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   651
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   652
    # 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
   653
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   654
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   655
    @cached
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   656
    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
   657
        """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
   658
        publisher = application.CubicWebPublisher(self.repo, self.config)
4137
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   659
        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
   660
            raise
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   661
        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
   662
        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
   663
9845
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   664
    @deprecated('[3.19] use the .remote_calling 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
   665
    def remote_call(self, fname, *args):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   666
        """remote json call simulation"""
5377
84d14ddfae13 [python2.6] prefer python2.6's builtin json module over simplejson
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5268
diff changeset
   667
        dump = json.dumps
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   668
        args = [dump(arg) for arg in args]
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   669
        req = self.request(fname=fname, pageid='123', arg=args)
8128
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8004
diff changeset
   670
        ctrl = self.vreg['controllers'].select('ajax', req)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   671
        return ctrl.publish(), req
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   672
9845
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   673
    @contextmanager
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   674
    def remote_calling(self, fname, *args):
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   675
        """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
   676
        args = [json.dumps(arg) for arg in args]
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   677
        with self.admin_access.web_request(fname=fname, pageid='123', arg=args) as req:
9c3ec404534f [testlib] deprecate .remote_call and provide new connection api friendly .remote_calling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9837
diff changeset
   678
            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
   679
            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
   680
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   681
    def app_handle_request(self, req, path='view'):
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   682
        return self.app.core_handle(req, path)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   683
8363
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   684
    @deprecated("[3.15] app_handle_request is the new and better way"
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   685
                " (beware of small semantic changes)")
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   686
    def app_publish(self, *args, **kwargs):
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   687
        return self.app_handle_request(*args, **kwargs)
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   688
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
   689
    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
   690
        """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
   691
        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
   692
        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
   693
            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
   694
            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
   695
        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
   696
            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
   697
            raise
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   698
        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
   699
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
   700
    @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
   701
    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
   702
        """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
   703
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
   704
        * `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
   705
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
   706
        * `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
   707
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
   708
        * `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
   709
          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
   710
        """
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
   711
        assert field_dict or 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
   712
                'field_dict and entity_field_dicts arguments must not be both unspecified'
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
   713
        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
   714
            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
   715
        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
   716
        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
   717
        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
   718
            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
   719
            form[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
   720
        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
   721
            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
   722
            form[eid_param(field, entity.eid)] = 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
   723
        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
   724
            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
   725
                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
   726
            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
   727
            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
   728
            _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
   729
            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
   730
                _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
   731
            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
   732
                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
   733
        if fields:
10468
3f27669634d2 [devtools] Sort _cw_fields in fake_form
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10363
diff changeset
   734
            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
   735
        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
   736
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   737
    @deprecated('[3.19] use .admin_request_from_url instead')
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
   738
    def req_from_url(self, url):
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
        """parses `url` and builds the corresponding CW-web request
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
   740
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
   741
        req.form will be setup using the url's query string
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
   742
        """
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
   743
        req = self.request(url=url)
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
   744
        if isinstance(url, unicode):
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
   745
            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
   746
        querystring = urlparse(url)[-2]
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
   747
        params = parse_qs(querystring)
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
   748
        req.setup_params(params)
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
   749
        return req
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
   750
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   751
    @contextmanager
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   752
    def admin_request_from_url(self, url):
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   753
        """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
   754
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   755
        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
   756
        """
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   757
        with self.admin_access.web_request(url=url) as req:
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   758
            if isinstance(url, unicode):
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   759
                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
   760
            querystring = urlparse(url)[-2]
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
   761
            params = parse_qs(querystring)
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   762
            req.setup_params(params)
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   763
            yield req
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   764
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
   765
    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
   766
        """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
   767
        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
   768
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
   769
        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
   770
        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
   771
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
   772
        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
   773
        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
   774
        """
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   775
        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
   776
            if data is not None:
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   777
                req.form.update(data)
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   778
            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
   779
            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
   780
8721
b399c87df63c [devtools] add http_publish to CubicWebTC (closes #2565882)
Julien Cristau <julien.cristau@logilab.fr>
parents: 8720
diff changeset
   781
    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
   782
        """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
   783
        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
   784
        """
9931
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   785
        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
   786
            if data is not None:
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   787
                req.form.update(data)
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   788
            with real_error_handling(self.app):
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   789
                result = self.app_handle_request(req, req.relative_path(False))
013dd868e6da devtools: deprecate .req_from_url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
   790
            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
   791
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   792
    @staticmethod
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   793
    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
   794
        try:
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   795
            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
   796
        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
   797
            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
   798
            params = {}
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   799
        else:
10603
65ad6980976e [py3k] import URL mangling functions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10594
diff changeset
   800
            cleanup = lambda p: (p[0], urlunquote(p[1]))
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   801
            params = dict(cleanup(p.split('=', 1)) for p in params.split('&') if p)
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   802
        if path.startswith(req.base_url()): # may be relative
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   803
            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
   804
        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
   805
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   806
    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
   807
        """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
   808
        Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   809
        """
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   810
        try:
4719
aaed3f813ef8 kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4690
diff changeset
   811
            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
   812
        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
   813
            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
   814
        else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   815
            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
   816
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   817
    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
   818
        """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
   819
        get a Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   820
        """
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   821
        result = self.app_handle_request(req, path)
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   822
        self.assertTrue(300 <= req.status_out <400, req.status_out)
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   823
        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
   824
        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
   825
8363
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   826
    @deprecated("[3.15] expect_redirect_handle_request is the new and better way"
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   827
                " (beware of small semantic changes)")
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   828
    def expect_redirect_publish(self, *args, **kwargs):
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   829
        return self.expect_redirect_handle_request(*args, **kwargs)
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   830
3f3b4e4c63f5 [devtool-testlib] add deprecated entry point for publish method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8318
diff changeset
   831
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
   832
    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
   833
        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
   834
        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
   835
        if anonuser is None:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   836
            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
   837
        else:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   838
            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
   839
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
   840
    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
   841
        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
   842
        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
   843
        sh = self.app.session_handler
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   844
        authm = sh.session_manager.authmanager
4916
4b8cdda342ae fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   845
        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
   846
        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
   847
        # not properly cleaned between tests
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   848
        self.open_sessions = sh.session_manager._sessions = {}
9626
90fb0623bb70 [devtools] avoid an internal deprecation warning
Julien Cristau <julien.cristau@logilab.fr>
parents: 9606
diff changeset
   849
        return req, self.session
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   850
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
   851
    def assertAuthSuccess(self, req, origsession, nbsessions=1):
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   852
        sh = self.app.session_handler
9019
e08f9c55dab5 [application] call req.set_session in application.main_handle_request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9017
diff changeset
   853
        session = self.app.get_session(req)
10356
a009a31fb1ea [connection] eliminate ClientConnection leftovers
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10355
diff changeset
   854
        cnx = repoapi.Connection(session)
a009a31fb1ea [connection] eliminate ClientConnection leftovers
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10355
diff changeset
   855
        req.set_cnx(cnx)
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   856
        self.assertEqual(len(self.open_sessions), nbsessions, self.open_sessions)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   857
        self.assertEqual(session.login, origsession.login)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   858
        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
   859
3676
fa170564e1a0 optional nbsessions arg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3657
diff changeset
   860
    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
   861
        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
   862
            self.app.get_session(req)
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8978
diff changeset
   863
        # +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
   864
        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
   865
        clear_cache(req, 'get_authorization')
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   866
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   867
    # content validation #######################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   868
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   869
    # validators are used to validate (XML, DTD, whatever) view's content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   870
    # validators availables are :
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   871
    #  DTDValidator : validates XML + declared DTD
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   872
    #  SaxOnlyValidator : guarantees XML is well formed
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   873
    #  None : do not try to validate anything
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   874
    # 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
   875
    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
   876
        # 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
   877
        #
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
   878
        # 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
   879
        # snippets
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
   880
        #'text/html': DTDValidator,
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
   881
        #'application/xhtml+xml': DTDValidator,
8971
062e40f41b57 [testlib] SaxOnlyValidator is deprecated, use XMLValidator instead
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8930
diff changeset
   882
        'application/xml': htmlparser.XMLValidator,
062e40f41b57 [testlib] SaxOnlyValidator is deprecated, use XMLValidator instead
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8930
diff changeset
   883
        '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
   884
        '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
   885
        '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
   886
        '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
   887
        '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
   888
        '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
   889
        'image/png': 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
   890
        }
562
bdadb26c4a3c old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents: 549
diff changeset
   891
    # 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
   892
    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
   893
                          for vid, valkey in VIEW_VALIDATORS.items())
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
   894
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   895
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
   896
    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
   897
             **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   898
        """This method tests the view `vid` on `rset` using `template`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   899
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
   900
        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
   901
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   902
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   903
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   904
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   905
        """
8628
b236b91836c0 [test] fix req default value handling in CubicWebTC.view (closes #2544376)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8497
diff changeset
   906
        if req is None:
b236b91836c0 [test] fix req default value handling in CubicWebTC.view (closes #2544376)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8497
diff changeset
   907
            if rset is None:
b236b91836c0 [test] fix req default value handling in CubicWebTC.view (closes #2544376)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8497
diff changeset
   908
                req = self.request()
b236b91836c0 [test] fix req default value handling in CubicWebTC.view (closes #2544376)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8497
diff changeset
   909
            else:
b236b91836c0 [test] fix req default value handling in CubicWebTC.view (closes #2544376)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8497
diff changeset
   910
                req = rset.req
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   911
        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
   912
        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
   913
        view = viewsreg.select(vid, req, rset=rset, **kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   914
        # set explicit test description
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   915
        if rset is not None:
10621
987fbc88f097 [devtools/testlib] Port CubicWebTC.view() to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   916
            # coerce to "bytes" on py2 because the description will be sent to
987fbc88f097 [devtools/testlib] Port CubicWebTC.view() to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   917
            # sys.stdout/stderr which takes "bytes" on py2 and "unicode" on py3
987fbc88f097 [devtools/testlib] Port CubicWebTC.view() to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   918
            rql = str(rset.printable_rql())
5875
e707d481219e [testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5815
diff changeset
   919
            self.set_description("testing vid=%s defined in %s with (%s)" % (
10621
987fbc88f097 [devtools/testlib] Port CubicWebTC.view() to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   920
                vid, view.__module__, rql))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   921
        else:
5875
e707d481219e [testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5815
diff changeset
   922
            self.set_description("testing vid=%s defined in %s without rset" % (
2070
d98f5be5e371 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   923
                vid, view.__module__))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   924
        if template is None: # raw view testing, no template
1773
789ee507a8e0 use render
sylvain.thenault@logilab.fr
parents: 1605
diff changeset
   925
            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
   926
        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
   927
            kwargs['view'] = view
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
   928
            viewfunc = lambda **k: viewsreg.main_template(req, template,
8497
7f71e366cb5e [testlib] consider rset for template / view selection (closes #2447183)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8480
diff changeset
   929
                                                          rset=rset, **kwargs)
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
   930
        return self._test_view(viewfunc, view, template, kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   931
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   932
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
   933
    def _test_view(self, viewfunc, view, template='main-template', kwargs={}):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   934
        """this method does the actual call to the view
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   935
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
   936
        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
   937
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   938
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   939
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   940
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   941
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   942
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   943
            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
   944
        except Exception:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   945
            # hijack exception: generative tests stop when the exception
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   946
            # is not an AssertionError
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   947
            klass, exc, tcbk = sys.exc_info()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   948
            try:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   949
                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
   950
            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
   951
                msg = '[%s in %s] undisplayable exception' % (klass, view.__regid__)
10590
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
   952
            exc = AssertionError(msg)
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
   953
            exc.__traceback__ = tcbk
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
   954
            raise exc
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   955
        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
   956
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   957
    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
   958
        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
   959
            try:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   960
                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
   961
            except KeyError:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   962
                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
   963
                    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
   964
        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
   965
            content_type = 'text/html'
8978
269548f2306e [testlib] fix page validator selection. Closes #2869456
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8975
diff changeset
   966
        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
   967
            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
   968
                # 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
   969
                # 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
   970
                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
   971
            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
   972
                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
   973
            else:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   974
                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
   975
        else:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   976
            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
   977
        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
   978
                                                          default_validator)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   979
        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
   980
            return
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   981
        return validatorclass()
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   982
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   983
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   984
    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
   985
        """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
   986
        output = output.strip()
10755
4c48d3bab38c [devtools] CubicWebTC._check_html may have to deal with unicode or bytes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10700
diff changeset
   987
        if isinstance(output, text_type):
4c48d3bab38c [devtools] CubicWebTC._check_html may have to deal with unicode or bytes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10700
diff changeset
   988
            # XXX
4c48d3bab38c [devtools] CubicWebTC._check_html may have to deal with unicode or bytes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10700
diff changeset
   989
            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
   990
        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
   991
        if validator is None:
7821
3ecd114f6d75 [testlib] make self.view() return raw output if no validator is used
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7797
diff changeset
   992
            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
   993
        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
   994
            # 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
   995
            output = re.sub('<canvas.*?></canvas>', '', output)
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   996
        return self.assertWellFormed(validator, output.strip(), context= view.__regid__)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   997
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   998
    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
   999
        try:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1000
            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
  1001
        except Exception:
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1002
            # 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
  1003
            # 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
  1004
            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
  1005
            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
  1006
                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
  1007
            else:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1008
                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
  1009
            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
  1010
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1011
            try:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1012
                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
  1013
            except Exception:
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1014
                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
  1015
            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
  1016
            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
  1017
                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
  1018
                if position:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1019
                    # define filter
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1020
                    if isinstance(content, str):
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1021
                        content = unicode(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
  1022
                    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
  1023
                    content = content.splitlines()
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1024
                    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
  1025
                    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
  1026
                    # 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
  1027
                    # the line number
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1028
                    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
  1029
                                         for idx, line in enumerate(content)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1030
                                         if line_context_filter(idx+1, position))
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
  1031
                    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
  1032
            exc = AssertionError(msg)
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
  1033
            exc.__traceback__ = tcbk
7629902e7554 [py3k] Fix raise with embedded traceback
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10589
diff changeset
  1034
            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
  1035
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
  1036
    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
  1037
        # 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
  1038
        with self.admin_access.shell() as mih:
0c492a2720f1 [devtools] fix CubicWebTC.assertDocTestFile (closes #5930028)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10468
diff changeset
  1039
            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
  1040
        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
  1041
            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
  1042
                                        % testfile)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
  1043
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
  1044
    # 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
  1045
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
  1046
    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
  1047
        """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
  1048
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
  1049
        :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
  1050
        :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
  1051
        :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
  1052
        :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
  1053
        """
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
  1054
        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
  1055
                    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
  1056
        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
  1057
            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
  1058
            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
  1059
                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
  1060
            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
  1061
        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
  1062
            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
  1063
        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
  1064
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1065
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1066
# 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
  1067
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1068
from cubicweb.devtools.fill import insert_entity_queries, make_relations_queries
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1069
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1070
# 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
  1071
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1072
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
  1073
    """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
  1074
    satisfy relations cardinality.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1075
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1076
    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
  1077
    least.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1078
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1079
    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
  1080
    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
  1081
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1082
    relmap = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1083
    for rschema in schema.relations():
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
  1084
        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
  1085
            continue
4053
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
  1086
        for subj, obj in rschema.rdefs:
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
  1087
            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
  1088
            # 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
  1089
            # obj to satisfy it
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1090
            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
  1091
                # 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
  1092
                # 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
  1093
                # -> 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
  1094
                #    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
  1095
                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
  1096
            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
  1097
                # 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
  1098
                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
  1099
    unprotected = unprotected_entities(schema)
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1100
    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
  1101
        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
  1102
    howmanydict = {}
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1103
    # 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
  1104
    # 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
  1105
    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
  1106
        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
  1107
        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
  1108
            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
  1109
    # 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
  1110
    # 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
  1111
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1112
    # 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
  1113
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1114
    # 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
  1115
    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
  1116
        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
  1117
        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
  1118
    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
  1119
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1120
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1121
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
  1122
    """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
  1123
    __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
  1124
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1125
    test_db_id = 'autopopulate'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1126
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1127
    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
  1128
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1129
    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
  1130
    # 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
  1131
    # 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
  1132
    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
  1133
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1134
    no_auto_populate = ()
3734
b2107f68176c ignored_relations should be a set
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3720
diff changeset
  1135
    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
  1136
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
  1137
    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
  1138
        return unprotected_entities(self.schema, strict=True)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1139
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1140
    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
  1141
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1142
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1143
    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
  1144
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1145
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
  1146
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1147
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1148
    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
  1149
        """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
  1150
        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
  1151
        """
10354
635cfac73d28 [repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10353
diff changeset
  1152
        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
  1153
            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
  1154
                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
  1155
                cnx.commit()
5004
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
  1156
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1157
    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
  1158
        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
  1159
        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
  1160
        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
  1161
        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
  1162
            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
  1163
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1164
            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
  1165
            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
  1166
                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
  1167
        edict = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1168
        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
  1169
            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
  1170
            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
  1171
        existingrels = {}
4036
137be4878127 [mq]: fix_set_addition
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 4016
diff changeset
  1172
        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
  1173
        for rschema in self.schema.relations():
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
  1174
            if rschema.final or rschema in 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
  1175
                continue
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1176
            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
  1177
            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
  1178
        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
  1179
                                   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
  1180
        for rql, args in q:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1181
            try:
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1182
                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
  1183
            except ValidationError as ex:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1184
                # failed to satisfy some constraint
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10569
diff changeset
  1185
                print('error in automatic db population', ex)
9837
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1186
                cnx.commit_state = None # reset uncommitable flag
64c8ee99baf7 [devtools/testlib,fill] use the new connection api (for auto_populate)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9836
diff changeset
  1187
        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
  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
    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
  1190
        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
  1191
        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
  1192
            for etype in etypes:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1193
                if limit:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1194
                    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
  1195
                else:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1196
                    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
  1197
                rset = req.execute(rql)
10609
e2d8e81bfe68 [py3k] import range using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10603
diff changeset
  1198
                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
  1199
                    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
  1200
                        break
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1201
                    # XXX iirk
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1202
                    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
  1203
                    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
  1204
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1205
    def iter_automatic_rsets(self, limit=10):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1206
        """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
  1207
        etypes = self.to_test_etypes()
2219
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
  1208
        if not etypes:
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
  1209
            return
9836
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1210
        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
  1211
            for etype in etypes:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1212
                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
  1213
            etype1 = etypes.pop()
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1214
            try:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1215
                etype2 = etypes.pop()
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1216
            except KeyError:
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1217
                etype2 = etype1
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1218
            # 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
  1219
            # 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
  1220
            # because of some duplicate "id" attributes)
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1221
            yield req.execute('DISTINCT Any X, MAX(Y) GROUPBY X WHERE X is %s, Y is %s' % (etype1, etype2))
71045bb09136 [webtests/automatic views tests] use the new connection api
Julien Cristau <julien.cristau@logilab.fr>
parents: 9790
diff changeset
  1222
            # 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
  1223
            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
  1224
                yield req.execute(rql)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1225
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1226
    def _test_everything_for(self, rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1227
        """this method tries to find everything that can be tested
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1228
        for `rset` and yields a callable test (as needed in generative tests)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1229
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1230
        propdefs = self.vreg['propertydefs']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1231
        # make all components visible
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1232
        for k, v in propdefs.items():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1233
            if k.endswith('visible') and not v['default']:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1234
                propdefs[k]['default'] = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1235
        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
  1236
            backup_rset = rset.copy(rset.rows, rset.description)
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
  1237
            yield InnerTest(self._testname(rset, view.__regid__, 'view'),
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
  1238
                            self.view, view.__regid__, rset,
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 563
diff changeset
  1239
                            rset.req.reset_headers(), 'main-template')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1240
            # We have to do this because some views modify the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1241
            # resultset's syntax tree
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1242
            rset = backup_rset
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1243
        for action in self.list_actions_for(rset):
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
  1244
            yield InnerTest(self._testname(rset, action.__regid__, 'action'), self._test_action, action)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1245
        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
  1246
            w = [].append
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
  1247
            yield InnerTest(self._testname(rset, box.__regid__, 'box'), box.render, w)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1248
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1249
    @staticmethod
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1250
    def _testname(rset, objid, objtype):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1251
        return '%s_%s_%s' % ('_'.join(rset.column_types(0)), objid, objtype)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1252
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1253
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1254
# 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
  1255
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1256
class AutomaticWebTest(AutoPopulateTest):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1257
    """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
  1258
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1259
    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
  1260
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1261
    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
  1262
        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
  1263
            # 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
  1264
            # issues.
b71511460a4f [devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10755
diff changeset
  1265
            return
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1266
        super(AutomaticWebTest, self).setUp()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1267
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1268
        # 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
  1269
        # 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
  1270
        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
  1271
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1272
    ## one each
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1273
    def test_one_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1274
        self.auto_populate(1)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1275
        for rset in self.iter_automatic_rsets(limit=1):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1276
            for testargs in self._test_everything_for(rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1277
                yield testargs
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1278
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1279
    ## ten each
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1280
    def test_ten_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1281
        self.auto_populate(10)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1282
        for rset in self.iter_automatic_rsets(limit=10):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1283
            for testargs in self._test_everything_for(rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1284
                yield testargs
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1285
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1286
    ## startup views
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1287
    def test_startup_views(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1288
        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
  1289
            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
  1290
                yield self.view, vid, None, req
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1291
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1292
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1293
# registry instrumentization ###################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1294
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1295
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
  1296
    try:
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1297
        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
  1298
    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
  1299
        pass
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1300
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1301
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
  1302
# 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
  1303
#     # 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
  1304
#     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
  1305
#     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
  1306
#     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
  1307
#         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
  1308
#         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
  1309
#             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
  1310
#         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
  1311
#             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
  1312
#         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
  1313
#             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
  1314
#             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
  1315
#                 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
  1316
#             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
  1317
#                 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
  1318
#             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
  1319
#                 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
  1320
#             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
  1321
#         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
  1322
#         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
  1323
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1324
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
  1325
# 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
  1326
#     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
  1327
#         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
  1328
#             continue
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10662
diff changeset
  1329
#         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
  1330
#             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
  1331
#                 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
  1332
#                     print 'not tested', regname, appobject