devtools/testlib.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 30 Sep 2010 15:00:30 +0200
branchstable
changeset 6369 a151453dc564
parent 6346 1a968e545e4e
child 6370 8c3d6f739fa3
child 6398 ea26eb5fd388
permissions -rw-r--r--
[test] more update to unittest2 api
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
     1
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
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"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
5004
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
    20
from __future__ import with_statement
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
    21
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
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 os
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
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
    26
import re
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    27
from urllib import unquote
6167
376e6c3d4002 [doc] add documentation on RealDatabaseConfiguration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6166
diff changeset
    28
import urlparse
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
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
    30
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
    31
from warnings import warn
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    32
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    33
import yams.schema
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
    35
from logilab.common.testlib import TestCase, InnerTest, Tags
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    36
from logilab.common.pytest import nocoverage, pause_tracing, resume_tracing
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    37
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
    38
from logilab.common.umessage import message_from_string
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
    39
from logilab.common.decorators import cached, classproperty, clear_cache
2773
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.deprecation import deprecated
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
    42
from cubicweb import ValidationError, NoSelectableObject, AuthenticationError
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
    43
from cubicweb import cwconfig, devtools, web, server
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
    44
from cubicweb.dbapi import ProgrammingError, DBAPISession, repo_connect
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    45
from cubicweb.sobjects import notification
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
    46
from cubicweb.web import Redirect, application
5004
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
    47
from cubicweb.server.session import security_enabled
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    48
from cubicweb.devtools import SYSTEM_ENTITIES, SYSTEM_RELATIONS, VIEW_VALIDATORS
6316
51aa84c40a71 [test] we actually still need the set_option on base-url for multi-sources (eg repo) configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6281
diff changeset
    49
from cubicweb.devtools import BASE_URL, fake, htmlparser
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
    50
from cubicweb.utils import json
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    52
# low-level utilities ##########################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
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
    55
    """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
    56
    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
    57
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
    def do_view(self, arg):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
        import webbrowser
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
        data = self._getval(arg)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
        file('/tmp/toto.html', 'w').write(data)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
        webbrowser.open('file:///tmp/toto.html')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
def line_context_filter(line_no, center, before=3, after=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
    """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
    66
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    67
    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
    68
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
    if after is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
        after = before
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
    return center - before <= line_no <= center + after
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    73
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    74
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
    75
    """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
    76
    (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
    77
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    78
    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
    79
        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
    80
    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    81
        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
    82
    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
    83
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    84
4689
4eb1f4490538 [test] skipping versions checking during test is enough, no need for monkey patch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4681
diff changeset
    85
def refresh_repo(repo, resetschema=False, resetvreg=False):
5751
1e5ef464cade [test] properly close connections during test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    86
    for pool in repo.pools:
1e5ef464cade [test] properly close connections during test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    87
        pool.close(True)
1e5ef464cade [test] properly close connections during test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    88
    repo.system_source.shutdown()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    89
    devtools.reset_test_database(repo.config)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    90
    for pool in repo.pools:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    91
        pool.reconnect()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    92
    repo._type_source_cache = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    93
    repo._extid_cache = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    94
    repo.querier._rql_cache = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    95
    for source in repo.sources:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    96
        source.reset_caches()
4690
0cfb6b63f90b [testlib] provide ability to control schema/vreg reset using reset_schema/reset_vreg test class attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4689
diff changeset
    97
    if resetschema:
0cfb6b63f90b [testlib] provide ability to control schema/vreg reset using reset_schema/reset_vreg test class attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4689
diff changeset
    98
        repo.set_schema(repo.config.load_schema(), resetvreg=resetvreg)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    99
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   100
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   101
# 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
   102
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   103
MAILBOX = []
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   104
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   105
class Email:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   106
    """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
   107
    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
   108
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   109
    * `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
   110
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   111
    * `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
   112
      message
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   113
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   114
    def __init__(self, recipients, msg):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   115
        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
   116
        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
   117
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   118
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   119
    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
   120
        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
   121
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   122
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   123
    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
   124
        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
   125
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   126
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   127
    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
   128
        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
   129
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   130
    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
   131
        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
   132
                                                  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
   133
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   134
# 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
   135
# 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
   136
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
   137
    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
   138
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   139
    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
   140
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   141
    def sendmail(self, helo_addr, recipients, msg):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   142
        MAILBOX.append(Email(recipients, msg))
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   143
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   144
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
   145
