author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Wed, 25 May 2011 18:46:09 +0200 | |
changeset 7439 | 8e1c58a212ad |
parent 7436 | 28ec860c4436 |
child 7441 | b70f4f4c8620 |
permissions | -rw-r--r-- |
7038
fe0afc4e8ebb
[testlib] fix rql generation bug w/ groups given as unicode string
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6979
diff
changeset
|
1 |
# copyright 2003-2011 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 | 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 | 22 |
__docformat__ = "restructuredtext en" |
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 | 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 | 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 |
0 | 34 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
35 |
import yams.schema |
0 | 36 |
|
5913
85240b3f9ee4
[test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5875
diff
changeset
|
37 |
from logilab.common.testlib import TestCase, InnerTest, Tags |
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
38 |
from logilab.common.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
|
39 |
from logilab.common.debugger import Debugger |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
40 |
from logilab.common.umessage import message_from_string |
7222
fcb8932082a5
[testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7163
diff
changeset
|
41 |
from logilab.common.decorators import cached, classproperty, clear_cache, iclassmethod |
6454
97203d0af4cb
[test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6442
diff
changeset
|
42 |
from logilab.common.deprecation import deprecated, class_deprecated |
6720
43a38c093f6f
[testlib] Use logilab.common.shellutils.getlogin instead of local hack.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6589
diff
changeset
|
43 |
from logilab.common.shellutils import getlogin |
0 | 44 |
|
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
45 |
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
|
46 |
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
|
47 |
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
|
48 |
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
|
49 |
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
|
50 |
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
|
51 |
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
|
52 |
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
|
53 |
from cubicweb.utils import json |
0 | 54 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
55 |
# low-level utilities ########################################################## |
0 | 56 |
|
57 |
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
|
58 |
"""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
|
59 |
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
|
60 |
""" |
0 | 61 |
def do_view(self, arg): |
62 |
import webbrowser |
|
63 |
data = self._getval(arg) |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
64 |
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
|
65 |
toto.write(data) |
0 | 66 |
webbrowser.open('file:///tmp/toto.html') |
67 |
||
68 |
def line_context_filter(line_no, center, before=3, after=None): |
|
69 |
"""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
|
70 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
71 |
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
|
72 |
""" |
0 | 73 |
if after is None: |
74 |
after = before |
|
75 |
return center - before <= line_no <= center + after |
|
76 |
||
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
77 |
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
|
78 |
"""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
|
79 |
(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
|
80 |
""" |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
81 |
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
|
82 |
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
|
83 |
else: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
84 |
protected_entities = yams.schema.BASE_TYPES.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
|
85 |
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
|
86 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
87 |
# 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
|
88 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
89 |
MAILBOX = [] |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
90 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
91 |
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
|
92 |
"""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
|
93 |
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
|
94 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
95 |
* `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
|
96 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
97 |
* `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
|
98 |
message |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
99 |
""" |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
100 |
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
|
101 |
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
|
102 |
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
|
103 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
104 |
@property |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
105 |
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
|
106 |
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
|
107 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
108 |
@property |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
109 |
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
|
110 |
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
|
111 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
112 |
@property |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
113 |
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
|
114 |
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
|
115 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
116 |
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
|
117 |
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
|
118 |
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
|
119 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
120 |
# 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
|
121 |
# 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
|
122 |
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
|
123 |
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
|
124 |
pass |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
125 |
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
|
126 |
pass |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
127 |
def 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
|
128 |
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
|
129 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
130 |
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
|
131 |
|
6424
f443a2b8a5c7
[devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6410
diff
changeset
|
132 |
|
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
|
133 |
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
|
134 |
"""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
|
135 |
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
|
136 |
|
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 |
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
|
138 |
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
|
139 |
""" |
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 |
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
|
141 |
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
|
142 |
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
|
143 |
|
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 |
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
|
145 |
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
|
146 |
|
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 |
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
|
148 |
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
|
149 |
|
7da7c270bbbd
[devtools] make CubiwebTC.login() context-manager restore the testcase connection on exit
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6109
diff
changeset
|
150 |
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
|
151 |
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
|
152 |
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
|
153 |
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
|
154 |
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
|
155 |
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
|
156 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
157 |
# 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
|
158 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
159 |
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
|
160 |
"""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
|
161 |
|
5229
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
162 |
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
|
163 |
|
5229
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
164 |
* `vreg`, the vregistry |
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
165 |
* `schema`, self.vreg.schema |
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
166 |
* `config`, cubicweb configuration |
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
167 |
* `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
|
168 |
* `session`, server side session associated to `cnx` |
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
169 |
* `app`, the cubicweb publisher (for web testing) |
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
170 |
* `repo`, the repository object |
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
171 |
* `admlogin`, login of the admin user |
67dbd07a05f3
[doc/book] expand tesing material
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5175
diff
changeset
|
172 |
* `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
|
173 |
* `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
|
174 |
""" |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
175 |
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
|
176 |
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
|
177 |
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
|
178 |
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
|
179 |
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
|
180 |
_cnxs = set() # establised connection |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
181 |
_cnx = None # current connection |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
182 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
183 |
# 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
|
184 |
@classmethod |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
185 |
def set_cnx(cls, cnx): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
186 |
cls._cnxs.add(cnx) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
187 |
cls._cnx = cnx |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
188 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
189 |
@property |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
190 |
def cnx(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
191 |
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
|
192 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
193 |
@classproperty |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
194 |
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
|
195 |
"""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
|
196 |
|
f443a2b8a5c7
[devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6410
diff
changeset
|
197 |
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
|
198 |
""" |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
199 |
try: |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
200 |
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
|
201 |
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
|
202 |
except KeyError: |
6631
26c303c3f1aa
[test] make test independant from the working directory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6590
diff
changeset
|
203 |
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
|
204 |
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
|
205 |
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
|
206 |
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
|
207 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
208 |
@classmethod |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
209 |
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
|
210 |
"""configuration initialization hooks. |
f443a2b8a5c7
[devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6410
diff
changeset
|
211 |
|
f443a2b8a5c7
[devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6410
diff
changeset
|
212 |
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
|
213 |
|
f443a2b8a5c7
[devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6410
diff
changeset
|
214 |
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
|
215 |
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
|
216 |
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
|
217 |
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
|
218 |
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
|
219 |
# 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
|
220 |
#config.global_set_option('query-log-file', |
edfe43ceaa35
backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2968
diff
changeset
|
221 |
# '/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
|
222 |
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
|
223 |
# 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
|
224 |
# 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
|
225 |
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
|
226 |
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
|
227 |
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
|
228 |
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
|
229 |
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
|
230 |
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
|
231 |
# 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
|
232 |
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
|
233 |
# 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
|
234 |
try: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
235 |
config.global_set_option('embed-allowed', re.compile('.*')) |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
236 |
except: # not in server only configuration |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
237 |
pass |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
238 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
239 |
#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
|
240 |
@classmethod |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
241 |
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
|
242 |
"""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
|
243 |
""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
244 |
# setup configuration for test |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
245 |
cls.init_config(cls.config) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
246 |
# get or restore and working db. |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
247 |
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
|
248 |
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
|
249 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
250 |
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
|
251 |
# 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
|
252 |
# 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
|
253 |
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
|
254 |
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
|
255 |
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
|
256 |
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
|
257 |
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
|
258 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
259 |
def _close_cnx(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
260 |
for cnx in list(self._cnxs): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
261 |
if not cnx._closed: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
262 |
cnx.rollback() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
263 |
cnx.close() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
264 |
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
|
265 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
266 |
# global resources accessors ############################################### |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
267 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
268 |
@property |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
269 |
def schema(self): |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
270 |
"""return the application schema""" |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
271 |
return self.vreg.schema |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
272 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
273 |
@property |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
274 |
def session(self): |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
275 |
"""return current server side session (using default manager account)""" |
4835
13b0b96d7982
[repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4719
diff
changeset
|
276 |
session = self.repo._sessions[self.cnx.sessionid] |
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
|
277 |
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
|
278 |
return session |
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
279 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
280 |
@property |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
281 |
def adminsession(self): |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
282 |
"""return current server side session (using default manager account)""" |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5177
diff
changeset
|
283 |
return self.repo._sessions[self._orig_cnx[0].sessionid] |
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
284 |
|
6694
d9eac4fd57dc
[devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6687
diff
changeset
|
285 |
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
|
286 |
"""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
|
287 |
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
|
288 |
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
|
289 |
interactive=False, |
d9eac4fd57dc
[devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6687
diff
changeset
|
290 |
# 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
|
291 |
schema=1) |
d9eac4fd57dc
[devtools] make migration handler easily available from CubicWebTC through .shell() method
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6687
diff
changeset
|
292 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
293 |
def 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
|
294 |
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
|
295 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
296 |
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
|
297 |
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
|
298 |
|
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6425
diff
changeset
|
299 |
def debugged(self, debugmode): |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6425
diff
changeset
|
300 |
return server.debugged(debugmode) |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6425
diff
changeset
|
301 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
302 |
# 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
|
303 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
304 |
def setUp(self): |
6398
ea26eb5fd388
[test] send mail synchronously during tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6369
diff
changeset
|
305 |
# 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
|
306 |
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
|
307 |
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
|
308 |
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
|
309 |
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
|
310 |
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
|
311 |
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
|
312 |
self._init_repo() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
313 |
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
|
314 |
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
|
315 |
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
|
316 |
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
|
317 |
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
|
318 |
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
|
319 |
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
|
320 |
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
|
321 |
|
6efb7a7ae570
[testlib] properly close connections opened during test in tearDown
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5128
diff
changeset
|
322 |
def tearDown(self): |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
323 |
# 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
|
324 |
while self._cleanups: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
325 |
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
|
326 |
cleanup(*args, **kwargs) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
327 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
328 |
def _patch_SendMailOp(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
329 |
# 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
|
330 |
_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
|
331 |
SendMailOp.postcommit_event = SendMailOp.sendmails |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
332 |
def reverse_SendMailOp_monkey_patch(): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
333 |
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
|
334 |
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
|
335 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
336 |
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
|
337 |
"""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
|
338 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
339 |
@classmethod |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
340 |
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
|
341 |
"""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
|
342 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
343 |
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
|
344 |
result. |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
345 |
""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
346 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
347 |
# 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
|
348 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
349 |
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
|
350 |
"""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
|
351 |
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
|
352 |
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
|
353 |
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
|
354 |
else: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
355 |
return req.user |
563
a690996639ca
[testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
562
diff
changeset
|
356 |
|
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
|
357 |
@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
|
358 |
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
|
359 |
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
|
360 |
"""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
|
361 |
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
|
362 |
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
|
363 |
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
|
364 |
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
|
365 |
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
|
366 |
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
|
367 |
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
|
368 |
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
|
369 |
login = req |
7307
a650e6267e97
[CubicWebTC] fix create_user bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7222
diff
changeset
|
370 |
assert not isinstance(self, type) |
a650e6267e97
[CubicWebTC] fix create_user bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7222
diff
changeset
|
371 |
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
|
372 |
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
|
373 |
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
|
374 |
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
|
375 |
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
|
376 |
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
|
377 |
% ','.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
|
378 |
{'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
|
379 |
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
|
380 |
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
|
381 |
reverse_primary_email=user) |
5557
1a534c596bff
[entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
382 |
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
|
383 |
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
|
384 |
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
|
385 |
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
|
386 |
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
|
387 |
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
|
388 |
return user |
563
a690996639ca
[testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
562
diff
changeset
|
389 |
|
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
|
390 |
@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
|
391 |
def grant_permission(self, session, entity, group, pname=None, plabel=None): |
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
|
392 |
"""insert a permission on an entity. Will have to commit the main |
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
|
393 |
connection to be considered |
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
|
394 |
""" |
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
|
395 |
if not isinstance(session, 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
|
396 |
warn('[3.12] grant_permission arguments are now (session, entity, group, pname[, plabel])', |
7324
5f7813ae9fb8
[testlib] fix deprecation warning stack level
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7313
diff
changeset
|
397 |
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
|
398 |
plabel = pname |
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
|
399 |
pname = group |
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
|
400 |
group = entity |
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
|
401 |
entity = 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
|
402 |
assert not isinstance(self, type) |
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
|
403 |
session = self.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
|
404 |
pname = unicode(pname) |
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
|
405 |
plabel = plabel and unicode(plabel) or unicode(group) |
7331
7fcc4f22f3e4
[testlib] grant_permission now accept either an entity or en eid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7324
diff
changeset
|
406 |
e = getattr(entity, 'eid', 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
|
407 |
with security_enabled(session, False, False): |
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
|
408 |
peid = session.execute( |
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
|
409 |
'INSERT CWPermission X: X name %(pname)s, X label %(plabel)s,' |
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
|
410 |
'X require_group G, E require_permission X ' |
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
|
411 |
'WHERE G name %(group)s, E eid %(e)s', |
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
|
412 |
locals())[0][0] |
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
|
413 |
return peid |
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
|
414 |
|
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
|
415 |
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
|
416 |
"""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
|
417 |
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
|
418 |
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
|
419 |
# 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
|
420 |
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
|
421 |
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
|
422 |
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
|
423 |
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
|
424 |
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
|
425 |
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
|
426 |
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
|
427 |
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
|
428 |
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
|
429 |
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
|
430 |
return self.cnx |
563
a690996639ca
[testlib] fix pb. related to class scoped variables
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
562
diff
changeset
|
431 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
432 |
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
|
433 |
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
|
434 |
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
|
435 |
self.cnx.close() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
436 |
cnx, self.websession = self._orig_cnx |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
437 |
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
|
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 |
# 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
|
440 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
441 |
@nocoverage |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
442 |
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
|
443 |
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
|
444 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
445 |
@nocoverage |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
446 |
def 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
|
447 |
"""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
|
448 |
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
|
449 |
""" |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5159
diff
changeset
|
450 |
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
|
451 |
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
|
452 |
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
|
453 |
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
|
454 |
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
|
455 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
456 |
@nocoverage |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
457 |
def commit(self): |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4835
diff
changeset
|
458 |
try: |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4835
diff
changeset
|
459 |
return self.cnx.commit() |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4835
diff
changeset
|
460 |
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
|
461 |
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
|
462 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
463 |
@nocoverage |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
464 |
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
|
465 |
try: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
466 |
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
|
467 |
except dbapi.ProgrammingError: |
5785
c0661b963ced
[test] fix test w/ closed connection pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5783
diff
changeset
|
468 |
pass # connection closed |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4835
diff
changeset
|
469 |
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
|
470 |
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
|
471 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
472 |
# # 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
|
473 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
474 |
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
|
475 |
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
|
476 |
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
|
477 |
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
|
478 |
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
|
479 |
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
|
480 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
481 |
# 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
|
482 |
|
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
|
483 |
@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
|
484 |
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
|
485 |
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
|
486 |
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
|
487 |
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
|
488 |
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
|
489 |
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
|
490 |
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
|
491 |
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
|
492 |
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
|
493 |
|
7039
df0e8581b06f
[testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7038
diff
changeset
|
494 |
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
|
495 |
entity.cw_attr_cache.pop('modification_date', None) |
df0e8581b06f
[testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7038
diff
changeset
|
496 |
self.failUnless(entity.modification_date > olddate) |
df0e8581b06f
[testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7038
diff
changeset
|
497 |
|
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
|
498 |
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
|
499 |
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
|
500 |
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
|
501 |
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
|
502 |
|
df0e8581b06f
[testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7038
diff
changeset
|
503 |
# 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
|
504 |
|
df0e8581b06f
[testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7038
diff
changeset
|
505 |
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
|
506 |
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
|
507 |
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
|
508 |
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
|
509 |
|
df0e8581b06f
[testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7038
diff
changeset
|
510 |
|
df0e8581b06f
[testlib] backport some useful testing utilities from tracker's testutils module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7038
diff
changeset
|
511 |
# views and actions registries inspection ################################## |
0 | 512 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
513 |
def pviews(self, req, rset): |
3468
b02fa4db2868
[tests] make unittest_viewselectors pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3454
diff
changeset
|
514 |
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
|
515 |
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
|
516 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
517 |
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
|
518 |
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
|
519 |
'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
|
520 |
return [(a.__regid__, a.__class__) |
2813
0cf6c8005bf6
R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2793
diff
changeset
|
521 |
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
|
522 |
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
|
523 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
524 |
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
|
525 |
return [(a.__regid__, a.__class__) |
2813
0cf6c8005bf6
R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2793
diff
changeset
|
526 |
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
|
527 |
if a.category in categories] |
0 | 528 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
529 |
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
|
530 |
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
|
531 |
'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
|
532 |
res = {} |
2813
0cf6c8005bf6
R propagate deprecation of CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2793
diff
changeset
|
533 |
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
|
534 |
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
|
535 |
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
|
536 |
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
|
537 |
|
3230 | 538 |
def action_submenu(self, req, rset, id): |
539 |
return self._test_action(self.vreg['actions'].select(id, req, rset=rset)) |
|
540 |
||
541 |
def _test_action(self, action): |
|
542 |
class fake_menu(list): |
|
543 |
@property |
|
544 |
def items(self): |
|
545 |
return self |
|
546 |
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
|
547 |
def action_link(self, action, **kwargs): |
3230 | 548 |
return (action.title, action.url()) |
549 |
submenu = fake_menu() |
|
550 |
action.fill_menu(fake_box(), submenu) |
|
551 |
return submenu |
|
0 | 552 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
553 |
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
|
554 |
"""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
|
555 |
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
|
556 |
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
|
557 |
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
|
558 |
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
|
559 |
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
|
560 |
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
|
561 |
continue |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
562 |
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
|
563 |
continue |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
564 |
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
|
565 |
if view.category != 'startupview' |
6454
97203d0af4cb
[test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6442
diff
changeset
|
566 |
and not issubclass(view, notification.NotificationView) |
97203d0af4cb
[test/possible views] skip deprecated views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6442
diff
changeset
|
567 |
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
|
568 |
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
|
569 |
try: |
2774 | 570 |
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
|
571 |
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
|
572 |
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
|
573 |
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
|
574 |
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
|
575 |
else: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
576 |
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
|
577 |
# 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
|
578 |
# 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
|
579 |
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
|
580 |
continue |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
581 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
582 |
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
|
583 |
"""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
|
584 |
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
|
585 |
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
|
586 |
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
|
587 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
588 |
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
|
589 |
"""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
|
590 |
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
|
591 |
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
|
592 |
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
|
593 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
594 |
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
|
595 |
"""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
|
596 |
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
|
597 |
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
|
598 |
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
|
599 |
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
|
600 |
else: |
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_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
|
602 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
603 |
# 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
|
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 |
@property |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
606 |
@cached |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
607 |
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
|
608 |
"""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
|
609 |
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
|
610 |
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
|
611 |
raise |
3a2d6c38bcd9
override publisher's error handler to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
612 |
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
|
613 |
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
|
614 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
615 |
requestcls = fake.FakeRequest |
7434
17ef6f9efaa1
[test] fix tests broken by 7427:5338d895b891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7376
diff
changeset
|
616 |
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
|
617 |
"""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
|
618 |
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
|
619 |
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
|
620 |
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
|
621 |
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
|
622 |
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
|
623 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
624 |
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
|
625 |
"""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
|
626 |
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
|
627 |
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
|
628 |
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
|
629 |
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
|
630 |
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
|
631 |
|
3657
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
632 |
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
|
633 |
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
|
634 |
|
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
|
635 |
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
|
636 |
"""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
|
637 |
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
|
638 |
try: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
639 |
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
|
640 |
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
|
641 |
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
|
642 |
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
|
643 |
raise |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
644 |
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
|
645 |
|
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
|
646 |
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
|
647 |
"""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
|
648 |
|
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
|
649 |
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
|
650 |
""" |
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
|
651 |
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
|
652 |
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
|
653 |
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
|
654 |
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
|
655 |
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
|
656 |
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
|
657 |
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
|
658 |
|
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
|
659 |
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
|
660 |
"""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
|
661 |
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
|
662 |
|
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
|
663 |
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
|
664 |
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
|
665 |
""" |
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
|
666 |
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
|
667 |
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
|
668 |
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
|
669 |
|
3657
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
670 |
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
|
671 |
"""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
|
672 |
Redirect exception |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
673 |
""" |
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
674 |
try: |
4719
aaed3f813ef8
kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4690
diff
changeset
|
675 |
callback(req) |
3657
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
676 |
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
|
677 |
try: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
678 |
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
|
679 |
except ValueError: |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
680 |
path = ex.location |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
681 |
params = {} |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
682 |
else: |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
683 |
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
|
684 |
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
|
685 |
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
|
686 |
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
|
687 |
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
|
688 |
else: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
689 |
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
|
690 |
|
4523
d8127c2bd6b5
use 'edit' as defaut path for expect_redirect_publish
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4513
diff
changeset
|
691 |
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
|
692 |
"""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
|
693 |
get a Redirect exception |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
694 |
""" |
4083
3b285889b8e9
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4053
diff
changeset
|
695 |
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
|
696 |
|
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
|
697 |
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
|
698 |
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
|
699 |
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
|
700 |
if anonuser is None: |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7060
diff
changeset
|
701 |
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
|
702 |
else: |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7060
diff
changeset
|
703 |
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
|
704 |
|
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
|
705 |
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
|
706 |
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
|
707 |
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
|
708 |
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
|
709 |
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
|
710 |
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
|
711 |
sh = self.app.session_handler |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
712 |
authm = sh.session_manager.authmanager |
4916 | 713 |
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
|
714 |
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
|
715 |
# not properly cleaned between tests |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
716 |
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
|
717 |
return req, origsession |
3657
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
718 |
|
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
|
719 |
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
|
720 |
sh = self.app.session_handler |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
721 |
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
|
722 |
session = req.session |
6369
a151453dc564
[test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6346
diff
changeset
|
723 |
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
|
724 |
self.assertEqual(session.login, origsession.login) |
a151453dc564
[test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6346
diff
changeset
|
725 |
self.assertEqual(session.anonymous_session, False) |
a151453dc564
[test] more update to unittest2 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6346
diff
changeset
|
726 |
self.assertEqual(path, 'view') |
7439
8e1c58a212ad
[web test] fix test failures introduced by 7431:cab99ccdb774
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7436
diff
changeset
|
727 |
msg = req.session.data[params['_cwmsgid']] |
8e1c58a212ad
[web test] fix test failures introduced by 7431:cab99ccdb774
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7436
diff
changeset
|
728 |
self.assertEqual(msg, '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
|
729 |
|
3676
fa170564e1a0
optional nbsessions arg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3657
diff
changeset
|
730 |
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
|
731 |
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
|
732 |
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
|
733 |
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
|
734 |
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
|
735 |
# + 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
|
736 |
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
|
737 |
clear_cache(req, 'get_authorization') |
706d7bf0ae3d
factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3647
diff
changeset
|
738 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
739 |
# content validation ####################################################### |
0 | 740 |
|
741 |
# validators are used to validate (XML, DTD, whatever) view's content |
|
742 |
# validators availables are : |
|
743 |
# DTDValidator : validates XML + declared DTD |
|
744 |
# SaxOnlyValidator : guarantees XML is well formed |
|
745 |
# None : do not try to validate anything |
|
746 |
# 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
|
747 |
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
|
748 |
# 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
|
749 |
# |
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
|
750 |
# 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
|
751 |
# 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
|
752 |
#'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
|
753 |
#'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
|
754 |
'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
|
755 |
'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
|
756 |
'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
|
757 |
'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
|
758 |
'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
|
759 |
'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
|
760 |
'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
|
761 |
'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
|
762 |
} |
562
bdadb26c4a3c
old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents:
549
diff
changeset
|
763 |
# 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
|
764 |
vid_validators = dict((vid, htmlparser.VALMAP[valkey]) |
562
bdadb26c4a3c
old .validators attribute is now .vid_validators
sylvain.thenault@logilab.fr
parents:
549
diff
changeset
|
765 |
for vid, valkey in VIEW_VALIDATORS.iteritems()) |
1605 | 766 |
|
0 | 767 |
|
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
|
768 |
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
|
769 |
**kwargs): |
0 | 770 |
"""This method tests the view `vid` on `rset` using `template` |
771 |
||
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
|
772 |
If no error occurred while rendering the view, the HTML is analyzed |
0 | 773 |
and parsed. |
774 |
||
775 |
:returns: an instance of `cubicweb.devtools.htmlparser.PageInfo` |
|
776 |
encapsulation the generated HTML |
|
777 |
""" |
|
1142 | 778 |
req = req or rset and rset.req or self.request() |
0 | 779 |
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
|
780 |
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
|
781 |
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
|
782 |
view = viewsreg.select(vid, req, **kwargs) |
0 | 783 |
# set explicit test description |
784 |
if rset is not None: |
|
5875
e707d481219e
[testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
5815
diff
changeset
|
785 |
self.set_description("testing vid=%s defined in %s with (%s)" % ( |
2070 | 786 |
vid, view.__module__, rset.printable_rql())) |
0 | 787 |
else: |
5875
e707d481219e
[testlib] improve test description messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
5815
diff
changeset
|
788 |
self.set_description("testing vid=%s defined in %s without rset" % ( |
2070 | 789 |
vid, view.__module__)) |
0 | 790 |
if template is None: # raw view testing, no template |
1773 | 791 |
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
|
792 |
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
|
793 |
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
|
794 |
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
|
795 |
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
|
796 |
**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
|
797 |
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
|
798 |
return self._test_view(viewfunc, view, template, kwargs) |
0 | 799 |
|
800 |
||
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
|
801 |
def _test_view(self, viewfunc, view, template='main-template', kwargs={}): |
0 | 802 |
"""this method does the actual call to the view |
803 |
||
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
|
804 |
If no error occurred while rendering the view, the HTML is analyzed |
0 | 805 |
and parsed. |
806 |
||
807 |
:returns: an instance of `cubicweb.devtools.htmlparser.PageInfo` |
|
808 |
encapsulation the generated HTML |
|
809 |
""" |
|
810 |
try: |
|
811 |
output = viewfunc(**kwargs) |
|
812 |
except (SystemExit, KeyboardInterrupt): |
|
813 |
raise |
|
814 |
except: |
|
815 |
# hijack exception: generative tests stop when the exception |
|
816 |
# is not an AssertionError |
|
817 |
klass, exc, tcbk = sys.exc_info() |
|
818 |
try: |
|
3418
7b49fa7e942d
[api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3230
diff
changeset
|
819 |
msg = '[%s in %s] %s' % (klass, view.__regid__, exc) |
0 | 820 |
except: |
3418
7b49fa7e942d
[api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3230
diff
changeset
|
821 |
msg = '[%s in %s] undisplayable exception' % (klass, view.__regid__) |
0 | 822 |
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
|
823 |
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
|
824 |
|
6978
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
825 |
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
|
826 |
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
|
827 |
try: |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
828 |
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
|
829 |
except KeyError: |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
830 |
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
|
831 |
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
|
832 |
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
|
833 |
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
|
834 |
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
|
835 |
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
|
836 |
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
|
837 |
else: |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
838 |
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
|
839 |
else: |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
840 |
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
|
841 |
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
|
842 |
default_validator) |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
843 |
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
|
844 |
return |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
845 |
return validatorclass() |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
846 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
847 |
@nocoverage |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
848 |
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
|
849 |
"""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
|
850 |
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
|
851 |
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
|
852 |
if validator is None: |
a8fbcf9b6572
[testlib] take care, validator may be None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6978
diff
changeset
|
853 |
return |
4346
02f12f39bae5
XXX quick fix html validation by removing <canvas>
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
854 |
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
|
855 |
# 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
|
856 |
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
|
857 |
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
|
858 |
|
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
859 |
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
|
860 |
try: |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
861 |
return validator.parse_string(content) |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
862 |
except (SystemExit, KeyboardInterrupt): |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
863 |
raise |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
864 |
except: |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
865 |
# 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
|
866 |
# 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
|
867 |
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
|
868 |
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
|
869 |
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
|
870 |
else: |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
871 |
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
|
872 |
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
|
873 |
|
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
874 |
try: |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
875 |
str_exc = str(exc) |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
876 |
except: |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
877 |
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
|
878 |
msg += str_exc |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
879 |
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
|
880 |
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
|
881 |
if position: |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
882 |
# define filter |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
883 |
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
|
884 |
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
|
885 |
content = content.splitlines() |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
886 |
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
|
887 |
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
|
888 |
# 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
|
889 |
# the line number |
8291f5e0c9f6
[testlib] extract validation logic into a ``assertWellFormed`` method.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
6800
diff
changeset
|
890 |
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
|
891 |
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
|
892 |
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
|
893 |
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
|
894 |
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
|
895 |
|
6978
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
896 |
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
|
897 |
# 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
|
898 |
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
|
899 |
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
|
900 |
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
|
901 |
% testfile) |
cac71b8a8711
[testlib] extract get_validator method from _check_html, move assertDocTestFile
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6806
diff
changeset
|
902 |
|
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
|
903 |
# 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
|
904 |
|
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
|
905 |
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
|
906 |
"""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
|
907 |
|
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
|
908 |
: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
|
909 |
: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
|
910 |
: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
|
911 |
: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
|
912 |
""" |
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
|
913 |
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
|
914 |
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
|
915 |
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
|
916 |
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
|
917 |
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
|
918 |
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
|
919 |
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
|
920 |
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
|
921 |
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
|
922 |
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
|
923 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
924 |
# deprecated ############################################################### |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
925 |
|
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5159
diff
changeset
|
926 |
@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
|
927 |
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
|
928 |
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
|
929 |
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
|
930 |
DeprecationWarning, stacklevel=2) |
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5159
diff
changeset
|
931 |
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
|
932 |
|
4016
250784a2d105
deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
933 |
@deprecated('[3.6] use self.request().create_entity(...)') |
250784a2d105
deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
934 |
def add_entity(self, etype, req=None, **kwargs): |
250784a2d105
deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
935 |
if req is None: |
250784a2d105
deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
936 |
req = self.request() |
250784a2d105
deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
937 |
return req.create_entity(etype, **kwargs) |
250784a2d105
deprecated one more custom add_entity in favor of req.create_entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
938 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
939 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
940 |
# 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
|
941 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
942 |
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
|
943 |
|
4513
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
944 |
# 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
|
945 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
946 |
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
|
947 |
"""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
|
948 |
satisfy relations cardinality. |
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
949 |
|
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
950 |
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
|
951 |
least. |
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
952 |
|
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
953 |
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
|
954 |
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
|
955 |
""" |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
956 |
relmap = {} |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
957 |
for rschema in schema.relations(): |
3720 | 958 |
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
|
959 |
continue |
4053
7cc66b1d9183
more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
4036
diff
changeset
|
960 |
for subj, obj in rschema.rdefs: |
7cc66b1d9183
more api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
4036
diff
changeset
|
961 |
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
|
962 |
# 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
|
963 |
# obj to satisfy it |
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
964 |
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
|
965 |
# 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
|
966 |
# 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
|
967 |
# -> 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
|
968 |
# 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
|
969 |
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
|
970 |
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
|
971 |
# 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
|
972 |
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
|
973 |
unprotected = unprotected_entities(schema) |
4513
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
974 |
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
|
975 |
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
|
976 |
howmanydict = {} |
4513
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
977 |
# 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
|
978 |
# 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
|
979 |
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
|
980 |
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
|
981 |
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
|
982 |
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
|
983 |
# 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
|
984 |
# 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
|
985 |
# |
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
986 |
# 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
|
987 |
# |
8abf464d2ffe
fix and begin to document autofill algorithm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4367
diff
changeset
|
988 |
# 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
|
989 |
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
|
990 |
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
|
991 |
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
|
992 |
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
|
993 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
994 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
995 |
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
|
996 |
"""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
|
997 |
__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
|
998 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
999 |
test_db_id = 'autopopulate' |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
1000 |
|
5913
85240b3f9ee4
[test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5875
diff
changeset
|
1001 |
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
|
1002 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1003 |
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
|
1004 |
# 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
|
1005 |
# 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
|
1006 |
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
|
1007 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1008 |
no_auto_populate = () |
3734
b2107f68176c
ignored_relations should be a set
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3720
diff
changeset
|
1009 |
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
|
1010 |
|
427
e894eec21a1b
move selection of entity types to test in a method to ease overriding
sylvain.thenault@logilab.fr
parents:
0
diff
changeset
|
1011 |
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
|
1012 |
return unprotected_entities(self.schema, strict=True) |
1605 | 1013 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1014 |
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
|
1015 |
pass |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1016 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1017 |
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
|
1018 |
pass |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1019 |
|
3720 | 1020 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1021 |
@nocoverage |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1022 |
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
|
1023 |
"""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
|
1024 |
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
|
1025 |
""" |
5004
4cc020ee70e2
le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4958
diff
changeset
|
1026 |
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
|
1027 |
self._auto_populate(how_many) |
4cc020ee70e2
le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4958
diff
changeset
|
1028 |
|
4cc020ee70e2
le patch rql26 a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4958
diff
changeset
|
1029 |
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
|
1030 |
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
|
1031 |
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
|
1032 |
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
|
1033 |
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
|
1034 |
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
|
1035 |
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
|
1036 |
continue |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1037 |
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
|
1038 |
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
|
1039 |
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
|
1040 |
edict = {} |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1041 |
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
|
1042 |
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
|
1043 |
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
|
1044 |
existingrels = {} |
4036
137be4878127
[mq]: fix_set_addition
Arthur Lutz <arthur.lutz@logilab.fr>
parents:
4016
diff
changeset
|
1045 |
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
|
1046 |
for rschema in self.schema.relations(): |
3720 | 1047 |
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
|
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 |
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
|
1050 |
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
|
1051 |
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
|
1052 |
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
|
1053 |
for rql, args in q: |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1054 |
try: |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1055 |
cu.execute(rql, args) |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1056 |
except ValidationError, ex: |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1057 |
# failed to satisfy some constraint |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
1058 |
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
|
1059 |
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
|
1060 |
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
|
1061 |
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
|
1062 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1063 |
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
|
1064 |
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
|
1065 |
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
|
1066 |
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
|
1067 |
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
|
1068 |
else: |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1069 |
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
|
1070 |
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
|
1071 |
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
|
1072 |
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
|
1073 |
break |
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1074 |
# 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
|
1075 |
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
|
1076 |
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
|
1077 |
|
1004
625e59773119
fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
563
diff
changeset
|
1078 |
def iter_automatic_rsets(self, limit=10): |
0 | 1079 |
"""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
|
1080 |
etypes = self.to_test_etypes() |
2219
bb5098e74b82
protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2070
diff
changeset
|
1081 |
if not etypes: |
bb5098e74b82
protect against empty etypes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2070
diff
changeset
|
1082 |
return |
0 | 1083 |
for etype in etypes: |
1004
625e59773119
fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
563
diff
changeset
|
1084 |
yield self.execute('Any X LIMIT %s WHERE X is %s' % (limit, etype)) |
0 | 1085 |
etype1 = etypes.pop() |
1775
f450f1594992
fix in case only one type is tested
sylvain.thenault@logilab.fr
parents:
1773
diff
changeset
|
1086 |
try: |
f450f1594992
fix in case only one type is tested
sylvain.thenault@logilab.fr
parents:
1773
diff
changeset
|
1087 |
etype2 = etypes.pop() |
f450f1594992
fix in case only one type is tested
sylvain.thenault@logilab.fr
parents:
1773
diff
changeset
|
1088 |
except KeyError: |
f450f1594992
fix in case only one type is tested
sylvain.thenault@logilab.fr
parents:
1773
diff
changeset
|
1089 |
etype2 = etype1 |
0 | 1090 |
# test a mixed query (DISTINCT/GROUP to avoid getting duplicate |
1091 |
# X which make muledit view failing for instance (html validation fails |
|
1092 |
# because of some duplicate "id" attributes) |
|
1093 |
yield self.execute('DISTINCT Any X, MAX(Y) GROUPBY X WHERE X is %s, Y is %s' % (etype1, etype2)) |
|
1094 |
# test some application-specific queries if defined |
|
1095 |
for rql in self.application_rql: |
|
1096 |
yield self.execute(rql) |
|
1097 |
||
1098 |
def _test_everything_for(self, rset): |
|
1099 |
"""this method tries to find everything that can be tested |
|
1100 |
for `rset` and yields a callable test (as needed in generative tests) |
|
1101 |
""" |
|
1102 |
propdefs = self.vreg['propertydefs'] |
|
1103 |
# make all components visible |
|
1104 |
for k, v in propdefs.items(): |
|
1105 |
if k.endswith('visible') and not v['default']: |
|
1106 |
propdefs[k]['default'] = True |
|
1107 |
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
|
1108 |
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
|
1109 |
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
|
1110 |
self.view, view.__regid__, rset, |
823
cb8ccbef8fa5
main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
563
diff
changeset
|
1111 |
rset.req.reset_headers(), 'main-template') |
0 | 1112 |
# We have to do this because some views modify the |
1113 |
# resultset's syntax tree |
|
1114 |
rset = backup_rset |
|
1115 |
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
|
1116 |
yield InnerTest(self._testname(rset, action.__regid__, 'action'), self._test_action, action) |
0 | 1117 |
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
|
1118 |
w = [].append |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6109
diff
changeset
|
1119 |
yield InnerTest(self._testname(rset, box.__regid__, 'box'), box.render, w) |
0 | 1120 |
|
1121 |
@staticmethod |
|
1122 |
def _testname(rset, objid, objtype): |
|
1123 |
return '%s_%s_%s' % ('_'.join(rset.column_types(0)), objid, objtype) |
|
1605 | 1124 |
|
0 | 1125 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1126 |
# 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
|
1127 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1128 |
class AutomaticWebTest(AutoPopulateTest): |
0 | 1129 |
"""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
|
1130 |
|
85240b3f9ee4
[test] add default generic test Tags to CubicWeb TestCase class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5875
diff
changeset
|
1131 |
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
|
1132 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1133 |
def setUp(self): |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
1134 |
assert not self.__class__ is AutomaticWebTest, 'Please subclass AutomaticWebTest to pprevent database caching issue' |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
1135 |
super(AutomaticWebTest, self).setUp() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
1136 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1137 |
# 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
|
1138 |
# 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
|
1139 |
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
|
1140 |
|
0 | 1141 |
## one each |
1142 |
def test_one_each_config(self): |
|
1143 |
self.auto_populate(1) |
|
1004
625e59773119
fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
563
diff
changeset
|
1144 |
for rset in self.iter_automatic_rsets(limit=1): |
0 | 1145 |
for testargs in self._test_everything_for(rset): |
1146 |
yield testargs |
|
1147 |
||
1148 |
## ten each |
|
1149 |
def test_ten_each_config(self): |
|
1150 |
self.auto_populate(10) |
|
1004
625e59773119
fix automatic test: ensure we actually have
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
563
diff
changeset
|
1151 |
for rset in self.iter_automatic_rsets(limit=10): |
0 | 1152 |
for testargs in self._test_everything_for(rset): |
1153 |
yield testargs |
|
1605 | 1154 |
|
0 | 1155 |
## startup views |
1156 |
def test_startup_views(self): |
|
1157 |
for vid in self.list_startup_views(): |
|
1158 |
req = self.request() |
|
1159 |
yield self.view, vid, None, req |
|
1160 |
||
1161 |
||
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1162 |
# registry instrumentization ################################################### |
0 | 1163 |
|
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
1164 |
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
|
1165 |
try: |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
1166 |
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
|
1167 |
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
|
1168 |
pass |
1605 | 1169 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1170 |
|
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
|
1171 |
def vreg_instrumentize(testclass): |
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1172 |
# XXX broken |
534
1368c80276bc
refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents:
514
diff
changeset
|
1173 |
from cubicweb.devtools.apptest import TestEnvironment |
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1174 |
env = testclass._env = TestEnvironment('data', configcls=testclass.configcls) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1175 |
for reg in env.vreg.values(): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1176 |
reg._selected = {} |
2668
979c7ccb4a86
[testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
1177 |
try: |
979c7ccb4a86
[testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
1178 |
orig_select_best = reg.__class__.__orig_select_best |
979c7ccb4a86
[testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
1179 |
except: |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2668
diff
changeset
|
1180 |
orig_select_best = reg.__class__._select_best |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1181 |
def instr_select_best(self, *args, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1182 |
selected = orig_select_best(self, *args, **kwargs) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1183 |
try: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1184 |
self._selected[selected.__class__] += 1 |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1185 |
except KeyError: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1186 |
self._selected[selected.__class__] = 1 |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1187 |
except AttributeError: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1188 |
pass # occurs on reg used to restore database |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1189 |
return selected |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2668
diff
changeset
|
1190 |
reg.__class__._select_best = instr_select_best |
2668
979c7ccb4a86
[testlib] take care of re-monkeypatching which'll cause infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
1191 |
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
|
1192 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2668
diff
changeset
|
1193 |
|
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
|
1194 |
def print_untested_objects(testclass, skipregs=('hooks', 'etypes')): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1195 |
for regname, reg in testclass._env.vreg.iteritems(): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2234
diff
changeset
|
1196 |
if regname in skipregs: |
534
1368c80276bc
refactor validator selection using a content type based dictionnary (which may be overriden by view id) + functions to instrumentize the registry to check what's tested and what's not
sylvain.thenault@logilab.fr
parents:
514
diff
changeset
|
1197 |
continue |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
1198 |
for appobjects in reg.itervalues(): |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
1199 |
for appobject in appobjects: |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
1200 |
if not reg._selected.get(appobject): |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
1201 |
print 'not tested', regname, appobject |