web/test/unittest_application.py
author Rémi Cardona <remi.cardona@logilab.fr>
Tue, 22 Sep 2015 15:36:32 +0200
changeset 10605 61521bee2b68
parent 10604 d4bf85db41f2
child 10734 e64738c093e5
permissions -rw-r--r--
[py3k] import SimpleCookie using six.moves
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
d4bf85db41f2 [py3k] import HTTP client constants and exceptions using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10356
diff changeset
    22
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
    23
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
    24
f8df42c9da6b [vreg api update] remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2267
diff changeset
    25
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
    26
from logilab.common.decorators import clear_cache, classproperty
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    27
9862
f97a65c29d82 [webtests/application] remove unused imports
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9861
diff changeset
    28
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
    29
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
    30
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
    31
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
    32
from cubicweb.web import LogOut, Redirect, INTERNAL_FIELD_VALUE
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
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
    34
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
    35
from cubicweb import repoapi
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
class FakeMapping:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
    """emulates a mapping module"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
    def __init__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
        self.ENTITIES_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
        self.ATTRIBUTES_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
        self.RELATIONS_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
class MockCursor:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
    def __init__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
        self.executed = []
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5038
diff changeset
    47
    def execute(self, rql, args=None, build_descr=False):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    48
        args = args or {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
        self.executed.append(rql % args)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
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
class FakeController(ViewController):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
    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
    55
        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
    56
        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
    57
        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
    58
        self._cw.execute = self._cursor.execute
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
    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
    61
        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
    62
        self._cw.execute = self._cursor.execute
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
    def 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
    65
        self._cw.form = form
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
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
class RequestBaseTC(TestCase):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
    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
    70
        self._cw = FakeRequest()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
    71
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
    def test_list_arg(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
        """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
    75
        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
    76
        self.assertEqual(list_arg('arg3', {}), [])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
        d = {'arg1' : "value1",
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
             'arg2' : ('foo', INTERNAL_FIELD_VALUE,),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    79
             '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
    80
        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
    81
        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
    82
        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
    83
        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
    84
        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
    85
        self.assertEqual({'arg3' : ['bar'],}, d)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    86
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
    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
    89
        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
    90
        self.assertEqual(self._cw.from_controller(), 'view')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    91
        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
    92
        req.vreg['controllers'] = {'view': 1, 'login': 1}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    93
        # this assertion is just to make sure that relative_path can be
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    94
        # 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
    95
        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
    96
        self.assertEqual(req.from_controller(), 'view')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    97
        # test on a valid non-view controller
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
        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
    99
        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
   100
        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
   101
        self.assertEqual(req.from_controller(), 'login')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   103
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   104
class UtilsTC(TestCase):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
    """test suite for misc application utilities"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   107
    def setUp(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   108
        self.ctrl = FakeController()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   109
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   110
    #def test_which_mapping(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   111
    #    """tests which mapping is used (application or core)"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   112
    #    init_mapping()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   113
    #    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
   114
    #    self.assertEqual(mapping.MAPPING_USED, 'core')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   115
    #    sys.modules['mapping'] = FakeMapping()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
    #    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
   117
    #    self.assertEqual(mapping.MAPPING_USED, 'application')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
    #    del sys.modules['mapping']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   119
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
    def test_execute_linkto(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
        """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
   122
        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
   123
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   124
                          [])
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   125
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   126
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:object',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
                              'eid': 8})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   128
        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
   129
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   130
                          ['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
   131
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   133
        self.ctrl.new_cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:subject',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
                              'eid': 8})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   136
        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
   137
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   138
                          ['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
   139
                           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
   140
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   141
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
        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
   143
        self.ctrl._cw.form = {'__linkto' : 'works_for:12_13_14:object'}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   144
        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
   145
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   146
                          ['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
   147
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
        self.ctrl.new_cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   150
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:subject'})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   151
        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
   152
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
                          ['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
   154
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   155
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2661
diff changeset
   157
class ApplicationTC(CubicWebTC):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   158
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
   159
    @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
   160
    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
   161
        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
   162
            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
   163
        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
   164
            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
   165
            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
   166
            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
   167
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   168
    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
   169
        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
   170
            user = cnx.user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   171
            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
   172
            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
   173
            user = cnx.user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   174
            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
   175
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   176
            user = cnx.user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   177
            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
   178
            # cleanup
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   179
            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
   180
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   181
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   182
    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
   183
        with self.admin_access.web_request() as req:
9861
e90ff9d594e5 [webtests/application] .user(...) really wants a request object
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9674
diff changeset
   184
            user = self.user(req)
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   185
            eid = unicode(user.eid)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   186
            req.form = {
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   187
                'eid':       eid,
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   188
                '__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
   189
                '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
   190
                 # 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
   191
                '__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
   192
                }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   193
            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
   194
            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
   195
            eidmap = forminfo['eidmap']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   196
            self.assertEqual(eidmap, {})
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   197
            values = forminfo['values']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   198
            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
   199
            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
   200
            error = forminfo['error']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   201
            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
   202
            self.assertEqual(error.errors['login-subject'], 'required field')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   203
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   204
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   205
    def test_validation_error_dont_loose_subentity_data_ctrl(self):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   206
        """test creation of two linked entities
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   207
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   208
        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
   209
        """
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   210
        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
   211
            # 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
   212
            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
   213
                        '__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
   214
                        # missing required field
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   215
                        '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
   216
                        # 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
   217
                        '__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
   218
                        '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
   219
                        '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
   220
                        # 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
   221
                        '__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
   222
                        }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   223
            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
   224
            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
   225
            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
   226
            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
   227
            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
   228
            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
   229
            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
   230
                              {'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
   231
            self.assertEqual(forminfo['values'], req.form)
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   232
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
    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
   235
        """test creation of two linked entities
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   236
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   237
        error occurs on the repository
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   238
        """
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   239
        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
   240
            # 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
   241
            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
   242
                        '__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
   243
                        # already existent user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   244
                        '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
   245
                        '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
   246
                        '__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
   247
                        '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
   248
                        '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
   249
                        # 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
   250
                        '__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
   251
                        }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   252
            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
   253
            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
   254
            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
   255
            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
   256
            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
   257
            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
   258
            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
   259
                              {'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
   260
            self.assertEqual(forminfo['values'], req.form)
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   261
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
   262
    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
   263
        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
   264
            __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
   265
            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
   266
                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
   267
        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
   268
            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
   269
                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
   270
                    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
   271
                    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
   272
        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
   273
                         req.status_out)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   274
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   275
    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
   276
        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
   277
            page = self.app_handle_request(req, 'view')
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   278
            self.assertNotIn(injected, page)
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   279
            self.assertIn(cleaned, page)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   280
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   281
    def test_nonregr_script_kiddies(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   282
        """test against current script injection"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   283
        injected = '<i>toto</i>'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   284
        cleaned = 'toto'
10080
bc7c3b0f439b [web] stop accepting the magic __message form parameter
Julien Cristau <julien.cristau@logilab.fr>
parents: 9882
diff changeset
   285
        for kwargs in ({'vid': injected},
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   286
                       {'vtitle': injected},
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   287
                       ):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   288
            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
   289
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   290
    def test_site_wide_eproperties_sync(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   291
        # 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
   292
        # in which case we need a kindof repo -> http server notification
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   293
        # protocol
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   294
        vreg = self.app.vreg
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   295
        # 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
   296
        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
   297
        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
   298
            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
   299
            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
   300
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   301
            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
   302
            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
   303
            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
   304
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   305
            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
   306
            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
   307
            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
   308
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   309
            self.assertEqual(vreg.property_value('ui.language'), 'en')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   310
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   311
    # authentication tests ####################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   312
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   313
    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
   314
        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
   315
        self.assertAuthFailure(req)
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   316
        self.app.handle_request(req, 'login')
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   317
        self.assertEqual(401, req.status_out)
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   318
        clear_cache(req, 'get_authorization')
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
   319
        authstr = base64.encodestring('%s:%s' % (self.admlogin, self.admpassword))
7224
e5833657c646 [testlib] make a clear distinction between input / output HTTP headers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7163
diff changeset
   320
        req.set_request_header('Authorization', 'basic %s' % authstr)
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
   321
        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
   322
        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
   323
        self.assertEqual(len(self.open_sessions), 0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   324
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   325
    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
   326
        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
   327
        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
   328
        try:
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   329
            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
   330
        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
   331
            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
   332
        clear_cache(req, 'get_authorization')
9674
96549de9dd70 [test] use assertIn where appropriate
Julien Cristau <julien.cristau@logilab.fr>
parents: 9642
diff changeset
   333
        self.assertIn('__login', form)
96549de9dd70 [test] use assertIn where appropriate
Julien Cristau <julien.cristau@logilab.fr>
parents: 9642
diff changeset
   334
        self.assertIn('__password', form)
9039
488255d1cf3b [testlib] rework request building in init_authentication
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9019
diff changeset
   335
        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
   336
        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
   337
        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
   338
        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
   339
        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
   340
        self.assertEqual(len(self.open_sessions), 0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   341
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   342
    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
   343
        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
   344
            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
   345
            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
   346
            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
   347
                        '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
   348
            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
   349
        # # 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
   350
        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
   351
        # 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
   352
        # 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
   353
        # self.assertAuthFailure(req)
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   354
        # 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
   355
        #origsession.login = address
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   356
        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
   357
        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
   358
        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
   359
        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
   360
        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
   361
        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
   362
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   363
    def _reset_cookie(self, req):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   364
        # preparing the suite of the test
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   365
        # set session id in cookie
10605
61521bee2b68 [py3k] import SimpleCookie using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10604
diff changeset
   366
        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
   367
        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
   368
        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
   369
        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
   370
                               raw=True)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   371
        clear_cache(req, 'get_authorization')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   372
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   373
    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
   374
        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
   375
        # 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
   376
        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
   377
        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
   378
        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
   379
        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
   380
        self._reset_cookie(req)
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   381
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   382
    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
   383
        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
   384
        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
   385
        # 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
   386
        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
   387
        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
   388
        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
   389
        self.assertEqual(1, len(self.open_sessions))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   390
        self._reset_cookie(req)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   391
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   392
    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
   393
        req, origsession = self.init_authentication('http', 'anon')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   394
        self._test_auth_anon(req)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   395
        authstr = base64.encodestring('toto:pouet')
7224
e5833657c646 [testlib] make a clear distinction between input / output HTTP headers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7163
diff changeset
   396
        req.set_request_header('Authorization', 'basic %s' % authstr)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   397
        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
   398
        authstr = base64.encodestring('%s:%s' % (self.admlogin, self.admpassword))
7224
e5833657c646 [testlib] make a clear distinction between input / output HTTP headers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7163
diff changeset
   399
        req.set_request_header('Authorization', 'basic %s' % authstr)
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
   400
        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
   401
        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
   402
        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
   403
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   404
    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
   405
        req, origsession = self.init_authentication('cookie', 'anon')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   406
        self._test_auth_anon(req)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   407
        req.form['__login'] = 'toto'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   408
        req.form['__password'] = 'pouet'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   409
        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
   410
        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
   411
        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
   412
        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
   413
        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
   414
        self.assertEqual(0, len(self.open_sessions))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   415
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7791
diff changeset
   416
    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
   417
        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
   418
            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
   419
            # 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
   420
            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
   421
            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
   422
                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
   423
                # 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
   424
                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
   425
            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
   426
            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
   427
3523
16880e7ee3fa don't accept None to avoid error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3265
diff changeset
   428
    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
   429
        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
   430
            # 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
   431
            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
   432
            self.app_handle_request(req)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   433
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
   434
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   435
if __name__ == '__main__':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   436
    unittest_main()