devtools/testlib.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Tue, 10 Jul 2012 11:11:15 +0200
branchstable
changeset 8460 b1f6777fc839
parent 8004 7f14b5e25b97
child 8463 a964c40adbe3
permissions -rw-r--r--
[testlib] introduce temporary_permissions context manager Fix a test failure due to cached method on the way as usage of the context manager enforce proper interaction with schema objects
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
     1
# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5401
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5786
diff changeset
    18
"""this module contains base classes and utilities for cubicweb tests"""
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
6585
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6469
diff changeset
    27
import urlparse
6631
26c303c3f1aa [test] make test independant from the working directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6590
diff changeset
    28
from os.path import dirname, join, abspath
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    29
from urllib import unquote
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    30
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
    31
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
    32
from warnings import warn
7313
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
    33
from types import NoneType
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
    34
from itertools import chain
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
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
import yams.schema
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
    38
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
    39
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
    40
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
    41
from logilab.common.umessage import message_from_string
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
    42
from logilab.common.decorators import cached, classproperty, clear_cache, iclassmethod
6454
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
    43
from logilab.common.deprecation import deprecated, class_deprecated
6720
43a38c093f6f [testlib] Use logilab.common.shellutils.getlogin instead of local hack.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6589
diff changeset
    44
from logilab.common.shellutils import getlogin
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
    46
from cubicweb import ValidationError, NoSelectableObject, AuthenticationError
7313
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
    47
from cubicweb import cwconfig, dbapi, devtools, web, server
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.sobjects import notification
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
    49
from cubicweb.web import Redirect, application
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
    50
from cubicweb.server.session import Session, security_enabled
6398
ea26eb5fd388 [test] send mail synchronously during tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6369
diff changeset
    51
from cubicweb.server.hook import SendMailOp
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
from cubicweb.devtools import SYSTEM_ENTITIES, SYSTEM_RELATIONS, VIEW_VALIDATORS
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    53
from cubicweb.devtools import BASE_URL, fake, htmlparser, DEFAULT_EMPTY_DB_ID
5389
809d3b5b3d31 [python2.6] careful: json-py provides a json package. We don't want that.
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5377
diff changeset
    54