6165
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   146
class TestCaseConnectionProxy(object):
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   147
    """thin wrapper around `cubicweb.dbapi.Connection` context-manager
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   148
    used in CubicWebTC (cf. `cubicweb.devtools.testlib.CubicWebTC.login` method)
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   149
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   150
    It just proxies to the default connection context manager but
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   151
    restores the original connection on exit.
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   152
    """
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   153
    def __init__(self, testcase, cnx):
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   154
        self.testcase = testcase
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   155
        self.cnx = cnx
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   156
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   157
    def __getattr__(self, attrname):
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   158
        return getattr(self.cnx, attrname)
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   159
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   160
    def __enter__(self):
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   161
        return self.cnx.__enter__()
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   162
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   163
    def __exit__(self, exctype, exc, tb):
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   164
        try:
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   165
            return self.cnx.__exit__(exctype, exc, tb)
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   166
        finally:
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   167
            self.cnx.close()
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   168
            self.testcase.restore_connection()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   169
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   170
# 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
   171
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   172
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
   173
    """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
   174
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   175
    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
   176
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   177
    * `vreg`, the vregistry
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   178
    * `schema`, self.vreg.schema
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   179
    * `config`, cubicweb configuration
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   180
    * `cnx`, dbapi connection to the repository using an admin user
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   181
    * `session`, server side session associated to `cnx`
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   182
    * `app`, the cubicweb publisher (for web testing)
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   183
    * `repo`, the repository object
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   184
    * `admlogin`, login of the admin user
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   185
    * `admpassword`, password of the admin 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
   186
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   187
    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
   188
    configcls = devtools.ApptestConfiguration
4690
0cfb6b63f90b [testlib] provide ability to control schema/vreg reset using reset_schema/reset_vreg test class attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4689
diff changeset
   189
    reset_schema = reset_vreg = False # reset schema / vreg between tests
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
   190
    tags= TestCase.tags | Tags('cubicweb', 'cw_repo')
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   191
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   192
    @classproperty
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   193
    def config(cls):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   194
        """return the configuration object. Configuration is cached on the test
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   195
        class.
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   196
        """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   197
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   198
            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
   199
        except KeyError:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   200
            config = cls._config = cls.configcls(cls.appid)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   201
            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
   202
            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
   203
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   204
    @classmethod
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   205
    def init_config(cls, config):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   206
        """configuration initialization hooks. You may want to override this."""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   207
        source = config.sources()['system']
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   208
        cls.admlogin = unicode(source['db-user'])
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   209
        cls.admpassword = source['db-password']
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   210
        # 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
   211
        #config.global_set_option('query-log-file',
edfe43ceaa35 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   212
        #                         '/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
   213
        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
   214
        # 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
   215
        # 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
   216
        config.global_set_option('default-dest-addrs', ['whatever'])
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   217
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   218
            send_to =  '%s@logilab.fr' % os.getlogin()
3163
edfe43ceaa35 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   219
            # AttributeError since getlogin not available under all platforms
edfe43ceaa35 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   220
        except (OSError, AttributeError):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   221
            send_to =  '%s@logilab.fr' % (os.environ.get('USER')
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   222
                                          or os.environ.get('USERNAME')
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   223
                                          or os.environ.get('LOGNAME'))
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   224
        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
   225
        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
   226
        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
   227
        config.global_set_option('sender-addr', 'cubicweb-test@logilab.fr')
6316
51aa84c40a71 [test] we actually still need the set_option on base-url for multi-sources (eg repo) configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6281
diff changeset
   228
        config.global_set_option('base-url', 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
   229
        # 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
   230
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   231
            config.global_set_option('embed-allowed', re.compile('.*'))
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   232
        except: # not in server only configuration
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   233
            pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   234
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   235
    @classmethod
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   236
    def _init_repo(cls):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   237
        """init the repository and connection to it.
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   238
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   239
        Repository and connection are cached on the test class. Once
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   240
        initialized, we simply reset connections and repository caches.
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   241
        """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   242
        if not 'repo' in cls.__dict__:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   243
            cls._build_repo()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   244
        else:
5778
1a4ac9e2ce63 [test] workaround connection leak making tests fail under windows environment (though we've still probably some open connection leak to resolve...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5751
diff changeset
   245
            try:
1a4ac9e2ce63 [test] workaround connection leak making tests fail under windows environment (though we've still probably some open connection leak to resolve...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5751
diff changeset
   246
                cls.cnx.rollback()
5783
c5ff8cd74758 [devtools/teslib] be more defensive on rollbacks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5778
diff changeset
   247
            except ProgrammingError:
5778
1a4ac9e2ce63 [test] workaround connection leak making tests fail under windows environment (though we've still probably some open connection leak to resolve...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5751
diff changeset
   248
                pass
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   249
            cls._refresh_repo()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   250
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   251
    @classmethod
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   252
    def _build_repo(cls):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   253
        cls.repo, cls.cnx = devtools.init_test_database(config=cls.config)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   254
        cls.init_config(cls.config)
4958
665eacdd8c50 [repo] call server_startup event in start_looping_task the repo is fully started (registered in pyro for instance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4917
diff changeset
   255
        cls.repo.hm.call_hooks('server_startup', repo=cls.repo)
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
        cls.vreg = cls.repo.vreg
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
   257
        cls.websession = DBAPISession(cls.cnx, cls.admlogin,
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
   258
                                      {'password': cls.admpassword})
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
   259
        cls._orig_cnx = (cls.cnx, cls.websession)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   260
        cls.config.repository = lambda x=None: cls.repo
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   261
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   262
    @classmethod
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   263
    def _refresh_repo(cls):
4690
0cfb6b63f90b [testlib] provide ability to control schema/vreg reset using reset_schema/reset_vreg test class attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4689
diff changeset
   264
        refresh_repo(cls.repo, cls.reset_schema, cls.reset_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
   265
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   266
    # 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
   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
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   269
    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
   270
        """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
   271
        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
   272
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   273
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   274
    def session(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   275
        """return current server side session (using default manager account)"""
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   276
        session = self.repo._sessions[self.cnx.sessionid]
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   277
        session.set_pool()
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   278
        return 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
   279
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   280
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   281
    def adminsession(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   282
        """return current server side session (using default manager account)"""
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
   283
        return self.repo._sessions[self._orig_cnx[0].sessionid]
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   284
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   285
    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
   286
        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
   287
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   288
    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
   289
        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
   290
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   291
    # 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
   292
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   293
    def setUp(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   294
        pause_tracing()
5020
30a539c2074d When a TC failed to initiliase the database, the following test are SKIPPED
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4958
diff changeset
   295
        previous_failure = self.__class__.__dict__.get('_repo_init_failed')
30a539c2074d When a TC failed to initiliase the database, the following test are SKIPPED
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4958
diff changeset
   296
        if previous_failure is not None:
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   297
            self.skipTest('repository is not initialised: %r' % previous_failure)
5020
30a539c2074d When a TC failed to initiliase the database, the following test are SKIPPED
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4958
diff changeset
   298
        try:
30a539c2074d When a TC failed to initiliase the database, the following test are SKIPPED
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4958
diff changeset
   299
            self._init_repo()
30a539c2074d When a TC failed to initiliase the database, the following test are SKIPPED
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4958
diff changeset
   300
        except Exception, ex:
30a539c2074d When a TC failed to initiliase the database, the following test are SKIPPED
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4958
diff changeset
   301
            self.__class__._repo_init_failed = ex
30a539c2074d When a TC failed to initiliase the database, the following test are SKIPPED
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4958
diff changeset
   302
            raise
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   303
        resume_tracing()
5401
547911327475 [testlib] move _cnxs initialization before setup_database so one can login in it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
   304
        self._cnxs = []
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   305
        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
   306
        self.commit()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   307
        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
   308
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   309
    def tearDown(self):
5785
c0661b963ced [test] fix test w/ closed connection pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5783
diff changeset
   310
        if not self.cnx._closed:
5783
c5ff8cd74758 [devtools/teslib] be more defensive on rollbacks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5778
diff changeset
   311
            self.cnx.rollback()
5175
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   312
        for cnx in self._cnxs:
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   313
            if not cnx._closed:
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   314
                cnx.close()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   315
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   316
    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
   317
        """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
   318
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   319
    # 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
   320
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   321
    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
   322
        """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
   323
        if req is None:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   324
            req = self.request()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   325
            return self.cnx.user(req)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   326
        else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   327
            return req.user
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   328
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   329
    def create_user(self, login, groups=('users',), password=None, req=None,
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
   330
                    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
   331
        """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
   332
        if password is None:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   333
            password = login.encode('utf8')
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
   334
        if req is None:
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
   335
            req = self._orig_cnx[0].request()
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
   336
        user = req.create_entity('CWUser', login=unicode(login),
14906474c55d [testlib] create_user support extra kwargs to give to create_entity(CWUser)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5036
diff changeset
   337
                                 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
   338
        req.execute('SET X in_group G WHERE X eid %%(x)s, G name IN(%s)'
14906474c55d [testlib] create_user support extra kwargs to give to create_entity(CWUser)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5036
diff changeset
   339
                    % ','.join(repr(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
   340
                    {'x': user.eid})
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
   341
        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
   342
        if commit:
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
   343
            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
   344
        return user
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   345
3647
2941f4a0aab9 refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3589
diff changeset
   346
    def login(self, login, **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
   347
        """return a connection for the given login/password"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   348
        if login == self.admlogin:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   349
            self.restore_connection()
6346
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   350
            # definitly don't want autoclose when used as a context manager
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   351
            return self.cnx
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   352
        autoclose = kwargs.pop('autoclose', True)
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   353
        if not kwargs:
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   354
            kwargs['password'] = str(login)
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   355
        self.cnx = repo_connect(self.repo, unicode(login), **kwargs)
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   356
        self.websession = DBAPISession(self.cnx)
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   357
        self._cnxs.append(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
   358
        if login == self.vreg.config.anonymous_user()[0]:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   359
            self.cnx.anonymous_connection = True
6346
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   360
        if autoclose:
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   361
            return TestCaseConnectionProxy(self, self.cnx)
1a968e545e4e [testlib] don't wrap main test connection into TestCaseConnectionProxy, it should not be closed afterwards
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6316
diff changeset
   362
        return self.cnx
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   363
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
    def restore_connection(self):
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
   365
        if not self.cnx is self._orig_cnx[0]:
5786
7c16a4e7a592 [test] fix stupd name error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5785
diff changeset
   366
            if not self.cnx._closed:
5785
c0661b963ced [test] fix test w/ closed connection pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5783
diff changeset
   367
                self.cnx.close()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   368
            try:
5175
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   369
                self._cnxs.remove(self.cnx)
5785
c0661b963ced [test] fix test w/ closed connection pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5783
diff changeset
   370
            except ValueError:
c0661b963ced [test] fix test w/ closed connection pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5783
diff changeset
   371
                pass
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
   372
        self.cnx, self.websession = self._orig_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
   373
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   374
    # db api ##################################################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   375
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   376
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   377
    def cursor(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
   378
        return self.cnx.cursor(req or self.request())
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   379
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   380
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   381
    def execute(self, rql, args=None, eidkey=None, 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
   382
        """executes <rql>, builds a resultset, and returns a couple (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
   383
        where req is a FakeRequest
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   384
        """
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   385
        if eidkey is not None:
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   386
            warn('[3.8] eidkey is deprecated, you can safely remove this argument',
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   387
                 DeprecationWarning, stacklevel=2)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   388
        req = req or self.request(rql=rql)
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   389
        return req.execute(unicode(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
   390
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   391
    @nocoverage
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 commit(self):
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   393
        try:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   394
            return self.cnx.commit()
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   395
        finally:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   396
            self.session.set_pool() # ensure pool still set after 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
   397
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   398
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   399
    def rollback(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   400
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   401
            self.cnx.rollback()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   402
        except ProgrammingError:
5785
c0661b963ced [test] fix test w/ closed connection pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5783
diff changeset
   403
            pass # connection closed
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   404
        finally:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   405
            self.session.set_pool() # ensure pool still set after 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
   406
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   407
    # # server side db api #######################################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   408
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   409
    def sexecute(self, rql, args=None, eid_key=None):
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   410
        if eid_key is not None:
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   411
            warn('[3.8] eid_key is deprecated, you can safely remove this argument',
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   412
                 DeprecationWarning, stacklevel=2)
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.session.set_pool()
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   414
        return self.session.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
   415
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   416
    # 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
   417
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
   418
    @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
   419
    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
   420
        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
   421
        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
   422
            self.vreg.register(obj)
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
   423
        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
   424
            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
   425
        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
   426
            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
   427
                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
   428
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   429
    # vregistry inspection utilities ###########################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   430
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   431
    def pviews(self, req, rset):
3468
b02fa4db2868 [tests] make unittest_viewselectors pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3454
diff changeset
   432
        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
   433
                      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
   434
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   435
    def pactions(self, req, rset,
3589
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3468
diff changeset
   436
                 skipcategories=('addrelated', 'siteactions', 'useractions', 'footer')):
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   437
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   438
                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
   439
                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
   440
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   441
    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
   442
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   443
                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
   444
                if a.category in categories]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   445
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   446
    def pactionsdict(self, req, rset,
3589
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3468
diff changeset
   447
                     skipcategories=('addrelated', 'siteactions', 'useractions', 'footer')):
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
        res = {}
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   449
        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
   450
            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
   451
                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
   452
        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
   453
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   454
    def action_submenu(self, req, rset, id):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   455
        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
   456
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   457
    def _test_action(self, action):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   458
        class fake_menu(list):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   459
            @property
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   460
            def items(self):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   461
                return self
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   462
        class fake_box(object):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   463
            def mk_action(self, label, url, **kwargs):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   464
                return (label, url)
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   465
            def box_action(self, action, **kwargs):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   466
                return (action.title, action.url())
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   467
        submenu = fake_menu()
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   468
        action.fill_menu(fake_box(), submenu)
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   469
        return submenu
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   470
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   471
    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
   472
        """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
   473
        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
   474
        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
   475
        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
   476
        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
   477
        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
   478
            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
   479
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   480
            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
   481
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   482
            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
   483
                     if view.category != 'startupview'
3454
ad1cddc06997 [testlib] added some new required attributes on FakeRequest, fix dummy NameError
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3418
diff changeset
   484
                     and not issubclass(view, notification.NotificationView)]
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   485
            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
   486
                try:
2774
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2770 2773
diff changeset
   487
                    view = viewsvreg._select_best(views, 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
   488
                    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
   489
                        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
   490
                    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   491
                        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
   492
                    # 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
   493
                    # 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
   494
                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
   495
                    continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   496
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   497
    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
   498
        """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
   499
        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
   500
        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
   501
            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
   502
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   503
    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
   504
        """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
   505
        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
   506
        for box in self.vreg['boxes'].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
   507
            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
   508
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   509
    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
   510
        """returns the list of startup views"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   511
        req = self.request()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   512
        for view in self.vreg['views'].possible_views(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
   513
            if view.category == 'startupview':
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   514
                yield view.__regid__
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   515
            else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   516
                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
   517
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   518
    # 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
   519
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   520
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   521
    @cached
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   522
    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
   523
        """return a cubicweb publisher"""
4137
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   524
        publisher = application.CubicWebPublisher(self.config, vreg=self.vreg)
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   525
        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
   526
            raise
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   527
        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
   528
        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
   529
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   530
    requestcls = fake.FakeRequest
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   531
    def request(self, *args, **kwargs):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   532
        """return a web ui request"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   533
        req = self.requestcls(self.vreg, form=kwargs)
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
   534
        req.set_session(self.websession)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   535
        return req
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   536
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   537
    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
   538
        """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
   539
        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
   540
        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
   541
        req = self.request(fname=fname, pageid='123', arg=args)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   542
        ctrl = self.vreg['controllers'].select('json', req)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   543
        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
   544
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   545
    def app_publish(self, req, path='view'):
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   546
        return self.app.publish(path, req)
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   547
5247
3c8f6e6014f4 [testlib] ctrl_publish now allow to specify the controller id as argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5229
diff changeset
   548
    def ctrl_publish(self, req, ctrl='edit'):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   549
        """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
   550
        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
   551
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   552
            result = ctrl.publish()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   553
            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
   554
        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
   555
            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
   556
            raise
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   557
        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
   558
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
   559
    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
   560
        """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
   561
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
   562
        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
   563
        """
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
   564
        req = self.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
   565
        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
   566
            url = url.encode(req.encoding) # req.setup_params() expects encoded strings
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
   567
        querystring = urlparse.urlparse(url)[-2]
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
   568
        params = urlparse.parse_qs(querystring)
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
   569
        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
   570
        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
   571
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
   572
    def url_publish(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
   573
        """takes `url`, uses application's app_resolver to find the
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
   574
        appropriate controller, and publishes the result.
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
   575
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
   576
        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
   577
        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
   578
        """
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
   579
        req = self.req_from_url(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
   580
        ctrlid, rset = self.app.url_resolver.process(req, req.relative_path(False))
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
   581
        return self.ctrl_publish(req, ctrlid)
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
   582
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   583
    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
   584
        """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
   585
        Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   586
        """
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   587
        try:
4719
aaed3f813ef8 kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4690
diff changeset
   588
            callback(req)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   589
        except Redirect, ex:
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   590
            try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   591
                path, params = ex.location.split('?', 1)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   592
            except ValueError:
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   593
                path = ex.location
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   594
                params = {}
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   595
            else:
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   596
                cleanup = lambda p: (p[0], unquote(p[1]))
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   597
                params = dict(cleanup(p.split('=', 1)) for p in params.split('&') if p)
5036
3e436a494ce3 [testlib] __errorurl may be a relative path, check we're actually removing base url first
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5020
diff changeset
   598
            if path.startswith(req.base_url()): # may be relative
3e436a494ce3 [testlib] __errorurl may be a relative path, check we're actually removing base url first
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5020
diff changeset
   599
                path = path[len(req.base_url()):]
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   600
            return path, params
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
        else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   602
            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
   603
4523
d8127c2bd6b5 use 'edit' as defaut path for expect_redirect_publish
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4513
diff changeset
   604
    def expect_redirect_publish(self, req, path='edit'):
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   605
        """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
   606
        get a Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   607
        """
4083
3b285889b8e9 3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4053
diff changeset
   608
        return self.expect_redirect(lambda x: self.app_publish(x, path), req)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   609
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   610
    def init_authentication(self, authmode, anonuser=None):
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   611
        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
   612
        self.set_option('anonymous-user', anonuser)
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   613
        req = self.request()
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
   614
        origsession = req.session
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
   615
        req.session = req.cnx = None
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
   616
        del req.execute # get back to class implementation
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   617
        sh = self.app.session_handler
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   618
        authm = sh.session_manager.authmanager
4916
4b8cdda342ae fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   619
        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
   620
        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
   621
        # not properly cleaned between tests
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   622
        self.open_sessions = sh.session_manager._sessions = {}
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
   623
        return req, origsession
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   624
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
   625
    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
   626
        sh = self.app.session_handler
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   627
        path, params = self.expect_redirect(lambda x: self.app.connect(x), req)
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
   628
        session = req.session
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   629
        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
   630
        self.assertEqual(session.login, origsession.login)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   631
        self.assertEqual(session.anonymous_session, False)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   632
        self.assertEqual(path, 'view')
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   633
        self.assertEqual(params, {'__message': 'welcome %s !' % req.user.login})
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   634
3676
fa170564e1a0 optional nbsessions arg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3657
diff changeset
   635
    def assertAuthFailure(self, req, nbsessions=0):
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
   636
        self.app.connect(req)
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
   637
        self.assertIsInstance(req.session, DBAPISession)
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   638
        self.assertEqual(req.session.cnx, None)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   639
        self.assertEqual(req.cnx, None)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   640
        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
   641
        clear_cache(req, 'get_authorization')
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   642
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   643
    # content validation #######################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   644
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   645
    # validators are used to validate (XML, DTD, whatever) view's content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   646
    # validators availables are :
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   647
    #  DTDValidator : validates XML + declared DTD
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   648
    #  SaxOnlyValidator : guarantees XML is well formed
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   649
    #  None : do not try to validate anything
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   650
    # 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
   651
    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
   652
        # 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
   653
        #
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
   654
        # 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
   655
        # 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
   656
        #'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
   657
        #'application/xhtml+xml': DTDValidator,
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   658
        'application/xml': htmlparser.SaxOnlyValidator,
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   659
        'text/xml': htmlparser.SaxOnlyValidator,
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
   660
        '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
   661
        '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
   662
        '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
   663
        '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
   664
        'application/json': 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
   665
        '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
   666
        }
562
bdadb26c4a3c old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents: 549
diff changeset
   667
    # 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
   668
    vid_validators = dict((vid, htmlparser.VALMAP[valkey])
562
bdadb26c4a3c old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents: 549
diff changeset
   669
                          for vid, valkey in VIEW_VALIDATORS.iteritems())
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
   670
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   671
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
   672
    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
   673
             **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   674
        """This method tests the view `vid` on `rset` using `template`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   675
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
   676
        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
   677
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   678
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   679
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   680
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   681
        """
1142
03a9acf3c299 rset may be None
sylvain.thenault@logilab.fr
parents: 1133
diff changeset
   682
        req = req or rset and rset.req or self.request()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   683
        req.form['vid'] = vid
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
   684
        kwargs['rset'] = rset
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
   685
        viewsreg = self.vreg['views']
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
   686
        view = viewsreg.select(vid, req, **kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   687
        # set explicit test description
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   688
        if rset is not None:
5875
e707d481219e [testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5815
diff changeset
   689
            self.set_description("testing vid=%s defined in %s with (%s)" % (
2070
d98f5be5e371 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   690
                vid, view.__module__, rset.printable_rql()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   691
        else:
5875
e707d481219e [testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5815
diff changeset
   692
            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
   693
                vid, view.__module__))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   694
        if template is None: # raw view testing, no template
1773
789ee507a8e0 use render
sylvain.thenault@logilab.fr
parents: 1605
diff changeset
   695
            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
   696
        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
   697
            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
   698
            templateview = viewsreg.select(template, req, **kwargs)
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
   699
            viewfunc = lambda **k: viewsreg.main_template(req, template,
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
   700
                                                          **kwargs)
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
   701
        kwargs.pop('rset')
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
   702
        return self._test_view(viewfunc, view, template, kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   703
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   704
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
   705
    def _test_view(self, viewfunc, view, template='main-template', kwargs={}):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   706
        """this method does the actual call to the view
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   707
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
   708
        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
   709
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   710
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   711
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   712
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   713
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   714
        output = None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   715
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   716
            output = viewfunc(**kwargs)
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
   717
            return self._check_html(output, view, template)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   718
        except (SystemExit, KeyboardInterrupt):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   719
            raise
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   720
        except:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   721
            # hijack exception: generative tests stop when the exception
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   722
            # is not an AssertionError
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   723
            klass, exc, tcbk = sys.exc_info()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   724
            try:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   725
                msg = '[%s in %s] %s' % (klass, view.__regid__, exc)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   726
            except:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   727
                msg = '[%s in %s] undisplayable exception' % (klass, view.__regid__)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   728
            if output is not None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   729
                position = getattr(exc, "position", (0,))[0]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   730
                if position:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   731
                    # define filter
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   732
                    output = output.splitlines()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   733
                    width = int(log(len(output), 10)) + 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   734
                    line_template = " %" + ("%i" % width) + "i: %s"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   735
                    # XXX no need to iterate the whole file except to get
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   736
                    # the line number
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   737
                    output = '\n'.join(line_template % (idx + 1, line)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   738
                                for idx, line in enumerate(output)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   739
                                if line_context_filter(idx+1, position))
1133
8a409ea0c9ec more linting
sylvain.thenault@logilab.fr
parents: 1132
diff changeset
   740
                    msg += '\nfor output:\n%s' % output
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   741
            raise AssertionError, msg, tcbk
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   742
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
   743
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   744
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   745
    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
   746
        """raises an exception if the HTML is invalid"""
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   747
        try:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   748
            validatorclass = self.vid_validators[view.__regid__]
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   749
        except KeyError:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   750
            if view.content_type in ('text/html', 'application/xhtml+xml'):
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   751
                if template is None:
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   752
                    default_validator = htmlparser.HTMLValidator
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   753
                else:
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   754
                    default_validator = htmlparser.DTDValidator
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   755
            else:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   756
                default_validator = 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
   757
            validatorclass = self.content_type_validators.get(view.content_type,
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   758
                                                              default_validator)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   759
        if validatorclass is None:
5974
cac990ad6180 [testlib] when no validator specified, simply return stripped output, not None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5948
diff changeset
   760
            return output.strip()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   761
        validator = validatorclass()
4346
02f12f39bae5 XXX quick fix html validation by removing <canvas>
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   762
        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
   763
            # 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
   764
            output = re.sub('<canvas.*?></canvas>', '', output)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   765
        return validator.parse_string(output.strip())
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   766
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   767
    # deprecated ###############################################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   768
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   769
    @deprecated('[3.8] use self.execute(...).get_entity(0, 0)')
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   770
    def entity(self, rql, args=None, eidkey=None, req=None):
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   771
        if eidkey is not None:
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   772
            warn('[3.8] eidkey is deprecated, you can safely remove this argument',
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   773
                 DeprecationWarning, stacklevel=2)
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   774
        return self.execute(rql, args, req=req).get_entity(0, 0)
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   775
4016
250784a2d105 deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3998
diff changeset
   776
    @deprecated('[3.6] use self.request().create_entity(...)')
250784a2d105 deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3998
diff changeset
   777
    def add_entity(self, etype, req=None, **kwargs):
250784a2d105 deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3998
diff changeset
   778
        if req is None:
250784a2d105 deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3998
diff changeset
   779
            req = self.request()
250784a2d105 deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3998
diff changeset
   780
        return req.create_entity(etype, **kwargs)
250784a2d105 deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3998
diff changeset
   781
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   782
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   783
# 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
   784
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   785
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
   786
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   787
# 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
   788
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   789
def how_many_dict(schema, cursor, how_many, skip):
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   790
    """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
   791
    satisfy relations cardinality.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   792
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   793
    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
   794
    least.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   795
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   796
    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
   797
    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
   798
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   799
    relmap = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   800
    for rschema in schema.relations():
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
   801
        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
   802
            continue
4053
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
   803
        for subj, obj in rschema.rdefs:
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
   804
            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
   805
            # 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
   806
            # obj to satisfy it
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   807
            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
   808
                # 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
   809
                # 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
   810
                # -> 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
   811
                #    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
   812
                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
   813
            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
   814
                # 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
   815
                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
   816
    unprotected = unprotected_entities(schema)
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   817
    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
   818
        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
   819
    howmanydict = {}
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   820
    # 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
   821
    # 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
   822
    for etype in unprotected_entities(schema, strict=True):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   823
        howmanydict[str(etype)] = cursor.execute('Any COUNT(X) WHERE X is %s' % etype)[0][0]
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   824
        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
   825
            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
   826
    # 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
   827
    # 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
   828
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   829
    # 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
   830
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   831
    # XXX we should first check there is no cycle then propagate changes
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   832
    for (rschema, etype), targets in relmap.iteritems():
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   833
        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
   834
        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
   835
    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
   836
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   837
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   838
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
   839
    """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
   840
    __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
   841
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
   842
    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
   843
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   844
    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
   845
    # 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
   846
    # 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
   847
    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
   848
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   849
    no_auto_populate = ()
3734
b2107f68176c ignored_relations should be a set
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3720
diff changeset
   850
    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
   851
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
   852
    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
   853
        return unprotected_entities(self.schema, strict=True)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
   854
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   855
    def custom_populate(self, how_many, cursor):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   856
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   857
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   858
    def post_populate(self, cursor):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   859
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   860
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
   861
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   862
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   863
    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
   864
        """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
   865
        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
   866
        """
5004
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
   867
        with security_enabled(self.session, read=False, write=False):
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
   868
            self._auto_populate(how_many)
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
   869
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
   870
    def _auto_populate(self, 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
   871
        cu = self.cursor()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   872
        self.custom_populate(how_many, cu)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   873
        vreg = self.vreg
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   874
        howmanydict = how_many_dict(self.schema, cu, how_many, 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
   875
        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
   876
            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
   877
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   878
            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
   879
            for rql, args in insert_entity_queries(etype, self.schema, vreg, nb):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   880
                cu.execute(rql, args)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   881
        edict = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   882
        for etype in unprotected_entities(self.schema, strict=True):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   883
            rset = cu.execute('%s X' % etype)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   884
            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
   885
        existingrels = {}
4036
137be4878127 [mq]: fix_set_addition
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 4016
diff changeset
   886
        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
   887
        for rschema in self.schema.relations():
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
   888
            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
   889
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   890
            rset = cu.execute('DISTINCT Any X,Y WHERE X %s Y' % rschema)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   891
            existingrels.setdefault(rschema.type, set()).update((x, y) for x, y in rset)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   892
        q = make_relations_queries(self.schema, edict, cu, ignored_relations,
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   893
                                   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
   894
        for rql, args in q:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   895
            try:
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   896
                cu.execute(rql, args)
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   897
            except ValidationError, ex:
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   898
                # failed to satisfy some constraint
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
   899
                print 'error in automatic db population', ex
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   900
        self.post_populate(cu)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   901
        self.commit()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   902
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   903
    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
   904
        etypes = etypes or self.to_test_etypes()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   905
        for etype in etypes:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   906
            if limit:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   907
                rql = 'Any X LIMIT %s WHERE X is %s' % (limit, etype)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   908
            else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   909
                rql = 'Any X WHERE X is %s' % etype
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   910
            rset = self.execute(rql)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   911
            for row in xrange(len(rset)):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   912
                if limit and row > limit:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   913
                    break
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   914
                # XXX iirk
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   915
                rset2 = rset.limit(limit=1, offset=row)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   916
                yield rset2
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   917
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
   918
    def iter_automatic_rsets(self, limit=10):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   919
        """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
   920
        etypes = self.to_test_etypes()
2219
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
   921
        if not etypes:
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
   922
            return
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   923
        for etype in etypes:
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
   924
            yield self.execute('Any X LIMIT %s WHERE X is %s' % (limit, etype))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   925
        etype1 = etypes.pop()
1775
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
   926
        try:
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
   927
            etype2 = etypes.pop()
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
   928
        except KeyError:
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
   929
            etype2 = etype1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   930
        # test a mixed query (DISTINCT/GROUP to avoid getting duplicate
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   931
        # X which make muledit view failing for instance (html validation fails
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   932
        # because of some duplicate "id" attributes)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   933
        yield self.execute('DISTINCT Any X, MAX(Y) GROUPBY X WHERE X is %s, Y is %s' % (etype1, etype2))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   934
        # test some application-specific queries if defined
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   935
        for rql in self.application_rql:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   936
            yield self.execute(rql)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   937
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   938
    def _test_everything_for(self, rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   939
        """this method tries to find everything that can be tested
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   940
        for `rset` and yields a callable test (as needed in generative tests)
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
        propdefs = self.vreg['propertydefs']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   943
        # make all components visible
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   944
        for k, v in propdefs.items():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   945
            if k.endswith('visible') and not v['default']:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   946
                propdefs[k]['default'] = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   947
        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
   948
            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
   949
            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
   950
                            self.view, view.__regid__, rset,
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 563
diff changeset
   951
                            rset.req.reset_headers(), 'main-template')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   952
            # We have to do this because some views modify the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   953
            # resultset's syntax tree
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   954
            rset = backup_rset
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   955
        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
   956
            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
   957
        for box in self.list_boxes_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
   958
            yield InnerTest(self._testname(rset, box.__regid__, 'box'), box.render)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   959
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   960
    @staticmethod
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   961
    def _testname(rset, objid, objtype):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   962
        return '%s_%s_%s' % ('_'.join(rset.column_types(0)), objid, objtype)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
   963
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   964
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   965
# 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
   966
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   967
class AutomaticWebTest(AutoPopulateTest):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   968
    """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
   969
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
   970
    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
   971
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   972
    def setUp(self):
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   973
        AutoPopulateTest.setUp(self)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   974
        # 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
   975
        # 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
   976
        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
   977
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   978
    ## one each
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   979
    def test_one_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   980
        self.auto_populate(1)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
   981
        for rset in self.iter_automatic_rsets(limit=1):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   982
            for testargs in self._test_everything_for(rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   983
                yield testargs
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   984
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   985
    ## ten each
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   986
    def test_ten_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   987
        self.auto_populate(10)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
   988
        for rset in self.iter_automatic_rsets(limit=10):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   989
            for testargs in self._test_everything_for(rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   990
                yield testargs
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
   991
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   992
    ## startup views
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   993
    def test_startup_views(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   994
        for vid in self.list_startup_views():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   995
            req = self.request()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   996
            yield self.view, vid, None, req
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   997
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   998
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   999
# registry instrumentization ###################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1000
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1001
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
  1002
    try:
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1003
        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
  1004
    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
  1005
        pass
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1006
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1007
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
  1008
def vreg_instrumentize(testclass):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1009
    # XXX broken
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
  1010
    from cubicweb.devtools.apptest import TestEnvironment
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1011
    env = testclass._env = TestEnvironment('data', configcls=testclass.configcls)
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
  1012
    for reg in env.vreg.values():
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
  1013
        reg._selected = {}
2668
979c7ccb4a86 [testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
  1014
        try:
979c7ccb4a86 [testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
  1015
            orig_select_best = reg.__class__.__orig_select_best
979c7ccb4a86 [testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
  1016
        except:
2770
356e9d7c356d R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2668
diff changeset
  1017
            orig_select_best = reg.__class__._select_best
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
  1018
        def instr_select_best(self, *args, **kwargs):
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
  1019
            selected = orig_select_best(self, *args, **kwargs)
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
  1020
            try:
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
  1021
                self._selected[selected.__class__] += 1
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
  1022
            except KeyError:
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
  1023
                self._selected[selected.__class__] = 1
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
  1024
            except AttributeError:
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
  1025
                pass # occurs on reg used to restore database
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
  1026
            return selected
2770
356e9d7c356d R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2668
diff changeset
  1027
        reg.__class__._select_best = instr_select_best
2668
979c7ccb4a86 [testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
  1028
        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
  1029
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1030
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
  1031
def print_untested_objects(testclass, skipregs=('hooks', 'etypes')):
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
  1032
    for regname, reg in testclass._env.vreg.iteritems():
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
  1033
        if regname in skipregs:
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
  1034
            continue
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1035
        for appobjects in reg.itervalues():
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1036
            for appobject in appobjects:
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1037
                if not reg._selected.get(appobject):
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1038
                    print 'not tested', regname, appobject