cubicweb/web/test/unittest_application.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Sat, 16 Jan 2016 13:48:51 +0100
changeset 11057 0b59724cb3f2
parent 10890 web/test/unittest_application.py@504a67206fdc
child 11129 97095348b3ee
permissions -rw-r--r--
Reorganize source tree to have a "cubicweb" top-level package Basically: mkdir cubicweb hg mv *.py -X setup.py cubicweb hg mv dataimport devtools entities etwist ext hooks i18n misc schemas server skeleton sobjects test web wsgi cubicweb Other changes: * adjust path to cubicweb-ctl in devtools tests * update setup.py to avoid importing __pkginfo__ (exec it instead), replace os.path.walk by os.walk and prepend `modname` here and there * update tox.ini to account for new test locations * update doc/conf.py so that it still finds __pkginfo__.py and CWDIR in doc/Makefile
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9428
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
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: 5038
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5584
c1823448f81d [web] disallow authenticated users to access to the login form (closes #914873)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    18
"""unit tests for cubicweb.web.application"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
10605
61521bee2b68 [py3k] import SimpleCookie using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10604
diff changeset
    20
import base64
10604
d4bf85db41f2 [py3k] import HTTP client constants and exceptions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10356
diff changeset
    21
10734
e64738c093e5 [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10605
diff changeset
    22
from six import text_type
10604
d4bf85db41f2 [py3k] import HTTP client constants and exceptions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10356
diff changeset
    23
from six.moves import http_client
10605
61521bee2b68 [py3k] import SimpleCookie using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10604
diff changeset
    24
from six.moves.http_cookies import SimpleCookie
2661
f8df42c9da6b [vreg api update] remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2267
diff changeset
    25
f8df42c9da6b [vreg api update] remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2267
diff changeset
    26
from logilab.common.testlib import TestCase, unittest_main
6849
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
    27
from logilab.common.decorators import clear_cache, classproperty
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    28
9862
f97a65c29d82 [webtests/application] remove unused imports
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9861
diff changeset
    29
from cubicweb import AuthenticationError
9428
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
    30
from cubicweb import view
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
    31
from cubicweb.devtools.testlib import CubicWebTC, real_error_handling
2661
f8df42c9da6b [vreg api update] remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2267
diff changeset
    32
from cubicweb.devtools.fake import FakeRequest
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: 5174
diff changeset
    33
from cubicweb.web import LogOut, Redirect, INTERNAL_FIELD_VALUE
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
from cubicweb.web.views.basecontrollers import ViewController
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7791
diff changeset
    35
from cubicweb.web.application import anonymized_request
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
    36
from cubicweb import repoapi
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
class FakeMapping:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
    """emulates a mapping module"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
    def __init__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
        self.ENTITIES_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
        self.ATTRIBUTES_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
        self.RELATIONS_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
class MockCursor:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
    def __init__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
        self.executed = []
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5038
diff changeset
    48
    def execute(self, rql, args=None, build_descr=False):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
        args = args or {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
        self.executed.append(rql % args)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
class FakeController(ViewController):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    55
    def __init__(self, form=None):
3462
3a79fecdd2b4 [magicsearch] make tests pass again: base preprocessor must have access to vreg
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3293
diff changeset
    56
        self._cw = FakeRequest()
3a79fecdd2b4 [magicsearch] make tests pass again: base preprocessor must have access to vreg
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3293
diff changeset
    57
        self._cw.form = form or {}
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: 5174
diff changeset
    58
        self._cursor = MockCursor()
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: 5174
diff changeset
    59
        self._cw.execute = self._cursor.execute
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
    def new_cursor(self):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
    62
        self._cursor = MockCursor()
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: 5174
diff changeset
    63
        self._cw.execute = self._cursor.execute
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
    def set_form(self, form):
3462
3a79fecdd2b4 [magicsearch] make tests pass again: base preprocessor must have access to vreg
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3293
diff changeset
    66
        self._cw.form = form
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
class RequestBaseTC(TestCase):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
    def setUp(self):
3462
3a79fecdd2b4 [magicsearch] make tests pass again: base preprocessor must have access to vreg
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3293
diff changeset
    71
        self._cw = FakeRequest()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
    72
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
    def test_list_arg(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
        """tests the list_arg() function"""
3462
3a79fecdd2b4 [magicsearch] make tests pass again: base preprocessor must have access to vreg
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3293
diff changeset
    76
        list_arg = self._cw.list_form_param
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    77
        self.assertEqual(list_arg('arg3', {}), [])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
        d = {'arg1' : "value1",
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    79
             'arg2' : ('foo', INTERNAL_FIELD_VALUE,),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    80
             'arg3' : ['bar']}
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    81
        self.assertEqual(list_arg('arg1', d, True), ['value1'])
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    82
        self.assertEqual(d, {'arg2' : ('foo', INTERNAL_FIELD_VALUE), 'arg3' : ['bar'],})
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    83
        self.assertEqual(list_arg('arg2', d, True), ['foo'])
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    84
        self.assertEqual({'arg3' : ['bar'],}, d)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    85
        self.assertEqual(list_arg('arg3', d), ['bar',])
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    86
        self.assertEqual({'arg3' : ['bar'],}, d)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    87
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    88
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    89
    def test_from_controller(self):
3462
3a79fecdd2b4 [magicsearch] make tests pass again: base preprocessor must have access to vreg
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3293
diff changeset
    90
        self._cw.vreg['controllers'] = {'view': 1, 'login': 1}
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    91
        self.assertEqual(self._cw.from_controller(), 'view')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    92
        req = FakeRequest(url='project?vid=list')
3265
96c8363b8f64 test update, no more a FakeVReg, needs to hack it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2661
diff changeset
    93
        req.vreg['controllers'] = {'view': 1, 'login': 1}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    94
        # this assertion is just to make sure that relative_path can be
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    95
        # correctly computed as it is used in from_controller()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    96
        self.assertEqual(req.relative_path(False), 'project')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
    97
        self.assertEqual(req.from_controller(), 'view')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
        # test on a valid non-view controller
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    99
        req = FakeRequest(url='login?x=1&y=2')
3265
96c8363b8f64 test update, no more a FakeVReg, needs to hack it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2661
diff changeset
   100
        req.vreg['controllers'] = {'view': 1, 'login': 1}
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   101
        self.assertEqual(req.relative_path(False), 'login')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   102
        self.assertEqual(req.from_controller(), 'login')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   103
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   104
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
class UtilsTC(TestCase):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
    """test suite for misc application utilities"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   107
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   108
    def setUp(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   109
        self.ctrl = FakeController()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   110
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   111
    #def test_which_mapping(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   112
    #    """tests which mapping is used (application or core)"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   113
    #    init_mapping()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   114
    #    from cubicweb.common import mapping
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   115
    #    self.assertEqual(mapping.MAPPING_USED, 'core')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
    #    sys.modules['mapping'] = FakeMapping()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   117
    #    init_mapping()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   118
    #    self.assertEqual(mapping.MAPPING_USED, 'application')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   119
    #    del sys.modules['mapping']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
    def test_execute_linkto(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   122
        """tests the execute_linkto() function"""
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   123
        self.assertEqual(self.ctrl.execute_linkto(), None)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   124
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   125
                          [])
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   126
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:object',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   128
                              'eid': 8})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   129
        self.ctrl.execute_linkto()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   130
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   131
                          ['SET Y works_for X WHERE X eid 8, Y eid %s' % i
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   133
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
        self.ctrl.new_cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:subject',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   136
                              'eid': 8})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   137
        self.ctrl.execute_linkto()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   138
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
                          ['SET X works_for Y WHERE X eid 8, Y eid %s' % i
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   140
                           for i in (12, 13, 14)])
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   141
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
        self.ctrl.new_cursor()
