My favorites
|
Sign in
feedvalidator
A validator for syndicated feeds. It works with Atom, RSS feeds as well as OPML and KML formats.
Project Home
Downloads
Wiki
Issues
Source
Checkout
|
Browse
|
Changes
|
Changes to /trunk/apptestsuite/client/validator/runtests.py
r973 vs. r979
Edit
Compare:
r973
r979
r993
r1005
vs.
r973
r979
r993
r1005
Format:
Single-column
Side by side
‹r973
r979
r993›
Revision r979
Go to:
...t/validator/rawtestdata/complete
...ator/rawtestdata/complete/DELETE
...estdata/complete/DELETE/projects
...lete/DELETE/projects/apptestsite
...ETE/projects/apptestsite/app.cgi
...ects/apptestsite/app.cgi/service
...pptestsite/app.cgi/service/entry
...ite/app.cgi/service/entry/1.file
...ite/app.cgi/service/entry/2.file
...ite/app.cgi/service/entry/3.file
...pptestsite/app.cgi/service/media
...ite/app.cgi/service/media/1.file
...lidator/rawtestdata/complete/GET
...awtestdata/complete/GET/projects
...omplete/GET/projects/apptestsite
...GET/projects/apptestsite/app.cgi
...ects/apptestsite/app.cgi/service
...apptestsite/app.cgi/service.file
...pptestsite/app.cgi/service/entry
...tsite/app.cgi/service/entry.file
...ite/app.cgi/service/entry.file.2
...ite/app.cgi/service/entry.file.3
...ite/app.cgi/service/entry/1.file
...e/app.cgi/service/entry/1.file.2
...ite/app.cgi/service/entry/2.file
...e/app.cgi/service/entry/2.file.2
...e/app.cgi/service/entry/2.file.3
...ite/app.cgi/service/entry/3.file
...e/app.cgi/service/entry/3.file.2
...pptestsite/app.cgi/service/media
...tsite/app.cgi/service/media.file
...ite/app.cgi/service/media.file.2
...ite/app.cgi/service/media/1.file
...idator/rawtestdata/complete/POST
...wtestdata/complete/POST/projects
...mplete/POST/projects/apptestsite
...ects/apptestsite/app.cgi/service
...tsite/app.cgi/service/entry.file
...ite/app.cgi/service/entry.file.2
...ite/app.cgi/service/entry.file.3
...tsite/app.cgi/service/media.file
...lidator/rawtestdata/complete/PUT
...awtestdata/complete/PUT/projects
...omplete/PUT/projects/apptestsite
...PUT/projects/apptestsite/app.cgi
...ects/apptestsite/app.cgi/service
...pptestsite/app.cgi/service/entry
...ite/app.cgi/service/entry/2.file
...pptestsite/app.cgi/service/media
...ite/app.cgi/service/media/1.file
Project members,
sign in
to write a code review
/trunk/apptestsuite/client/validator/runtests.py
r973
/trunk/apptestsuite/client/validator/runtests.py
r979
1
from subprocess import Popen, PIPE
1
from subprocess import Popen, PIPE
2
import unittest
2
import unittest
3
import
appclienttest
3
from
appclienttest
import msg
4
4
5
class Test(unittest.TestCase):
5
class Test(unittest.TestCase):
6
def _parse(self, output):
7
parsed = [tuple(l.split(" ", 1)[0].split(":")) for l in output.splitlines()]
8
parsed = [(code, getattr(msg, message)) for code, message in parsed]
9
msg_count = {}
10
for code, message in parsed:
11
msg_count[code] = msg_count.get(code, 0) + 1
12
13
return (parsed, msg_count)
14
6
def testNonWellFormed(self):
15
def testNonWellFormed(self):
7
"""
16
"""
8
Non-WellFormed output should be caught
17
Non-WellFormed output should be caught
9
and a log message recording the malformed
18
and a log message recording the malformed
10
XML should be produced.
19
XML should be produced.
11
"""
20
"""
12
output = Popen(["python", "appclienttest.py", "--quiet", "--playback=./rawtestdata/invalid-service/"], stdout=PIPE).communicate()[0]
21
output = Popen(["python", "./validator/appclienttest.py", "--quiet", "--playback=./validator/rawtestdata/invalid-service/"], stdout=PIPE).communicate()[0]
13
parsed = [l.split(":") for l in output.splitlines()]
22
parsed, msg_count = self._parse(output)
14
msg_count = {}
23
self.assertTrue(("Error", msg.WELL_FORMED_XML) in parsed)
15
for code, msg in parsed:
24
self.assertEqual(1, msg_count["Begin_Test"])
16
msg_count[code] = msg_count.get(code, 0) + 1
25
self.assertEqual(0, msg_count.get("Warning", 0))
17
self.assertTrue(["Error", appclienttest.REPRESENTATION] in parsed)
26
18
self.assertTrue(["Log", "Response"] in parsed)
27
def testComplete(self):
28
"""
29
Test a complete path through the flow. The following errors
30
have been injected into a good run:
31
32
The service document does not return Etag or Last-Modified headers.
33
On Entry creation neither a Location or Content-Location: header are returned.
34
The Slug header is ignored.
35
The Entry does not contain an 'edit' link.
36
The PUT to update the entry fails with a 400.
37
The XML returned from creating a media entry is not well-formed.
38
"""
39
output = Popen(["python", "./validator/appclienttest.py", "--quiet", "--playback=./validator/rawtestdata/complete/"], stdout=PIPE).communicate()[0]
40
parsed, msg_count = self._parse(output)
41
self.assertTrue(("Warning", msg.HTTP_ETAG) in parsed)
42
self.assertTrue(("Warning", msg.HTTP_LAST_MODIFIED) in parsed)
43
self.assertTrue(("Error", msg.CREATE_RETURNS_LOCATION) in parsed)
44
self.assertTrue(("Warning", msg.CREATE_CONTENT_LOCATION) in parsed)
45
self.assertTrue(("Warning", msg.SLUG_HEADER) in parsed)
46
self.assertTrue(("Warning", msg.ENTRY_LINK_EDIT) in parsed)
47
self.assertTrue(("Error", msg.PUT_STATUS_CODE) in parsed)
48
self.assertTrue(("Error", msg.WELL_FORMED_XML) in parsed)
49
50
51
52
53
54
19
55
20
if __name__ == "__main__":
56
if __name__ == "__main__":
21
unittest.main()
57
unittest.main()
22
58
Hosted by