• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zopefoundation / Products.CMFCore / 6246800861

20 Sep 2023 09:41AM UTC coverage: 86.008% (-0.3%) from 86.266%
6246800861

Pull #131

github

mauritsvanrees
Run Py 2.7 tests on python:2.7.18-buster container.

Use a separate workflow file for this, to keep things simple.
Pull Request #131: Make decodeFolderFilter and encodeFolderFilter non-public.

2466 of 3689 branches covered (0.0%)

Branch coverage included in aggregate %.

6 of 6 new or added lines in 1 file covered. (100.0%)

17297 of 19289 relevant lines covered (89.67%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.25
/src/Products/CMFCore/tests/test_OpaqueItems.py
1
##############################################################################
2
#
3
# Copyright (c) 2002 Zope Foundation and Contributors.
4
#
5
# This software is subject to the provisions of the Zope Public License,
6
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
7
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
8
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
9
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
10
# FOR A PARTICULAR PURPOSE.
11
#
12
##############################################################################
13
""" Unit tests for IOpaqueItems implementations.
1✔
14
"""
15

16
import unittest
1✔
17

18
import six
1✔
19

20
from zope.component import getSiteManager
1✔
21
from zope.interface import implementer
1✔
22

23
from ..interfaces import ICallableOpaqueItem
1✔
24
from ..interfaces import ICallableOpaqueItemEvents
1✔
25
from ..interfaces import IContentish
1✔
26
from ..interfaces import ITypesTool
1✔
27
from ..PortalFolder import PortalFolder
1✔
28
from ..testing import TraversingEventZCMLLayer
1✔
29
from ..TypesTool import TypesTool
1✔
30
from .base.dummy import DummyContent as OriginalDummyContent
1✔
31
from .base.testcase import SecurityTest
1✔
32

33

34
# -------------------------------------------
35
# Helper classes and functions
36
# -------------------------------------------
37

38
def extra_meta_types():
1✔
39
    return [{'name': 'Dummy', 'action': 'manage_addFolder',
1✔
40
             'permission': 'View'}]
41

42

43
def addDummyContent(container, id, opaqueItem):
1✔
44
    container._setObject(id,
1✔
45
                         DummyContent(id, opaqueItem=opaqueItem, catalog=1))
46
    return getattr(container, id)
1✔
47

48

49
@implementer(IContentish)
1✔
50
class DummyContent(OriginalDummyContent):
1✔
51

52
    """ A Dummy piece of PortalContent with additional attributes
53
    """
54

55
    def __init__(self, id='dummy', opaqueItem=None, *args, **kw):
1✔
56
        OriginalDummyContent.__init__(self, id, *args, **kw)
1✔
57
        if opaqueItem is None:
1✔
58
            self.opaqueItem = 'noncallable'
1✔
59
            self.opaqueItemsId = 'opaqueItem'
1✔
60
        elif isinstance(opaqueItem, six.string_types):
1✔
61
            Hooks(self, opaqueItem)
1✔
62
            self.opaqueItemsId = opaqueItem
1✔
63
        else:
64
            opaqueItem(self, 'opaqueItem')
1✔
65
            self.opaqueItemsId = 'opaqueItem'
1✔
66

67
    # Ensure additional attributes get copied
68
    def _getCopy(self, container):
1✔
69
        obj = DummyContent(self.id, catalog=self.catalog)
1✔
70
        setattr(obj, self.opaqueItemsId, getattr(self, self.opaqueItemsId))
1✔
71
        return obj
1✔
72

73
    def isNotifiedByAfterAdd(self):
1✔
74
        return getattr(getattr(self, self.opaqueItemsId), 'addCount', None)
1✔
75

76
    def isNotifiedByAfterClone(self):
1✔
77
        return getattr(getattr(self, self.opaqueItemsId), 'cloneCount', None)
1✔
78

79
    def isNotifiedByBeforeDelete(self):
1✔
80
        return getattr(getattr(self, self.opaqueItemsId), 'deleteCount', None)
1✔
81

82

83
class OpaqueBase:
1✔
84
    """ Dummy opaque item without manage_after/before hookes
85
    """
86
    def __init__(self, obj, id):
1✔
87
        self.addCount = self.cloneCount = self.deleteCount = 0
1✔
88
        self.addCounter = self.cloneCounter = self.deleteCounter = 1
1✔
89
        self.id = id
1✔
90
        setattr(obj, id, self)
1✔
91

92
    def __call__(self):
1✔
93
        return
×
94

95
    def getId(self):
1✔
96
        return self.id
1✔
97

98

99
@implementer(ICallableOpaqueItem)
1✔
100
class Marker(OpaqueBase):
1✔
101
    """ Opaque item without manage_after/before hookes but marked as callable
102
    """
103
    pass
1✔
104

105

106
@implementer(ICallableOpaqueItemEvents)
1✔
107
class Hooks(OpaqueBase):
1✔
108
    """ Opaque item with manage_after/before hooks but not marked as callable
109
    """
110

111
    def manage_afterAdd(self, item, container):
1✔
112
        self.addCount = self.addCounter
1✔
113
        self.addCounter += 1
1✔
114

115
    def manage_afterClone(self, item):
1✔
116
        self.cloneCount = self.cloneCounter
1✔
117
        self.cloneCounter += 1
1✔
118

119
    def manage_beforeDelete(self, item, container):
1✔
120
        self.deleteCount = self.deleteCounter
×
121
        self.deleteCounter += 1
×
122

123

124
class MarkerAndHooks(Marker, Hooks):
1✔
125

126
    """ Opaque item with manage_after/before hookes and marked as callable
127
    """
128

129

130
# -------------------------------------------
131
# Unit Tests
132
# -------------------------------------------
133

134
class ManageBeforeAfterTests(SecurityTest):
1✔
135

136
    layer = TraversingEventZCMLLayer
1✔
137

138
    def setUp(self):
1✔
139
        SecurityTest.setUp(self)
1✔
140

141
        # setting up types tool
142
        getSiteManager().registerUtility(TypesTool(), ITypesTool)
1✔
143

144
        # setup portal
145
        try:
1✔
146
            self.app._delObject('test')
1✔
147
        except AttributeError:
1✔
148
            pass
1✔
149
        self.app._setObject('test', PortalFolder('test', ''))
1✔
150
        self.test = test = self.app.test
1✔
151

152
        # setting up folders
153
        test._setObject('folder', PortalFolder('folder', ''))
1✔
154
        folder = self.folder = test.folder
1✔
155
        folder._setObject('sub', PortalFolder('sub', ''))
1✔
156
        sub = self.sub = folder.sub
1✔
157

158
        # ----- hacks to allow pasting (see also test_PortalFolder)
159
        # WAAA! force sub to allow paste of Dummy object.
160
        sub.all_meta_types = extra_meta_types()
1✔
161

162
        # delete items if necessary
163
        try:
1✔
164
            folder._delObject('dummy')
1✔
165
        except AttributeError:
1✔
166
            pass
1✔
167
        try:
1✔
168
            sub._delObject('dummy')
1✔
169
        except AttributeError:
1✔
170
            pass
1✔
171

172
    def test_nonCallableItem(self):
1✔
173
        # no exception should be raised
174
        folder = self.folder
1✔
175
        sub = self.sub
1✔
176
        dummy = addDummyContent(folder, 'dummy', None)
1✔
177

178
        # WAAAA! must get _p_jar set
179
        old, dummy._p_jar = sub._p_jar, self.app._p_jar
1✔
180
        try:
1✔
181
            cp = folder.manage_copyObjects(ids=['dummy'])
1✔
182
            sub.manage_pasteObjects(cp)
1✔
183
        finally:
184
            dummy._p_jar = old
1✔
185

186
    def test_callableItemWithMarkerOnly(self):
1✔
187
        folder = self.folder
1✔
188
        sub = self.sub
1✔
189
        dummy = addDummyContent(folder, 'dummy', Marker)
1✔
190

191
        self.assertFalse(dummy.isNotifiedByAfterAdd())
1✔
192
        self.assertFalse(dummy.isNotifiedByAfterClone())
1✔
193
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
194

195
        # WAAAA! must get _p_jar set
196
        old, dummy._p_jar = sub._p_jar, self.app._p_jar
1✔
197
        try:
1✔
198
            cp = folder.manage_copyObjects(ids=['dummy'])
1✔
199
            sub.manage_pasteObjects(cp)
1✔
200
        finally:
201
            dummy._p_jar = old
1✔
202

203
        self.assertFalse(dummy.isNotifiedByAfterAdd())
1✔
204
        self.assertFalse(dummy.isNotifiedByAfterClone())
1✔
205
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
206

207
    def test_callableItemWithHooksOnly(self):
1✔
208
        folder = self.folder
1✔
209
        sub = self.sub
1✔
210
        dummy = addDummyContent(folder, 'dummy', Hooks)
1✔
211

212
        self.assertFalse(dummy.isNotifiedByAfterAdd())
1✔
213
        self.assertFalse(dummy.isNotifiedByAfterClone())
1✔
214
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
215

216
        # WAAAA! must get _p_jar set
217
        old, dummy._p_jar = sub._p_jar, self.app._p_jar
1✔
218
        try:
1✔
219
            cp = folder.manage_copyObjects(ids=['dummy'])
1✔
220
            sub.manage_pasteObjects(cp)
1✔
221
        finally:
222
            dummy._p_jar = old
1✔
223

224
        self.assertFalse(dummy.isNotifiedByAfterAdd())
1✔
225
        self.assertFalse(dummy.isNotifiedByAfterClone())
1✔
226
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
227

228
    def test_callableItemWithMarkerAndHooks(self):
1✔
229
        folder = self.folder
1✔
230
        sub = self.sub
1✔
231
        dummy = addDummyContent(folder, 'dummy', MarkerAndHooks)
1✔
232

233
        self.assertEqual(dummy.isNotifiedByAfterAdd(), 1)
1✔
234
        self.assertFalse(dummy.isNotifiedByAfterClone())
1✔
235
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
236

237
        # WAAAA! must get _p_jar set
238
        old, dummy._p_jar = sub._p_jar, self.app._p_jar
1✔
239
        try:
1✔
240
            cp = folder.manage_copyObjects(ids=['dummy'])
1✔
241
            sub.manage_pasteObjects(cp)
1✔
242
        finally:
243
            dummy._p_jar = old
1✔
244

245
        self.assertEqual(dummy.isNotifiedByAfterAdd(), 2)
1✔
246
        self.assertEqual(dummy.isNotifiedByAfterClone(), 1)
1✔
247
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
248

249
    def test_talkbackItem(self):
1✔
250
        folder = self.folder
1✔
251
        sub = self.sub
1✔
252

253
        dummy = addDummyContent(folder, 'dummy', 'talkback')
1✔
254

255
        self.assertEqual(dummy.isNotifiedByAfterAdd(), 1)
1✔
256
        self.assertFalse(dummy.isNotifiedByAfterClone())
1✔
257
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
258

259
        # WAAAA! must get _p_jar set
260
        old, dummy._p_jar = sub._p_jar, self.app._p_jar
1✔
261
        try:
1✔
262
            cp = folder.manage_copyObjects(ids=['dummy'])
1✔
263
            sub.manage_pasteObjects(cp)
1✔
264
        finally:
265
            dummy._p_jar = old
1✔
266

267
        self.assertEqual(dummy.isNotifiedByAfterAdd(), 2)
1✔
268
        self.assertEqual(dummy.isNotifiedByAfterClone(), 1)
1✔
269
        self.assertFalse(dummy.isNotifiedByBeforeDelete())
1✔
270

271

272
def test_suite():
1✔
273
    return unittest.TestSuite((
1✔
274
        unittest.makeSuite(ManageBeforeAfterTests),
275
        ))
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2024 Coveralls, Inc