1##############################################################################
2#
3# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
4# All Rights Reserved.
5#
6# This software is subject to the provisions of the Zope Public License,
7# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
8# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11# FOR A PARTICULAR PURPOSE.
12#
13##############################################################################
14"""baserequest tests
15"""
16from unittest import TestCase, main, makeSuite
17
18from zope.publisher.tests.basetestipublicationrequest \
19     import BaseTestIPublicationRequest
20
21from zope.publisher.tests.basetestipublisherrequest \
22     import BaseTestIPublisherRequest
23
24from zope.publisher.tests.basetestiapplicationrequest \
25     import BaseTestIApplicationRequest
26
27from StringIO import StringIO
28from zope.interface import Interface, providedBy, alsoProvides
29from zope.component import provideAdapter
30
31class TestBaseRequest(BaseTestIPublicationRequest,
32                      BaseTestIApplicationRequest,
33                      BaseTestIPublisherRequest,
34                      TestCase):
35
36    def _Test__new(self, **kw):
37        from zope.publisher.base import BaseRequest
38        return BaseRequest(StringIO(''), kw)
39
40    def _Test__expectedViewType(self):
41        return None # we don't expect
42
43    def test_IApplicationRequest_bodyStream(self):
44        from zope.publisher.base import BaseRequest
45
46        request = BaseRequest(StringIO('spam'), {})
47        self.assertEqual(request.bodyStream.read(), 'spam')
48
49    def test_IPublicationRequest_getPositionalArguments(self):
50        self.assertEqual(self._Test__new().getPositionalArguments(), ())
51
52    def test_IPublisherRequest_retry(self):
53        self.assertEqual(self._Test__new().supportsRetry(), 0)
54
55    def test_IPublisherRequest_traverse(self):
56        from zope.publisher.tests.publication import TestPublication
57        request = self._Test__new()
58        request.setPublication(TestPublication())
59        app = request.publication.getApplication(request)
60
61        request.setTraversalStack([])
62        self.assertEqual(request.traverse(app).name, '')
63        self.assertEqual(request._last_obj_traversed, app)
64        request.setTraversalStack(['ZopeCorp'])
65        self.assertEqual(request.traverse(app).name, 'ZopeCorp')
66        self.assertEqual(request._last_obj_traversed, app.ZopeCorp)
67        request.setTraversalStack(['Engineering', 'ZopeCorp'])
68        self.assertEqual(request.traverse(app).name, 'Engineering')
69        self.assertEqual(request._last_obj_traversed, app.ZopeCorp.Engineering)
70
71    def test_IPublisherRequest_processInputs(self):
72        self._Test__new().processInputs()
73
74    def test_AnnotationsExist(self):
75        self.assertEqual(self._Test__new().annotations, {})
76
77    # Needed by BaseTestIEnumerableMapping tests:
78    def _IEnumerableMapping__stateDict(self):
79        return {'id': 'ZopeOrg', 'title': 'Zope Community Web Site',
80                'greet': 'Welcome to the Zope Community Web site'}
81
82    def _IEnumerableMapping__sample(self):
83        return self._Test__new(**(self._IEnumerableMapping__stateDict()))
84
85    def _IEnumerableMapping__absentKeys(self):
86        return 'foo', 'bar'
87
88    def test_SetRequestInResponse(self):
89        request = self._Test__new()
90        self.assertEqual(request.response._request, request)
91
92    def test_retry_keeps_everything(self):
93        """lowlevel test for retry (see #98440)"""
94        from zope.publisher.browser import TestRequest
95        from zope.publisher.skinnable import setDefaultSkin
96        from zope.publisher.interfaces import IDefaultSkin
97        from zope.publisher.interfaces.browser import IBrowserRequest
98        from zope.publisher.interfaces.browser import IBrowserSkinType
99        # create a retryable request
100        request = TestRequest()
101        self.assertTrue(request.supportsRetry())
102        # create a skin and register it as the default skin
103        class ISomeSkin(Interface):
104            pass
105        alsoProvides(ISomeSkin, IBrowserSkinType)
106        provideAdapter(ISomeSkin, (IBrowserRequest,), IDefaultSkin)
107        # set the default skin for the request
108        setDefaultSkin(request)
109
110        # create a retried request
111        retried = request.retry()
112
113        # the requests are not the same
114        self.assertTrue(request is not retried)
115        # the requests both provide the default skin
116        self.assertTrue(ISomeSkin.providedBy(request))
117        self.assertTrue(ISomeSkin.providedBy(retried))
118
119
120def test_suite():
121    return makeSuite(TestBaseRequest)
122
123if __name__=='__main__':
124    main(defaultTest='test_suite')
125