Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
Zope
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
Zope
Commits
64afeb22
Commit
64afeb22
authored
Apr 19, 2009
by
Tres Seaver
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove module-scope imports from unit tests.
parent
3dc6901a
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
288 additions
and
235 deletions
+288
-235
src/ZPublisher/tests/testBaseRequest.py
src/ZPublisher/tests/testBaseRequest.py
+288
-235
No files found.
src/ZPublisher/tests/testBaseRequest.py
View file @
64afeb22
import
unittest
from
Acquisition
import
Implicit
class
BaseRequest_factory
:
import
zope.interface
import
zope.component
import
zope.testing.cleanup
import
zope.traversing.namespace
from
zope.publisher.browser
import
BrowserPage
from
zope.publisher.browser
import
IBrowserRequest
from
zope.publisher.browser
import
IDefaultBrowserLayer
from
zope.traversing.interfaces
import
ITraversable
def
_makeOne
(
self
,
root
):
from
Acquisition
import
Implicit
class
DummyResponse
(
Implicit
):
class
TestBaseRequest
(
unittest
.
TestCase
):
base
=
''
status
=
None
debug_mode
=
False
def
_getTargetClass
(
self
):
from
ZPublisher.BaseRequest
import
BaseRequest
return
BaseRequest
def
setStatus
(
self
,
code
):
self
.
status
=
code
def
setBase
(
self
,
base
):
if
base
is
None
:
base
=
''
elif
not
base
.
endswith
(
'/'
):
base
=
base
+
'/'
self
.
base
=
str
(
base
)
def
notFoundError
(
self
,
name
):
from
zExceptions
import
NotFound
raise
NotFound
(
name
)
# Real responses raise NotFound, to avoid information disclosure
#def forbiddenError(self, name):
# from zExceptions import Forbidden
# raise Forbidden(name)
forbiddenError
=
notFoundError
def
_makeOne
(
self
,
root
):
response
=
DummyResponse
()
environment
=
{
'URL'
:
''
,
'PARENTS'
:
[
root
],
...
...
@@ -28,14 +40,118 @@ class TestBaseRequest(unittest.TestCase):
'response'
:
response
}
return
self
.
_getTargetClass
()(
environment
)
def
_makeBasicObjectClass
(
self
):
from
Acquisition
import
Implicit
class
DummyObjectBasic
(
Implicit
):
"""Dummy class with docstring."""
def
_setObject
(
self
,
id
,
object
):
setattr
(
self
,
id
,
object
)
return
getattr
(
self
,
id
)
def
view
(
self
):
"""Attribute with docstring."""
return
'view content'
def
noview
(
self
):
# Attribute without docstring.
return
'unpublishable'
return
DummyObjectBasic
def
_makeBasicObject
(
self
):
return
self
.
_makeBasicObjectClass
()()
def
_makeObjectWithDefault
(
self
):
class
DummyObjectWithDefault
(
self
.
_makeBasicObjectClass
()):
"""Dummy class with docstring."""
def
index_html
(
self
):
"""Attribute with docstring."""
return
'index_html content'
return
DummyObjectWithDefault
()
def
_makeObjectWithDefaultNone
(
self
):
class
DummyObjectWithDefaultNone
(
self
.
_makeBasicObjectClass
()):
"""Dummy class with docstring."""
index_html
=
None
return
DummyObjectWithDefaultNone
()
def
_makeObjectWithBPTH
(
self
):
class
DummyObjectWithBPTH
(
self
.
_makeBasicObjectClass
()):
"""Dummy class with __before_publishing_traverse__."""
def
__before_publishing_traverse__
(
self
,
object
,
REQUEST
):
if
REQUEST
[
'_test_counter'
]
<
100
:
REQUEST
[
'_test_counter'
]
+=
1
else
:
raise
RuntimeError
(
'Infinite loop detected.'
)
REQUEST
[
'TraversalRequestNameStack'
]
+=
self
.
_path
REQUEST
.
_hacked_path
=
1
return
DummyObjectWithBPTH
()
def
_makeObjectWithBD
(
self
):
class
DummyObjectWithBD
(
self
.
_makeBasicObjectClass
()):
"""Dummy class with __browser_default__."""
def
__browser_default__
(
self
,
REQUEST
):
if
REQUEST
[
'_test_counter'
]
<
100
:
REQUEST
[
'_test_counter'
]
+=
1
else
:
raise
RuntimeError
(
'Infinite loop detected.'
)
return
self
,
self
.
_default_path
return
DummyObjectWithBD
()
def
_makeObjectWithBDBBT
(
self
):
class
DummyObjectWithBDBBT
(
self
.
_makeBasicObjectClass
()):
"""Dummy class with __browser_default__."""
def
__browser_default__
(
self
,
REQUEST
):
if
REQUEST
[
'_test_counter'
]
<
100
:
REQUEST
[
'_test_counter'
]
+=
1
else
:
raise
RuntimeError
(
'Infinite loop detected.'
)
return
self
,
self
.
_default_path
def
__bobo_traverse__
(
self
,
REQUEST
,
name
):
if
name
==
self
.
_default_path
[
0
]:
return
getattr
(
self
,
name
)
raise
AttributeError
,
name
return
DummyObjectWithBDBBT
()
def
_makeObjectWithEmptyDocstring
(
self
):
from
Acquisition
import
Implicit
class
DummyObjectWithEmptyDocstring
(
Implicit
):
""
def
view
(
self
):
"""Attribute with docstring."""
return
'view content'
def
noview
(
self
):
# Attribute without docstring.
return
'unpublishable'
return
DummyObjectWithEmptyDocstring
()
class
TestBaseRequest
(
unittest
.
TestCase
,
BaseRequest_factory
):
def
_getTargetClass
(
self
):
from
ZPublisher.BaseRequest
import
BaseRequest
return
BaseRequest
def
_makeRootAndFolder
(
self
):
root
=
DummyObjectBasic
()
folder
=
root
.
_setObject
(
'folder'
,
DummyObjectBasic
())
root
=
self
.
_makeBasicObject
()
folder
=
root
.
_setObject
(
'folder'
,
self
.
_makeBasicObject
())
return
root
,
folder
def
test_traverse_basic
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objBasic'
,
DummyObjectBasic
())
folder
.
_setObject
(
'objBasic'
,
self
.
_makeBasicObject
())
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objBasic'
)
self
.
assertEqual
(
r
.
URL
,
'/folder/objBasic'
)
...
...
@@ -43,7 +159,7 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_withDefault
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithDefault'
,
Dummy
ObjectWithDefault
())
folder
.
_setObject
(
'objWithDefault'
,
self
.
_make
ObjectWithDefault
())
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objWithDefault'
)
self
.
assertEqual
(
r
.
URL
,
'/folder/objWithDefault/index_html'
)
...
...
@@ -51,7 +167,8 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_withDefaultNone
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithDefaultNone'
,
DummyObjectWithDefaultNone
())
folder
.
_setObject
(
'objWithDefaultNone'
,
self
.
_makeObjectWithDefaultNone
())
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objWithDefaultNone'
)
self
.
assertEqual
(
r
.
URL
,
'/folder/objWithDefaultNone'
)
...
...
@@ -59,7 +176,7 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_withBPTH
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithBPTH'
,
Dummy
ObjectWithBPTH
())
folder
.
_setObject
(
'objWithBPTH'
,
self
.
_make
ObjectWithBPTH
())
folder
.
objWithBPTH
.
_path
=
[
'view'
]
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objWithBPTH'
)
...
...
@@ -68,7 +185,7 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_withBDView
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithBD'
,
Dummy
ObjectWithBD
())
folder
.
_setObject
(
'objWithBD'
,
self
.
_make
ObjectWithBD
())
folder
.
objWithBD
.
_default_path
=
[
'view'
]
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objWithBD'
)
...
...
@@ -77,9 +194,9 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_withAcquisition
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithBPTH'
,
Dummy
ObjectWithBPTH
())
folder
.
_setObject
(
'objWithBPTH'
,
self
.
_make
ObjectWithBPTH
())
folder
.
objWithBPTH
.
_path
=
[
'view'
]
folder
.
_setObject
(
'objWithBD'
,
Dummy
ObjectWithBD
())
folder
.
_setObject
(
'objWithBD'
,
self
.
_make
ObjectWithBD
())
folder
.
objWithBD
.
_default_path
=
[
'view'
]
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objWithBD/objWithBPTH'
)
...
...
@@ -89,10 +206,10 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_withBDAndBPTH
(
self
):
# Collector 1079 (infinite loop 1)
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objBasic'
,
DummyObjectBasic
())
folder
.
_setObject
(
'objWithBPTH'
,
Dummy
ObjectWithBPTH
())
folder
.
_setObject
(
'objBasic'
,
self
.
_makeBasicObject
())
folder
.
_setObject
(
'objWithBPTH'
,
self
.
_make
ObjectWithBPTH
())
folder
.
objWithBPTH
.
_path
=
[
'objBasic'
]
folder
.
_setObject
(
'objWithBD'
,
Dummy
ObjectWithBD
())
folder
.
_setObject
(
'objWithBD'
,
self
.
_make
ObjectWithBD
())
folder
.
objWithBD
.
_default_path
=
[
'objWithBPTH'
]
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objWithBD'
)
...
...
@@ -103,7 +220,7 @@ class TestBaseRequest(unittest.TestCase):
# Collector 1079 (infinite loop 2)
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithBD'
,
Dummy
ObjectWithBD
())
folder
.
_setObject
(
'objWithBD'
,
self
.
_make
ObjectWithBD
())
folder
.
objWithBD
.
_default_path
=
[
''
]
r
=
self
.
_makeOne
(
root
)
self
.
failUnlessRaises
(
NotFound
,
r
.
traverse
,
'folder/objWithBD'
)
...
...
@@ -113,7 +230,11 @@ class TestBaseRequest(unittest.TestCase):
# that we get a NotFound
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithBBT'
,
DummyObjectWithBBT
())
def
_faux___bobo_traverse__
(
REQUEST
,
name
):
raise
AttributeError
,
name
obj
=
self
.
_makeBasicObject
()
obj
.
__bobo_traverse__
=
_faux___bobo_traverse__
folder
.
_setObject
(
'objWithBBT'
,
obj
)
r
=
self
.
_makeOne
(
root
)
self
.
failUnlessRaises
(
NotFound
,
r
.
traverse
,
'folder/objWithBBT/bbt_foo'
)
...
...
@@ -124,7 +245,7 @@ class TestBaseRequest(unittest.TestCase):
# __bobo_traverse__ should return the object
# pointed by __browser_default__
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithBDBBT'
,
Dummy
ObjectWithBDBBT
())
folder
.
_setObject
(
'objWithBDBBT'
,
self
.
_make
ObjectWithBDBBT
())
folder
.
objWithBDBBT
.
_default_path
=
[
'view'
]
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objWithBDBBT'
)
...
...
@@ -138,14 +259,14 @@ class TestBaseRequest(unittest.TestCase):
# raise a NotFound
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithBDBBT'
,
Dummy
ObjectWithBDBBT
())
folder
.
_setObject
(
'objWithBDBBT'
,
self
.
_make
ObjectWithBDBBT
())
folder
.
objWithBDBBT
.
_default_path
=
[
'xxx'
]
r
=
self
.
_makeOne
(
root
)
self
.
failUnlessRaises
(
NotFound
,
r
.
traverse
,
'folder/objWithBDBBT'
)
def
test_traverse_slash
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithDefault'
,
Dummy
ObjectWithDefault
())
folder
.
_setObject
(
'objWithDefault'
,
self
.
_make
ObjectWithDefault
())
r
=
self
.
_makeOne
(
root
)
r
[
'PARENTS'
]
=
[
folder
.
objWithDefault
]
r
.
traverse
(
'/'
)
...
...
@@ -154,7 +275,7 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_attribute_with_docstring
(
self
):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objBasic'
,
DummyObjectBasic
())
folder
.
_setObject
(
'objBasic'
,
self
.
_makeBasicObject
())
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/objBasic/view'
)
self
.
assertEqual
(
r
.
URL
,
'/folder/objBasic/view'
)
...
...
@@ -163,21 +284,23 @@ class TestBaseRequest(unittest.TestCase):
def
test_traverse_attribute_without_docstring
(
self
):
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objBasic'
,
DummyObjectBasic
())
folder
.
_setObject
(
'objBasic'
,
self
.
_makeBasicObject
())
r
=
self
.
_makeOne
(
root
)
self
.
assertRaises
(
NotFound
,
r
.
traverse
,
'folder/objBasic/noview'
)
def
test_traverse_class_without_docstring
(
self
):
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithoutDocstring'
,
DummyObjectWithoutDocstring
())
folder
.
_setObject
(
'objWithoutDocstring'
,
self
.
_makeObjectWithEmptyDocstring
())
r
=
self
.
_makeOne
(
root
)
self
.
assertRaises
(
NotFound
,
r
.
traverse
,
'folder/objWithoutDocstring'
)
def
test_traverse_attribute_of_class_without_docstring
(
self
):
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'objWithoutDocstring'
,
DummyObjectWithoutDocstring
())
folder
.
_setObject
(
'objWithoutDocstring'
,
self
.
_makeObjectWithEmptyDocstring
())
r
=
self
.
_makeOne
(
root
)
self
.
assertRaises
(
NotFound
,
r
.
traverse
,
'folder/objWithoutDocstring/view'
)
...
...
@@ -186,7 +309,8 @@ class TestBaseRequest(unittest.TestCase):
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
r
=
self
.
_makeOne
(
root
)
folder
.
_setObject
(
'objWithoutDocstring'
,
DummyObjectWithoutDocstring
())
folder
.
_setObject
(
'objWithoutDocstring'
,
self
.
_makeObjectWithEmptyDocstring
())
self
.
assertRaises
(
NotFound
,
r
.
traverse
,
'folder/objWithoutDocstring/noview'
)
...
...
@@ -255,67 +379,155 @@ class TestBaseRequest(unittest.TestCase):
self
.
assertRaises
(
NotFound
,
r
.
traverse
,
'not_found'
)
class
TestBaseRequestZope3Views
(
unittest
.
TestCase
):
class
TestBaseRequestZope3Views
(
unittest
.
TestCase
,
BaseRequest_factory
):
_dummy_interface
=
None
def
_getTargetClass
(
self
):
from
ZPublisher.BaseRequest
import
BaseRequest
return
BaseRequest
def
_makeOne
(
self
,
root
):
response
=
DummyResponse
()
environment
=
{
'URL'
:
''
,
'PARENTS'
:
[
root
],
'steps'
:
[],
'_hacked_path'
:
0
,
'_test_counter'
:
0
,
'response'
:
response
}
request
=
self
.
_getTargetClass
()(
environment
)
from
zope.interface
import
directlyProvides
from
zope.publisher.browser
import
IDefaultBrowserLayer
request
=
super
(
TestBaseRequestZope3Views
,
self
).
_makeOne
(
root
)
# The request needs to implement the proper interface
zope
.
interface
.
directlyProvides
(
request
,
IDefaultBrowserLayer
)
directlyProvides
(
request
,
IDefaultBrowserLayer
)
return
request
def
_makeRootAndFolder
(
self
):
root
=
DummyObjectBasic
()
folder
=
root
.
_setObject
(
'folder'
,
DummyObjectZ3
(
'folder'
))
root
=
self
.
_makeBasicObject
()
folder
=
root
.
_setObject
(
'folder'
,
self
.
_makeDummyObject
(
'folder'
))
return
root
,
folder
def
_dummyInterface
(
self
):
from
zope.interface
import
Interface
if
self
.
_dummy_interface
is
not
None
:
return
self
.
_dummy_interface
class
IDummy
(
Interface
):
"""IDummy"""
self
.
_dummy_interface
=
IDummy
return
IDummy
def
_makeDummyObject
(
self
,
name
=
'dummy'
):
from
zope.interface
import
implements
class
DummyObjectZ3
(
self
.
_makeBasicObjectClass
()):
implements
(
self
.
_dummyInterface
())
def
__init__
(
self
,
name
):
self
.
name
=
name
return
DummyObjectZ3
(
name
)
def
_makeDummyObjectWithAttr
(
self
,
name
):
from
zope.interface
import
implements
class
DummyObjectZ3WithAttr
(
self
.
_makeBasicObjectClass
()):
implements
(
self
.
_dummyInterface
())
def
__init__
(
self
,
name
):
self
.
name
=
name
def
meth
(
self
):
"""doc"""
return
'meth on %s'
%
self
.
name
def
methonly
(
self
):
"""doc"""
return
'methonly on %s'
%
self
.
name
return
DummyObjectZ3WithAttr
(
name
)
def
setUp
(
self
):
zope
.
testing
.
cleanup
.
cleanUp
()
from
zope.testing.cleanup
import
cleanUp
cleanUp
()
self
.
_registerAdapters
()
def
_registerAdapters
(
self
):
from
Acquisition
import
Implicit
from
zope.component
import
getGlobalSiteManager
from
zope.interface
import
Interface
from
zope.publisher.browser
import
BrowserPage
from
zope.publisher.browser
import
IDefaultBrowserLayer
from
zope.traversing.interfaces
import
ITraversable
from
zope.traversing.namespace
import
view
gsm
=
zope
.
component
.
getGlobalSiteManager
()
gsm
=
getGlobalSiteManager
()
IDummy
=
self
.
_dummyInterface
()
class
DummyView
(
Implicit
):
def
__init__
(
self
,
content
,
request
):
self
.
content
=
content
self
.
request
=
request
def
__call__
(
self
):
return
'view on %s'
%
(
self
.
content
.
name
)
class
DummyPage
(
BrowserPage
):
# BrowserPage is an IBrowserPublisher with a browserDefault that
# returns self, () so that __call__ is invoked by the publisher.
def
__call__
(
self
):
return
'Test page'
class
DummyPage2
(
BrowserPage
):
def
browserDefault
(
self
,
request
):
# intentionally return something that's not self
return
DummyPage
(
self
.
context
,
request
),
()
# __call__ remains unimplemented, baseclass raises NotImplementedError
class
DummyPage3
(
BrowserPage
):
def
browserDefault
(
self
,
request
):
# intentionally return a method here
return
self
.
foo
,
()
def
foo
(
self
):
return
'Test page'
# __call__ remains unimplemented, baseclass raises NotImplementedError
class
DummyPage4
(
Implicit
,
DummyPage
):
# a normal page that can implicitly acquire attributes
pass
# Define the views
gsm
.
registerAdapter
(
DummyView
,
(
IDummy
,
IDefaultBrowserLayer
),
zope
.
interface
.
Interface
,
'meth'
)
Interface
,
'meth'
)
gsm
.
registerAdapter
(
DummyPage
,
(
IDummy
,
IDefaultBrowserLayer
),
zope
.
interface
.
Interface
,
'page'
)
Interface
,
'page'
)
gsm
.
registerAdapter
(
DummyPage2
,
(
IDummy
,
IDefaultBrowserLayer
),
zope
.
interface
.
Interface
,
'page2'
)
Interface
,
'page2'
)
gsm
.
registerAdapter
(
DummyPage3
,
(
IDummy
,
IDefaultBrowserLayer
),
zope
.
interface
.
Interface
,
'page3'
)
Interface
,
'page3'
)
gsm
.
registerAdapter
(
DummyPage4
,
(
IDummy
,
IDefaultBrowserLayer
),
zope
.
interface
.
Interface
,
'page4'
)
Interface
,
'page4'
)
# Bind the 'view' namespace (for @@ traversal)
gsm
.
registerAdapter
(
zope
.
traversing
.
namespace
.
view
,
(
IDummy
,
IDefaultBrowserLayer
),
ITraversable
,
'view'
)
gsm
.
registerAdapter
(
view
,
(
self
.
_dummyInterface
(),
IDefaultBrowserLayer
)
,
ITraversable
,
'view'
)
def
tearDown
(
self
):
zope
.
testing
.
cleanup
.
cleanUp
()
from
zope.testing.cleanup
import
cleanUp
cleanUp
()
def
_setDefaultViewName
(
self
,
name
):
from
zope.component
import
getGlobalSiteManager
from
zope.component.interfaces
import
IDefaultViewName
gsm
=
zope
.
component
.
getGlobalSiteManager
()
gsm
.
registerAdapter
(
name
,
(
IDummy
,
IBrowserRequest
),
IDefaultViewName
,
''
)
from
zope.publisher.browser
import
IBrowserRequest
gsm
=
getGlobalSiteManager
()
gsm
.
registerAdapter
(
name
,
(
self
.
_dummyInterface
(),
IBrowserRequest
),
IDefaultViewName
,
''
)
def
test_traverse_view
(
self
):
#simple view
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'obj'
,
DummyObjectZ3
(
'obj'
))
folder
.
_setObject
(
'obj'
,
self
.
_makeDummyObject
(
'obj'
))
r
=
self
.
_makeOne
(
root
)
ob
=
r
.
traverse
(
'folder/obj/meth'
)
self
.
assertEqual
(
ob
(),
'view on obj'
)
...
...
@@ -329,7 +541,7 @@ class TestBaseRequestZope3Views(unittest.TestCase):
def
test_traverse_view_attr_local
(
self
):
#method on object used first
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'withattr'
,
DummyObjectZ3
WithAttr
(
'withattr'
))
folder
.
_setObject
(
'withattr'
,
self
.
_makeDummyObject
WithAttr
(
'withattr'
))
r
=
self
.
_makeOne
(
root
)
ob
=
r
.
traverse
(
'folder/withattr/meth'
)
self
.
assertEqual
(
ob
(),
'meth on withattr'
)
...
...
@@ -343,8 +555,8 @@ class TestBaseRequestZope3Views(unittest.TestCase):
def
test_traverse_view_attr_above
(
self
):
#view takes precedence over acquired attribute
root
,
folder
=
self
.
_makeRootAndFolder
()
folder2
=
root
.
_setObject
(
'folder2'
,
DummyObjectZ3
WithAttr
(
'folder2'
))
folder2
.
_setObject
(
'obj2'
,
DummyObjectZ3
(
'obj2'
))
folder2
=
root
.
_setObject
(
'folder2'
,
self
.
_makeDummyObject
WithAttr
(
'folder2'
))
folder2
.
_setObject
(
'obj2'
,
self
.
_makeDummyObject
(
'obj2'
))
r
=
self
.
_makeOne
(
root
)
ob
=
r
.
traverse
(
'folder2/obj2/meth'
)
self
.
assertEqual
(
ob
(),
'view on obj2'
)
# used to be buggy (acquired)
...
...
@@ -358,8 +570,8 @@ class TestBaseRequestZope3Views(unittest.TestCase):
def
test_traverse_view_attr_local2
(
self
):
#method with other method above
root
,
folder
=
self
.
_makeRootAndFolder
()
folder2
=
root
.
_setObject
(
'folder2'
,
DummyObjectZ3
WithAttr
(
'folder2'
))
folder2
.
_setObject
(
'withattr2'
,
DummyObjectZ3
WithAttr
(
'withattr2'
))
folder2
=
root
.
_setObject
(
'folder2'
,
self
.
_makeDummyObject
WithAttr
(
'folder2'
))
folder2
.
_setObject
(
'withattr2'
,
self
.
_makeDummyObject
WithAttr
(
'withattr2'
))
r
=
self
.
_makeOne
(
root
)
ob
=
r
.
traverse
(
'folder2/withattr2/meth'
)
self
.
assertEqual
(
ob
(),
'meth on withattr2'
)
...
...
@@ -374,8 +586,8 @@ class TestBaseRequestZope3Views(unittest.TestCase):
#normal acquired attribute without view
from
ZPublisher
import
NotFound
root
,
folder
=
self
.
_makeRootAndFolder
()
folder2
=
root
.
_setObject
(
'folder2'
,
DummyObjectZ3
WithAttr
(
'folder2'
))
folder2
.
_setObject
(
'obj2'
,
DummyObjectZ3
(
'obj2'
))
folder2
=
root
.
_setObject
(
'folder2'
,
self
.
_makeDummyObject
WithAttr
(
'folder2'
))
folder2
.
_setObject
(
'obj2'
,
self
.
_makeDummyObject
(
'obj2'
))
r
=
self
.
_makeOne
(
root
)
ob
=
r
.
traverse
(
'folder2/obj2/methonly'
)
self
.
assertEqual
(
ob
(),
'methonly on folder2'
)
...
...
@@ -387,7 +599,7 @@ class TestBaseRequestZope3Views(unittest.TestCase):
def
test_quoting_goggles
(
self
):
#View goggles ('@@') should not be quoted
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'obj'
,
DummyObjectZ3
(
'obj'
))
folder
.
_setObject
(
'obj'
,
self
.
_makeDummyObject
(
'obj'
))
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/obj/@@meth'
)
self
.
assertEqual
(
r
[
'URL'
],
'/folder/obj/@@meth'
)
...
...
@@ -395,7 +607,7 @@ class TestBaseRequestZope3Views(unittest.TestCase):
def
test_quoting_plusplus
(
self
):
#View markers ('++ should not be quoted
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'obj'
,
DummyObjectZ3
(
'obj'
))
folder
.
_setObject
(
'obj'
,
self
.
_makeDummyObject
(
'obj'
))
r
=
self
.
_makeOne
(
root
)
r
.
traverse
(
'folder/obj/++view++meth'
)
self
.
assertEqual
(
r
[
'URL'
],
'/folder/obj/++view++meth'
)
...
...
@@ -404,7 +616,7 @@ class TestBaseRequestZope3Views(unittest.TestCase):
# browserDefault can return self, () to indicate that the
# object itself wants to be published (using __call__):
root
,
folder
=
self
.
_makeRootAndFolder
()
folder
.
_setObject
(
'obj'
,
DummyObjectZ3
(
'obj'
))
folder
.
_setObject
(
'obj'
,
self
.
_makeDummyObject
(
'obj'
))
r
=
self
.
_makeOne
(
root
)
ob
=
r
.
traverse
(
'folder/obj/page'
)
self
.
assertEqual
(
ob
(),
'Test page'
)
...
...
@@ -426,7 +638,7 @@ class TestBaseRequestZope3Views(unittest.TestCase):
# an object providing IAcquirer, it should wrap it in the
# object being traversed
root
,
folder
=
self
.
_makeRootAndFolder
()
ob2
=
DummyObjectZ3
(
'ob2'
)
ob2
=
self
.
_makeDummyObject
(
'ob2'
)
folder
.
_setObject
(
'ob2'
,
ob2
)
r
=
self
.
_makeOne
(
root
)
ob
=
r
.
traverse
(
'folder/page4'
)
...
...
@@ -434,165 +646,6 @@ class TestBaseRequestZope3Views(unittest.TestCase):
# make sure we can acquire
self
.
assertEqual
(
ob
.
ob2
,
ob2
)
class
DummyResponse
(
Implicit
):
base
=
''
status
=
None
debug_mode
=
False
def
setStatus
(
self
,
code
):
self
.
status
=
code
def
setBase
(
self
,
base
):
if
base
is
None
:
base
=
''
elif
not
base
.
endswith
(
'/'
):
base
=
base
+
'/'
self
.
base
=
str
(
base
)
def
notFoundError
(
self
,
name
):
from
zExceptions
import
NotFound
raise
NotFound
(
name
)
# Real responses raise NotFound, to avoid information disclosure
#def forbiddenError(self, name):
# from zExceptions import Forbidden
# raise Forbidden(name)
forbiddenError
=
notFoundError
class
DummyObjectBasic
(
Implicit
):
"""Dummy class with docstring."""
def
_setObject
(
self
,
id
,
object
):
setattr
(
self
,
id
,
object
)
return
getattr
(
self
,
id
)
def
view
(
self
):
"""Attribute with docstring."""
return
'view content'
def
noview
(
self
):
# Attribute without docstring.
return
'unpublishable'
class
DummyObjectWithoutDocstring
(
Implicit
):
""
def
view
(
self
):
"""Attribute with docstring."""
return
'view content'
def
noview
(
self
):
# Attribute without docstring.
return
'unpublishable'
class
DummyObjectWithDefault
(
DummyObjectBasic
):
"""Dummy class with docstring."""
def
index_html
(
self
):
"""Attribute with docstring."""
return
'index_html content'
class
DummyObjectWithDefaultNone
(
DummyObjectWithDefault
):
"""Dummy class with docstring."""
index_html
=
None
class
DummyObjectWithBPTH
(
DummyObjectBasic
):
"""Dummy class with docstring."""
def
__before_publishing_traverse__
(
self
,
object
,
REQUEST
):
if
REQUEST
[
'_test_counter'
]
<
100
:
REQUEST
[
'_test_counter'
]
+=
1
else
:
raise
RuntimeError
(
'Infinite loop detected.'
)
REQUEST
[
'TraversalRequestNameStack'
]
+=
self
.
_path
REQUEST
.
_hacked_path
=
1
class
DummyObjectWithBBT
(
DummyObjectBasic
):
""" Dummy class with docstring.
"""
def
__bobo_traverse__
(
self
,
REQUEST
,
name
):
raise
AttributeError
,
name
class
DummyObjectWithBD
(
DummyObjectBasic
):
"""Dummy class with docstring."""
def
__browser_default__
(
self
,
REQUEST
):
if
REQUEST
[
'_test_counter'
]
<
100
:
REQUEST
[
'_test_counter'
]
+=
1
else
:
raise
RuntimeError
(
'Infinite loop detected.'
)
return
self
,
self
.
_default_path
class
DummyObjectWithBDBBT
(
DummyObjectWithBD
):
"""Dummy class with docstring."""
def
__bobo_traverse__
(
self
,
REQUEST
,
name
):
if
name
==
self
.
_default_path
[
0
]:
return
getattr
(
self
,
name
)
raise
AttributeError
,
name
class
IDummy
(
zope
.
interface
.
Interface
):
"""IDummy"""
class
DummyObjectZ3
(
DummyObjectBasic
):
zope
.
interface
.
implements
(
IDummy
)
def
__init__
(
self
,
name
):
self
.
name
=
name
class
DummyObjectZ3WithAttr
(
DummyObjectZ3
):
def
meth
(
self
):
"""doc"""
return
'meth on %s'
%
self
.
name
def
methonly
(
self
):
"""doc"""
return
'methonly on %s'
%
self
.
name
class
DummyView
(
Implicit
):
def
__init__
(
self
,
content
,
request
):
self
.
content
=
content
self
.
request
=
request
def
__call__
(
self
):
return
'view on %s'
%
(
self
.
content
.
name
)
class
DummyPage
(
BrowserPage
):
# BrowserPage is an IBrowserPublisher with a browserDefault that
# returns self, () so that __call__ is invoked by the publisher.
def
__call__
(
self
):
return
'Test page'
class
DummyPage2
(
BrowserPage
):
def
browserDefault
(
self
,
request
):
# intentionally return something that's not self
return
DummyPage
(
self
.
context
,
request
),
()
# __call__ remains unimplemented, baseclass raises NotImplementedError
class
DummyPage3
(
BrowserPage
):
def
browserDefault
(
self
,
request
):
# intentionally return a method here
return
self
.
foo
,
()
def
foo
(
self
):
return
'Test page'
# __call__ remains unimplemented, baseclass raises NotImplementedError
class
DummyPage4
(
Implicit
,
DummyPage
):
# a normal page that can implicitly acquire attributes
pass
def
test_suite
():
return
unittest
.
TestSuite
((
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment