test/unittest_predicates.py
author Julien Cristau <julien.cristau@logilab.fr>
Tue, 28 Jul 2015 09:25:26 +0200
changeset 10553 1d824df4f2bd
parent 10529 747eded13c68
child 10704 73367a56ee41
permissions -rw-r--r--
Fix (de)serialization of ComputedRelation read permissions For normal relation types, permissions don't need to be stored since they're just default values for the relation definitions. However, computed relations are serialized (as CWComputedRType), while their relation definitions are added at schema finalization time, and are only in memory. So add the 'read_permission' relation to CWComputedRType, and the appropriate hooks to save and restore those permissions. To avoid having to touch yams, we drop the 'add' and 'delete' permissions from the default computed relation permissions; this should probably be backported there. The actual permissions (set on the relation definitions) are hardcoded in finalize_computed_relations anyway. In deserialize_schema, the CWComputedRType handling needs to be delayed a little bit, until after we've called deserialize_ertype_permissions. The rql2sql test is adjusted because CWComputedRType has a 'name' attribute and the 'read_permission' relation, which generates ambiguity vs CWEType. We add an explicit CubicWebRelationSchema.check_permission_definitions, since we need to check both that computed and non-computed rtypes are defined properly. Based on report and initial patch from Christophe de Vienne (thanks!). Closes #5706307
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
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: 4491
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5561
58b05c314443 [selectors] ensure adaptable('IDownloadable') takes precedence over implements('Any')
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    18
"""unit tests for selectors mechanism"""
630
66ff0b2f7d03 simple test implementation for binary operators on selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
    20
from operator import eq, lt, le, gt
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    21
from contextlib import contextmanager
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    22
630
66ff0b2f7d03 simple test implementation for binary operators on selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
from logilab.common.testlib import TestCase, unittest_main
9582
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9152
diff changeset
    24
from logilab.common.decorators import clear_cache
630
66ff0b2f7d03 simple test implementation for binary operators on selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
5561
58b05c314443 [selectors] ensure adaptable('IDownloadable') takes precedence over implements('Any')
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    26
from cubicweb import Binary
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
    27
from cubicweb.devtools.testlib import CubicWebTC
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7986
diff changeset
    28
from cubicweb.predicates import (is_instance, adaptable, match_kwargs, match_user_groups,
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    29
                                multi_lines_rset, score_entity, is_in_state,
10476
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
    30
                                rql_condition, relation_possible, match_form_params)
8220
e4ea285510e5 [test] fix test broken by selectors/predicates changes coming with the move of registry to lgc
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8190
diff changeset
    31
from cubicweb.selectors import on_transition # XXX on_transition is deprecated
8858
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
    32
from cubicweb.view import EntityAdapter
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
    33
