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

root/trunk/cherrypy/test/test_misc_tools.py

Revision 1811 (checked in by fumanchu, 10 months ago)

Fix for #745 (Make a builtin tool which logs all hooks for a given request).

  • Property svn:eol-style set to native
Line 
1 from cherrypy.test import test
2 test.prefer_parent_path()
3
4 import os
5 localDir = os.path.dirname(__file__)
6 logfile = os.path.join(localDir, "test_misc_tools.log")
7
8 import cherrypy
9 from cherrypy import tools
10
11
12 def setup_server():
13     class Root:
14         def index(self):
15             yield "Hello, world"
16         index.exposed = True
17         h = [("Content-Language", "en-GB"), ('Content-Type', 'text/plain')]
18         tools.response_headers(headers=h)(index)
19        
20         def other(self):
21             return "salut"
22         other.exposed = True
23         other._cp_config = {
24             'tools.response_headers.on': True,
25             'tools.response_headers.headers': [("Content-Language", "fr"),
26                                                ('Content-Type', 'text/plain')],
27             'tools.log_hooks.on': True,
28             }
29    
30    
31     class Accept:
32         _cp_config = {'tools.accept.on': True}
33        
34         def index(self):
35             return '<a href="feed">Atom feed</a>'
36         index.exposed = True
37        
38         # In Python 2.4+, we could use a decorator instead:
39         # @tools.accept('application/atom+xml')
40         def feed(self):
41             return """<?xml version="1.0" encoding="utf-8"?>
42 <feed xmlns="http://www.w3.org/2005/Atom">
43     <title>Unknown Blog</title>
44 </feed>"""
45         feed.exposed = True
46         feed._cp_config = {'tools.accept.media': 'application/atom+xml'}
47        
48         def select(self):
49             # We could also write this: mtype = cherrypy.lib.accept.accept(...)
50             mtype = tools.accept.callable(['text/html', 'text/plain'])
51             if mtype == 'text/html':
52                 return "<h2>Page Title</h2>"
53             else:
54                 return "PAGE TITLE"
55         select.exposed = True
56    
57     class Referer:
58         def accept(self):
59             return "Accepted!"
60         accept.exposed = True
61         reject = accept
62    
63     conf = {'/referer': {'tools.referer.on': True,
64                          'tools.referer.pattern': r'http://[^/]*example\.com',
65                          },
66             '/referer/reject': {'tools.referer.accept': False,
67                                 'tools.referer.accept_missing': True,
68                                 },
69             }
70    
71     root = Root()
72     root.referer = Referer()
73     root.accept = Accept()
74     cherrypy.tree.mount(root, config=conf)
75     cherrypy.config.update({'environment': 'test_suite',
76                             'log.error_file': logfile})
77
78
79 from cherrypy.test import helper
80
81 class ResponseHeadersTest(helper.CPWebCase):
82
83     def testResponseHeadersDecorator(self):
84         self.getPage('/')
85         self.assertHeader("Content-Language", "en-GB")
86         self.assertHeader('Content-Type', 'text/plain')
87
88     def testResponseHeaders(self):
89         self.getPage('/other')
90         self.assertHeader("Content-Language", "fr")
91         self.assertHeader('Content-Type', 'text/plain')
92
93
94 class RefererTest(helper.CPWebCase):
95    
96     def testReferer(self):
97         self.getPage('/referer/accept')
98         self.assertErrorPage(403, 'Forbidden Referer header.')
99        
100         self.getPage('/referer/accept',
101                      headers=[('Referer', 'http://www.example.com/')])
102         self.assertStatus(200)
103         self.assertBody('Accepted!')
104        
105         # Reject
106         self.getPage('/referer/reject')
107         self.assertStatus(200)
108         self.assertBody('Accepted!')
109        
110         self.getPage('/referer/reject',
111                      headers=[('Referer', 'http://www.example.com/')])
112         self.assertErrorPage(403, 'Forbidden Referer header.')
113
114
115 class AcceptTest(helper.CPWebCase):
116    
117     def test_Accept_Tool(self):
118         # Test with no header provided
119         self.getPage('/accept/feed')
120         self.assertStatus(200)
121         self.assertInBody('<title>Unknown Blog</title>')
122        
123         # Specify exact media type
124         self.getPage('/accept/feed', headers=[('Accept', 'application/atom+xml')])
125         self.assertStatus(200)
126         self.assertInBody('<title>Unknown Blog</title>')
127        
128         # Specify matching media range
129         self.getPage('/accept/feed', headers=[('Accept', 'application/*')])
130         self.assertStatus(200)
131         self.assertInBody('<title>Unknown Blog</title>')
132        
133         # Specify all media ranges
134         self.getPage('/accept/feed', headers=[('Accept', '*/*')])
135         self.assertStatus(200)
136         self.assertInBody('<title>Unknown Blog</title>')
137        
138         # Specify unacceptable media types
139         self.getPage('/accept/feed', headers=[('Accept', 'text/html')])
140         self.assertErrorPage(406,
141                              "Your client sent this Accept header: text/html. "
142                              "But this resource only emits these media types: "
143                              "application/atom+xml.")
144        
145         # Test resource where tool is 'on' but media is None (not set).
146         self.getPage('/accept/')
147         self.assertStatus(200)
148         self.assertBody('<a href="feed">Atom feed</a>')
149    
150     def test_accept_selection(self):
151         # Try both our expected media types
152         self.getPage('/accept/select', [('Accept', 'text/html')])
153         self.assertStatus(200)
154         self.assertBody('<h2>Page Title</h2>')
155         self.getPage('/accept/select', [('Accept', 'text/plain')])
156         self.assertStatus(200)
157         self.assertBody('PAGE TITLE')
158         self.getPage('/accept/select', [('Accept', 'text/plain, text/*;q=0.5')])
159         self.assertStatus(200)
160         self.assertBody('PAGE TITLE')
161        
162         # text/* and */* should prefer text/html since it comes first
163         # in our 'media' argument to tools.accept
164         self.getPage('/accept/select', [('Accept', 'text/*')])
165         self.assertStatus(200)
166         self.assertBody('<h2>Page Title</h2>')
167         self.getPage('/accept/select', [('Accept', '*/*')])
168         self.assertStatus(200)
169         self.assertBody('<h2>Page Title</h2>')
170        
171         # Try unacceptable media types
172         self.getPage('/accept/select', [('Accept', 'application/xml')])
173         self.assertErrorPage(406,
174                              "Your client sent this Accept header: application/xml. "
175                              "But this resource only emits these media types: "
176                              "text/html, text/plain.")
177
178
179
180 if __name__ == "__main__":
181     setup_server()
182     helper.testmain()
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets