Ticket #1762: webtest-luke-tweaked.patch
| File webtest-luke-tweaked.patch, 85.9 kB (added by kskuhlman, 4 months ago) |
|---|
-
setup.py
old new 24 24 "TurboCheetah >= 1.0", 25 25 "TurboJson >= 1.1.2", 26 26 "tgMochiKit >= 0.1alpha", 27 "WebTest", 27 28 ] 28 29 29 30 # for when we get rid of Kid & SQLObject dependency -
turbogears/identity/tests/test_identity.py
old new 55 55 56 56 @expose() 57 57 def index(self): 58 pass58 return dict() 59 59 60 60 @expose() 61 61 def identity_failed(self, **kw): … … 69 69 @expose() 70 70 @identity.require(in_group('peon')) 71 71 def in_peon_group(self): 72 assert("samIam", cherrypy.serving.request.identity.user_name) 72 73 return 'in_peon_group' 73 74 74 75 @expose() … … 136 137 return 'wrong params: %s\nexpected unicode objects' \ 137 138 ' for all strings' % cherrypy.request.params 138 139 140 @expose() 141 def is_anonymous(self): 142 assert cherrypy.serving.request.identity.user_name == None 143 assert cherrypy.serving.request.identity.anonymous 144 assert identity.current.anonymous 145 return 'is_anonymous' 139 146 140 class TestIdentity(unittest.TestCase):141 147 148 149 class TestIdentity(testutil.TGWebTest): 150 142 151 def setUp(self): 143 152 # identity requires visit and a failure_url 144 153 test_config = {'global': { … … 152 161 config.configure_loggers(test_config) 153 162 config.update(test_config['global']) 154 163 cherrypy.root = IdentityRoot() 155 startup.startTurboGears()164 testutil.TGWebTest.setUp(self) 156 165 self.init_model() 157 166 158 167 def tearDown(self): 159 startup.stopTurboGears()168 testutil.TGWebTest.tearDown(self) 160 169 config.update(self._original_config) 161 170 162 171 def init_model(self): … … 181 190 182 191 def test_user_password_parameters(self): 183 192 """Controller can receive user_name and password parameters.""" 184 testutil.create_request('/new_user_setup?user_name=test&password=pw') 185 firstline = cherrypy.response.body[0] 186 assert 'test pw' in firstline, firstline 193 response = self.app.get('/new_user_setup?user_name=test&password=pw') 194 assert 'test pw' in response 187 195 188 196 def test_user_exists(self): 189 197 u = TG_User.by_user_name('samIam') … … 205 213 config.update({'identity.soprovider.encryption_algorithm': None}) 206 214 # force new config values to load 207 215 startup.startTurboGears() 208 testutil.create_request('/')216 self.app.get('/') 209 217 hub.begin() 210 218 u = TG_User.by_user_name('samIam') 211 219 u.password = u'garçon' … … 219 227 config.update({'identity.soprovider.encryption_algorithm': 'sha1'}) 220 228 # force new config values to load 221 229 startup.startTurboGears() 222 testutil.create_request('/')230 self.app.get('/') 223 231 hub.begin() 224 232 u = TG_User.by_user_name('samIam') 225 233 u.password = 'password' … … 234 242 config.update({'identity.soprovider.encryption_algorithm': 'sha1'}) 235 243 # force new config values to load 236 244 startup.startTurboGears() 237 testutil.create_request('/')245 self.app.get('/') 238 246 hub.begin() 239 247 u = TG_User.by_user_name('samIam') 240 248 u.password = u'garçon' … … 248 256 config.update({'identity.soprovider.encryption_algorithm': 'md5'}) 249 257 # force new config values to load 250 258 startup.startTurboGears() 251 testutil.create_request('/')259 self.app.get('/') 252 260 hub.begin() 253 261 u = TG_User.by_user_name('samIam') 254 262 u.password = 'password' … … 263 271 config.update({'identity.soprovider.encryption_algorithm': 'md5'}) 264 272 # force new config values to load 265 273 startup.startTurboGears() 266 testutil.create_request('/')274 self.app.get('/') 267 275 hub.begin() 268 276 u = TG_User.by_user_name('samIam') 269 277 u.password = u'garçon' … … 280 288 config.update({'identity.soprovider.encryption_algorithm': 'md5'}) 281 289 # force new config values to load 282 290 startup.startTurboGears() 283 testutil.create_request('/')291 self.app.get('/') 284 292 hub.begin() 285 293 u = TG_User.by_user_name('samIam') 286 294 u.password = u'garçon'.encode('UTF-8') … … 295 303 config.update({'identity.soprovider.encryption_algorithm':'sha1'}) 296 304 # force new config values to load 297 305 startup.startTurboGears() 298 testutil.create_request('/')306 self.app.get('/') 299 307 hub.begin() 300 308 u = TG_User.by_user_name('samIam') 301 309 u.set_password_raw('password') … … 308 316 config.update({'identity.soprovider.encryption_algorithm':'sha1'}) 309 317 # force new config values to load 310 318 startup.startTurboGears() 311 testutil.create_request('/')319 self.app.get('/') 312 320 hub.begin() 313 321 u = TG_User.by_user_name('samIam') 314 322 u.set_password_raw(u'garçon') … … 324 332 'identity.tests.test_identity.mycustomencrypt'}) 325 333 # force new config values to load 326 334 startup.startTurboGears() 327 testutil.create_request('/')335 self.app.get('/') 328 336 hub.begin() 329 337 u = TG_User.by_user_name('samIam') 330 338 u.password = 'password' … … 335 343 336 344 def test_anonymous_browsing(self): 337 345 """Test if we can show up anonymously.""" 338 testutil.create_request('/')339 assert identity.current.anonymous346 response = self.app.get('/is_anonymous') 347 assert 'is_anonymous' in response 340 348 341 349 def test_deny_anonymous(self): 342 350 """Test that we have secured an url from anonymous users.""" 343 testutil.create_request('/logged_in_only') 344 firstline = cherrypy.response.body[0] 345 assert 'identity_failed_answer' in firstline, firstline 351 response = self.app.get('/logged_in_only') 352 assert 'identity_failed_answer' in response 346 353 347 354 def test_deny_anonymous_viewable(self): 348 355 """Test that a logged in user can see an resource blocked 349 356 from anonymous users.""" 350 testutil.create_request('/logged_in_only?'357 response = self.app.get('/logged_in_only?' 351 358 'user_name=samIam&password=secret&login=Login') 352 firstline = cherrypy.response.body[0] 353 assert 'logged_in_only' in firstline, firstline 359 assert 'logged_in_only' in response 354 360 355 361 def test_logout(self): 356 362 """Test that logout works and session is gets invalid afterwards.""" 357 testutil.create_request('/in_peon_group?'363 response = self.app.get('/in_peon_group?' 358 364 'user_name=samIam&password=secret&login=Login') 359 self.assertEquals("samIam", cherrypy.serving.request.identity.user_name) 360 session_id = re.match("Set-Cookie: (.*?); Path.*", 361 str(cherrypy.response.simple_cookie)).group(1) 362 testutil.create_request('/logout', headers={'Cookie': session_id }) 363 self.assertEquals(None, cherrypy.serving.request.identity.user_name) 364 assert cherrypy.serving.request.identity.anonymous 365 session_id = response.headers['Set-Cookie'] 366 response = self.app.get('/logout', headers={'Cookie': session_id }) 367 response = self.app.get('/is_anonymous', headers={'Cookie': session_id}) 368 assert response.body == 'is_anonymous' 365 369 366 370 def test_logout_with_set_identity(self): 367 371 """Test that logout works even when there is no visit_key … … 522 526 def setUp(self): 523 527 self._identity_on = config.get('identity.on', False) 524 528 config.update({'identity.on': False}) 525 try:526 self._provider = cherrypy.request.identityProvider527 except AttributeError:528 self._provider= None529 cherrypy.request.identityProvider = None530 529 startup.startTurboGears() 531 530 testutil.DBTest.setUp(self) 532 531 533 532 def tearDown(self): 534 533 testutil.DBTest.tearDown(self) 535 534 startup.stopTurboGears() 536 cherrypy.request.identityProvider = self._provider537 535 config.update({'identity.on': self._identity_on}) 538 536 539 537 def test_create_user(self): -
turbogears/tests/test_form_controllers.py
old new 34 34 self.name = name 35 35 self.age = age 36 36 self.date = date 37 return dict() 37 38 38 39 @expose() 39 40 @validate(form=myform) … … 43 44 self.name = name 44 45 self.age = age 45 46 self.date = date 47 return dict() 46 48 47 def test_form_translation():48 """Form input is translated into properly converted parameters"""49 root = MyRoot()50 cherrypy.root = root51 testutil.create_request("/testform?name=ed&date=11/05/2005&age=5")52 assert root.name == "ed"53 assert root.age == 554 49 55 def test_form_translation_new_style(): 56 """Form input is translated into properly converted parameters""" 57 root = MyRoot() 58 cherrypy.root = root 59 testutil.create_request("/testform_new_style?name=ed&date=11/05/2005&age=5&") 60 assert root.name == "ed" 61 assert root.age == 5 50 class TestFormControllers(testutil.TGWebTest): 62 51 63 def test_invalid_form_with_error_handling(): 64 """Invalid forms can be handled by the method""" 65 root = cherrypy.root 66 testutil.create_request("/testform?name=ed&age=edalso&date=11/05/2005") 67 assert root.has_errors 52 def test_form_translation(self): 53 """Form input is translated into properly converted parameters""" 54 root = MyRoot() 55 cherrypy.root = root 56 self.app.get("/testform?name=ed&date=11/05/2005&age=5") 57 assert root.name == "ed" 58 assert root.age == 5 68 59 69 def test_css_should_appear(): 70 """CSS should appear when asked for""" 71 testutil.create_request("/") 72 assert "calendar-system.css" in cherrypy.response.body[0] 60 def test_form_translation_new_style(self): 61 """Form input is translated into properly converted parameters""" 62 root = MyRoot() 63 cherrypy.root = root 64 self.app.get("/testform_new_style?name=ed&date=11/05/2005&age=5&") 65 assert root.name == "ed" 66 assert root.age == 5 73 67 74 def test_javascript_should_appear(): 75 """JavaScript should appear when asked for""" 76 testutil.create_request("/") 77 assert "calendar.js" in cherrypy.response.body[0] 68 def test_invalid_form_with_error_handling(self): 69 """Invalid forms can be handled by the method""" 70 root = cherrypy.root 71 self.app.get("/testform?name=ed&age=edalso&date=11/05/2005") 72 assert root.has_errors 78 73 79 def test_include_mochikit(): 80 """JSLinks (and MochiKit especially) can be included easily""" 81 testutil.create_request("/usemochi") 82 assert "MochiKit.js" in cherrypy.response.body[0] 74 def test_css_should_appear(self): 75 """CSS should appear when asked for""" 76 cherrypy.root = MyRoot() 77 response = self.app.get("/") 78 assert "calendar-system.css" in response 83 79 84 def test_suppress_mochikit(): 85 """MochiKit inclusion can be suppressed""" 86 config.update({"global": {"tg.mochikit_suppress": True}}) 87 testutil.create_request("/usemochi") 88 suppressed_body = cherrypy.response.body[0] 89 # repair the fixture 90 config.update({"global": {"tg.mochikit_suppress": False}}) 91 testutil.create_request("/usemochi") 92 included_body = cherrypy.response.body[0] 93 assert "MochiKit.js" not in suppressed_body 94 assert "MochiKit.js" in included_body 80 def test_javascript_should_appear(self): 81 """JavaScript should appear when asked for""" 82 cherrypy.root = MyRoot() 83 response = self.app.get("/") 84 assert "calendar.js" in response 95 85 96 def test_mochikit_everywhere(): 97 """MochiKit can be included everywhere by setting tg.mochikit_all""" 98 config.update({"global": {"tg.mochikit_all": True}}) 99 testutil.create_request("/") 100 config.update({"global": {"tg.mochikit_all": False}}) 101 assert "MochiKit.js" in cherrypy.response.body[0] 86 def test_include_mochikit(self): 87 """JSLinks (and MochiKit especially) can be included easily""" 88 cherrypy.root = MyRoot() 89 response = self.app.get("/usemochi") 90 assert "MochiKit.js" in response 102 91 103 def test_mochikit_nowhere(): 104 """Setting tg.mochikit_suppress will prevent including it everywhere""" 105 config.update({"global": {"tg.mochikit_all": True}}) 106 config.update({"global": {"tg.mochikit_suppress": True}}) 107 testutil.create_request("/") 108 config.update({"global": {"tg.mochikit_all": False}}) 109 config.update({"global": {"tg.mochikit_suppress": False}}) 110 assert "MochiKit.js" not in cherrypy.response.body[0] 92 def test_suppress_mochikit(self): 93 """MochiKit inclusion can be suppressed""" 94 cherrypy.root = MyRoot() 95 config.update({"global": {"tg.mochikit_suppress": True}}) 96 response = self.app.get("/usemochi") 97 suppressed_body = response.body 98 # repair the fixture 99 config.update({"global": {"tg.mochikit_suppress": False}}) 100 response = self.app.get("/usemochi") 101 included_body = response.body 102 assert "MochiKit.js" not in suppressed_body 103 assert "MochiKit.js" in included_body 111 104 112 def test_include_widgets(): 113 """Any widget can be included everywhere by setting tg.include_widgets""" 114 config.update({"global": {"tg.include_widgets": ["mochikit"]}}) 115 testutil.create_request("/") 116 config.update({"global": {"tg.include_widgets": []}}) 117 assert "MochiKit.js" in cherrypy.response.body[0] 105 def test_mochikit_everywhere(self): 106 """MochiKit can be included everywhere by setting tg.mochikit_all""" 107 cherrypy.root = MyRoot() 108 config.update({"global": {"tg.mochikit_all": True}}) 109 response = self.app.get("/") 110 config.update({"global": {"tg.mochikit_all": False}}) 111 assert "MochiKit.js" in response 118 112 113 def test_mochikit_nowhere(self): 114 """Setting tg.mochikit_suppress will prevent including it everywhere""" 115 cherrypy.root = MyRoot() 116 config.update({"global": {"tg.mochikit_all": True}}) 117 config.update({"global": {"tg.mochikit_suppress": True}}) 118 response = self.app.get("/") 119 config.update({"global": {"tg.mochikit_all": False}}) 120 config.update({"global": {"tg.mochikit_suppress": False}}) 121 assert "MochiKit.js" not in response 119 122 123 def test_include_widgets(self): 124 """Any widget can be included everywhere by setting tg.include_widgets""" 125 cherrypy.root = MyRoot() 126 config.update({"global": {"tg.include_widgets": ["mochikit"]}}) 127 response = self.app.get("/") 128 config.update({"global": {"tg.include_widgets": []}}) 129 assert "MochiKit.js" in response 130 131 120 132 class State(object): 121 133 counter = 0 122 134 -
turbogears/tests/test_errorhandling.py
old new 208 208 return dict(title="Nested") 209 209 210 210 211 class TestErrorHandler( unittest.TestCase):211 class TestErrorHandler(testutil.TGWebTest): 212 212 213 213 def setUp(self): 214 testutil.TGWebTest.setUp(self) 214 215 cherrypy.root = MyRoot() 215 216 cherrypy.root.nestedcontroller = NestedController() 216 217 217 218 def test_defaultErrorHandler(self): 218 219 """Default error handler.""" 219 testutil.create_request("/defaulterror?bar=abc")220 self.failUnless("Default error handler" in cherrypy.response.body[0])221 testutil.create_request("/defaulterror?bar=true")222 self.failUnless("Default error provider" in cherrypy.response.body[0])220 response = self.app.get("/defaulterror?bar=abc") 221 self.failUnless("Default error handler" in response) 222 response = self.app.get("/defaulterror?bar=true") 223 self.failUnless("Default error provider" in response) 223 224 224 225 def test_specialisedErrorHandler(self): 225 226 """Error handler specialisation.""" 226 testutil.create_request("/specialisederror?bar=abc&baz=a@b.com")227 self.failUnless("Default error handler" in cherrypy.response.body[0])228 testutil.create_request("/specialisederror?baz=abc&bar=1")227 response = self.app.get("/specialisederror?bar=abc&baz=a@b.com") 228 self.failUnless("Default error handler" in response) 229 response = self.app.get("/specialisederror?baz=abc&bar=1") 229 230 self.failUnless("Specialised error handler" in 230 cherrypy.response.body[0])231 testutil.create_request("/specialisederror?bar=1&baz=a@b.com")231 response) 232 response = self.app.get("/specialisederror?bar=1&baz=a@b.com") 232 233 self.failUnless("Specialised error provider" in 233 cherrypy.response.body[0])234 response) 234 235 235 236 def test_exceptionErrorHandler(self): 236 237 """Error handler for exceptions.""" 237 testutil.create_request("/exceptionerror")238 self.failUnless("Default error handler" in cherrypy.response.body[0])238 response = self.app.get("/exceptionerror") 239 self.failUnless("Default error handler" in response) 239 240 240 241 def test_recursiveErrorHandler(self): 241 242 """Recursive error handler.""" 242 testutil.create_request("/recursiveerror?bar=abc")243 self.failUnless("Recursive error handler" in cherrypy.response.body[0])244 testutil.create_request("/recursiveerror?bar=1")243 response = self.app.get("/recursiveerror?bar=abc") 244 self.failUnless("Recursive error handler" in response) 245 response = self.app.get("/recursiveerror?bar=1") 245 246 self.failUnless("Recursive error provider" in 246 cherrypy.response.body[0])247 response) 247 248 248 249 def test_implicitErrorHandler(self): 249 250 """Implicit error handling.""" 250 testutil.create_request("/impliciterror?bar=abc")251 response = self.app.get("/impliciterror?bar=abc") 251 252 self.failUnless("Implicit error handler" in 252 cherrypy.response.body[0])253 testutil.create_request("/impliciterror?bar=1")253 response) 254 response = self.app.get("/impliciterror?bar=1") 254 255 self.failUnless("Implicit error provider" in 255 cherrypy.response.body[0])256 response) 256 257 257 258 def test_normalMethodErrorHandler(self): 258 259 """Normal method as an error handler.""" 259 testutil.create_request("/normalmethodcaller?bar=abc")260 self.failUnless("Normal method" in cherrypy.response.body[0])261 testutil.create_request("/normalmethodcaller?bar=true")262 self.failUnless("Normal method caller" in cherrypy.response.body[0])260 response = self.app.get("/normalmethodcaller?bar=abc") 261 self.failUnless("Normal method" in response) 262 response = self.app.get("/normalmethodcaller?bar=true") 263 self.failUnless("Normal method caller" in response) 263 264 264 265 def test_infiniteRecursionPrevention(self): 265 266 """Infinite recursion prevention.""" 266 testutil.create_request("/infiniteloop")267 self.failUnless("Exception 2" in cherrypy.response.body[0])267 response = self.app.get("/infiniteloop") 268 self.failUnless("Exception 2" in response) 268 269 269 270 def test_positionalArgs(self): 270 271 """Positional argument validation.""" 271 testutil.create_request("/positionalargs/first/23/third?bar=abc")272 self.failUnless("Default error handler" in cherrypy.response.body[0])273 testutil.create_request("/positionalargs/first/abc/third?bar=false")274 self.failUnless("Default error handler" in cherrypy.response.body[0])275 testutil.create_request("/positionalargs/first/abc/third?bar=abc")276 self.failUnless("Default error handler" in cherrypy.response.body[0])277 testutil.create_request("/positionalargs/first/23/third?bar=true")278 self.failUnless("Positional arguments" in cherrypy.response.body[0])272 response = self.app.get("/positionalargs/first/23/third?bar=abc") 273 self.failUnless("Default error handler" in response) 274 response = self.app.get("/positionalargs/first/abc/third?bar=false") 275 self.failUnless("Default error handler" in response) 276 response = self.app.get("/positionalargs/first/abc/third?bar=abc") 277 self.failUnless("Default error handler" in response) 278 response = self.app.get("/positionalargs/first/23/third?bar=true") 279 self.failUnless("Positional arguments" in response) 279 280 self.failUnless(cherrypy.root.first == "first") 280 281 self.failUnless(cherrypy.root.second == 23) 281 282 self.failUnless(cherrypy.root.third == "third") 282 283 283 284 def test_missingArgs(self): 284 285 """Arguments required in validation missing.""" 285 testutil.create_request("/missingargs")286 self.failUnless("Default error handler" in cherrypy.response.body[0])287 testutil.create_request("/missingargs?bar=12")288 self.failUnless("Missing args provider" in cherrypy.response.body[0])286 response = self.app.get("/missingargs") 287 self.failUnless("Default error handler" in response) 288 response = self.app.get("/missingargs?bar=12") 289 self.failUnless("Missing args provider" in response) 289 290 290 291 def test_nohandler(self): 291 292 """No error hanlder declared.""" 292 testutil.create_request("/nohandler")293 self.failUnless("Exception raised" in cherrypy.response.body[0])293 response = self.app.get("/nohandler") 294 self.failUnless("Exception raised" in response) 294 295 295 296 def test_bindArgs(self): 296 297 """Arguments can be bond to an error handler.""" 297 testutil.create_request("/bindargs")298 self.failUnless("123" in cherrypy.response.body[0])298 response = self.app.get("/bindargs") 299 self.failUnless("123" in response) 299 300 300 301 def test_notExposed(self): 301 302 """Validation error handling is decoupled from expose.""" 302 testutil.create_request("/notexposedcaller?foo=a&bar=rab&baz=c")303 self.failUnless("Not exposed error" in cherrypy.response.body[0])304 self.failUnless("rab" in cherrypy.response.body[0])303 response = self.app.get("/notexposedcaller?foo=a&bar=rab&baz=c") 304 self.failUnless("Not exposed error" in response) 305 self.failUnless("rab" in response) 305 306 306 307 def test_continuations(self): 307 308 """Continuations via error handling mechanism.""" 308 testutil.create_request("/continuationcaller?bar=a")309 self.failUnless("Continuation caller" in cherrypy.response.body[0])309 response = self.app.get("/continuationcaller?bar=a") 310 self.failUnless("Continuation caller" in response) 310 311 self.failUnless(cherrypy.root.continuation == True) 311 312 312 313 def test_nested(self): 313 314 """Potentially ambiguous cases.""" 314 testutil.create_request("/nest?bar=a")315 self.failUnless("Default error handler" in cherrypy.response.body[0])316 testutil.create_request("/nestedcontroller/nest?bar=a")317 self.failUnless("Nested" in cherrypy.response.body[0])315 response = self.app.get("/nest?bar=a") 316 self.failUnless("Default error handler" in response) 317 response = self.app.get("/nestedcontroller/nest?bar=a") 318 self.failUnless("Nested" in response) 318 319 319 320 def test_failsafe(self): 320 321 """Failsafe values for erroneous input.""" 321 testutil.create_request("/failsafenone?bar=a&baz=b")322 self.failUnless('"bar": "a"' in cherrypy.response.body[0])323 self.failUnless('"baz": "b"' in cherrypy.response.body[0])324 testutil.create_request("/failsafevaluesdict?bar=a&baz=b")325 self.failUnless('"bar": 1' in cherrypy.response.body[0])326 self.failUnless('"baz": 2' in cherrypy.response.body[0])327 testutil.create_request("/failsafevaluesatom?bar=a&baz=b")328 self.failUnless('"bar": 13' in cherrypy.response.body[0])329 self.failUnless('"baz": 13' in cherrypy.response.body[0])330 testutil.create_request("/failsafemaperrors?bar=a&baz=b")322 response = self.app.get("/failsafenone?bar=a&baz=b") 323 self.failUnless('"bar": "a"' in response) 324 self.failUnless('"baz": "b"' in response) 325 response = self.app.get("/failsafevaluesdict?bar=a&baz=b") 326 self.failUnless('"bar": 1' in response) 327 self.failUnless('"baz": 2' in response) 328 response = self.app.get("/failsafevaluesatom?bar=a&baz=b") 329 self.failUnless('"bar": 13' in response) 330 self.failUnless('"baz": 13' in response) 331 response = self.app.get("/failsafemaperrors?bar=a&baz=b") 331 332 self.failUnless('"bar": "Please enter an integer value"' in 332 cherrypy.response.body[0])333 response) 333 334 self.failUnless('"baz": "Please enter an integer value"' in 334 cherrypy.response.body[0])335 testutil.create_request("/failsafeformencode?bar=a&baz=b")336 self.failUnless('"bar": 1' in cherrypy.response.body[0])337 self.failUnless('"baz": 2' in cherrypy.response.body[0])338 testutil.create_request("/failsafedefaults?bar=a&baz=b")339 self.failUnless('"bar": 1' in cherrypy.response.body[0])340 self.failUnless('"baz": 2' in cherrypy.response.body[0])335 response) 336 response = self.app.get("/failsafeformencode?bar=a&baz=b") 337 self.failUnless('"bar": 1' in response) 338 self.failUnless('"baz": 2' in response) 339 response = self.app.get("/failsafedefaults?bar=a&baz=b") 340 self.failUnless('"bar": 1' in response,response) 341 self.failUnless('"baz": 2' in response) -
turbogears/tests/test_sqlalchemy.py
old new 9 9 from turbogears.database import metadata, session, mapper, \ 10 10 bind_metadata, get_metadata 11 11 from turbogears.controllers import RootController 12 from turbogears.testutil import create_request, sqlalchemy_cleanup, \12 from turbogears.testutil import sqlalchemy_cleanup, TGWebTest, \ 13 13 capture_log, print_log 14 14 15 15 … … 162 162 return "No exceptions occurred" 163 163 164 164 165 def test_implicit_trans_no_error(): 166 """If a controller runs sucessfully, the transaction is commited.""" 167 capture_log("turbogears.database") 168 cherrypy.root = MyRoot() 169 create_request("/no_error?name=A.%20Dent") 170 output = cherrypy.response.body[0] 171 print output 172 print_log() 173 q = session.query(Person) 174 arthur = q.filter_by(name="A. Dent").first() 175 assert 'someconfirmhandler' in output, \ 176 'The no error should have redirected to someconfirmhandler' 177 assert arthur is not None, 'Person arthur should have been saved!' 178 assert arthur.name == "A. Dent", 'Person arthur should be named "A. Dent"' 165 class TestSQLAlchemy(TGWebTest): 179 166 180 def test_raise_sa_exception(): 181 """If a controller causes an SA exception, it is raised properly.""" 182 capture_log("turbogears.database") 183 cherrypy.root = MyRoot() 184 create_request("/create_person?id=20") 185 output = cherrypy.response.body[0] 186 print_log() 187 print output 188 assert 'No exceptions occurred' in output 189 assert cherrypy.response.status.startswith("200") 190 create_request("/create_person?id=20") 191 output = cherrypy.response.body[0] 192 assert cherrypy.response.status.startswith("500") 193 print output 194 assert 'KARL25' not in output, \ 195 'Exception should NOT have been handled by our handler' 196 assert 'DBAPIError' in output, \ 197 'The page should have displayed an SQLAlchemy exception' 167 def test_implicit_trans_no_error(self): 168 """If a controller runs sucessfully, the transaction is commited.""" 169 #capture_log("turbogears.database") 170 cherrypy.root = MyRoot() 171 response = self.app.get("/no_error?name=A.%20Dent") 172 output = response.body 173 #print output 174 #print_log() 175 q = session.query(Person) 176 arthur = q.filter_by(name="A. Dent").first() 177 assert 'someconfirmhandler' in output, \ 178 'The no error should have redirected to someconfirmhandler' 179 assert arthur is not None, 'Person arthur should have been saved!' 180 assert arthur.name == "A. Dent", 'Person arthur should be named "A. Dent"' 198 181 199 def test_user_exception(): 200 """If a controller raises an exception, transactions are rolled back.""" 201 capture_log("turbogears.database") 202 cherrypy.root = MyRoot() 203 create_request("/create_person?id=19&docom=0&doerr=1&name=Martin%20GAL") 204 output = cherrypy.response.body[0] 205 print_log() 206 print output 207 assert 'KARL25' in output, \ 208 'The exception handler should have answered us' 209 p = session.query(Person).get(19) 210 assert p is None, \ 211 'This Person should have been rolled back: %s' % p 182 def test_raise_sa_exception(self): 183 """If a controller causes an SA exception, it is raised properly.""" 184 #capture_log("turbogears.database") 185 cherrypy.root = MyRoot() 186 response = self.app.get("/create_person?id=20", status=200) 187 output = response.body 188 #print_log() 189 print output 190 assert 'No exceptions occurred' in output 191 response = self.app.get("/create_person?id=20", status=500) 192 output = response.body 193 print output 194 assert 'KARL25' not in output, \ 195 'Exception should NOT have been handled by our handler' 196 assert 'DBAPIError' in output, \ 197 'The page should have displayed an SQLAlchemy exception' 212 198 213 def test_user_redirect(): 214 """If a controller redirects, transactions are committed.""" 215 cherrypy.root = MyRoot() 216 create_request("/create_person?id=22&doerr=2") 217 assert session.query(Person).get(22) is not None, \ 218 'The controller only redirected, the Person should have been saved' 199 def test_user_exception(self): 200 """If a controller raises an exception, transactions are rolled back.""" 201 #capture_log("turbogears.database") 202 cherrypy.root = MyRoot() 203 response = self.app.get("/create_person?id=19&docom=0&doerr=1&name=Martin%20GAL") 204 output = response.body 205 #print_log() 206 print output 207 assert 'KARL25' in output, \ 208 'The exception handler should have answered us' 209 p = session.query(Person).get(19) 210 assert p is None, \ 211 'This Person should have been rolled back: %s' % p 219 212 220 def test_cntrl_commit(): 221 """It's safe to commit a transaction in the controller.""" 222 cherrypy.root = MyRoot() 223 create_request("/create_person?id=23&docom=1") 224 assert 'InvalidRequestError' not in cherrypy.response.body[0] 225 assert session.query(Person).get(23) is not None, \ 226 'The Person 23 should have been saved during commit inside controller' 213 def test_user_redirect(self): 214 """If a controller redirects, transactions are committed.""" 215 cherrypy.root = MyRoot() 216 self.app.get("/create_person?id=22&doerr=2") 217 assert session.query(Person).get(22) is not None, \ 218 'The controller only redirected, the Person should have been saved' 227 219 228 def test_cntrl_commit2(): 229 """A commit inside the controller is not rolled back by the exception.""" 230 cherrypy.root = MyRoot() 231 create_request("/create_person?id=24&docom=1&doerr=1") 232 assert 'InvalidRequestError' not in cherrypy.response.body[0] 233 assert session.query(Person).get(24) is not None, \ 234 'The Person 24 should have been saved during commit' \ 235 ' inside controller and not rolled back' 220 def test_cntrl_commit(self): 221 """It's safe to commit a transaction in the controller.""" 222 cherrypy.root = MyRoot() 223 response = self.app.get("/create_person?id=23&docom=1") 224 assert 'InvalidRequestError' not in response 225 assert session.query(Person).get(23) is not None, \ 226 'The Person 23 should have been saved during commit inside controller' 236 227 237 def test_cntrl_flush(): 238 """It's safe to flush in the controller.""" 239 cherrypy.root = MyRoot() 240 create_request("/create_person?id=25&doflush=1") 241 print cherrypy.response.body[0] 242 assert 'No exceptions occurred' in cherrypy.response.body[0] 243 create_request("/create_person?id=25&doflush=0") 244 assert cherrypy.response.status.startswith("500") 245 assert 'IntegrityError' in cherrypy.response.body[0] 246 create_request("/create_person?id=25&doflush=1") 247 assert cherrypy.response.status.startswith("200") 248 assert 'IntegrityError' in cherrypy.response.body[0] 249 create_request("/create_person?id=25&doflush=2") 250 assert cherrypy.response.status.startswith("200") 251 assert 'No exceptions occurred' in cherrypy.response.body[0] 228 def test_cntrl_commit2(self): 229 """A commit inside the controller is not rolled back by the exception.""" 230 cherrypy.root = MyRoot() 231 response = self.app.get("/create_person?id=24&docom=1&doerr=1") 232 assert 'InvalidRequestError' not in response 233 assert session.query(Person).get(24) is not None, \ 234 'The Person 24 should have been saved during commit' \ 235 ' inside controller and not rolled back' 252 236 237 def test_cntrl_flush(self): 238 """It's safe to flush in the controller.""" 239 cherrypy.root = MyRoot() 240 response = self.app.get("/create_person?id=25&doflush=1") 241 assert 'No exceptions occurred' in response 242 response = self.app.get("/create_person?id=25&doflush=0", status=500) 243 assert 'IntegrityError' in response 244 response = self.app.get("/create_person?id=25&doflush=1") 245 assert 'IntegrityError' in response 246 response = self.app.get("/create_person?id=25&doflush=2") 247 assert 'No exceptions occurred' in response 253 248 249 254 250 # Exception handling with rollback 255 251 256 252 class RbRoot(RootController): … … 292 288 session.rollback() 293 289 raise Exception('test') 294 290 291 class TestExceptionRollback(TGWebTest): 295 292 296 def test_exc_rollback():297 """An exception within a controller method causes a rollback.293 def test_exc_rollback(self): 294 """An exception within a controller method causes a rollback. 298 295 299 Try to create a user that should rollback because of an exception300 so user 25 should not exist, but user 26 should be present since it301 is created by the exception handler.296 Try to create a user that should rollback because of an exception 297 so user 25 should not exist, but user 26 should be present since it 298 is created by the exception handler. 302 299 303 """ 304 cherrypy.root = RbRoot() 305 create_request('/doerr?id=26') 306 output = cherrypy.response.body[0] 307 print output 308 assert 'KARL27' in output, 'Exception handler should have answered' 309 assert session.query(User).get(26) is None 310 assert session.query(User).get(27) is not None 300 """ 301 cherrypy.root = RbRoot() 302 response = self.app.get('/doerr?id=26') 303 assert 'KARL27' in response, 'Exception handler should have answered' 304 assert session.query(User).get(26) is None 305 assert session.query(User).get(27) is not None 311 306 312 def test_exc_rollback2():313 """An exception within a controller method causes a rollback.307 def test_exc_rollback2(self): 308 """An exception within a controller method causes a rollback. 314 309 315 Try to create a user that should rollback because of an exception316 so user XX should not exist.310 Try to create a user that should rollback because of an exception 311 so user XX should not exist. 317 312 318 """ 319 cherrypy.root = RbRoot() 320 create_request('/doerr?id=XX') 321 output = cherrypy.response.body[0] 322 assert 'KARL27' in output, 'Exception handler should have answered' 323 assert session.query(User).get('XX') is None 313 """ 314 cherrypy.root = RbRoot() 315 response = self.app.get('/doerr?id=XX') 316 assert 'KARL27' in response, 'Exception handler should have answered' 317 assert session.query(User).get('XX') is None 324 318 325 def test_exc_done_rollback(): 326 """No problems with error handler if controller manually rollbacks.""" 327 cherrypy.root = RbRoot() 328 create_request('/doerr?id=28&dorb=1') 329 output = cherrypy.response.body[0] 330 assert 'KARL27' in output, 'Exception handler should have answered' 331 assert session.query(User).get(28) is None 332 assert session.query(User).get(29) is not None 319 def test_exc_done_rollback(self): 320 """No problems with error handler if controller manually rollbacks.""" 321 cherrypy.root = RbRoot() 322 response = self.app.get('/doerr?id=28&dorb=1') 323 assert 'KARL27' in response, 'Exception handler should have answered' 324 assert session.query(User).get(28) is None 325 assert session.query(User).get(29) is not None 333 326 334 327 335 328 # Session freshness tests … … 352 345 assert session.query(Test).get(1).val == 'b' 353 346 return dict() 354 347 348 class TestSessionFreshness(TGWebTest): 355 349 356 def test_session_freshness():357 """Check for session freshness.350 def test_session_freshness(self): 351 """Check for session freshness. 358 352 359 Changes made to the data in thread B should be reflected in thread A.353 Changes made to the data in thread B should be reflected in thread A. 360 354 361 """362 test_table.insert().execute(dict(id=1, val='a'))363 cherrypy.root = FreshRoot()364 create_request("/test1")365 assert cherrypy.response.status.startswith("200")366 assert 'AssertionError' not in cherrypy.response.body[0]367 # Call test2 in a different thread368 class ThreadB(threading.Thread):369 def run(self):370 create_request("/test2")371 assert cherrypy.response.status.startswith("200")372 assert 'AssertionError' not in cherrypy.response.body[0]373 thrdb = ThreadB()374 thrdb.start()375 thrdb.join()376 create_request("/test3")377 assert cherrypy.response.status.startswith("200")378 assert 'AssertionError' not in cherrypy.response.body[0]355 """ 356 test_table.insert().execute(dict(id=1, val='a')) 357 cherrypy.root = FreshRoot() 358 response = self.app.get("/test1") 359 assert 'AssertionError' not in response 360 # Call test2 in a different thread 361 class ThreadB(threading.Thread): 362 def __init__(self, app): 363 threading.Thread.__init__(self) 364 self.app = app 365 def run(self): 366 response = self.app.get("/test2") 367 assert 'AssertionError' not in response 368 thrdb = ThreadB(app=self.app) 369 thrdb.start() 370 thrdb.join() 371 response = self.app.get("/test3") 372 assert 'AssertionError' not in response -
turbogears/tests/test_expose.py
old new 1 1 import cherrypy 2 2 import simplejson 3 3 4 from turbogears import controllers, expose 5 from turbogears.testutil import create_request 4 from turbogears import controllers, expose, testutil 6 5 7 6 8 7 class ExposeRoot(controllers.RootController): … … 19 18 return dict(title="Foobar", mybool=False, someval="foo") 20 19 21 20 22 def test_gettinghtml(): 23 cherrypy.root = ExposeRoot() 24 create_request("/with_json") 25 body = cherrypy.response.body[0] 26 assert "Paging all foo" in body 21 class TestExposeRoot(testutil.TGWebTest): 27 22 28 def test_gettingjson(): 29 cherrypy.root = ExposeRoot() 30 create_request("/with_json?tg_format=json") 31 body = cherrypy.response.body[0] 32 assert '"title": "Foobar"' in body 23 def test_gettinghtml(self): 24 cherrypy.root = ExposeRoot() 25 response = self.app.get("/with_json") 26 assert "Paging all foo" in response 33 27 34 def test_gettingjsonviaaccept(): 35 cherrypy.root = ExposeRoot() 36 create_request("/with_json_via_accept", 37 headers=dict(Accept="text/javascript")) 38 body = cherrypy.response.body[0] 39 assert '"title": "Foobar"' in body 28 def test_gettingjson(self): 29 cherrypy.root = ExposeRoot() 30 response = self.app.get("/with_json?tg_format=json") 31 assert '"title": "Foobar"' in response 40 32 41 def test_getting_json_with_accept_but_using_tg_format():42 cherrypy.root = ExposeRoot()43 create_request("/with_json_via_accept?tg_format=json")44 body = cherrypy.response.body[0]45 assert '"title": "Foobar"' in body33 def test_gettingjsonviaaccept(self): 34