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

Source Code for Module cherrypy.test.test_misc_tools

  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
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() 183