import wsmeext.tg11 from wsme import WSRoot from wsmeext.tg11 import wsexpose, wsvalidate import wsmeext.tg1 from turbogears.controllers import RootController import cherrypy import unittest import simplejson from wsmeext.tests import test_soap class WSController(WSRoot): pass class Subcontroller(object): @wsexpose(int, int, int) def add(self, a, b): return a + b class Root(RootController): class UselessSubClass: # This class is here only to make sure wsmeext.tg1.scan_api # does its job properly pass ws = WSController(webpath='/ws') ws.addprotocol( 'soap', tns=test_soap.tns, typenamespace=test_soap.typenamespace, baseURL='/ws/' ) ws = wsmeext.tg11.adapt(ws) @wsexpose(int) @wsvalidate(int, int) def multiply(self, a, b): return a * b @wsexpose(int) @wsvalidate(int, int) def divide(self, a, b): if b == 0: raise cherrypy.HTTPError(400, 'Cannot divide by zero!') return a / b sub = Subcontroller() from turbogears import testutil, config, startup class TestController(unittest.TestCase): root = Root def setUp(self): "Tests the output of the index method" self.app = testutil.make_app(self.root) testutil.start_server() def tearDown(self): # implementation copied from turbogears.testutil.stop_server. # The only change is that cherrypy.root is set to None # AFTER stopTurbogears has been called so that wsmeext.tg11 # can correctly uninstall its filter. if config.get("cp_started"): cherrypy.server.stop() config.update({"cp_started": False}) if config.get("server_started"): startup.stopTurboGears() config.update({"server_started": False}) def test_restcall(self): response = self.app.post("/multiply", simplejson.dumps({'a': 5, 'b': 10}), {'Content-Type': 'application/json'} ) print response assert simplejson.loads(response.body) == 50 response = self.app.post("/sub/add", simplejson.dumps({'a': 5, 'b': 10}), {'Content-Type': 'application/json'} ) print response assert simplejson.loads(response.body) == 15 response = self.app.post("/multiply", simplejson.dumps({'a': 5, 'b': 10}), {'Content-Type': 'application/json', 'Accept': 'application/json'} ) print response assert simplejson.loads(response.body) == 50 response = self.app.post("/multiply", simplejson.dumps({'a': 5, 'b': 10}), {'Content-Type': 'application/json', 'Accept': 'text/javascript'} ) print response assert simplejson.loads(response.body) == 50 response = self.app.post("/multiply", simplejson.dumps({'a': 5, 'b': 10}), {'Content-Type': 'application/json', 'Accept': 'text/xml'} ) print response assert response.body == "50" def test_custom_clientside_error(self): response = self.app.post( "/divide", simplejson.dumps({'a': 5, 'b': 0}), {'Content-Type': 'application/json', 'Accept': 'application/json'}, expect_errors=True ) assert response.status_int == 400 assert simplejson.loads(response.body) == { "debuginfo": None, "faultcode": "Server", "faultstring": "(400, 'Cannot divide by zero!')" } response = self.app.post( "/divide", simplejson.dumps({'a': 5, 'b': 0}), {'Content-Type': 'application/json', 'Accept': 'text/xml'}, expect_errors=True ) assert response.status_int == 400 assert response.body == ("Server" "(400, 'Cannot divide by zero!')" "") def test_soap_wsdl(self): ts = test_soap.TestSOAP('test_wsdl') ts.app = self.app ts.ws_path = '/ws/' ts.run() #wsdl = self.app.get('/ws/api.wsdl').body #print wsdl #assert 'multiply' in wsdl def test_soap_call(self): ts = test_soap.TestSOAP('test_wsdl') ts.app = self.app ts.ws_path = '/ws/' print ts.ws_path assert ts.call('multiply', a=5, b=10, _rt=int) == 50 def test_scan_api_loops(self): class MyRoot(object): pass MyRoot.loop = MyRoot() root = MyRoot() api = list(wsmeext.tg1._scan_api(root)) print(api) self.assertEquals(len(api), 0) def test_scan_api_maxlen(self): class ARoot(object): pass def make_subcontrollers(n): c = type('Controller%s' % n, (object,), {}) return c c = ARoot for n in xrange(55): subc = make_subcontrollers(n) c.sub = subc() c = subc root = ARoot() self.assertRaises(ValueError, list, wsmeext.tg1._scan_api(root)) def test_templates_content_type(self): self.assertEquals( "application/json", wsmeext.tg1.AutoJSONTemplate().get_content_type('dummy') ) self.assertEquals( "text/xml", wsmeext.tg1.AutoXMLTemplate().get_content_type('dummy') )