Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

root/branches/cherrypy-2.x/cherrypy/test/test_misc_tools.py

Revision 1523 (checked in by fumanchu, 2 years ago)

2.x backport of [1330] (new cptools.referer) and [1422] (new cptools.accept(media)). See test_misc_tools.py for usage.

  • Property svn:eol-style set to native
Line 
1 import test
2 test.prefer_parent_path()
3
4 import cherrypy
5 from cherrypy.lib import cptools
6
7
8 def setup_server():
9     class Root:
10         pass
11    
12    
13     class Accept:
14         def index(self):
15             cptools.accept()
16             return '<a href="feed">Atom feed</a>'
17         index.exposed = True
18        
19         def feed(self):
20             cptools.accept(media='application/atom+xml')
21             return """<?xml version="1.0" encoding="utf-8"?>
22 <feed xmlns="http://www.w3.org/2005/Atom">
23     <title>Unknown Blog</title>
24 </feed>"""
25         feed.exposed = True
26        
27         def select(self):
28             mtype = cptools.accept(['text/html', 'text/plain'])
29             if mtype == 'text/html':
30                 return "<h2>Page Title</h2>"
31             else:
32                 return "PAGE TITLE"
33         select.exposed = True
34    
35     class Referer:
36         def accept(self):
37             cptools.referer(pattern=r'http://[^/]*thisdomain\.com')
38             return "Accepted!"
39         accept.exposed = True
40        
41         def reject(self):
42             cptools.referer(pattern=r'http://[^/]*thisdomain\.com',
43                             accept=False, accept_missing=True)
44             return "Accepted!"
45         reject.exposed = True
46    
47     root = Root()
48     root.referer = Referer()
49     root.accept = Accept()
50     cherrypy.root = root
51     cherrypy.config.update({
52             'server.log_to_screen': False,
53             'server.environment': 'production',
54     })
55
56
57 import helper
58
59
60 class RefererTest(helper.CPWebCase):
61    
62     def testReferer(self):
63         self.getPage('/referer/accept')
64         self.assertErrorPage(403, 'Forbidden Referer header.')
65        
66         self.getPage('/referer/accept',
67                      headers=[('Referer', 'http://www.thisdomain.com/')])
68         self.assertStatus(200)
69         self.assertBody('Accepted!')
70        
71         # Reject
72         self.getPage('/referer/reject')
73         self.assertStatus(200)
74         self.assertBody('Accepted!')
75        
76         self.getPage('/referer/reject',
77                      headers=[('Referer', 'http://www.thisdomain.com/')])
78         self.assertErrorPage(403, 'Forbidden Referer header.')
79
80
81 class AcceptTest(helper.CPWebCase):
82    
83     def test_Accept_Tool(self):
84         # Test with no header provided
85         self.getPage('/accept/feed')
86         self.assertStatus(200)
87         self.assertInBody('<title>Unknown Blog</title>')
88        
89         # Specify exact media type
90         self.getPage('/accept/feed', headers=[('Accept', 'application/atom+xml')])
91         self.assertStatus(200)
92         self.assertInBody('<title>Unknown Blog</title>')
93        
94         # Specify matching media range
95         self.getPage('/accept/feed', headers=[('Accept', 'application/*')])
96         self.assertStatus(200)
97         self.assertInBody('<title>Unknown Blog</title>')
98        
99         # Specify all media ranges
100         self.getPage('/accept/feed', headers=[('Accept', '*/*')])
101         self.assertStatus(200)
102         self.assertInBody('<title>Unknown Blog</title>')
103        
104         # Specify unacceptable media types
105         self.getPage('/accept/feed', headers=[('Accept', 'text/html')])
106         self.assertErrorPage(406,
107                              "Your client sent this Accept header: text/html. "
108                              "But this resource only emits these media types: "
109                              "application/atom+xml.")
110        
111         # Test resource where tool is 'on' but media is None (not set).
112         self.getPage('/accept/')
113         self.assertStatus(200)
114         self.assertBody('<a href="feed">Atom feed</a>')
115    
116     def test_accept_selection(self):
117         # Try both our expected media types
118         self.getPage('/accept/select', [('Accept', 'text/html')])
119         self.assertStatus(200)
120         self.assertBody('<h2>Page Title</h2>')
121         self.getPage('/accept/select', [('Accept', 'text/plain')])
122         self.assertStatus(200)
123         self.assertBody('PAGE TITLE')
124         self.getPage('/accept/select', [('Accept', 'text/plain, text/*;q=0.5')])
125         self.assertStatus(200)
126         self.assertBody('PAGE TITLE')
127        
128         # text/* and */* should prefer text/html since it comes first
129         # in our 'media' argument to tools.accept
130         self.getPage('/accept/select', [('Accept', 'text/*')])
131         self.assertStatus(200)
132         self.assertBody('<h2>Page Title</h2>')
133         self.getPage('/accept/select', [('Accept', '*/*')])
134         self.assertStatus(200)
135         self.assertBody('<h2>Page Title</h2>')
136        
137         # Try unacceptable media types
138         self.getPage('/accept/select', [('Accept', 'application/xml')])
139         self.assertErrorPage(406,
140                              "Your client sent this Accept header: application/xml. "
141                              "But this resource only emits these media types: "
142                              "text/html, text/plain.")
143
144
145
146 if __name__ == "__main__":
147     setup_server()
148     helper.testmain()
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets