web/test/unittest_application.py
author Florent Cayré <florent.cayre@logilab.fr>
Mon, 14 Dec 2015 14:29:22 +0100
changeset 11065 c7dbd10648e6
parent 11064 113e9da47afc
child 11066 dcbb64d3a1d9
permissions -rw-r--r--
[forms] Do not raise errors on composite required relation being deleted The entity included in the composite will be deleted in such a case, so the field is not required even when the cardinality is '1' or '+'. Related to #8529868
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
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
import base64, Cookie
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
    21
import httplib
2661
f8df42c9da6b [vreg api update] remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2267
diff changeset
    22
f8df42c9da6b [vreg api update] remove some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2267
diff changeset
    23
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
    24
from logilab.common.decorators import clear_cache, classproperty
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
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
    26
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
    27
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
    28
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
    29
from cubicweb.web import LogOut, Redirect, INTERNAL_FIELD_VALUE
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    30
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
    31
from cubicweb.web.application import anonymized_request
9065
b1cad8e4557f [web/test] properly reset the request connection related attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9064
diff changeset
    32
from cubicweb.dbapi import DBAPISession, _NeedAuthAccessMock
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
    33
from cubicweb import repoapi
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
class FakeMapping:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
    """emulates a mapping module"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
    def __init__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
        self.ENTITIES_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
        self.ATTRIBUTES_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
        self.RELATIONS_MAP = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
class MockCursor:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
    def __init__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
        self.executed = []
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5038
diff changeset
    45
    def execute(self, rql, args=None, build_descr=False):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
        args = args or {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
        self.executed.append(rql % args)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    48
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
class FakeController(ViewController):
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
    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
    53
        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
    54
        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
    55
        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
    56
        self._cw.execute = self._cursor.execute
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
    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
    59
        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
    60
        self._cw.execute = self._cursor.execute
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
    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
    63
        self._cw.form = form
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
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
class RequestBaseTC(TestCase):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
    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
    68
        self._cw = FakeRequest()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
    69
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
    def test_list_arg(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
        """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
    73
        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
    74
        self.assertEqual(list_arg('arg3', {}), [])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
        d = {'arg1' : "value1",
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
             'arg2' : ('foo', INTERNAL_FIELD_VALUE,),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
             '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
    78
        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
    79
        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
    80
        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
    81
        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
    82
        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
    83
        self.assertEqual({'arg3' : ['bar'],}, d)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    85
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    86
    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
    87
        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
    88
        self.assertEqual(self._cw.from_controller(), 'view')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    89
        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
    90
        req.vreg['controllers'] = {'view': 1, 'login': 1}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    91
        # this assertion is just to make sure that relative_path can be
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    92
        # 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
    93
        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
    94
        self.assertEqual(req.from_controller(), 'view')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    95
        # test on a valid non-view controller
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    96
        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
    97
        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
    98
        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
    99
        self.assertEqual(req.from_controller(), 'login')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   100
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   101
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
class UtilsTC(TestCase):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   103
    """test suite for misc application utilities"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   104
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
    def setUp(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
        self.ctrl = FakeController()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   107
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   108
    #def test_which_mapping(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   109
    #    """tests which mapping is used (application or core)"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   110
    #    init_mapping()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   111
    #    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
   112
    #    self.assertEqual(mapping.MAPPING_USED, 'core')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   113
    #    sys.modules['mapping'] = FakeMapping()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   114
    #    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
   115
    #    self.assertEqual(mapping.MAPPING_USED, 'application')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
    #    del sys.modules['mapping']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   117
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
    def test_execute_linkto(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   119
        """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
   120
        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
   121
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   122
                          [])
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   123
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   124
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:object',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   125
                              'eid': 8})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   126
        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
   127
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   128
                          ['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
   129
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   130
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   131
        self.ctrl.new_cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:subject',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   133
                              'eid': 8})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
        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
   135
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   136
                          ['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
   137
                           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
   138
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   140
        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
   141
        self.ctrl._cw.form = {'__linkto' : 'works_for:12_13_14:object'}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
        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
   143
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   144
                          ['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
   145
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   146
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   147
        self.ctrl.new_cursor()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
        self.ctrl.set_form({'__linkto' : 'works_for:12_13_14:subject'})
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
        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
   150
        self.assertEqual(self.ctrl._cursor.executed,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   151
                          ['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
   152
                           for i in (12, 13, 14)])
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   154
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2661
diff changeset
   155
class ApplicationTC(CubicWebTC):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
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
   157
    @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
   158
    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
   159
        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
   160
            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
   161
        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
   162
            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
   163
            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
   164
            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
   165
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   166
    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
   167
        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
   168
            user = cnx.user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   169
            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
   170
            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
   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.commit()
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', 'guests')))
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   176
            # cleanup
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   177
            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
   178
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   179
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   180
    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
   181
        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
   182
            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
   183
            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
   184
            req.form = {
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   185
                'eid':       eid,
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   186
                '__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
   187
                '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
   188
                 # 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
   189
                '__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
   190
                }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   191
            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
   192
            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
   193
            eidmap = forminfo['eidmap']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   194
            self.assertEqual(eidmap, {})
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   195
            values = forminfo['values']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   196
            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
   197
            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
   198
            error = forminfo['error']
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   199
            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
   200
            self.assertEqual(error.errors['login-subject'], 'required field')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   201
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   202
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   203
    def test_validation_error_dont_loose_subentity_data_ctrl(self):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   204
        """test creation of two linked entities
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   205
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   206
        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
   207
        """
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   208
        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
   209
            # 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
   210
            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
   211
                        '__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
   212
                        # missing required field
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   213
                        '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
   214
                        # 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
   215
                        '__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
   216
                        '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
   217
                        '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
   218
                        # 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
   219
                        '__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
   220
                        }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   221
            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
   222
            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
   223
            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
   224
            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
   225
            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
   226
            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
   227
            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
   228
                              {'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
   229
            self.assertEqual(forminfo['values'], req.form)
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   230
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   231
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   232
    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
   233
        """test creation of two linked entities
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
        error occurs on the repository
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   236
        """
9641
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   237
        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
   238
            # 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
   239
            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
   240
                        '__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
   241
                        # already existent user
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   242
                        '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
   243
                        '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
   244
                        '__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
   245
                        '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
   246
                        '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
   247
                        # 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
   248
                        '__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
   249
                        }
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   250
            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
   251
            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
   252
            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
   253
            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
   254
            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
   255
            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
   256
            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
   257
                              {'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
   258
            self.assertEqual(forminfo['values'], req.form)
5038
90493551b1eb [form] fix validation error handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   259
11063
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   260
    def _edit_parent(self, dir_eid, parent_eid, role='subject',
11064
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   261
                     etype='Directory', **kwargs):
11063
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   262
        parent_eid = parent_eid or '__cubicweb_internal_field__'
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   263
        with self.admin_access.web_request() as req:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   264
            req.form = {
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   265
                'eid': unicode(dir_eid),
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   266
                '__maineid': unicode(dir_eid),
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   267
                '__type:%s' % dir_eid: etype,
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   268
                'parent-%s:%s' % (role, dir_eid): parent_eid,
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   269
            }
11064
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   270
            req.form.update(kwargs)
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   271
            req.form['_cw_entity_fields:%s' % dir_eid] = ','.join(
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   272
                ['parent-%s' % role] +
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   273
                [key.split(':')[0]
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   274
                 for key in kwargs.keys()
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   275
                 if not key.startswith('_')])
11063
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   276
            self.expect_redirect_handle_request(req)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   277
11064
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   278
    def test_create_and_link_directories(self):
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   279
        with self.admin_access.web_request() as req:
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   280
            req.form = {
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   281
                'eid': (u'A', u'B'),
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   282
                '__maineid': u'A',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   283
                '__type:A': 'Directory',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   284
                '__type:B': 'Directory',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   285
                'parent-subject:B': u'A',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   286
                'name-subject:A': u'topd',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   287
                'name-subject:B': u'subd',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   288
                '_cw_entity_fields:A': 'name-subject',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   289
                '_cw_entity_fields:B': 'parent-subject,name-subject',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   290
            }
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   291
            self.expect_redirect_handle_request(req)
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   292
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   293
        with self.admin_access.repo_cnx() as cnx:
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   294
            self.assertTrue(cnx.find('Directory', name=u'topd'))
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   295
            self.assertTrue(cnx.find('Directory', name=u'subd'))
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   296
            self.assertEqual(1, cnx.execute(
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   297
                'Directory SUBD WHERE SUBD parent TOPD,'
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   298
                ' SUBD name "subd", TOPD name "topd"').rowcount)
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   299
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   300
    def test_create_subentity(self):
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   301
        with self.admin_access.repo_cnx() as cnx:
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   302
            topd = cnx.create_entity('Directory', name=u'topd')
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   303
            cnx.commit()
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   304
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   305
        with self.admin_access.web_request() as req:
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   306
            req.form = {
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   307
                'eid': (unicode(topd.eid), u'B'),
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   308
                '__maineid': unicode(topd.eid),
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   309
                '__type:%s' % topd.eid: 'Directory',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   310
                '__type:B': 'Directory',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   311
                'parent-object:%s' % topd.eid: u'B',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   312
                'name-subject:B': u'subd',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   313
                '_cw_entity_fields:%s' % topd.eid: 'parent-object',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   314
                '_cw_entity_fields:B': 'name-subject',
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   315
            }
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   316
            self.expect_redirect_handle_request(req)
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   317
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   318
        with self.admin_access.repo_cnx() as cnx:
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   319
            self.assertTrue(cnx.find('Directory', name=u'topd'))
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   320
            self.assertTrue(cnx.find('Directory', name=u'subd'))
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   321
            self.assertEqual(1, cnx.execute(
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   322
                'Directory SUBD WHERE SUBD parent TOPD,'
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   323
                ' SUBD name "subd", TOPD name "topd"').rowcount)
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   324
11063
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   325
    def test_subject_subentity_removal(self):
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   326
        """Editcontroller: detaching a composite relation removes the subentity
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   327
        (edit from the subject side)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   328
        """
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   329
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   330
            topd = cnx.create_entity('Directory', name=u'topd')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   331
            sub1 = cnx.create_entity('Directory', name=u'sub1', parent=topd)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   332
            sub2 = cnx.create_entity('Directory', name=u'sub2', parent=topd)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   333
            cnx.commit()
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   334
11064
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   335
        attrs = {'name-subject:%s' % sub1.eid: ''}
113e9da47afc [edit controller] Cancel RQL queries to be performed on entities to be deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11063
diff changeset
   336
        self._edit_parent(sub1.eid, parent_eid=None, **attrs)
11063
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   337
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   338
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   339
            self.assertTrue(cnx.find('Directory', eid=topd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   340
            self.assertFalse(cnx.find('Directory', eid=sub1.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   341
            self.assertTrue(cnx.find('Directory', eid=sub2.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   342
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   343
    def test_object_subentity_removal(self):
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   344
        """Editcontroller: detaching a composite relation removes the subentity
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   345
        (edit from the object side)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   346
        """
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   347
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   348
            topd = cnx.create_entity('Directory', name=u'topd')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   349
            sub1 = cnx.create_entity('Directory', name=u'sub1', parent=topd)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   350
            sub2 = cnx.create_entity('Directory', name=u'sub2', parent=topd)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   351
            cnx.commit()
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   352
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   353
        self._edit_parent(topd.eid, parent_eid=sub1.eid, role='object')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   354
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   355
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   356
            self.assertTrue(cnx.find('Directory', eid=topd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   357
            self.assertTrue(cnx.find('Directory', eid=sub1.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   358
            self.assertFalse(cnx.find('Directory', eid=sub2.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   359
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   360
    def test_reparent_subentity(self):
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   361
        "Editcontroller: re-parenting a subentity does not remove it"
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   362
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   363
            top1 = cnx.create_entity('Directory', name=u'top1')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   364
            top2 = cnx.create_entity('Directory', name=u'top2')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   365
            subd = cnx.create_entity('Directory', name=u'subd', parent=top1)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   366
            cnx.commit()
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   367
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   368
        self._edit_parent(subd.eid, parent_eid=top2.eid)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   369
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   370
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   371
            self.assertTrue(cnx.find('Directory', eid=top1.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   372
            self.assertTrue(cnx.find('Directory', eid=top2.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   373
            self.assertTrue(cnx.find('Directory', eid=subd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   374
            self.assertEqual(
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   375
                cnx.find('Directory', eid=subd.eid).one().parent[0], top2)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   376
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   377
    def test_subject_mixed_composite_subentity_removal_1(self):
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   378
        """Editcontroller: detaching several subentities respects each rdef's
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   379
        compositeness - Remove non composite
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   380
        """
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   381
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   382
            topd = cnx.create_entity('Directory', name=u'topd')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   383
            fs = cnx.create_entity('Filesystem', name=u'/tmp')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   384
            subd = cnx.create_entity('Directory', name=u'subd',
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   385
                                     parent=(topd, fs))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   386
            cnx.commit()
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   387
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   388
        self._edit_parent(subd.eid, parent_eid=topd.eid)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   389
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   390
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   391
            self.assertTrue(cnx.find('Directory', eid=topd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   392
            self.assertTrue(cnx.find('Directory', eid=subd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   393
            self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   394
            self.assertEqual(cnx.find('Directory', eid=subd.eid).one().parent,
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   395
                             [topd,])
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   396
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   397
    def test_subject_mixed_composite_subentity_removal_2(self):
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   398
        """Editcontroller: detaching several subentities respects each rdef's
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   399
        compositeness - Remove composite
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   400
        """
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   401
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   402
            topd = cnx.create_entity('Directory', name=u'topd')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   403
            fs = cnx.create_entity('Filesystem', name=u'/tmp')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   404
            subd = cnx.create_entity('Directory', name=u'subd',
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   405
                                     parent=(topd, fs))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   406
            cnx.commit()
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   407
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   408
        self._edit_parent(subd.eid, parent_eid=fs.eid)
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   409
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   410
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   411
            self.assertTrue(cnx.find('Directory', eid=topd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   412
            self.assertFalse(cnx.find('Directory', eid=subd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   413
            self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   414
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   415
    def test_object_mixed_composite_subentity_removal_1(self):
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   416
        """Editcontroller: detaching several subentities respects each rdef's
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   417
        compositeness - Remove non composite
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   418
        """
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   419
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   420
            topd = cnx.create_entity('Directory', name=u'topd')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   421
            fs = cnx.create_entity('Filesystem', name=u'/tmp')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   422
            subd = cnx.create_entity('Directory', name=u'subd',
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   423
                                     parent=(topd, fs))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   424
            cnx.commit()
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   425
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   426
        self._edit_parent(fs.eid, parent_eid=None, role='object',
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   427
                          etype='Filesystem')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   428
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   429
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   430
            self.assertTrue(cnx.find('Directory', eid=topd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   431
            self.assertTrue(cnx.find('Directory', eid=subd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   432
            self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   433
            self.assertEqual(cnx.find('Directory', eid=subd.eid).one().parent,
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   434
                             [topd,])
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   435
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   436
    def test_object_mixed_composite_subentity_removal_2(self):
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   437
        """Editcontroller: detaching several subentities respects each rdef's
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   438
        compositeness - Remove composite
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   439
        """
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   440
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   441
            topd = cnx.create_entity('Directory', name=u'topd')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   442
            fs = cnx.create_entity('Filesystem', name=u'/tmp')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   443
            subd = cnx.create_entity('Directory', name=u'subd',
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   444
                                     parent=(topd, fs))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   445
            cnx.commit()
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   446
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   447
        self._edit_parent(topd.eid, parent_eid=None, role='object')
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   448
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   449
        with self.admin_access.repo_cnx() as cnx:
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   450
            self.assertTrue(cnx.find('Directory', eid=topd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   451
            self.assertFalse(cnx.find('Directory', eid=subd.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   452
            self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
de20b0903d7d [edit controller] fix handling of removal of subentities from an edit form
Florent Cayré <florent.cayre@logilab.fr>
parents: 11062
diff changeset
   453
11065
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   454
    def test_delete_mandatory_composite(self):
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   455
        with self.admin_access.repo_cnx() as cnx:
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   456
            perm = cnx.create_entity('DirectoryPermission')
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   457
            mydir = cnx.create_entity('Directory', name=u'dir',
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   458
                                      has_permission=perm)
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   459
            cnx.commit()
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   460
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   461
        with self.admin_access.web_request() as req:
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   462
            dir_eid = unicode(mydir.eid)
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   463
            perm_eid = unicode(perm.eid)
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   464
            req.form = {
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   465
                'eid': [dir_eid, perm_eid],
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   466
                '__maineid' : dir_eid,
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   467
                '__type:%s' % dir_eid: 'Directory',
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   468
                '__type:%s' % perm_eid: 'DirectoryPermission',
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   469
                '_cw_entity_fields:%s' % dir_eid: '',
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   470
                '_cw_entity_fields:%s' % perm_eid: 'has_permission-object',
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   471
                'has_permission-object:%s' % perm_eid: '',
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   472
                }
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   473
            path, _params = self.expect_redirect_handle_request(req, 'edit')
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   474
            self.assertTrue(req.find('Directory', eid=mydir.eid))
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   475
            self.assertFalse(req.find('DirectoryPermission', eid=perm.eid))
c7dbd10648e6 [forms] Do not raise errors on composite required relation being deleted
Florent Cayré <florent.cayre@logilab.fr>
parents: 11064
diff changeset
   476
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
   477
    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
   478
        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
   479
            __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
   480
            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
   481
                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
   482
        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
   483
            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
   484
                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
   485
                    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
   486
                    page = app.handle_request(req, '')
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
   487
        self.assertEqual(httplib.INTERNAL_SERVER_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
   488
                         req.status_out)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   489
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   490
    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
   491
        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
   492
            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
   493
            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
   494
            self.assertIn(cleaned, page)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   495
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   496
    def test_nonregr_script_kiddies(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   497
        """test against current script injection"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   498
        injected = '<i>toto</i>'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   499
        cleaned = 'toto'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   500
        for kwargs in ({'__message': injected},
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   501
                       {'vid': injected},
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   502
                       {'vtitle': injected},
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   503
                       ):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   504
            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
   505
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   506
    def test_site_wide_eproperties_sync(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   507
        # 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
   508
        # in which case we need a kindof repo -> http server notification
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   509
        # protocol
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   510
        vreg = self.app.vreg
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   511
        # 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
   512
        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
   513
        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
   514
            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
   515
            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
   516
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   517
            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
   518
            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
   519
            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
   520
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   521
            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
   522
            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
   523
            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
   524
            cnx.commit()
4147cc32371d [web/test] port unittest_application to new 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   525
            self.assertEqual(vreg.property_value('ui.language'), 'en')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   526
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   527
    # authentication tests ####################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   528
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   529
    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
   530
        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
   531
        self.assertAuthFailure(req)
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   532
        self.app.handle_request(req, 'login')
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   533
        self.assertEqual(401, req.status_out)
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   534
        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
   535
        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
   536
        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
   537
        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
   538
        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
   539
        self.assertEqual(len(self.open_sessions), 0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   540
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   541
    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
   542
        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
   543
        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
   544
        try:
9017
aa709bc6b6c1 [application/connect] simplify connection logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8695
diff changeset
   545
            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
   546
        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
   547
            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
   548
        clear_cache(req, 'get_authorization')
9674
96549de9dd70 [test] use assertIn where appropriate
Julien Cristau <julien.cristau@logilab.fr>
parents: 9642
diff changeset
   549
        self.assertIn('__login', form)
96549de9dd70 [test] use assertIn where appropriate
Julien Cristau <julien.cristau@logilab.fr>
parents: 9642
diff changeset
   550
        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
   551
        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
   552
        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
   553
        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
   554
        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
   555
        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
   556
        self.assertEqual(len(self.open_sessions), 0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   557
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   558
    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
   559
        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
   560
            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
   561
            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
   562
            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
   563
                        '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
   564
            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
   565
        # # 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
   566
        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
   567
        # 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
   568
        # 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
   569
        # self.assertAuthFailure(req)
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   570
        # 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
   571
        #origsession.login = address
1490
6b024694d493 add allow-email-login option
Florent <florent@secondweb.fr>
parents: 1489
diff changeset
   572
        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
   573
        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
   574
        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
   575
        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
   576
        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
   577
        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
   578
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   579
    def _reset_cookie(self, req):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   580
        # preparing the suite of the test
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   581
        # set session id in cookie
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   582
        cookie = 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
   583
        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
   584
        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
   585
        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
   586
                               raw=True)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   587
        clear_cache(req, 'get_authorization')
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
   588
        # reset session as if it was a new incoming request
9065
b1cad8e4557f [web/test] properly reset the request connection related attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9064
diff changeset
   589
        req.session = DBAPISession(None)
b1cad8e4557f [web/test] properly reset the request connection related attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9064
diff changeset
   590
        req.user = req.cnx = _NeedAuthAccessMock
b1cad8e4557f [web/test] properly reset the request connection related attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9064
diff changeset
   591
        
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   592
3657
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   593
    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
   594
        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
   595
        # important otherwise _reset_cookie will not use the right session
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   596
        req.set_cnx(repoapi.ClientConnection(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
   597
        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
   598
        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
   599
        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
   600
        self._reset_cookie(req)
706d7bf0ae3d factor out code reusable for authentication tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3524
diff changeset
   601
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   602
    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
   603
        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
   604
        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
   605
        # important otherwise _reset_cookie will not use the right session
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9069
diff changeset
   606
        req.set_cnx(repoapi.ClientConnection(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
   607
        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
   608
        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
   609
        self.assertEqual(1, len(self.open_sessions))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   610
        self._reset_cookie(req)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1490
diff changeset
   611
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   612
    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
   613
        req, origsession = self.init_authentication('http', 'anon')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   614
        self._test_auth_anon(req)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   615
        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
   616
        req.set_request_header('Authorization', 'basic %s' % authstr)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   617
        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
   618
        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
   619
        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
   620
        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
   621
        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
   622
        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
   623
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   624
    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
   625
        req, origsession = self.init_authentication('cookie', 'anon')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   626
        self._test_auth_anon(req)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   627
        req.form['__login'] = 'toto'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   628
        req.form['__password'] = 'pouet'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   629
        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
   630
        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
   631
        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
   632
        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
   633
        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
   634
        self.assertEqual(0, len(self.open_sessions))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   635
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7791
diff changeset
   636
    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
   637
        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
   638
            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
   639
            # 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
   640
            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
   641
            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
   642
                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
   643
                # 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
   644
                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
   645
            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
   646
            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
   647
3523
16880e7ee3fa don't accept None to avoid error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3265
diff changeset
   648
    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
   649
        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
   650
            # 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
   651
            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
   652
            self.app_handle_request(req)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   653
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
   654
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   655
if __name__ == '__main__':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   656
    unittest_main()