from cubicweb.web import action
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    34
630
66ff0b2f7d03 simple test implementation for binary operators on selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    36
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    37
class ImplementsTC(CubicWebTC):
779
8510e14335e1 implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents: 630
diff changeset
    38
    def test_etype_priority(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    39
        with self.admin_access.web_request() as req:
10529
747eded13c68 [test] use FakeFile instead of File in test_fulltextindex
Julien Cristau <julien.cristau@logilab.fr>
parents: 10476
diff changeset
    40
            f = req.create_entity('FakeFile', data_name=u'hop.txt', data=Binary('hop'),
747eded13c68 [test] use FakeFile instead of File in test_fulltextindex
Julien Cristau <julien.cristau@logilab.fr>
parents: 10476
diff changeset
    41
                                  data_format=u'text/plain')
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    42
            rset = f.as_rset()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    43
            anyscore = is_instance('Any')(f.__class__, req, rset=rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    44
            idownscore = adaptable('IDownloadable')(f.__class__, req, rset=rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    45
            self.assertTrue(idownscore > anyscore, (idownscore, anyscore))
10529
747eded13c68 [test] use FakeFile instead of File in test_fulltextindex
Julien Cristau <julien.cristau@logilab.fr>
parents: 10476
diff changeset
    46
            filescore = is_instance('FakeFile')(f.__class__, req, rset=rset)
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    47
            self.assertTrue(filescore > idownscore, (filescore, idownscore))
1473
717dea3362c0 more implements selector tests
sylvain.thenault@logilab.fr
parents: 779
diff changeset
    48
717dea3362c0 more implements selector tests
sylvain.thenault@logilab.fr
parents: 779
diff changeset
    49
    def test_etype_inheritance_no_yams_inheritance(self):
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
    50
        cls = self.vreg['etypes'].etype_class('Personne')
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    51
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    52
            self.assertFalse(is_instance('Societe').score_class(cls, req))
1473
717dea3362c0 more implements selector tests
sylvain.thenault@logilab.fr
parents: 779
diff changeset
    53
6046
3fd4a34c4a09 [selectors] fix is_instance bug w/ parent classes. Also slight performance enhancements by changing what's returned by vreg['etypes'].parent_classes method (dedicated for this usage...) and removing no more necessary methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
    54
    def test_yams_inheritance(self):
3fd4a34c4a09 [selectors] fix is_instance bug w/ parent classes. Also slight performance enhancements by changing what's returned by vreg['etypes'].parent_classes method (dedicated for this usage...) and removing no more necessary methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
    55
        cls = self.vreg['etypes'].etype_class('Transition')
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    56
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    57
            self.assertEqual(is_instance('BaseTransition').score_class(cls, req),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    58
                             3)
6046
3fd4a34c4a09 [selectors] fix is_instance bug w/ parent classes. Also slight performance enhancements by changing what's returned by vreg['etypes'].parent_classes method (dedicated for this usage...) and removing no more necessary methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
    59
7982
77ed9b2fc9a5 [selectors] EClassSelector (eg is_instance & all) should check for None value (possible w/ outer join) when a row is specified. Closes #2033165
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7617
diff changeset
    60
    def test_outer_join(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    61
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    62
            rset = req.execute('Any U,B WHERE B? bookmarked_by U, U login "anon"')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    63
            self.assertEqual(is_instance('Bookmark')(None, req, rset=rset, row=0, col=1),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    64
                             0)
7982
77ed9b2fc9a5 [selectors] EClassSelector (eg is_instance & all) should check for None value (possible w/ outer join) when a row is specified. Closes #2033165
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7617
diff changeset
    65
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
    66
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    67
class WorkflowSelectorTC(CubicWebTC):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    68
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    69
    def setUp(self):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    70
        super(WorkflowSelectorTC, self).setUp()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    71
        # enable debug mode to state/transition validation on the fly
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    72
        self.vreg.config.debugmode = True
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    73
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    74
    def tearDown(self):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    75
        self.vreg.config.debugmode = False
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    76
        super(WorkflowSelectorTC, self).tearDown()
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    77
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    78
    def setup_database(self):
9668
501f14e095d1 [test] Use RepoAccess.shell() in unittest_predicates
Julien Cristau <julien.cristau@logilab.fr>
parents: 9653
diff changeset
    79
        with self.admin_access.shell() as shell:
501f14e095d1 [test] Use RepoAccess.shell() in unittest_predicates
Julien Cristau <julien.cristau@logilab.fr>
parents: 9653
diff changeset
    80
            wf = shell.add_workflow("wf_test", 'StateFull', default=True)
501f14e095d1 [test] Use RepoAccess.shell() in unittest_predicates
Julien Cristau <julien.cristau@logilab.fr>
parents: 9653
diff changeset
    81
            created   = wf.add_state('created', initial=True)
501f14e095d1 [test] Use RepoAccess.shell() in unittest_predicates
Julien Cristau <julien.cristau@logilab.fr>
parents: 9653
diff changeset
    82
            validated = wf.add_state('validated')
501f14e095d1 [test] Use RepoAccess.shell() in unittest_predicates
Julien Cristau <julien.cristau@logilab.fr>
parents: 9653
diff changeset
    83
            abandoned = wf.add_state('abandoned')
501f14e095d1 [test] Use RepoAccess.shell() in unittest_predicates
Julien Cristau <julien.cristau@logilab.fr>
parents: 9653
diff changeset
    84
            wf.add_transition('validate', created, validated, ('managers',))
501f14e095d1 [test] Use RepoAccess.shell() in unittest_predicates
Julien Cristau <julien.cristau@logilab.fr>
parents: 9653
diff changeset
    85
            wf.add_transition('forsake', (created, validated,), abandoned, ('managers',))
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    86
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    87
    @contextmanager
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    88
    def statefull_stuff(self):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    89
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    90
            wf_entity = req.create_entity('StateFull', name=u'')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    91
            rset = wf_entity.as_rset()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    92
            adapter = wf_entity.cw_adapt_to('IWorkflowable')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    93
            req.cnx.commit()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    94
            self.assertEqual(adapter.state, 'created')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    95
            yield req, wf_entity, rset, adapter
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    96
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
    97
    def test_is_in_state(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    98
        with self.statefull_stuff() as (req, wf_entity, rset, adapter):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    99
            for state in ('created', 'validated', 'abandoned'):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   100
                selector = is_in_state(state)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   101
                self.assertEqual(selector(None, req, rset=rset),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   102
                                 state=="created")
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   103
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   104
            adapter.fire_transition('validate')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   105
            req.cnx.commit(); wf_entity.cw_clear_all_caches()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   106
            self.assertEqual(adapter.state, 'validated')
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   107
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   108
            clear_cache(rset, 'get_entity')
9582
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9152
diff changeset
   109
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   110
            selector = is_in_state('created')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   111
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   112
            selector = is_in_state('validated')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   113
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   114
            selector = is_in_state('validated', 'abandoned')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   115
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   116
            selector = is_in_state('abandoned')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   117
            self.assertEqual(selector(None, req, rset=rset), 0)
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   118
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   119
            adapter.fire_transition('forsake')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   120
            req.cnx.commit(); wf_entity.cw_clear_all_caches()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   121
            self.assertEqual(adapter.state, 'abandoned')
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   122
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   123
            clear_cache(rset, 'get_entity')
9582
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9152
diff changeset
   124
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   125
            selector = is_in_state('created')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   126
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   127
            selector = is_in_state('validated')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   128
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   129
            selector = is_in_state('validated', 'abandoned')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   130
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   131
            self.assertEqual(adapter.state, 'abandoned')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   132
            self.assertEqual(selector(None, req, rset=rset), 1)
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   133
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   134
    def test_is_in_state_unvalid_names(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   135
        with self.statefull_stuff() as (req, wf_entity, rset, adapter):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   136
            selector = is_in_state("unknown")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   137
            with self.assertRaises(ValueError) as cm:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   138
                selector(None, req, rset=rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   139
            self.assertEqual(str(cm.exception),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   140
                             "wf_test: unknown state(s): unknown")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   141
            selector = is_in_state("weird", "unknown", "created", "weird")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   142
            with self.assertRaises(ValueError) as cm:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   143
                selector(None, req, rset=rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   144
            self.assertEqual(str(cm.exception),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   145
                             "wf_test: unknown state(s): unknown,weird")
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   146
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   147
    def test_on_transition(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   148
        with self.statefull_stuff() as (req, wf_entity, rset, adapter):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   149
            for transition in ('validate', 'forsake'):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   150
                selector = on_transition(transition)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   151
                self.assertEqual(selector(None, req, rset=rset), 0)
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   152
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   153
            adapter.fire_transition('validate')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   154
            req.cnx.commit(); wf_entity.cw_clear_all_caches()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   155
            self.assertEqual(adapter.state, 'validated')
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   156
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   157
            clear_cache(rset, 'get_entity')
9582
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9152
diff changeset
   158
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   159
            selector = on_transition("validate")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   160
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   161
            selector = on_transition("validate", "forsake")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   162
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   163
            selector = on_transition("forsake")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   164
            self.assertEqual(selector(None, req, rset=rset), 0)
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   165
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   166
            adapter.fire_transition('forsake')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   167
            req.cnx.commit(); wf_entity.cw_clear_all_caches()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   168
            self.assertEqual(adapter.state, 'abandoned')
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   169
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   170
            clear_cache(rset, 'get_entity')
9582
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9152
diff changeset
   171
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   172
            selector = on_transition("validate")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   173
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   174
            selector = on_transition("validate", "forsake")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   175
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   176
            selector = on_transition("forsake")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   177
            self.assertEqual(selector(None, req, rset=rset), 1)
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   178
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   179
    def test_on_transition_unvalid_names(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   180
        with self.statefull_stuff() as (req, wf_entity, rset, adapter):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   181
            selector = on_transition("unknown")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   182
            with self.assertRaises(ValueError) as cm:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   183
                selector(None, req, rset=rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   184
            self.assertEqual(str(cm.exception),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   185
                             "wf_test: unknown transition(s): unknown")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   186
            selector = on_transition("weird", "unknown", "validate", "weird")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   187
            with self.assertRaises(ValueError) as cm:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   188
                selector(None, req, rset=rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   189
            self.assertEqual(str(cm.exception),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   190
                             "wf_test: unknown transition(s): unknown,weird")
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   191
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   192
    def test_on_transition_with_no_effect(self):
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   193
        """selector will not be triggered with `change_state()`"""
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   194
        with self.statefull_stuff() as (req, wf_entity, rset, adapter):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   195
            adapter.change_state('validated')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   196
            req.cnx.commit(); wf_entity.cw_clear_all_caches()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   197
            self.assertEqual(adapter.state, 'validated')
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   198
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   199
            selector = on_transition("validate")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   200
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   201
            selector = on_transition("validate", "forsake")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   202
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   203
            selector = on_transition("forsake")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   204
            self.assertEqual(selector(None, req, rset=rset), 0)
6919
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   205
8fd6921f3e7c [selectors] modify workflow selectors: is_in_state, on_transition
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6908
diff changeset
   206
7617
be5f68f9314e [selectors, test] remove duplicated test and add some for relation_possible selector w/ rqlst
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   207
class RelationPossibleTC(CubicWebTC):
be5f68f9314e [selectors, test] remove duplicated test and add some for relation_possible selector w/ rqlst
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   208
be5f68f9314e [selectors, test] remove duplicated test and add some for relation_possible selector w/ rqlst
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   209
    def test_rqlst_1(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   210
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   211
            selector = relation_possible('in_group')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   212
            select = self.vreg.parse(req, 'Any X WHERE X is CWUser').children[0]
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   213
            score = selector(None, req, rset=1,
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   214
                             select=select, filtered_variable=select.defined_vars['X'])
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   215
            self.assertEqual(score, 1)
7617
be5f68f9314e [selectors, test] remove duplicated test and add some for relation_possible selector w/ rqlst
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   216
be5f68f9314e [selectors, test] remove duplicated test and add some for relation_possible selector w/ rqlst
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   217
    def test_rqlst_2(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   218
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   219
            selector = relation_possible('in_group')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   220
            select = self.vreg.parse(req, 'Any 1, COUNT(X) WHERE X is CWUser, X creation_date XD, '
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   221
                                     'Y creation_date YD, Y is CWGroup '
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   222
                                     'HAVING DAY(XD)=DAY(YD)').children[0]
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   223
            score = selector(None, req, rset=1,
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   224
                             select=select, filtered_variable=select.defined_vars['X'])
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   225
            self.assertEqual(score, 1)
7617
be5f68f9314e [selectors, test] remove duplicated test and add some for relation_possible selector w/ rqlst
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   226
9152
b0155bfd4e17 Protect against crash in the `relation_possible` predicate with ambiguous relations.
Florent Cayre <florent.cayre@logilab.fr>
parents: 8866
diff changeset
   227
    def test_ambiguous(self):
b0155bfd4e17 Protect against crash in the `relation_possible` predicate with ambiguous relations.
Florent Cayre <florent.cayre@logilab.fr>
parents: 8866
diff changeset
   228
        # Ambiguous relations are :
b0155bfd4e17 Protect against crash in the `relation_possible` predicate with ambiguous relations.
Florent Cayre <florent.cayre@logilab.fr>
parents: 8866
diff changeset
   229
        # (Service, fabrique_par, Personne) and (Produit, fabrique_par, Usine)
b0155bfd4e17 Protect against crash in the `relation_possible` predicate with ambiguous relations.
Florent Cayre <florent.cayre@logilab.fr>
parents: 8866
diff changeset
   230
        # There used to be a crash here with a bad rdef choice in the strict
b0155bfd4e17 Protect against crash in the `relation_possible` predicate with ambiguous relations.
Florent Cayre <florent.cayre@logilab.fr>
parents: 8866
diff changeset
   231
        # checking case.
b0155bfd4e17 Protect against crash in the `relation_possible` predicate with ambiguous relations.
Florent Cayre <florent.cayre@logilab.fr>
parents: 8866
diff changeset
   232
        selector = relation_possible('fabrique_par', role='object',
b0155bfd4e17 Protect against crash in the `relation_possible` predicate with ambiguous relations.
Florent Cayre <florent.cayre@logilab.fr>
parents: 8866
diff changeset
   233
                                     target_etype='Personne', strict=True)
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   234
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   235
            usine = req.create_entity('Usine', lieu=u'here')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   236
            score = selector(None, req, rset=usine.as_rset())
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   237
            self.assertEqual(0, score)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   238
7617
be5f68f9314e [selectors, test] remove duplicated test and add some for relation_possible selector w/ rqlst
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   239
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
   240
class MatchUserGroupsTC(CubicWebTC):
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   241
    def test_owners_group(self):
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   242
        """tests usage of 'owners' group with match_user_group"""
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   243
        class SomeAction(action.Action):
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2773
diff changeset
   244
            __regid__ = 'yo'
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   245
            category = 'foo'
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   246
            __select__ = match_user_groups('owners')
1640
65b60f177eb1 fix tests
sylvain.thenault@logilab.fr
parents: 1571
diff changeset
   247
        self.vreg._loadedmods[__name__] = {}
4491
a0f48c31b58a kill register_appobject_class method, simplifying autoregistration. Update test accordingly (test which manually registers object should also properly call there __register__ method). Drop the disable-appobjects config file entry: no one used it since its introduction years ago.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4490
diff changeset
   248
        self.vreg.register(SomeAction)
4490
d45cde54d464 backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   249
        SomeAction.__registered__(self.vreg['actions'])
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7617
diff changeset
   250
        self.assertTrue(SomeAction in self.vreg['actions']['yo'], self.vreg['actions'])
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   251
        try:
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   252
            with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   253
                self.create_user(req, 'john')
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   254
            # login as a simple user
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   255
            john_access = self.new_access('john')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   256
            with john_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   257
                # it should not be possible to use SomeAction not owned objects
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   258
                rset = req.execute('Any G WHERE G is CWGroup, G name "managers"')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   259
                self.assertFalse('yo' in dict(self.pactions(req, rset)))
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   260
                # insert a new card, and check that we can use SomeAction on our object
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   261
                req.execute('INSERT Card C: C title "zoubidou"')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   262
                req.cnx.commit()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   263
            with john_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   264
                rset = req.execute('Card C WHERE C title "zoubidou"')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   265
                self.assertTrue('yo' in dict(self.pactions(req, rset)), self.pactions(req, rset))
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   266
            # make sure even managers can't use the action
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   267
            with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   268
                rset = req.execute('Card C WHERE C title "zoubidou"')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   269
                self.assertFalse('yo' in dict(self.pactions(req, rset)))
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   270
        finally:
3418
7b49fa7e942d [api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2773
diff changeset
   271
            del self.vreg[SomeAction.__registry__][SomeAction.__regid__]
1571
e9ad2724659d tests depends on the bootstrap cube
sylvain.thenault@logilab.fr
parents: 1473
diff changeset
   272
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   273
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   274
class MultiLinesRsetTC(CubicWebTC):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   275
    def setup_database(self):
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   276
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   277
            req.execute('INSERT CWGroup G: G name "group1"')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   278
            req.execute('INSERT CWGroup G: G name "group2"')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   279
            req.cnx.commit()
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   280
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   281
    def test_default_op_in_selector(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   282
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   283
            rset = req.execute('Any G WHERE G is CWGroup')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   284
            expected = len(rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   285
            selector = multi_lines_rset(expected)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   286
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   287
            self.assertEqual(selector(None, req, None), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   288
            selector = multi_lines_rset(expected + 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   289
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   290
            self.assertEqual(selector(None, req, None), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   291
            selector = multi_lines_rset(expected - 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   292
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   293
            self.assertEqual(selector(None, req, None), 0)
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   294
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   295
    def test_without_rset(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   296
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   297
            rset = req.execute('Any G WHERE G is CWGroup')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   298
            expected = len(rset)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   299
            selector = multi_lines_rset(expected)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   300
            self.assertEqual(selector(None, req, None), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   301
            selector = multi_lines_rset(expected + 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   302
            self.assertEqual(selector(None, req, None), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   303
            selector = multi_lines_rset(expected - 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   304
            self.assertEqual(selector(None, req, None), 0)
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   305
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   306
    def test_with_operators(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   307
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   308
            rset = req.execute('Any G WHERE G is CWGroup')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   309
            expected = len(rset)
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   310
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   311
            # Format     'expected', 'operator', 'assert'
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   312
            testdata = (( expected,         eq,        1),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   313
                        ( expected+1,       eq,        0),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   314
                        ( expected-1,       eq,        0),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   315
                        ( expected,         le,        1),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   316
                        ( expected+1,       le,        1),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   317
                        ( expected-1,       le,        0),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   318
                        ( expected-1,       gt,        1),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   319
                        ( expected,         gt,        0),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   320
                        ( expected+1,       gt,        0),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   321
                        ( expected+1,       lt,        1),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   322
                        ( expected,         lt,        0),
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   323
                        ( expected-1,       lt,        0))
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   324
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   325
            for (expected, operator, assertion) in testdata:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   326
                selector = multi_lines_rset(expected, operator)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   327
                yield self.assertEqual, selector(None, req, rset=rset), assertion
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   328
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   329
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   330
class MatchKwargsTC(TestCase):
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   331
7955
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   332
    def test_match_kwargs_default(self):
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   333
        selector = match_kwargs( set( ('a', 'b') ) )
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   334
        self.assertEqual(selector(None, None, a=1, b=2), 2)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   335
        self.assertEqual(selector(None, None, a=1), 0)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   336
        self.assertEqual(selector(None, None, c=1), 0)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   337
        self.assertEqual(selector(None, None, a=1, c=1), 0)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   338
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   339
    def test_match_kwargs_any(self):
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   340
        selector = match_kwargs( set( ('a', 'b') ), mode='any')
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   341
        self.assertEqual(selector(None, None, a=1, b=2), 2)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   342
        self.assertEqual(selector(None, None, a=1), 1)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   343
        self.assertEqual(selector(None, None, c=1), 0)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   344
        self.assertEqual(selector(None, None, a=1, c=1), 1)
f4c97d3c8b93 [selectors] match_kwargs and match_form_params selectors both accept a new `once_is_enough` argument (closes #1990438)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7791
diff changeset
   345
6348
f5bd501628b0 [selectors] multi_lines_rset selector supports now optional operator for richer comparaisons
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6340
diff changeset
   346
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   347
class ScoreEntityTC(CubicWebTC):
6869
900cb9b1b687 [tests] new unit tests about score_entity selector (inscore machinery)
Julien Jehannet <julien@smaf.org>
parents: 6348
diff changeset
   348
900cb9b1b687 [tests] new unit tests about score_entity selector (inscore machinery)
Julien Jehannet <julien@smaf.org>
parents: 6348
diff changeset
   349
    def test_intscore_entity_selector(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   350
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   351
            rset = req.execute('Any E WHERE E eid 1')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   352
            selector = score_entity(lambda x: None)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   353
            self.assertEqual(selector(None, req, rset=rset), 0)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   354
            selector = score_entity(lambda x: "something")
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   355
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   356
            selector = score_entity(lambda x: object)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   357
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   358
            rset = req.execute('Any G LIMIT 2 WHERE G is CWGroup')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   359
            selector = score_entity(lambda x: 10)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   360
            self.assertEqual(selector(None, req, rset=rset), 20)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   361
            selector = score_entity(lambda x: 10, mode='any')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   362
            self.assertEqual(selector(None, req, rset=rset), 10)
6869
900cb9b1b687 [tests] new unit tests about score_entity selector (inscore machinery)
Julien Jehannet <julien@smaf.org>
parents: 6348
diff changeset
   363
7345
b9eaad6e34c3 [selectors] test/fix rql_condition to make it works when entity is specified via 'entity' keyword argument instead of rset, row and col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7244
diff changeset
   364
    def test_rql_condition_entity(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   365
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   366
            selector = rql_condition('X identity U')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   367
            rset = req.user.as_rset()
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   368
            self.assertEqual(selector(None, req, rset=rset), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   369
            self.assertEqual(selector(None, req, entity=req.user), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   370
            self.assertEqual(selector(None, req), 0)
6869
900cb9b1b687 [tests] new unit tests about score_entity selector (inscore machinery)
Julien Jehannet <julien@smaf.org>
parents: 6348
diff changeset
   371
7362
b9813c9d32ac [selectors] enhance rql_condition to make it usable as a condition on request's user
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7345
diff changeset
   372
    def test_rql_condition_user(self):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   373
        with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   374
            selector = rql_condition('U login "admin"', user_condition=True)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   375
            self.assertEqual(selector(None, req), 1)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   376
            selector = rql_condition('U login "toto"', user_condition=True)
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   377
            self.assertEqual(selector(None, req), 0)
7362
b9813c9d32ac [selectors] enhance rql_condition to make it usable as a condition on request's user
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7345
diff changeset
   378
8858
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   379
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   380
class AdaptablePredicateTC(CubicWebTC):
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   381
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   382
    def test_multiple_entity_types_rset(self):
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   383
        class CWUserIWhatever(EntityAdapter):
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   384
            __regid__ = 'IWhatever'
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   385
            __select__ = is_instance('CWUser')
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   386
        class CWGroupIWhatever(EntityAdapter):
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   387
            __regid__ = 'IWhatever'
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   388
            __select__ = is_instance('CWGroup')
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   389
        with self.temporary_appobjects(CWUserIWhatever, CWGroupIWhatever):
9653
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   390
            with self.admin_access.web_request() as req:
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   391
                selector = adaptable('IWhatever')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   392
                rset = req.execute('Any X WHERE X is IN(CWGroup, CWUser)')
ac723e09704f [test] update unittest_predicates to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   393
                self.assertTrue(selector(None, req, rset=rset))
8858
51fdbbbd07b2 [predicates] fix 'adaptable' implementation, used to return 0 on a rset with individualy adaptable entities of different types. Closes #2709663
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8220
diff changeset
   394
10476
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   395
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   396
class MatchFormParamsTC(CubicWebTC):
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   397
    """tests for match_form_params predicate"""
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   398
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   399
    def test_keyonly_match(self):
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   400
        """test standard usage: ``match_form_params('param1', 'param2')``
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   401
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   402
        ``param1`` and ``param2`` must be specified in request's form.
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   403
        """
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   404
        web_request = self.admin_access.web_request
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   405
        vid_selector = match_form_params('vid')
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   406
        vid_subvid_selector = match_form_params('vid', 'subvid')
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   407
        # no parameter => KO,KO
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   408
        with web_request() as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   409
            self.assertEqual(vid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   410
            self.assertEqual(vid_subvid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   411
        # one expected parameter found => OK,KO
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   412
        with web_request(vid='foo') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   413
            self.assertEqual(vid_selector(None, req), 1)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   414
            self.assertEqual(vid_subvid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   415
        # all expected parameters found => OK,OK
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   416
        with web_request(vid='foo', subvid='bar') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   417
            self.assertEqual(vid_selector(None, req), 1)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   418
            self.assertEqual(vid_subvid_selector(None, req), 2)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   419
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   420
    def test_keyvalue_match_one_parameter(self):
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   421
        """test dict usage: ``match_form_params(param1=value1)``
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   422
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   423
        ``param1`` must be specified in the request's form and its value
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   424
        must be ``value1``.
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   425
        """
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   426
        web_request = self.admin_access.web_request
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   427
        # test both positional and named parameters
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   428
        vid_selector = match_form_params(vid='foo')
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   429
        # no parameter => should fail
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   430
        with web_request() as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   431
            self.assertEqual(vid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   432
        # expected parameter found with expected value => OK
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   433
        with web_request(vid='foo', subvid='bar') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   434
            self.assertEqual(vid_selector(None, req), 1)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   435
        # expected parameter found but value is incorrect => KO
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   436
        with web_request(vid='bar') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   437
            self.assertEqual(vid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   438
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   439
    def test_keyvalue_match_two_parameters(self):
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   440
        """test dict usage: ``match_form_params(param1=value1, param2=value2)``
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   441
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   442
        ``param1`` and ``param2`` must be specified in the request's form and
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   443
        their respective value must be ``value1`` and ``value2``.
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   444
        """
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   445
        web_request = self.admin_access.web_request
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   446
        vid_subvid_selector = match_form_params(vid='list', subvid='tsearch')
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   447
        # missing one expected parameter => KO
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   448
        with web_request(vid='list') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   449
            self.assertEqual(vid_subvid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   450
        # expected parameters found but values are incorrect => KO
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   451
        with web_request(vid='list', subvid='foo') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   452
            self.assertEqual(vid_subvid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   453
        # expected parameters found and values are correct => OK
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   454
        with web_request(vid='list', subvid='tsearch') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   455
            self.assertEqual(vid_subvid_selector(None, req), 2)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   456
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   457
    def test_keyvalue_multiple_match(self):
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   458
        """test dict usage with multiple values
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   459
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   460
        i.e. as in ``match_form_params(param1=('value1', 'value2'))``
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   461
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   462
        ``param1`` must be specified in the request's form and its value
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   463
        must be either ``value1`` or ``value2``.
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   464
        """
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   465
        web_request = self.admin_access.web_request
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   466
        vid_subvid_selector = match_form_params(vid='list', subvid=('tsearch', 'listitem'))
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   467
        # expected parameters found and values correct => OK
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   468
        with web_request(vid='list', subvid='tsearch') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   469
            self.assertEqual(vid_subvid_selector(None, req), 2)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   470
        with web_request(vid='list', subvid='listitem') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   471
            self.assertEqual(vid_subvid_selector(None, req), 2)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   472
        # expected parameters found but values are incorrect => OK
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   473
        with web_request(vid='list', subvid='foo') as req:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   474
            self.assertEqual(vid_subvid_selector(None, req), 0)
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   475
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   476
    def test_invalid_calls(self):
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   477
        """checks invalid calls raise a ValueError"""
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   478
        # mixing named and positional arguments should fail
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   479
        with self.assertRaises(ValueError) as cm:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   480
            match_form_params('list', x='1', y='2')
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   481
        self.assertEqual(str(cm.exception),
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   482
                         "match_form_params() can't be called with both "
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   483
                         "positional and named arguments")
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   484
        # using a dict as first and unique argument should fail
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   485
        with self.assertRaises(ValueError) as cm:
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   486
            match_form_params({'x': 1})
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   487
        self.assertEqual(str(cm.exception),
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   488
                         "match_form_params() positional arguments must be strings")
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   489
62251bfdfd79 [predicates] ExpectedValuePredicate now accepts a dict parameter
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 9668
diff changeset
   490
630
66ff0b2f7d03 simple test implementation for binary operators on selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   491
if __name__ == '__main__':
66ff0b2f7d03 simple test implementation for binary operators on selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   492
    unittest_main()
66ff0b2f7d03 simple test implementation for binary operators on selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   493