Index: third_party/twisted_8_1/twisted/web/test/test_woven.py |
diff --git a/third_party/twisted_8_1/twisted/web/test/test_woven.py b/third_party/twisted_8_1/twisted/web/test/test_woven.py |
deleted file mode 100644 |
index 29dd17fc10c3b8fbbd377342b16d62c64b3485f3..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/web/test/test_woven.py |
+++ /dev/null |
@@ -1,570 +0,0 @@ |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-from twisted.trial import unittest |
-from twisted.web import server, resource, microdom, domhelpers |
-from twisted.web import http |
-from twisted.web.test import test_web |
-from twisted.internet import reactor, defer, address |
- |
-from twisted.web.woven import template, model, view, controller, widgets, input, page, guard |
- |
-outputNum = 0 |
- |
-# Reusable test harness |
- |
-class WovenTC(unittest.TestCase): |
- modelFactory = lambda self: None |
- resourceFactory = None |
- def setUp(self): |
- self.m = self.modelFactory() |
- self.t = self.resourceFactory(self.m) |
- self.r = test_web.DummyRequest(['']) |
- self.r.prepath = [''] |
- self.prerender() |
- self.t.render(self.r) |
- |
- self.channel = "a fake channel" |
- self.output = ''.join(self.r.written) |
- assert self.output, "No output was generated by the test." |
- global outputNum |
- open("wovenTestOutput%s.html" % (outputNum + 1), 'w').write(self.output) |
- outputNum += 1 |
- self.d = microdom.parseString(self.output) |
- |
- def prerender(self): |
- pass |
- |
-# Test 1 |
-# Test that replacing nodes with a string works properly |
- |
- |
-class SimpleTemplate(template.DOMTemplate): |
- template = """<http> |
- <head> |
- <title id="title"><span view="getTitle">Hello</span></title> |
- </head> |
- <body> |
- <h3 id="hello"><span view="getHello">Hi</span></h3> |
- </body> |
-</http>""" |
- |
- def factory_getTitle(self, request, node): |
- return "Title" |
- |
- def factory_getHello(self, request, node): |
- return "Hello" |
- |
- |
-class DOMTemplateTest(WovenTC): |
- resourceFactory = SimpleTemplate |
- def testSimpleRender(self): |
- titleNode = self.d.getElementById("title") |
- helloNode = self.d.getElementById("hello") |
- |
- self.assert_(domhelpers.gatherTextNodes(titleNode) == 'Title') |
- self.assert_(domhelpers.gatherTextNodes(helloNode) == 'Hello') |
- |
- |
-# Test 2 |
-# Test just like the first, but with Text widgets |
- |
-class TemplateWithWidgets(SimpleTemplate): |
- def wcfactory_getTitle(self, request, node): |
- return widgets.Text("Title") |
- |
- def wcfactory_getHello(self, request, node): |
- return widgets.Text("Hello") |
- |
- |
-class TWWTest(DOMTemplateTest): |
- resourceFactory = TemplateWithWidgets |
- |
- |
-# Test 3 |
-# Test a fancier widget, and controllers handling submitted input |
- |
- |
-class MDemo(model.AttributeModel): |
- foo = "Hello world" |
- color = 'blue' |
- |
- |
-class FancyBox(widgets.Widget): |
- def setUp(self, request, node, data): |
- self['style'] = 'margin: 1em; padding: 1em; background-color: %s' % data |
- |
- |
-class VDemo(view.View): |
- template = """<html> |
- |
-<div id="box" model="color" view="FancyBox"></div> |
- |
-<form action=""> |
-Type a color and hit submit: |
-<input type="text" controller="change" model="color" name="color" /> |
-<input type="submit" /> |
-</form> |
- |
-</html> |
-""" |
- def wvfactory_FancyBox(self, request, node, model): |
- return FancyBox(model) |
- |
- def renderFailure(self, failure, request): |
- return failure |
- |
- |
-class ChangeColor(input.Anything): |
- def commit(self, request, node, data): |
- session = request.getSession() |
- session.color = data |
- self.model.setData(request, data) |
- self.model.notify({'request': request}) |
- |
- |
-class CDemo(controller.Controller): |
- def setUp(self, request): |
- session = request.getSession() |
- self.model.color = getattr(session, 'color', self.model.color) |
- |
- def wcfactory_change(self, request, node, model): |
- return ChangeColor(model) |
- |
- |
-view.registerViewForModel(VDemo, MDemo) |
-controller.registerControllerForModel(CDemo, MDemo) |
- |
- |
-class ControllerTest(WovenTC): |
- modelFactory = MDemo |
- resourceFactory = CDemo |
- |
- def prerender(self): |
- self.r.addArg('color', 'red') |
- |
- def testControllerOutput(self): |
- boxNode = self.d.getElementById("box") |
- assert boxNode, "Test %s failed" % outputNum |
- style = boxNode.getAttribute("style") |
- styles = style.split(";") |
- sDict = {} |
- for item in styles: |
- key, value = item.split(":") |
- key = key.strip() |
- value = value.strip() |
- sDict[key] = value |
- |
-# print sDict |
- assert sDict['background-color'] == 'red' |
- |
- |
-# Test 4 |
-# Test a list, a list widget, and Deferred data handling |
- |
-identityList = ['asdf', 'foo', 'fredf', 'bob'] |
- |
-class MIdentityList(model.AttributeModel): |
- def __init__(self): |
- model.Model.__init__(self) |
- self.identityList = defer.Deferred() |
- self.identityList.callback(identityList) |
- |
- |
-class VIdentityList(view.View): |
- template = """<html> |
- <ul id="list" view="identityList" model="identityList"> |
- <li listItemOf="identityList" view="text"> |
- Stuff. |
- </li> |
- </ul> |
-</html>""" |
- |
- def wvfactory_identityList(self, request, node, model): |
- return widgets.List(model) |
- |
- def wvfactory_text(self, request, node, model): |
- return widgets.Text(model) |
- |
- def renderFailure(self, failure, request): |
- return failure |
- |
- |
-class CIdentityList(controller.Controller): |
- pass |
- |
- |
-view.registerViewForModel(VIdentityList, MIdentityList) |
-controller.registerControllerForModel(CIdentityList, MIdentityList) |
- |
- |
-class ListDeferredTest(WovenTC): |
- modelFactory = MIdentityList |
- resourceFactory = CIdentityList |
- |
- def testOutput(self): |
- listNode = self.d.getElementById("list") |
- assert listNode, "Test %s failed; there was no element with the id 'list' in the output" % outputNum |
- liNodes = domhelpers.getElementsByTagName(listNode, 'li') |
- assert len(liNodes) == len(identityList), "Test %s failed; the number of 'li' nodes did not match the list size" % outputNum |
- |
- |
-# Test 5 |
-# Test nested lists |
- |
-class LLModel(model.AttributeModel): |
- data = [['foo', 'bar', 'baz'], |
- ['gum', 'shoe'], |
- ['ggg', 'hhh', 'iii'] |
- ] |
- |
- |
-class LLView(view.View): |
- template = """<html> |
- <ul id="first" view="List" model="data"> |
- <li pattern="listItem" view="DefaultWidget"> |
- <ol view="List"> |
- <li pattern="listItem" view="Text" /> |
- </ol> |
- </li> |
- </ul> |
-</html>""" |
- |
- def wvfactory_List(self, request, node, model): |
- return widgets.List(model) |
- |
- |
-class NestedListTest(WovenTC): |
- modelFactory = LLModel |
- resourceFactory = LLView |
- |
- def testOutput(self): |
- listNode = self.d.getElementById("first") |
- assert listNode, "Test %s failed" % outputNum |
- liNodes = filter(lambda x: hasattr(x, 'tagName') and x.tagName == 'li', listNode.childNodes) |
-# print len(liNodes), len(self.m.data), liNodes, self.m.data |
- assert len(liNodes) == len(self.m.data), "Test %s failed" % outputNum |
- for i in range(len(liNodes)): |
- sublistNode = domhelpers.getElementsByTagName(liNodes[i], 'ol')[0] |
- subLiNodes = domhelpers.getElementsByTagName(sublistNode, 'li') |
- assert len(self.m.data[i]) == len(subLiNodes) |
- |
-# Test 6 |
-# Test notification when a model is a dict or a list |
- |
-class MNotifyTest(model.AttributeModel): |
- def initialize(self, *args, **kwargs): |
- self.root = {"inventory": [], 'log': ""} |
- |
- |
-class VNotifyTest(view.View): |
- template = """<html> |
- <body> |
- <ol id="theList" model="root/inventory" view="List"> |
- <li view="someText" pattern="listItem" /> |
- </ol> |
- |
- <form action=""> |
- <input model="root" view="DefaultWidget" controller="updateInventory" name="root" /> |
- <input type="submit" /> |
- </form> |
- </body> |
-</html>""" |
- |
- def wvfactory_someText(self, request, node, m): |
- return widgets.Text(m) |
- |
-class InventoryUpdater(input.Anything): |
- def commit(self, request, node, data): |
- invmodel = self.model.getSubmodel(request, "inventory") |
- log = self.model.getSubmodel(request, "log") |
- inv = invmodel.getData(request) |
- inv.append(data) # just add a string to the list |
- log.setData(request, log.getData(request) + ("%s added to servers\n" % data)) |
- invmodel.setData(request, inv) |
- invmodel.notify({'request': request}) |
- |
- |
-class CNotifyTest(controller.Controller): |
- def wcfactory_updateInventory(self, request, node, model): |
- return InventoryUpdater(model) |
- |
- |
-view.registerViewForModel(VNotifyTest, MNotifyTest) |
-controller.registerControllerForModel(CNotifyTest, MNotifyTest) |
- |
-class NotifyTest(WovenTC): |
- modelFactory = MNotifyTest |
- resourceFactory = CNotifyTest |
- |
- def prerender(self): |
- self.r.addArg('root', 'test') |
- |
- def testComplexNotification(self): |
- listNode = self.d.getElementById("theList") |
- self.assert_(listNode, "Test %s failed" % outputNum) |
- liNodes = domhelpers.getElementsByTagName(listNode, 'li') |
- self.assert_(liNodes, |
- "DOM was not updated by notifying Widgets. Test %s" % outputNum) |
- text = domhelpers.gatherTextNodes(liNodes[0]) |
- self.assert_(text.strip() == "test", |
- "Wrong output: %s. Test %s" % (text, outputNum)) |
- |
-view.registerViewForModel(LLView, LLModel) |
- |
-#### Test 7 |
-# Test model path syntax |
-# model="/" should get you the root object |
-# model="." should get you the current object |
-# model=".." should get you the parent model object |
- |
- |
-# xxx sanity check for now; just make sure it doesn't raise anything |
- |
-class ModelPathTest(WovenTC): |
- modelFactory = lambda self: ['hello', ['hi', 'there'], |
- 'hi', ['asdf', ['qwer', 'asdf']]] |
- resourceFactory = page.Page |
- |
- def prerender(self): |
- self.t.template = """<html> |
- <div model="0" view="None"> |
- <div model=".." view="Text" /> |
- </div> |
- |
- <div model="0" view="None"> |
- <div model="../1/../2/../3" view="Text" /> |
- </div> |
- |
- <div model="0" view="None"> |
- <div model="../3/1/./1" view="Text" /> |
- </div> |
- |
- <div model="3/1/0" view="None"> |
- <div model="/" view="Text" /> |
- </div> |
- |
- <div model="3/1/0" view="None"> |
- <div model="/3" view="Text" /> |
- </div> |
- |
-</html>""" |
- |
-#### Test 8 |
-# Test a large number of widgets |
- |
-class HugeTest(WovenTC): |
- modelFactory = lambda self: ['hello' for x in range(100)] |
- resourceFactory = page.Page |
- |
- def prerender(self): |
- self.t.template = """<html> |
- <div model="." view="List"> |
- <div pattern="listItem" view="Text" /> |
- </div> |
-</html>""" |
- |
- def testHugeTest(self): |
- pass |
- |
- |
-class ListOfDeferredsTest(WovenTC): |
- """Test rendering a model which is a list of Deferreds.""" |
- |
- modelFactory = lambda self: [defer.succeed("hello"), defer.succeed("world")] |
- resourceFactory = page.Page |
- |
- def prerender(self): |
- t = '''<div model="." view="List"> |
- <b pattern="listItem" view="Text" /> |
- </div>''' |
- self.t.template = t |
- |
- def testResult(self): |
- n = self.d.firstChild() |
- self.assertEquals(len(n.childNodes), 2) |
- for c in n.childNodes: |
- self.assertEquals(c.nodeName, "b") |
- self.assertEquals(n.firstChild().firstChild().toxml().strip(), "hello") |
- self.assertEquals(n.lastChild().firstChild().toxml().strip(), "world") |
- |
- |
-class FakeHTTPChannel: |
- # TODO: this should be an interface in twisted.protocols.http... lots of |
- # things want to fake out HTTP |
- def __init__(self): |
- self.transport = self |
- self.factory = self |
- self.received_cookies = {} |
- |
- # 'factory' attribute needs this |
- def log(self, req): |
- pass |
- |
- # 'channel' of request needs this |
- def requestDone(self, req): |
- self.req = req |
- |
- # 'transport' attribute needs this |
- def getPeer(self): |
- return address.IPv4Address("TCP", "fake", "fake") |
- def getHost(self): |
- return address.IPv4Address("TCP", "fake", 80) |
- |
- def write(self, data): |
- # print data |
- pass |
- def writeSequence(self, datas): |
- for data in datas: |
- self.write(data) |
- |
- # Utility for testing. |
- |
- def makeFakeRequest(self, path, **vars): |
- req = FakeHTTPRequest(self, queued=0) |
- req.received_cookies.update(self.received_cookies) |
- req.requestReceived("GET", path, "1.0") |
- return req |
- |
-class FakeHTTPRequest(server.Request): |
- def __init__(self, *args, **kw): |
- server.Request.__init__(self, *args, **kw) |
- self._cookieCache = {} |
- from cStringIO import StringIO |
- self.content = StringIO() |
- self.received_headers['host'] = 'fake.com' |
- self.written = StringIO() |
- |
- def write(self, data): |
- self.written.write(data) |
- server.Request.write(self, data) |
- |
- def addCookie(self, k, v, *args,**kw): |
- server.Request.addCookie(self,k,v,*args,**kw) |
- assert not self._cookieCache.has_key(k), "Should not be setting duplicate cookies!" |
- self._cookieCache[k] = v |
- self.channel.received_cookies[k] = v |
- |
- def processingFailed(self, fail): |
- raise fail |
- |
-class FakeSite(server.Site): |
- def getResourceFor(self, req): |
- res = server.Site.getResourceFor(self,req) |
- self.caughtRes = res |
- return res |
- |
-from twisted.web import static |
- |
-class GuardTest(unittest.TestCase): |
- def testSessionInit(self): |
- sessWrapped = static.Data("you should never see this", "text/plain") |
- swChild = static.Data("NO", "text/plain") |
- sessWrapped.putChild("yyy",swChild) |
- swrap = guard.SessionWrapper(sessWrapped) |
- da = static.Data("b","text/plain") |
- da.putChild("xxx", swrap) |
- st = FakeSite(da) |
- chan = FakeHTTPChannel() |
- chan.site = st |
- |
- # first we're going to make sure that the session doesn't get set by |
- # accident when browsing without first explicitly initializing the |
- # session |
- req = FakeHTTPRequest(chan, queued=0) |
- req.requestReceived("GET", "/xxx/yyy", "1.0") |
- assert len(req._cookieCache.values()) == 0, req._cookieCache.values() |
- self.assertEquals(req.getSession(),None) |
- |
- # now we're going to make sure that the redirect and cookie are properly set |
- req = FakeHTTPRequest(chan, queued=0) |
- req.requestReceived("GET", "/xxx/"+guard.INIT_SESSION, "1.0") |
- ccv = req._cookieCache.values() |
- self.assertEquals(len(ccv),1) |
- cookie = ccv[0] |
- # redirect set? |
- self.failUnless(req.headers.has_key('location')) |
- # redirect matches cookie? |
- self.assertEquals(req.headers['location'].split('/')[-1], guard.SESSION_KEY+cookie) |
- # URL is correct? |
- self.assertEquals(req.headers['location'], |
- 'http://fake.com/xxx/'+guard.SESSION_KEY+cookie) |
- oldreq = req |
- |
- # now let's try with a request for the session-cookie URL that has a cookie set |
- url = "/"+(oldreq.headers['location'].split('http://fake.com/',1))[1] |
- req = chan.makeFakeRequest(url) |
- self.assertEquals(req.headers['location'].split('?')[0], |
- 'http://fake.com/xxx/') |
- for sz in swrap.sessions.values(): |
- sz.expire() |
- |
- |
- |
-class _TestPage(page.Page): |
- template = """ |
- <html><body> |
- |
- <div>First: <span model="title" view="Text"/></div> |
- <div>Second: <span model="title" view="Text"/></div> |
- <div>Third: <span model="title" view="Text"/></div> |
- |
- </body></html> |
- """ |
- |
- def wmfactory_title(self, request): |
- d = defer.Deferred() |
- reactor.callLater(0, d.callback, 'The Result') |
- return d |
- |
-class DeferredModelTestCase(unittest.TestCase): |
- def testDeferredModel(self): |
- # Test that multiple uses of a deferred model work correctly. |
- channel = FakeHTTPChannel() |
- channel.site = FakeSite(_TestPage()) |
- request = channel.makeFakeRequest('/') |
- |
- d = request.notifyFinish() |
- def check(_): |
- dom = microdom.parseXMLString(request.written.getvalue()) |
- spanElems = domhelpers.findNodesNamed(dom, 'span') |
- for spanElem in spanElems: |
- self.failUnlessEqual('The Result', spanElem.childNodes[0].data) |
- |
- return d.addCallback(check) |
- |
- |
-class MyMacroPage(page.Page): |
- template = """\ |
-<html macro='foo'> |
-<head fill-slot='head'> |
-<script> |
-<![CDATA[ |
- <>'"& |
-]]> |
-</script> |
-</head> |
-</html> |
-""" |
- def wvfactory_foo(self, request, node, model): |
- return widgets.ExpandMacro(model, macroFile = 'cdataxtester.html', |
- macroFileDirectory = '.', |
- macroName = 'foo' |
- ) |
- |
-class ExpandMacroTestCase(WovenTC): |
- resourceFactory = MyMacroPage |
- def setUp(self, *args, **kwargs): |
- thepage = """\ |
-<html> |
-<head slot='head' /> |
-</html> |
-""" |
- file('cdatatester.html', 'wb').write(thepage) |
- WovenTC.setUp(self, *args, **kwargs) |
- def testCDATANotQuoted(self): |
- self.failUnless(self.output.find('<>\'"&')>=0) |
- |
- |
- |