import unittest import twill import cherrypy import WebInterfaceSites from twill import get_browser ## this makes assertRaises shorter from twill.errors import * from mechanize import BrowserStateError, LinkNotFoundError ## we do the following, for easy surfing ## e.g. use: cbx.go(your_url) ## commands api: http://twill.idyll.org/commands.html cbx = twill.commands CBXHOST="localhost" CBXPORT=8080 CBX="http://"+CBXHOST+":"+str(CBXPORT) class WebserverTests(unittest.TestCase): '''this class checks the webserver, using "twill" the tests in this class are from the browsers point of view, so not really unittests. fetch twill from: http://twill.idyll.org one way to manually run twill code is through the python interpreter commandline e.g.: import twill twill.shell.main() go http://localhost:8080 find "my very special html content" help ''' def setUp(self): '''configures the cherrypy server that it works nice with twill ''' cherrypy.config.update({ 'server.logToScreen' : False, 'autoreload.on': False, 'server.threadPool': 1, 'server.environment': 'production', }) cherrypy.root = WebInterfaceSites.WebInterfaceSites() cherrypy.server.start(initOnly=True, serverClass=None) from cherrypy._cpwsgi import wsgiApp twill.add_wsgi_intercept(CBXHOST, CBXPORT, lambda: wsgiApp) # grab the output of twill commands self.output = open("/tmp/twill.log","a") twill.set_output(self.output) def tearDown(self): '''clean up the room when leaving''' # remove intercept. twill.remove_wsgi_intercept(CBXHOST, CBXPORT) # shut down the cherrypy server. cherrypy.server.stop() self.output.close() ######################################## ######## the tests start here ########## def test_is_server_running(self): '''the server should run under given name and port''' cbx.go(CBX) # wrong port should fail self.assertRaises(BrowserStateError, cbx.go, "http://"+CBXHOST+":"+str(CBXPORT+1)) # wrong hostname too self.assertRaises(BrowserStateError, cbx.go, "http://localhorst:"+str(CBXPORT)) def test_helppages(self): '''helpsites should be availbale in different languages''' cbx.go(CBX) cbx.go("doc") cbx.find("Table of Contents") cbx.go("doc?weblang=en") cbx.find("Table of Contents") cbx.find("Getting started") self.assertRaises(TwillAssertionError, cbx.notfind, "Table of Contents") cbx.go("doc?weblang=de") cbx.find("Table of Contents") cbx.find("Wie geht es los") cbx.go("doc?weblang=si") #TODO: if weblang=si no help is displayed at all self.assertRaises(TwillAssertionError, cbx.notfind, "Table of Contents") def test_goto_status(self): cbx.go(CBX) cbx.go("status") cbx.find("Status") def test_goto_system(self): cbx.go(CBX) cbx.go("system") cbx.find("System") cbx.notfind("Sstem") self.assertRaises(TwillAssertionError, cbx.find, "Sstem") self.assertRaises(TwillAssertionError, cbx.notfind, "System") if __name__ == "__main__": unittest.main()