from cubicweb.utils import json
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    55
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    56
# low-level utilities ##########################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
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
    59
    """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
    60
    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
    61
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
    def do_view(self, arg):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
        import webbrowser
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
        data = self._getval(arg)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    65
        with file('/tmp/toto.html', 'w') as toto:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    66
            toto.write(data)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
        webbrowser.open('file:///tmp/toto.html')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
def line_context_filter(line_no, center, before=3, after=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
    """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
    71
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    72
    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
    73
    """
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
    if after is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
        after = before
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
    return center - before <= line_no <= center + after
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    78
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
    79
    """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
    80
    (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
    81
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    82
    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
    83
        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
    84
    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    85
        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
    86
    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
    87
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    88
# 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
    89
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    90
MAILBOX = []
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    91
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    92
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
    93
    """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
    94
    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
    95
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    96
    * `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
    97
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
    98
    * `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
    99
      message
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
    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
   102
        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
   103
        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
   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
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   106
    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
   107
        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
   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
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   110
    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
   111
        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
   112
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   113
    @property
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 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
   115
        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
   116
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   117
    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
   118
        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
   119
                                                  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
   120
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   121
# 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
   122
# 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
   123
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
   124
    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
   125
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   126
    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
   127
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   128
    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
   129
        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
   130
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   131
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
   132
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   133
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
   134
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
   135
    """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
   136
    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
   137
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   138
    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
   139
    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
   140
    """
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   141
    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
   142
        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
   143
        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
   144
7da7c270bbbd [devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6109
diff changeset
   145
    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
   146
        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
   147
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
    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
   149
        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
   150
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
    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
   152
        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
   153
            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
   154
        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
   155
            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
   156
            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
   157
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   158
# 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
   159
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   160
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
   161
    """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
   162
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   163
    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
   164
5229
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   165
    * `vreg`, the vregistry
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   166
    * `schema`, self.vreg.schema
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   167
    * `config`, cubicweb configuration
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   168
    * `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
   169
    * `session`, server side session associated to `cnx`
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   170
    * `app`, the cubicweb publisher (for web testing)
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   171
    * `repo`, the repository object
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   172
    * `admlogin`, login of the admin user
67dbd07a05f3 [doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5175
diff changeset
   173
    * `admpassword`, password of the admin user
6694
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   174
    * `shell`, create and use shell environment
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   175
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   176
    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
   177
    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
   178
    reset_schema = reset_vreg = False # reset schema / vreg between tests
6441
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6439
diff changeset
   179
    tags = TestCase.tags | Tags('cubicweb', 'cw_repo')
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   180
    test_db_id = DEFAULT_EMPTY_DB_ID
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   181
    _cnxs = set() # establised connection
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   182
    _cnx  = None  # current connection
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   183
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   184
    # Too much complicated stuff. the class doesn't need to bear the repo anymore
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   185
    @classmethod
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   186
    def set_cnx(cls, cnx):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   187
        cls._cnxs.add(cnx)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   188
        cls._cnx = cnx
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   189
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   190
    @property
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   191
    def cnx(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   192
        return self.__class__._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
   193
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   194
    @classproperty
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   195
    def config(cls):
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   196
        """return the configuration object
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   197
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   198
        Configuration is cached on the test class.
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   199
        """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   200
        try:
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   201
            assert not cls is CubicWebTC, "Don't use CubicWebTC directly to prevent database caching issue"
2773
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 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
   203
        except KeyError:
6631
26c303c3f1aa [test] make test independant from the working directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6590
diff changeset
   204
            home = abspath(join(dirname(sys.modules[cls.__module__].__file__), cls.appid))
6585
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6469
diff changeset
   205
            config = cls._config = cls.configcls(cls.appid, apphome=home)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   206
            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
   207
            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
   208
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   209
    @classmethod
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   210
    def init_config(cls, config):
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   211
        """configuration initialization hooks.
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   212
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   213
        You may only want to override here the configuraton logic.
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   214
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   215
        Otherwise, consider to use a different :class:`ApptestConfiguration`
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6410
diff changeset
   216
        defined in the `configcls` class attribute"""
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   217
        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
   218
        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
   219
        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
   220
        # 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
   221
        #config.global_set_option('query-log-file',
edfe43ceaa35 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   222
        #                         '/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
   223
        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
   224
        # 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
   225
        # 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
   226
        config.global_set_option('default-dest-addrs', ['whatever'])
6720
43a38c093f6f [testlib] Use logilab.common.shellutils.getlogin instead of local hack.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6589
diff changeset
   227
        send_to =  '%s@logilab.fr' % getlogin()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   228
        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
   229
        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
   230
        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
   231
        config.global_set_option('sender-addr', 'cubicweb-test@logilab.fr')
6432
30bde2b7fea2 restore line dropped in 6424:f443a2b8a5c7 which is necessary to have proper base-url on test server config (used for ms tests at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   232
        # default_base_url on config class isn't enough for TestServerConfiguration
6439
fe0fb6f95ff0 [test] we must consider default_base_url()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6432
diff changeset
   233
        config.global_set_option('base-url', config.default_base_url())
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   234
        # 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
   235
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   236
            config.global_set_option('embed-allowed', re.compile('.*'))
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   237
        except Exception: # not in server only configuration
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   238
            pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   239
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   240
    #XXX this doesn't need to a be classmethod anymore
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   241
    @classmethod
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   242
    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
   243
        """init the repository and connection to it.
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   244
        """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   245
        # setup configuration for test
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   246
        cls.init_config(cls.config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   247
        # get or restore and working db.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   248
        db_handler = devtools.get_test_db_handler(cls.config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   249
        db_handler.build_db_cache(cls.test_db_id, cls.pre_setup_database)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   250
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   251
        cls.repo, cnx = db_handler.get_repo_and_cnx(cls.test_db_id)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   252
        # no direct assignation to cls.cnx anymore.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   253
        # cnx is now an instance property that use a class protected attributes.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   254
        cls.set_cnx(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
   255
        cls.vreg = cls.repo.vreg
7313
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
   256
        cls.websession = dbapi.DBAPISession(cnx, cls.admlogin)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   257
        cls._orig_cnx = (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
   258
        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
   259
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   260
    def _close_cnx(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   261
        for cnx in list(self._cnxs):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   262
            if not cnx._closed:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   263
                cnx.rollback()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   264
                cnx.close()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   265
            self._cnxs.remove(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
   266
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   267
    # 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
   268
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   269
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   270
    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
   271
        """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
   272
        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
   273
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   274
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   275
    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
   276
        """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
   277
        session = self.repo._sessions[self.cnx.sessionid]
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7377
diff changeset
   278
        session.set_cnxset()
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
   279
        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
   280
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   281
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   282
    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
   283
        """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
   284
        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
   285
6694
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   286
    def shell(self):
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   287
        """return a shell session object"""
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   288
        from cubicweb.server.migractions import ServerMigrationHelper
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   289
        return ServerMigrationHelper(None, repo=self.repo, cnx=self.cnx,
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   290
                                     interactive=False,
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   291
                                     # hack so it don't try to load fs schema
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   292
                                     schema=1)
d9eac4fd57dc [devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6687
diff changeset
   293
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   294
    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
   295
        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
   296
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   297
    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
   298
        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
   299
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   300
    def debugged(self, debugmode):
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   301
        return server.debugged(debugmode)
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   302
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
    # 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
   304
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   305
    def setUp(self):
6398
ea26eb5fd388 [test] send mail synchronously during tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6369
diff changeset
   306
        # monkey patch send mail operation so emails are sent synchronously
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   307
        self._patch_SendMailOp()
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   308
        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
   309
        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
   310
        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
   311
            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
   312
        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
   313
            self._init_repo()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   314
            self.addCleanup(self._close_cnx)
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
   315
        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
   316
            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
   317
            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
   318
        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
   319
        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
   320
        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
   321
        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
   322
6efb7a7ae570 [testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5128
diff changeset
   323
    def tearDown(self):
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   324
        # XXX hack until logilab.common.testlib is fixed
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   325
        while self._cleanups:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   326
            cleanup, args, kwargs = self._cleanups.pop(-1)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   327
            cleanup(*args, **kwargs)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   328
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   329
    def _patch_SendMailOp(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   330
        # monkey patch send mail operation so emails are sent synchronously
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   331
        _old_mail_postcommit_event = SendMailOp.postcommit_event
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   332
        SendMailOp.postcommit_event = SendMailOp.sendmails
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   333
        def reverse_SendMailOp_monkey_patch():
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   334
            SendMailOp.postcommit_event = _old_mail_postcommit_event
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   335
        self.addCleanup(reverse_SendMailOp_monkey_patch)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   336
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   337
    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
   338
        """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
   339
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   340
    @classmethod
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   341
    def pre_setup_database(cls, session, config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   342
        """add your pre database setup code by overriding this method
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   343
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   344
        Do not forget to set the cls.test_db_id value to enable caching of the
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   345
        result.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   346
        """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   347
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   348
    # 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
   349
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   350
    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
   351
        """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
   352
        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
   353
            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
   354
            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
   355
        else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   356
            return req.user
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   357
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   358
    @iclassmethod # XXX turn into a class method
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   359
    def create_user(self, req, login=None, groups=('users',), password=None,
7337
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   360
                    email=None, commit=True, **kwargs):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   361
        """create and return a new user entity"""
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   362
        if isinstance(req, basestring):
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   363
            warn('[3.12] create_user arguments are now (req, login[, groups, password, commit, **kwargs])',
7324
5f7813ae9fb8 [testlib] fix deprecation warning stack level
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7313
diff changeset
   364
                 DeprecationWarning, stacklevel=2)
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   365
            if not isinstance(groups, (tuple, list)):
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   366
                password = groups
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   367
                groups = login
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   368
            elif isinstance(login, tuple):
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   369
                groups = login
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   370
            login = req
7307
a650e6267e97 [CubicWebTC] fix create_user bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7222
diff changeset
   371
            assert not isinstance(self, type)
a650e6267e97 [CubicWebTC] fix create_user bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7222
diff changeset
   372
            req = self._orig_cnx[0].request()
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
        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
   374
            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
   375
        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
   376
                                 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
   377
        req.execute('SET X in_group G WHERE X eid %%(x)s, G name IN(%s)'
7038
fe0afc4e8ebb [testlib] fix rql generation bug w/ groups given as unicode string
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6979
diff changeset
   378
                    % ','.join(repr(str(g)) for g in groups),
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   379
                    {'x': user.eid})
7337
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   380
        if email is not None:
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   381
            req.create_entity('EmailAddress', address=unicode(email),
67cd9d5b4c2e [testlib] create_user may now create user's email address
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7331
diff changeset
   382
                              reverse_primary_email=user)
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
   383
        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
   384
        if commit:
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   385
            try:
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   386
                req.commit() # req is a session
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   387
            except AttributeError:
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7163
diff changeset
   388
                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
   389
        return user
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   390
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
   391
    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
   392
        """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
   393
        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
   394
            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
   395
            # 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
   396
            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
   397
        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
   398
        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
   399
            kwargs['password'] = str(login)
7313
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
   400
        self.set_cnx(dbapi.repo_connect(self.repo, unicode(login), **kwargs))
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
   401
        self.websession = dbapi.DBAPISession(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
   402
        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
   403
            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
   404
        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
   405
            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
   406
        return self.cnx
563
a690996639ca [testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 562
diff changeset
   407
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   408
    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
   409
        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
   410
            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
   411
                self.cnx.close()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   412
        cnx, self.websession = self._orig_cnx
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   413
        self.set_cnx(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
   414
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   415
    # 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
   416
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   417
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   418
    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
   419
        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
   420
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   421
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   422
    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
   423
        """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
   424
        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
   425
        """
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   426
        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
   427
            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
   428
                 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
   429
        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
   430
        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
   431
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   432
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   433
    def commit(self):
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   434
        try:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   435
            return self.cnx.commit()
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   436
        finally:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7377
diff changeset
   437
            self.session.set_cnxset() # ensure cnxset 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
   438
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   439
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   440
    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
   441
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   442
            self.cnx.rollback()
7313
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
   443
        except dbapi.ProgrammingError:
5785
c0661b963ced [test] fix test w/ closed connection pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5783
diff changeset
   444
            pass # connection closed
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4835
diff changeset
   445
        finally:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7377
diff changeset
   446
            self.session.set_cnxset() # ensure cnxset 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
   447
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   448
    # # 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
   449
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   450
    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
   451
        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
   452
            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
   453
                 DeprecationWarning, stacklevel=2)
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7377
diff changeset
   454
        self.session.set_cnxset()
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   455
        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
   456
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   457
    # 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
   458
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
   459
    @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
   460
    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
   461
        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
   462
        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
   463
            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
   464
        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
   465
            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
   466
        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
   467
            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
   468
                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
   469
8460
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   470
    @contextmanager
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   471
    def temporary_permissions(self, *perm_overrides, **perm_kwoverrides):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   472
        """Set custom schema permissions within context.
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   473
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   474
        There are two ways to call this method, which may be used together :
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   475
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   476
        * using positional argument(s):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   477
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   478
          .. sourcecode:: python
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   479
                rdef = self.schema['CWUser'].rdef('login')
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   480
                with self.temporary_permissions((rdef, {'read': ()})):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   481
                    ...
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   482
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   483
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   484
        * using named argument(s):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   485
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   486
          .. sourcecode:: python
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   487
                rdef = self.schema['CWUser'].rdef('login')
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   488
                with self.temporary_permissions(CWUser={'read': ()}):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   489
                    ...
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   490
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   491
        Usually the former will be prefered to override permissions on a
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   492
        relation definition, while the latter is well suited for entity types.
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   493
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   494
        The allowed keys in the permission dictionary depends on the schema type
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   495
        (entity type / relation definition). Resulting permissions will be
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   496
        similar to `orig_permissions.update(partial_perms)`.
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   497
        """
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   498
        torestore = []
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   499
        for erschema, etypeperms in chain(perm_overrides, perm_kwoverrides.iteritems()):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   500
            if isinstance(erschema, basestring):
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   501
                erschema = self.schema[erschema]
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   502
            for action, actionperms in etypeperms.iteritems():
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   503
                origperms = erschema.permissions[action]
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   504
                erschema.set_action_permissions(action, actionperms)
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   505
                torestore.append([erschema, action, origperms])
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   506
        yield
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   507
        for erschema, action, permissions in torestore:
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   508
            if action is None:
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   509
                erschema.permissions = permissions
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   510
            else:
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   511
                erschema.set_action_permissions(action, permissions)
b1f6777fc839 [testlib] introduce temporary_permissions context manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8004
diff changeset
   512
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   513
    def assertModificationDateGreater(self, entity, olddate):
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   514
        entity.cw_attr_cache.pop('modification_date', None)
7763
31210a2ead63 drop unittest deprecation warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7441
diff changeset
   515
        self.assertTrue(entity.modification_date > olddate)
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   516
7376
38524ca653e5 [entity] fix cw_instantiate w/ reverse_ relation crash when either multiple entities are given or an eid instead of an entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7337
diff changeset
   517
    def assertItemsEqual(self, it1, it2, *args, **kwargs):
38524ca653e5 [entity] fix cw_instantiate w/ reverse_ relation crash when either multiple entities are given or an eid instead of an entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7337
diff changeset
   518
        it1 = set(getattr(x, 'eid', x) for x in it1)
38524ca653e5 [entity] fix cw_instantiate w/ reverse_ relation crash when either multiple entities are given or an eid instead of an entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7337
diff changeset
   519
        it2 = set(getattr(x, 'eid', x) for x in it2)
38524ca653e5 [entity] fix cw_instantiate w/ reverse_ relation crash when either multiple entities are given or an eid instead of an entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7337
diff changeset
   520
        super(CubicWebTC, self).assertItemsEqual(it1, it2, *args, **kwargs)
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   521
7441
b70f4f4c8620 [testlib] add convenience assertion method to check __message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7439
diff changeset
   522
    def assertMessageEqual(self, req, params, msg):
b70f4f4c8620 [testlib] add convenience assertion method to check __message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7439
diff changeset
   523
        msg = req.session.data[params['_cwmsgid']]
b70f4f4c8620 [testlib] add convenience assertion method to check __message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7439
diff changeset
   524
        self.assertEqual(msg, msg)
b70f4f4c8620 [testlib] add convenience assertion method to check __message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7439
diff changeset
   525
7039
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   526
    # workflow utilities #######################################################
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   527
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   528
    def assertPossibleTransitions(self, entity, expected):
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   529
        transitions = entity.cw_adapt_to('IWorkflowable').possible_transitions()
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   530
        self.assertListEqual(sorted(tr.name for tr in transitions),
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   531
                             sorted(expected))
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   532
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   533
df0e8581b06f [testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7038
diff changeset
   534
    # views and actions registries inspection ##################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   535
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   536
    def pviews(self, req, rset):
3468
b02fa4db2868 [tests] make unittest_viewselectors pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3454
diff changeset
   537
        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
   538
                      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
   539
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   540
    def pactions(self, req, rset,
6967
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   541
                 skipcategories=('addrelated', 'siteactions', 'useractions',
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   542
                                 'footer', 'manage')):
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   543
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   544
                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
   545
                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
   546
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   547
    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
   548
        return [(a.__regid__, a.__class__)
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   549
                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
   550
                if a.category in categories]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   551
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   552
    def pactionsdict(self, req, rset,
6967
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   553
                     skipcategories=('addrelated', 'siteactions', 'useractions',
07d889e3f35d [testlib] by default skip new 'manage' action's category
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   554
                                     'footer', 'manage')):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   555
        res = {}
2813
0cf6c8005bf6 R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2793
diff changeset
   556
        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
   557
            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
   558
                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
   559
        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
   560
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   561
    def action_submenu(self, req, rset, id):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   562
        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
   563
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   564
    def _test_action(self, action):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   565
        class fake_menu(list):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   566
            @property
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   567
            def items(self):
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   568
                return self
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   569
        class fake_box(object):
6800
3f3d576b87d9 [web action] refactor box menu handling, fixing #1401943 on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6774
diff changeset
   570
            def action_link(self, action, **kwargs):
3230
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   571
                return (action.title, action.url())
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   572
        submenu = fake_menu()
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   573
        action.fill_menu(fake_box(), submenu)
1d25e928c299 backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163 3226
diff changeset
   574
        return submenu
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   575
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   576
    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
   577
        """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
   578
        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
   579
        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
   580
        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
   581
        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
   582
        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
   583
            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
   584
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   585
            if 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
   586
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   587
            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
   588
                     if view.category != 'startupview'
6454
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
   589
                     and not issubclass(view, notification.NotificationView)
97203d0af4cb [test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6442
diff changeset
   590
                     and not isinstance(view, class_deprecated)]
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   591
            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
   592
                try:
2774
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2770 2773
diff changeset
   593
                    view = viewsvreg._select_best(views, req, rset=rset)
7272
771f594c12a2 [vreg] vregistry._select_best was needlessly instanciating NoSelectableObject (closes #1626708)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7222
diff changeset
   594
                    if view is None:
771f594c12a2 [vreg] vregistry._select_best was needlessly instanciating NoSelectableObject (closes #1626708)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7222
diff changeset
   595
                        raise NoSelectableObject((req,), {'rset':rset}, views)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   596
                    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
   597
                        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
   598
                    else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   599
                        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
   600
                    # 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
   601
                    # 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
   602
                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
   603
                    continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   604
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   605
    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
   606
        """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
   607
        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
   608
        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
   609
            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
   610
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   611
    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
   612
        """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
   613
        req = rset.req
6141
b8287e54b528 [web api] unify 'contentnav' (VComponent) and 'boxes' registries as 'ctxcomponents' (CtxComponent)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6140
diff changeset
   614
        for box in self.vreg['ctxcomponents'].possible_objects(req, rset=rset):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   615
            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
   616
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   617
    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
   618
        """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
   619
        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
   620
        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
   621
            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
   622
                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
   623
            else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   624
                not_selected(self.vreg, view)
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   625
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   626
    # 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
   627
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   628
    @property
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   629
    @cached
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   630
    def 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
   631
        """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
   632
        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
   633
        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
   634
            raise
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   635
        publisher.error_handler = raise_error_handler
3a2d6c38bcd9 override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4083
diff changeset
   636
        return publisher
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   637
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   638
    requestcls = fake.FakeRequest
7434
17ef6f9efaa1 [test] fix tests broken by 7427:5338d895b891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7376
diff changeset
   639
    def request(self, rollbackfirst=False, url=None, **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
   640
        """return a web ui request"""
7434
17ef6f9efaa1 [test] fix tests broken by 7427:5338d895b891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7376
diff changeset
   641
        req = self.requestcls(self.vreg, url=url, form=kwargs)
6410
2e7a7b0829ed [test] fix tests broken by transaction behaviour on Unauthorized/ValidationError (no rollback but connection marked as non-commitable)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6408
diff changeset
   642
        if rollbackfirst:
2e7a7b0829ed [test] fix tests broken by transaction behaviour on Unauthorized/ValidationError (no rollback but connection marked as non-commitable)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6408
diff changeset
   643
            self.websession.cnx.rollback()
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
   644
        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
   645
        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
   646
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   647
    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
   648
        """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
   649
        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
   650
        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
   651
        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
   652
        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
   653
        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
   654
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   655
    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
   656
        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
   657
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
   658
    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
   659
        """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
   660
        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
   661
        try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   662
            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
   663
            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
   664
        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
   665
            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
   666
            raise
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   667
        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
   668
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
   669
    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
   670
        """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
   671
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
   672
        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
   673
        """
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
   674
        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
   675
        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
   676
            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
   677
        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
   678
        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
   679
        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
   680
        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
   681
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
   682
    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
   683
        """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
   684
        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
   685
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
   686
        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
   687
        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
   688
        """
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
   689
        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
   690
        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
   691
        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
   692
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   693
    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
   694
        """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
   695
        Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   696
        """
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   697
        try:
4719
aaed3f813ef8 kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4690
diff changeset
   698
            callback(req)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   699
        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
   700
            try:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   701
                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
   702
            except ValueError:
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   703
                path = ex.location
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   704
                params = {}
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   705
            else:
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   706
                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
   707
                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
   708
            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
   709
                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
   710
            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
   711
        else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   712
            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
   713
4523
d8127c2bd6b5 use 'edit' as defaut path for expect_redirect_publish
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4513
diff changeset
   714
    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
   715
        """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
   716
        get a Redirect exception
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   717
        """
4083
3b285889b8e9 3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4053
diff changeset
   718
        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
   719
7163
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   720
    def set_auth_mode(self, authmode, anonuser=None):
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   721
        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
   722
        self.set_option('anonymous-user', anonuser)
7071
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   723
        if anonuser is None:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   724
            self.config.anonymous_credential = None
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   725
        else:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7060
diff changeset
   726
            self.config.anonymous_credential = (anonuser, anonuser)
7163
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   727
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   728
    def init_authentication(self, authmode, anonuser=None):
d6d905d0344f [web test] extract a set_auth_mode method from init_authentication and use it in test_fb_login_concept to avoid bad test interaction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7088
diff changeset
   729
        self.set_auth_mode(authmode, anonuser)
7434
17ef6f9efaa1 [test] fix tests broken by 7427:5338d895b891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7376
diff changeset
   730
        req = self.request(url='login')
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
   731
        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
   732
        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
   733
        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
   734
        sh = self.app.session_handler
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   735
        authm = sh.session_manager.authmanager
4916
4b8cdda342ae fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   736
        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
   737
        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
   738
        # not properly cleaned between tests
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   739
        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
   740
        return req, origsession
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   741
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
   742
    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
   743
        sh = self.app.session_handler
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   744
        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
   745
        session = req.session
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   746
        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
   747
        self.assertEqual(session.login, origsession.login)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   748
        self.assertEqual(session.anonymous_session, False)
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   749
        self.assertEqual(path, 'view')
7441
b70f4f4c8620 [testlib] add convenience assertion method to check __message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7439
diff changeset
   750
        self.assertMessageEqual(req, params, '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
   751
3676
fa170564e1a0 optional nbsessions arg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3657
diff changeset
   752
    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
   753
        self.app.connect(req)
7313
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
   754
        self.assertIsInstance(req.session, dbapi.DBAPISession)
6369
a151453dc564 [test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6346
diff changeset
   755
        self.assertEqual(req.session.cnx, None)
7313
02fb1dcc99a2 [testlib] fix assertAuthFailure to consider both None and dbapi._NeedAuthAccessMock as meaning 'no connection has been set'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7307
diff changeset
   756
        self.assertIsInstance(req.cnx, (dbapi._NeedAuthAccessMock, NoneType))
7434
17ef6f9efaa1 [test] fix tests broken by 7427:5338d895b891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7376
diff changeset
   757
        # + 1 since we should still have session without connection set
17ef6f9efaa1 [test] fix tests broken by 7427:5338d895b891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7376
diff changeset
   758
        self.assertEqual(len(self.open_sessions), nbsessions + 1)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   759
        clear_cache(req, 'get_authorization')
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3647
diff changeset
   760
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
    # content validation #######################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   762
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   763
    # validators are used to validate (XML, DTD, whatever) view's content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   764
    # validators availables are :
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   765
    #  DTDValidator : validates XML + declared DTD
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   766
    #  SaxOnlyValidator : guarantees XML is well formed
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   767
    #  None : do not try to validate anything
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   768
    # 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
   769
    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
   770
        # 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
   771
        #
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
   772
        # 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
   773
        # 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
   774
        #'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
   775
        #'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
   776
        '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
   777
        '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
   778
        '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
   779
        '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
   780
        '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
   781
        '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
   782
        '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
   783
        '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
   784
        }
562
bdadb26c4a3c old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents: 549
diff changeset
   785
    # 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
   786
    vid_validators = dict((vid, htmlparser.VALMAP[valkey])
562
bdadb26c4a3c old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents: 549
diff changeset
   787
                          for vid, valkey in VIEW_VALIDATORS.iteritems())
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
   788
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   789
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
   790
    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
   791
             **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   792
        """This method tests the view `vid` on `rset` using `template`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   793
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
   794
        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
   795
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   796
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   797
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   798
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   799
        """
1142
03a9acf3c299 rset may be None
sylvain.thenault@logilab.fr
parents: 1133
diff changeset
   800
        req = req or rset and rset.req or self.request()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   801
        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
   802
        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
   803
        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
   804
        view = viewsreg.select(vid, req, **kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   805
        # set explicit test description
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   806
        if rset is not None:
5875
e707d481219e [testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5815
diff changeset
   807
            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
   808
                vid, view.__module__, rset.printable_rql()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   809
        else:
5875
e707d481219e [testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5815
diff changeset
   810
            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
   811
                vid, view.__module__))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   812
        if template is None: # raw view testing, no template
1773
789ee507a8e0 use render
sylvain.thenault@logilab.fr
parents: 1605
diff changeset
   813
            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
   814
        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
   815
            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
   816
            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
   817
            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
   818
                                                          **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
   819
        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
   820
        return self._test_view(viewfunc, view, template, kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   821
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   822
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
   823
    def _test_view(self, viewfunc, view, template='main-template', kwargs={}):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   824
        """this method does the actual call to the view
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   825
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
   826
        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
   827
        and parsed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   828
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   829
        :returns: an instance of `cubicweb.devtools.htmlparser.PageInfo`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   830
                  encapsulation the generated HTML
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   831
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   832
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   833
            output = viewfunc(**kwargs)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   834
        except Exception:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   835
            # hijack exception: generative tests stop when the exception
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   836
            # is not an AssertionError
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   837
            klass, exc, tcbk = sys.exc_info()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   838
            try:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   839
                msg = '[%s in %s] %s' % (klass, view.__regid__, exc)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   840
            except Exception:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   841
                msg = '[%s in %s] undisplayable exception' % (klass, view.__regid__)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   842
            raise AssertionError, msg, tcbk
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   843
        return self._check_html(output, view, template)
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
   844
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   845
    def get_validator(self, view=None, content_type=None, output=None):
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   846
        if view is not None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   847
            try:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   848
                return self.vid_validators[view.__regid__]()
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   849
            except KeyError:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   850
                if content_type is None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   851
                    content_type = view.content_type
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   852
        if content_type is None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   853
            content_type = 'text/html'
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   854
        if content_type in ('text/html', 'application/xhtml+xml'):
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   855
            if output and output.startswith('<?xml'):
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   856
                default_validator = htmlparser.DTDValidator
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   857
            else:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   858
                default_validator = htmlparser.HTMLValidator
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   859
        else:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   860
            default_validator = None
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   861
        validatorclass = self.content_type_validators.get(content_type,
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   862
                                                          default_validator)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   863
        if validatorclass is None:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   864
            return
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   865
        return validatorclass()
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   866
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   867
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   868
    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
   869
        """raises an exception if the HTML is invalid"""
6772
68bb0943d192 [test, html validation] make validator selection somewhat smarter (at least it works properly when content is demoted from xhtml to html, making the XMLDemotingValidator class useless
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6721
diff changeset
   870
        output = output.strip()
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   871
        validator = self.get_validator(view, output=output)
6979
a8fbcf9b6572 [testlib] take care, validator may be None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6978
diff changeset
   872
        if validator is None:
7821
3ecd114f6d75 [testlib] make self.view() return raw output if no validator is used
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7797
diff changeset
   873
            return output # return raw output if no validator is defined
4346
02f12f39bae5 XXX quick fix html validation by removing <canvas>
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   874
        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
   875
            # 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
   876
            output = re.sub('<canvas.*?></canvas>', '', output)
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   877
        return self.assertWellFormed(validator, output.strip(), context= view.__regid__)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   878
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   879
    def assertWellFormed(self, validator, content, context=None):
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   880
        try:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   881
            return validator.parse_string(content)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   882
        except Exception:
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   883
            # hijack exception: generative tests stop when the exception
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   884
            # is not an AssertionError
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   885
            klass, exc, tcbk = sys.exc_info()
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   886
            if context is None:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   887
                msg = u'[%s]' % (klass,)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   888
            else:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   889
                msg = u'[%s in %s]' % (klass, context)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   890
            msg = msg.encode(sys.getdefaultencoding(), 'replace')
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   891
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   892
            try:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   893
                str_exc = str(exc)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   894
            except Exception:
6806
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   895
                str_exc = 'undisplayable exception'
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   896
            msg += str_exc
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   897
            if content is not None:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   898
                position = getattr(exc, "position", (0,))[0]
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   899
                if position:
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   900
                    # define filter
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   901
                    if isinstance(content, str):
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   902
                        content = unicode(content, sys.getdefaultencoding(), 'replace')
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   903
                    content = content.splitlines()
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   904
                    width = int(log(len(content), 10)) + 1
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   905
                    line_template = " %" + ("%i" % width) + "i: %s"
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   906
                    # XXX no need to iterate the whole file except to get
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   907
                    # the line number
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   908
                    content = u'\n'.join(line_template % (idx + 1, line)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   909
                                         for idx, line in enumerate(content)
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   910
                                         if line_context_filter(idx+1, position))
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   911
                    msg += u'\nfor content:\n%s' % content
8291f5e0c9f6 [testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6800
diff changeset
   912
            raise AssertionError, msg, tcbk
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   913
6978
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   914
    def assertDocTestFile(self, testfile):
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   915
        # doctest returns tuple (failure_count, test_count)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   916
        result = self.shell().process_script(testfile)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   917
        if result[0] and result[1]:
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   918
            raise self.failureException("doctest file '%s' failed"
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   919
                                        % testfile)
cac71b8a8711 [testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6806
diff changeset
   920
7060
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   921
    # notifications ############################################################
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   922
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   923
    def assertSentEmail(self, subject, recipients=None, nb_msgs=None):
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   924
        """test recipients in system mailbox for given email subject
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   925
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   926
        :param subject: email subject to find in mailbox
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   927
        :param recipients: list of email recipients
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   928
        :param nb_msgs: expected number of entries
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   929
        :returns: list of matched emails
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   930
        """
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   931
        messages = [email for email in MAILBOX
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   932
                    if email.message.get('Subject') == subject]
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   933
        if recipients is not None:
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   934
            sent_to = set()
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   935
            for msg in messages:
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   936
                sent_to.update(msg.recipients)
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   937
            self.assertSetEqual(set(recipients), sent_to)
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   938
        if nb_msgs is not None:
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   939
            self.assertEqual(len(MAILBOX), nb_msgs)
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   940
        return messages
f26a1cbddc91 [testlib] New assertion method assertSentEmail() to test presence of emails in system mailbox
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7039
diff changeset
   941
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   942
    # deprecated ###############################################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   943
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   944
    @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
   945
    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
   946
        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
   947
            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
   948
                 DeprecationWarning, stacklevel=2)
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5159
diff changeset
   949
        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
   950
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   951
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   952
# 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
   953
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   954
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
   955
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   956
# 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
   957
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   958
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
   959
    """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
   960
    satisfy relations cardinality.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   961
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   962
    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
   963
    least.
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   964
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   965
    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
   966
    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
   967
    """
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   968
    relmap = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
   969
    for rschema in schema.relations():
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
   970
        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
   971
            continue
4053
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
   972
        for subj, obj in rschema.rdefs:
7cc66b1d9183 more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4036
diff changeset
   973
            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
   974
            # 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
   975
            # obj to satisfy it
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   976
            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
   977
                # 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
   978
                # 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
   979
                # -> 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
   980
                #    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
   981
                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
   982
            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
   983
                # 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
   984
                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
   985
    unprotected = unprotected_entities(schema)
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   986
    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
   987
        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
   988
    howmanydict = {}
4513
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   989
    # 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
   990
    # 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
   991
    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
   992
        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
   993
        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
   994
            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
   995
    # 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
   996
    # 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
   997
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
   998
    # 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
   999
    #
8abf464d2ffe fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4367
diff changeset
  1000
    # 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
  1001
    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
  1002
        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
  1003
        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
  1004
    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
  1005
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1006
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1007
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
  1008
    """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
  1009
    __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
  1010
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1011
    test_db_id = 'autopopulate'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1012
5913
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1013
    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
  1014
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1015
    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
  1016
    # 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
  1017
    # 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
  1018
    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
  1019
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1020
    no_auto_populate = ()
3734
b2107f68176c ignored_relations should be a set
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3720
diff changeset
  1021
    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
  1022
427
e894eec21a1b move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents: 0
diff changeset
  1023
    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
  1024
        return unprotected_entities(self.schema, strict=True)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1025
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1026
    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
  1027
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1028
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1029
    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
  1030
        pass
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1031
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
  1032
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1033
    @nocoverage
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1034
    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
  1035
        """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
  1036
        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
  1037
        """
5004
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
  1038
        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
  1039
            self._auto_populate(how_many)
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
  1040
4cc020ee70e2 le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4958
diff changeset
  1041
    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
  1042
        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
  1043
        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
  1044
        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
  1045
        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
  1046
        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
  1047
            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
  1048
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1049
            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
  1050
            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
  1051
                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
  1052
        edict = {}
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1053
        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
  1054
            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
  1055
            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
  1056
        existingrels = {}
4036
137be4878127 [mq]: fix_set_addition
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 4016
diff changeset
  1057
        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
  1058
        for rschema in self.schema.relations():
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3676 3689
diff changeset
  1059
            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
  1060
                continue
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1061
            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
  1062
            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
  1063
        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
  1064
                                   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
  1065
        for rql, args in q:
3998
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1066
            try:
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1067
                cu.execute(rql, args)
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1068
            except ValidationError, ex:
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1069
                # failed to satisfy some constraint
94cc7cad3d2d backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3777 3956
diff changeset
  1070
                print 'error in automatic db population', ex
6469
82cf41ae8b89 [test] reset uncommitable flag on ValidationError raised during automatic db population
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
  1071
                self.session.commit_state = None # reset uncommitable flag
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1072
        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
  1073
        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
  1074
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1075
    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
  1076
        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
  1077
        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
  1078
            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
  1079
                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
  1080
            else:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1081
                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
  1082
            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
  1083
            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
  1084
                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
  1085
                    break
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1086
                # 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
  1087
                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
  1088
                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
  1089
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1090
    def iter_automatic_rsets(self, limit=10):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1091
        """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
  1092
        etypes = self.to_test_etypes()
2219
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
  1093
        if not etypes:
bb5098e74b82 protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2070
diff changeset
  1094
            return
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1095
        for etype in etypes:
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1096
            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
  1097
        etype1 = etypes.pop()
1775
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
  1098
        try:
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
  1099
            etype2 = etypes.pop()
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
  1100
        except KeyError:
f450f1594992 fix in case only one type is tested
sylvain.thenault@logilab.fr
parents: 1773
diff changeset
  1101
            etype2 = etype1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1102
        # test a mixed query (DISTINCT/GROUP to avoid getting duplicate
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1103
        # X which make muledit view failing for instance (html validation fails
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1104
        # because of some duplicate "id" attributes)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1105
        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
  1106
        # test some application-specific queries if defined
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1107
        for rql in self.application_rql:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1108
            yield self.execute(rql)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1109
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1110
    def _test_everything_for(self, rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1111
        """this method tries to find everything that can be tested
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1112
        for `rset` and yields a callable test (as needed in generative tests)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1113
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1114
        propdefs = self.vreg['propertydefs']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1115
        # make all components visible
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1116
        for k, v in propdefs.items():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1117
            if k.endswith('visible') and not v['default']:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1118
                propdefs[k]['default'] = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1119
        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
  1120
            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
  1121
            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
  1122
                            self.view, view.__regid__, rset,
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 563
diff changeset
  1123
                            rset.req.reset_headers(), 'main-template')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1124
            # We have to do this because some views modify the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1125
            # resultset's syntax tree
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1126
            rset = backup_rset
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1127
        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
  1128
            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
  1129
        for box in self.list_boxes_for(rset):
6140
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
  1130
            w = [].append
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
  1131
            yield InnerTest(self._testname(rset, box.__regid__, 'box'), box.render, w)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1132
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1133
    @staticmethod
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1134
    def _testname(rset, objid, objtype):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1135
        return '%s_%s_%s' % ('_'.join(rset.column_types(0)), objid, objtype)
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1136
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1137
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1138
# 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
  1139
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1140
class AutomaticWebTest(AutoPopulateTest):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1141
    """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
  1142
85240b3f9ee4 [test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5875
diff changeset
  1143
    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
  1144
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1145
    def setUp(self):
8004
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7990
diff changeset
  1146
        assert not self.__class__ is AutomaticWebTest, 'Please subclass AutomaticWebTest to prevent database caching issue'
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1147
        super(AutomaticWebTest, self).setUp()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
  1148
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1149
        # 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
  1150
        # 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
  1151
        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
  1152
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1153
    ## one each
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1154
    def test_one_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1155
        self.auto_populate(1)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1156
        for rset in self.iter_automatic_rsets(limit=1):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1157
            for testargs in self._test_everything_for(rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1158
                yield testargs
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1159
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1160
    ## ten each
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1161
    def test_ten_each_config(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1162
        self.auto_populate(10)
1004
625e59773119 fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 563
diff changeset
  1163
        for rset in self.iter_automatic_rsets(limit=10):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1164
            for testargs in self._test_everything_for(rset):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1165
                yield testargs
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1166
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1167
    ## startup views
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1168
    def test_startup_views(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1169
        for vid in self.list_startup_views():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1170
            req = self.request()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1171
            yield self.view, vid, None, req
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1172
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1173
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1174
# registry instrumentization ###################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1175
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1176
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
  1177
    try:
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
  1178
        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
  1179
    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
  1180
        pass
1605
b239744627c7 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1152
diff changeset
  1181
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1182
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1183
# def vreg_instrumentize(testclass):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1184
#     # XXX broken
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1185
#     from cubicweb.devtools.apptest import TestEnvironment
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1186
#     env = testclass._env = TestEnvironment('data', configcls=testclass.configcls)
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1187
#     for reg in env.vreg.values():
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1188
#         reg._selected = {}
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1189
#         try:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1190
#             orig_select_best = reg.__class__.__orig_select_best
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1191
#         except Exception:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1192
#             orig_select_best = reg.__class__._select_best
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1193
#         def instr_select_best(self, *args, **kwargs):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1194
#             selected = orig_select_best(self, *args, **kwargs)
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1195
#             try:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1196
#                 self._selected[selected.__class__] += 1
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1197
#             except KeyError:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1198
#                 self._selected[selected.__class__] = 1
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1199
#             except AttributeError:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1200
#                 pass # occurs on reg used to restore database
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1201
#             return selected
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1202
#         reg.__class__._select_best = instr_select_best
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1203
#         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
  1204
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2668
diff changeset
  1205
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1206
# def print_untested_objects(testclass, skipregs=('hooks', 'etypes')):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1207
#     for regname, reg in testclass._env.vreg.iteritems():
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1208
#         if regname in skipregs:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1209
#             continue
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1210
#         for appobjects in reg.itervalues():
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1211
#             for appobject in appobjects:
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1212
#                 if not reg._selected.get(appobject):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1213
#                     print 'not tested', regname, appobject