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