Package cherrypy :: Package test :: Module test_misc_tools
[hide private]
[frames] | no frames]

Source Code for Module cherrypy.test.test_misc_tools

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