3462
3a79fecdd2b4 [magicsearch] make tests pass again: base preprocessor must have access to vreg
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3293
diff changeset
   144
        self.ctrl._cw.form = {'__linkto' : 'works_for:12_13_14:object'}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   145
        self.ctrl.execute_linkto(eid=8)
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   146
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   147
                          ['SET Y works_for X WHERE X eid 8, Y eid %s' % i
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   150
        self.ctrl.new_cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   151
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:subject'})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   152
        self.ctrl.execute_linkto(eid=8)
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   153
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   154
                          ['SET X works_for Y WHERE X eid 8, Y eid %s' % i
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   155
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   157
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2661
diff changeset
   158
class ApplicationTC(CubicWebTC):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   159
6849
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   160
    @classproperty
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   161
    def config(cls):
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   162
        try:
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   163
            return cls.__dict__['_config']
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   164
        except KeyError:
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   165
            config = super(ApplicationTC, cls).config
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   166
            config.global_set_option('allow-email-login', True)
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   167
            return config
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   168
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   169
    def test_cnx_user_groups_sync(self):
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   170
        with self.admin_access.client_cnx() as cnx:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   171
            user = cnx.user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   172
            self.assertEqual(user.groups, set(('managers',)))
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   173
            cnx.execute('SET X in_group G WHERE X eid %s, G name "guests"' % user.eid)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   174
            user = cnx.user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   175
            self.assertEqual(user.groups, set(('managers',)))
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   176
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   177
            user = cnx.user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   178
            self.assertEqual(user.groups, set(('managers', 'guests')))
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   179
            # cleanup
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   180
            cnx.execute('DELETE X in_group G WHERE X eid %s, G name "guests"' % user.eid)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   181
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   182
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   183
    def test_publish_validation_error(self):
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   184
        with self.admin_access.web_request() as req:
10890
504a67206fdc [web/test] Remove use of old test API to silence warning
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10780
diff changeset
   185
            user = req.user
10734
e64738c093e5 [py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10605
diff changeset
   186
            eid = text_type(user.eid)
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   187
            req.form = {
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   188
                'eid':       eid,
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   189
                '__type:'+eid:    'CWUser', '_cw_entity_fields:'+eid: 'login-subject',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   190
                'login-subject:'+eid:     '', # ERROR: no login specified
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   191
                 # just a sample, missing some necessary information for real life
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   192
                '__errorurl': 'view?vid=edition...'
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   193
                }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   194
            path, params = self.expect_redirect_handle_request(req, 'edit')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   195
            forminfo = req.session.data['view?vid=edition...']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   196
            eidmap = forminfo['eidmap']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   197
            self.assertEqual(eidmap, {})
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   198
            values = forminfo['values']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   199
            self.assertEqual(values['login-subject:'+eid], '')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   200
            self.assertEqual(values['eid'], eid)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   201
            error = forminfo['error']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   202
            self.assertEqual(error.entity, user.eid)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   203
            self.assertEqual(error.errors['login-subject'], 'required field')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   204
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   205
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   206
    def test_validation_error_dont_loose_subentity_data_ctrl(self):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   207
        """test creation of two linked entities
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   208
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   209
        error occurs on the web controller
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   210
        """
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   211
        with self.admin_access.web_request() as req:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   212
            # set Y before X to ensure both entities are edited, not only X
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   213
            req.form = {'eid': ['Y', 'X'], '__maineid': 'X',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   214
                        '__type:X': 'CWUser', '_cw_entity_fields:X': 'login-subject',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   215
                        # missing required field
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   216
                        'login-subject:X': u'',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   217
                        # but email address is set
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   218
                        '__type:Y': 'EmailAddress', '_cw_entity_fields:Y': 'address-subject',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   219
                        'address-subject:Y': u'bougloup@logilab.fr',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   220
                        'use_email-object:Y': 'X',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   221
                        # necessary to get validation error handling
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   222
                        '__errorurl': 'view?vid=edition...',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   223
                        }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   224
            path, params = self.expect_redirect_handle_request(req, 'edit')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   225
            forminfo = req.session.data['view?vid=edition...']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   226
            self.assertEqual(set(forminfo['eidmap']), set('XY'))
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   227
            self.assertEqual(forminfo['eidmap']['X'], None)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   228
            self.assertIsInstance(forminfo['eidmap']['Y'], int)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   229
            self.assertEqual(forminfo['error'].entity, 'X')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   230
            self.assertEqual(forminfo['error'].errors,
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   231
                              {'login-subject': 'required field'})
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   232
            self.assertEqual(forminfo['values'], req.form)
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   233
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   234
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   235
    def test_validation_error_dont_loose_subentity_data_repo(self):
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   236
        """test creation of two linked entities
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   237
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   238
        error occurs on the repository
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   239
        """
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   240
        with self.admin_access.web_request() as req:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   241
            # set Y before X to ensure both entities are edited, not only X
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   242
            req.form = {'eid': ['Y', 'X'], '__maineid': 'X',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   243
                        '__type:X': 'CWUser', '_cw_entity_fields:X': 'login-subject,upassword-subject',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   244
                        # already existent user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   245
                        'login-subject:X': u'admin',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   246
                        'upassword-subject:X': u'admin', 'upassword-subject-confirm:X': u'admin',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   247
                        '__type:Y': 'EmailAddress', '_cw_entity_fields:Y': 'address-subject',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   248
                        'address-subject:Y': u'bougloup@logilab.fr',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   249
                        'use_email-object:Y': 'X',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   250
                        # necessary to get validation error handling
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   251
                        '__errorurl': 'view?vid=edition...',
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   252
                        }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   253
            path, params = self.expect_redirect_handle_request(req, 'edit')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   254
            forminfo = req.session.data['view?vid=edition...']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   255
            self.assertEqual(set(forminfo['eidmap']), set('XY'))
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   256
            self.assertIsInstance(forminfo['eidmap']['X'], int)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   257
            self.assertIsInstance(forminfo['eidmap']['Y'], int)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   258
            self.assertEqual(forminfo['error'].entity, forminfo['eidmap']['X'])
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   259
            self.assertEqual(forminfo['error'].errors,
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   260
                              {'login-subject': u'the value "admin" is already used, use another one'})
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   261
            self.assertEqual(forminfo['values'], req.form)
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   262
9428
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   263
    def test_ajax_view_raise_arbitrary_error(self):
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   264
        class ErrorAjaxView(view.View):
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   265
            __regid__ = 'test.ajax.error'
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   266
            def call(self):
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   267
                raise Exception('whatever')
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   268
        with self.temporary_appobjects(ErrorAjaxView):
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   269
            with real_error_handling(self.app) as app:
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   270
                with self.admin_access.web_request(vid='test.ajax.error') as req:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   271
                    req.ajax_request = True
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   272
                    page = app.handle_request(req, '')
10604
d4bf85db41f2 [py3k] import HTTP client constants and exceptions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10356
diff changeset
   273
        self.assertEqual(http_client.INTERNAL_SERVER_ERROR,
9428
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   274
                         req.status_out)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   275
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   276
    def _test_cleaned(self, kwargs, injected, cleaned):
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   277
        with self.admin_access.web_request(**kwargs) as req:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   278
            page = self.app_handle_request(req, 'view')
10735
cb83ba66fa61 [py3k] CubicWebTC.app_handle_request returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10734
diff changeset
   279
            self.assertNotIn(injected.encode('ascii'), page)
cb83ba66fa61 [py3k] CubicWebTC.app_handle_request returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10734
diff changeset
   280
            self.assertIn(cleaned.encode('ascii'), page)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   281
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   282
    def test_nonregr_script_kiddies(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   283
        """test against current script injection"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   284
        injected = '<i>toto</i>'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   285
        cleaned = 'toto'
10080
bc7c3b0f439b [web] stop accepting the magic __message form parameter
Julien Cristau <julien.cristau@logilab.fr>
parents: 9882
diff changeset
   286
        for kwargs in ({'vid': injected},
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   287
                       {'vtitle': injected},
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   288
                       ):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   289
            yield self._test_cleaned, kwargs, injected, cleaned
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   290
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   291
    def test_site_wide_eproperties_sync(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   292
        # XXX work in all-in-one configuration but not in twisted for instance
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   293
        # in which case we need a kindof repo -> http server notification
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   294
        # protocol
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   295
        vreg = self.app.vreg
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   296
        # default value
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   297
        self.assertEqual(vreg.property_value('ui.language'), 'en')
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   298
        with self.admin_access.client_cnx() as cnx:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   299
            cnx.execute('INSERT CWProperty X: X value "fr", X pkey "ui.language"')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   300
            self.assertEqual(vreg.property_value('ui.language'), 'en')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   301
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   302
            self.assertEqual(vreg.property_value('ui.language'), 'fr')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   303
            cnx.execute('SET X value "de" WHERE X pkey "ui.language"')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   304
            self.assertEqual(vreg.property_value('ui.language'), 'fr')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   305
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   306
            self.assertEqual(vreg.property_value('ui.language'), 'de')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   307
            cnx.execute('DELETE CWProperty X WHERE X pkey "ui.language"')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   308
            self.assertEqual(vreg.property_value('ui.language'), 'de')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   309
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   310
            self.assertEqual(vreg.property_value('ui.language'), 'en')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   311
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   312
    # authentication tests ####################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   313
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   314
    def test_http_auth_no_anon(self):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   315
        req, origsession = self.init_authentication('http')
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   316
        self.assertAuthFailure(req)
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   317
        self.app.handle_request(req, 'login')
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   318
        self.assertEqual(401, req.status_out)
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   319
        clear_cache(req, 'get_authorization')
10779
6cef304aca4c [web] base64 works on bytes not str (py3k)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10735
diff changeset
   320
        authstr = base64.encodestring(('%s:%s' % (self.admlogin, self.admpassword)).encode('ascii'))
6cef304aca4c [web] base64 works on bytes not str (py3k)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10735
diff changeset
   321
        req.set_request_header('Authorization', 'basic %s' % authstr.decode('ascii'))
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: 5174
diff changeset
   322
        self.assertAuthSuccess(req, origsession)
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   323
        self.assertRaises(LogOut, self.app_handle_request, req, 'logout')
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   324
        self.assertEqual(len(self.open_sessions), 0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   325
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   326
    def test_cookie_auth_no_anon(self):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   327
        req, origsession = self.init_authentication('cookie')
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   328
        self.assertAuthFailure(req)
8311
76a44a0d7f4b [login] split authentication logic from post authentication logic (closes #2200755)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7876
diff changeset
   329
        try:
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   330
            form = self.app.handle_request(req, 'login')
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8694
diff changeset
   331
        except Redirect as redir:
8311
76a44a0d7f4b [login] split authentication logic from post authentication logic (closes #2200755)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7876
diff changeset
   332
            self.fail('anonymous user should get login form')
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   333
        clear_cache(req, 'get_authorization')
10780
a96ed0acc556 [web/test] CubicWebPublisher.handle_request returns bytes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10779
diff changeset
   334
        self.assertIn(b'__login', form)
a96ed0acc556 [web/test] CubicWebPublisher.handle_request returns bytes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10779
diff changeset
   335
        self.assertIn(b'__password', form)
9039
488255d1cf3b [testlib] rework request building in init_authentication
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9019
diff changeset
   336
        self.assertFalse(req.cnx) # Mock cnx are False
6848
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   337
        req.form['__login'] = self.admlogin
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   338
        req.form['__password'] = self.admpassword
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: 5174
diff changeset
   339
        self.assertAuthSuccess(req, origsession)
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   340
        self.assertRaises(LogOut, self.app_handle_request, req, 'logout')
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   341
        self.assertEqual(len(self.open_sessions), 0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   342
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   343
    def test_login_by_email(self):
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   344
        with self.admin_access.client_cnx() as cnx:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   345
            login = cnx.user.login
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   346
            address = login + u'@localhost'
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   347
            cnx.execute('INSERT EmailAddress X: X address %(address)s, U primary_email X '
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   348
                        'WHERE U login %(login)s', {'address': address, 'login': login})
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   349
            cnx.commit()
6849
5a0c2cfc19bf [repository auth] cleanup email login by turning it into a proper repo-side authentication plugin
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6848
diff changeset
   350
        # # option allow-email-login not set
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: 5174
diff changeset
   351
        req, origsession = self.init_authentication('cookie')
6848
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   352
        # req.form['__login'] = address
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   353
        # req.form['__password'] = self.admpassword
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   354
        # self.assertAuthFailure(req)
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   355
        # option allow-email-login set
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   356
        #origsession.login = address
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   357
        self.set_option('allow-email-login', True)
1489
08acef58ad08 add a test regarding login with a primary email
Florent <florent@secondweb.fr>
parents: 1398
diff changeset
   358
        req.form['__login'] = address
6848
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   359
        req.form['__password'] = self.admpassword
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: 5174
diff changeset
   360
        self.assertAuthSuccess(req, origsession)
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   361
        self.assertRaises(LogOut, self.app_handle_request, req, 'logout')
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   362
        self.assertEqual(len(self.open_sessions), 0)
1489
08acef58ad08 add a test regarding login with a primary email
Florent <florent@secondweb.fr>
parents: 1398
diff changeset
   363
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   364
    def _reset_cookie(self, req):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   365
        # preparing the suite of the test
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   366
        # set session id in cookie
10605
61521bee2b68 [py3k] import SimpleCookie using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10604
diff changeset
   367
        cookie = SimpleCookie()
6797
90d687bd4c52 [web test] fix authentication test: session cookie should now be computed by the session handler (changed in cw 3.10.6)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6796
diff changeset
   368
        sessioncookie = self.app.session_handler.session_cookie(req)
90d687bd4c52 [web test] fix authentication test: session cookie should now be computed by the session handler (changed in cw 3.10.6)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6796
diff changeset
   369
        cookie[sessioncookie] = req.session.sessionid
7224
e5833657c646 [testlib] make a clear distinction between input / output HTTP headers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7163
diff changeset
   370
        req.set_request_header('Cookie', cookie[sessioncookie].OutputString(),
e5833657c646 [testlib] make a clear distinction between input / output HTTP headers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7163
diff changeset
   371
                               raw=True)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   372
        clear_cache(req, 'get_authorization')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   373
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   374
    def _test_auth_anon(self, req):
9019
e08f9c55dab5 [application] call req.set_session in application.main_handle_request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9017
diff changeset
   375
        asession = self.app.get_session(req)
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   376
        # important otherwise _reset_cookie will not use the right session
10356
a009a31fb1ea [connection] eliminate ClientConnection leftovers
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10331
diff changeset
   377
        req.set_cnx(repoapi.Connection(asession))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   378
        self.assertEqual(len(self.open_sessions), 1)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   379
        self.assertEqual(asession.login, 'anon')
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7584
diff changeset
   380
        self.assertTrue(asession.anonymous_session)
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   381
        self._reset_cookie(req)
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   382
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   383
    def _test_anon_auth_fail(self, req):
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   384
        self.assertEqual(1, len(self.open_sessions))
9019
e08f9c55dab5 [application] call req.set_session in application.main_handle_request
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9017
diff changeset
   385
        session = self.app.get_session(req)
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   386
        # important otherwise _reset_cookie will not use the right session
10356
a009a31fb1ea [connection] eliminate ClientConnection leftovers
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10331
diff changeset
   387
        req.set_cnx(repoapi.Connection(session))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   388
        self.assertEqual(req.message, 'authentication failure')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   389
        self.assertEqual(req.session.anonymous_session, True)
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   390
        self.assertEqual(1, len(self.open_sessions))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   391
        self._reset_cookie(req)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   392
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   393
    def test_http_auth_anon_allowed(self):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   394
        req, origsession = self.init_authentication('http', 'anon')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   395
        self._test_auth_anon(req)
10779
6cef304aca4c [web] base64 works on bytes not str (py3k)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10735
diff changeset
   396
        authstr = base64.encodestring(b'toto:pouet')
6cef304aca4c [web] base64 works on bytes not str (py3k)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10735
diff changeset
   397
        req.set_request_header('Authorization', 'basic %s' % authstr.decode('ascii'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   398
        self._test_anon_auth_fail(req)
10779
6cef304aca4c [web] base64 works on bytes not str (py3k)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10735
diff changeset
   399
        authstr = base64.encodestring(('%s:%s' % (self.admlogin, self.admpassword)).encode('ascii'))
6cef304aca4c [web] base64 works on bytes not str (py3k)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10735
diff changeset
   400
        req.set_request_header('Authorization', 'basic %s' % authstr.decode('ascii'))
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: 5174
diff changeset
   401
        self.assertAuthSuccess(req, origsession)
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   402
        self.assertRaises(LogOut, self.app_handle_request, req, 'logout')
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   403
        self.assertEqual(len(self.open_sessions), 0)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   404
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   405
    def test_cookie_auth_anon_allowed(self):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   406
        req, origsession = self.init_authentication('cookie', 'anon')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   407
        self._test_auth_anon(req)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   408
        req.form['__login'] = 'toto'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   409
        req.form['__password'] = 'pouet'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   410
        self._test_anon_auth_fail(req)
6848
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   411
        req.form['__login'] = self.admlogin
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6797
diff changeset
   412
        req.form['__password'] = self.admpassword
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: 5174
diff changeset
   413
        self.assertAuthSuccess(req, origsession)
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   414
        self.assertRaises(LogOut, self.app_handle_request, req, 'logout')
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   415
        self.assertEqual(0, len(self.open_sessions))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   416
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7791
diff changeset
   417
    def test_anonymized_request(self):
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   418
        with self.admin_access.web_request() as req:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   419
            self.assertEqual(self.admlogin, req.session.user.login)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   420
            # admin should see anon + admin
9642
9a42eaeea263 [web/test] avoid deprecation warnings from find_entities()
Julien Cristau <julien.cristau@logilab.fr>
parents: 9641
diff changeset
   421
            self.assertEqual(2, len(list(req.find('CWUser'))))
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   422
            with anonymized_request(req):
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   423
                self.assertEqual('anon', req.session.login, 'anon')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   424
                # anon should only see anon user
9642
9a42eaeea263 [web/test] avoid deprecation warnings from find_entities()
Julien Cristau <julien.cristau@logilab.fr>
parents: 9641
diff changeset
   425
                self.assertEqual(1, len(list(req.find('CWUser'))))
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   426
            self.assertEqual(self.admlogin, req.session.login)
9642
9a42eaeea263 [web/test] avoid deprecation warnings from find_entities()
Julien Cristau <julien.cristau@logilab.fr>
parents: 9641
diff changeset
   427
            self.assertEqual(2, len(list(req.find('CWUser'))))
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7791
diff changeset
   428
3523
16880e7ee3fa don't accept None to avoid error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3265
diff changeset
   429
    def test_non_regr_optional_first_var(self):
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   430
        with self.admin_access.web_request() as req:
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   431
            # expect a rset with None in [0][0]
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   432
            req.form['rql'] = 'rql:Any OV1, X WHERE X custom_workflow OV1?'
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   433
            self.app_handle_request(req)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   434
9428
946aded614f3 [web error] exception may not have a 'status' attribute, generating an AttributeError that hides the original error. Closes #3381670
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8695
diff changeset
   435
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   436
if __name__ == '__main__':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   437
    unittest_main()