3
from twisted.web2.test.test_server import BaseCase
4
from twisted.web2 import static
5
from twisted.web2 import http_headers
6
from twisted.web2 import stream
7
from twisted.web2 import iweb
9
class TestData(BaseCase):
11
self.text = "Hello, World\n"
12
self.data = static.Data(self.text, "text/plain")
14
def test_dataState(self):
16
Test the internal state of the Data object
18
self.assert_(hasattr(self.data, "created_time"))
19
self.assertEquals(self.data.data, self.text)
20
self.assertEquals(self.data.type, http_headers.MimeType("text", "plain"))
21
self.assertEquals(self.data.contentType(), http_headers.MimeType("text", "plain"))
26
Test that we can get an ETag
28
self.failUnless(self.data.etag())
31
def test_render(self):
33
Test that the result from Data.render is acceptable, including the
34
response code, the content-type header, and the actual response body
37
response = iweb.IResponse(self.data.render(None))
38
self.assertEqual(response.code, 200)
39
self.assert_(response.headers.hasHeader("content-type"))
40
self.assertEqual(response.headers.getHeader("content-type"),
41
http_headers.MimeType("text", "plain"))
42
def checkStream(data):
43
self.assertEquals(str(data), self.text)
44
return stream.readStream(iweb.IResponse(self.data.render(None)).stream,
49
class TestFileSaver(BaseCase):
51
self.tempdir = self.mktemp()
52
os.mkdir(self.tempdir)
54
self.root = static.FileSaver(self.tempdir,
55
expectedFields=['FileNameOne'],
57
self.root.addSlash = True
59
def uploadFile(self, fieldname, filename, mimetype, content, resrc=None,
60
host='foo', path='/'):
64
ctype = http_headers.MimeType('multipart', 'form-data',
65
(('boundary', '---weeboundary'),))
67
return self.getResponseFor(resrc, '/',
68
headers={'host': 'foo',
69
'content-type': ctype },
72
content="""-----weeboundary\r
73
Content-Disposition: form-data; name="%s"; filename="%s"\r
78
""" % (fieldname, filename, mimetype, content))
80
def _CbAssertInResponse(self, (code, headers, data, failed),
81
expected_response, expectedFailure=False):
83
expected_code, expected_headers, expected_data = expected_response
84
self.assertEquals(code, expected_code)
86
if expected_data is not None:
87
self.failUnlessSubstring(expected_data, data)
89
for key, value in expected_headers.iteritems():
90
self.assertEquals(headers.getHeader(key), value)
92
self.assertEquals(failed, expectedFailure)
94
def fileNameFromResponse(self, response):
95
(code, headers, data, failure) = response
96
return data[data.index('Saved file')+11:data.index('<br />')]
98
def assertInResponse(self, response, expected_response, failure=False):
100
d.addCallback(self._CbAssertInResponse, expected_response, failure)
103
def test_enforcesMaxBytes(self):
104
return self.assertInResponse(
105
self.uploadFile('FileNameOne', 'myfilename', 'text/html', 'X'*32),
106
(200, {}, 'exceeds maximum length'))
108
def test_enforcesMimeType(self):
109
return self.assertInResponse(
110
self.uploadFile('FileNameOne', 'myfilename',
111
'application/x-python', 'X'),
112
(200, {}, 'type not allowed'))
114
def test_invalidField(self):
115
return self.assertInResponse(
116
self.uploadFile('NotARealField', 'myfilename', 'text/html', 'X'),
117
(200, {}, 'not a valid field'))
119
def test_reportFileSave(self):
120
return self.assertInResponse(
121
self.uploadFile('FileNameOne', 'myfilename', 'text/plain', 'X'),
122
(200, {}, 'Saved file'))
124
def test_compareFileContents(self):
126
contents = file(fname, 'r').read()
127
self.assertEquals(contents, 'Test contents')
129
d = self.uploadFile('FileNameOne', 'myfilename', 'text/plain',
131
d.addCallback(self.fileNameFromResponse)
132
d.addCallback(gotFname)