diff options
author | Tim Peters <tim.one@comcast.net> | 2005-03-31 15:50:20 +0000 |
---|---|---|
committer | Tim Peters <tim.one@comcast.net> | 2005-03-31 15:50:20 +0000 |
commit | 73103060a2e106ac2dd4d304f1df107997748083 (patch) | |
tree | cb5339f2703b200502279ed3a3f9b05a1deed898 | |
download | zope-traversing-monolithic-zope3-zope-app-ZopeX3-3.0.0-Zope-2.8.tar.gz |
Stop using the deprecated get_transaction().monolithic-zope3-zope-app-ZopeX3-3.0.0-Zope-2.8
Alas, there's not enough stuff in this branch to run tests,
so none of this has been tested yet.
-rw-r--r-- | ftests/test_vhosting.py | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/ftests/test_vhosting.py b/ftests/test_vhosting.py new file mode 100644 index 0000000..873b546 --- /dev/null +++ b/ftests/test_vhosting.py @@ -0,0 +1,179 @@ +############################################################################## +# +# Copyright (c) 2003 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""Functional tests for virtual hosting. + +$Id$ +""" +import unittest +from zope.app.tests import ztapi +from zope.app.tests.functional import BrowserTestCase +from zope.app.folder import Folder +import transaction +from zope.app.publisher.browser.resource import Resource +from zope.app.traversing.api import traverse +from zope.security.checker import defineChecker, NamesChecker, NoProxy +from zope.app.container.contained import Contained +from zope.app.zptpage.zptpage import ZPTPage + +class MyObj(Contained): + def __getitem__(self, key): + return traverse(self, '/foo/bar/' + key) + +defineChecker(MyObj, NoProxy) + +class TestVirtualHosting(BrowserTestCase): + + def test_request_url(self): + self.addPage('/pt', u'<span tal:replace="request/URL"/>') + self.verify('/pt', 'http://localhost/pt/index.html\n') + self.verify('/++vh++/++/pt', + 'http://localhost/pt/index.html\n') + self.verify('/++vh++https:otherhost:443/++/pt', + 'https://otherhost/pt/index.html\n') + self.verify('/++vh++https:otherhost:443/fake/folders/++/pt', + 'https://otherhost/fake/folders/pt/index.html\n') + + self.addPage('/foo/bar/pt', u'<span tal:replace="request/URL"/>') + self.verify('/foo/bar/pt', 'http://localhost/foo/bar/pt/index.html\n') + self.verify('/foo/bar/++vh++/++/pt', + 'http://localhost/pt/index.html\n') + self.verify('/foo/bar/++vh++https:otherhost:443/++/pt', + 'https://otherhost/pt/index.html\n') + self.verify('/foo/++vh++https:otherhost:443/fake/folders/++/bar/pt', + 'https://otherhost/fake/folders/bar/pt/index.html\n') + + def test_request_base(self): + self.addPage('/pt', u'<head></head>') + self.verify('/pt', + '<head>\n<base href="http://localhost/pt/index.html" />\n' + '</head>\n') + self.verify('/++vh++/++/pt', + '<head>\n<base href="http://localhost/pt/index.html" />\n' + '</head>\n') + self.verify('/++vh++https:otherhost:443/++/pt', + '<head>\n' + '<base href="https://otherhost/pt/index.html" />' + '\n</head>\n') + self.verify('/++vh++https:otherhost:443/fake/folders/++/pt', + '<head>\n<base href=' + '"https://otherhost/fake/folders/pt/index.html" />' + '\n</head>\n') + + self.addPage('/foo/bar/pt', u'<head></head>') + self.verify('/foo/bar/pt', + '<head>\n<base ' + 'href="http://localhost/foo/bar/pt/index.html" />\n' + '</head>\n') + self.verify('/foo/bar/++vh++/++/pt', + '<head>\n<base href="http://localhost/pt/index.html" />\n' + '</head>\n') + self.verify('/foo/bar/++vh++https:otherhost:443/++/pt', + '<head>\n' + '<base href="https://otherhost/pt/index.html" />' + '\n</head>\n') + self.verify('/foo/++vh++https:otherhost:443/fake/folders/++/bar/pt', + '<head>\n<base href=' + '"https://otherhost/fake/folders/bar/pt/index.html" />' + '\n</head>\n') + + def test_request_redirect(self): + self.addPage('/foo/index.html', u'Spam') + self.verifyRedirect('/foo', 'http://localhost/foo/index.html') + self.verifyRedirect('/++vh++https:otherhost:443/++/foo', + 'https://otherhost/foo/index.html') + self.verifyRedirect('/foo/++vh++https:otherhost:443/bar/++', + 'https://otherhost/bar/index.html') + + def test_absolute_url(self): + self.addPage('/pt', u'<span tal:replace="template/@@absolute_url"/>') + self.verify('/pt', 'http://localhost/pt\n') + self.verify('/++vh++/++/pt', + 'http://localhost/pt\n') + self.verify('/++vh++https:otherhost:443/++/pt', + 'https://otherhost/pt\n') + self.verify('/++vh++https:otherhost:443/fake/folders/++/pt', + 'https://otherhost/fake/folders/pt\n') + + self.addPage('/foo/bar/pt', + u'<span tal:replace="template/@@absolute_url"/>') + self.verify('/foo/bar/pt', 'http://localhost/foo/bar/pt\n') + self.verify('/foo/bar/++vh++/++/pt', + 'http://localhost/pt\n') + self.verify('/foo/bar/++vh++https:otherhost:443/++/pt', + 'https://otherhost/pt\n') + self.verify('/foo/++vh++https:otherhost:443/fake/folders/++/bar/pt', + 'https://otherhost/fake/folders/bar/pt\n') + + def test_absolute_url_absolute_traverse(self): + self.createObject('/foo/bar/obj', MyObj()) + self.addPage('/foo/bar/pt', + u'<span tal:replace="container/obj/pt/@@absolute_url"/>') + self.verify('/foo/bar/pt', 'http://localhost/foo/bar/pt\n') + self.verify('/foo/++vh++https:otherhost:443/++/bar/pt', + 'https://otherhost/bar/pt\n') + + def test_resources(self): + ztapi.browserResource('quux', Resource) + defineChecker(Resource, NamesChecker(['__call__'])) + self.addPage('/foo/bar/pt', + u'<span tal:replace="context/++resource++quux" />') + self.verify('/foo/bar/pt', 'http://localhost/@@/quux\n') + self.verify('/foo/++vh++https:otherhost:443/fake/folders/++/bar/pt', + 'https://otherhost/fake/folders/@@/quux\n') + + def createFolders(self, path): + """addFolders('/a/b/c/d') would traverse and/or create three nested + folders (a, b, c) and return a tuple (c, 'd') where c is a Folder + instance at /a/b/c.""" + folder = self.getRootFolder() + if path[0] == '/': + path = path[1:] + path = path.split('/') + for id in path[:-1]: + try: + folder = folder[id] + except KeyError: + folder[id] = Folder() + folder = folder[id] + return folder, path[-1] + + def createObject(self, path, obj): + folder, id = self.createFolders(path) + folder[id] = obj + transaction.commit() + + def addPage(self, path, content): + page = ZPTPage() + page.source = content + self.createObject(path, page) + + def verify(self, path, content): + result = self.publish(path) + self.assertEquals(result.getStatus(), 200) + self.assertEquals(result.getBody(), content) + + def verifyRedirect(self, path, location): + result = self.publish(path) + self.assertEquals(result.getStatus(), 302) + self.assertEquals(result.getHeader('Location'), location) + + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestVirtualHosting)) + return suite + + +if __name__ == '__main__': + unittest.main() |