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