def invokeLinotp(self, linotpController, linotpAction, expectedValue=None, valueErrorMessage=None, passResponse=False, headers=None, **params): # Append dictionaries and convert all unicode names or values # to predefined encoded string (in praxis utf-8). def encodeDict(encoding, *anotherDict): retDict = {} for temp in anotherDict: if not temp is None: for key in temp.keys(): value = temp[key] if isinstance(key, unicode): key = key.encode(encoding) if isinstance(value, unicode): value = value.encode(encoding) elif not isinstance(value, basestring): value = str(value) retDict[key] = value return retDict; # By default we perform only get requests postMethod = False if 'method' in params: # Allow only get and post methods! self.assertTrue(params['method'].lower() in ['get', 'post'], "Invalid or unsupported Web method: " + params['method']) postMethod = params['method'] == 'post' # Process params and headers... # We do not allow transport of Unicode strings. If Unicode string # is provided, we convert the unicode value to utf-8 string! req_params = encodeDict('utf-8', self.GlobalParams.get(), params) req_headers = encodeDict('utf-8', self.Headers.get(), headers) # Perform the web-request... if postMethod: rsp = self.app.post( url(controller=linotpController, action=linotpAction), params=req_params, headers=req_headers) else: rsp = self.app.get( url(controller=linotpController, action=linotpAction), params=req_params, headers=req_headers) # The web-request must not fail! self.assertEqual(rsp.status_int, 200, rsp.status) # The result is always json! res = JsonUtils.getBody(rsp) # rsp.json_body # result Status must be always True! self.assertTrue(JsonUtils.getJson(res, ['result', 'status']) == True, ("Failed LinOTP %s.%s invocation (result: %s)" % (linotpController, linotpAction, str(rsp)))) value = JsonUtils.getJson(res, ['result', 'value']) if value is None: self.fail( ("The LinOTP %s.%s invocation returned no value (result: %s)" % (linotpController, linotpAction, str(rsp)))) elif not expectedValue is None: # If an explicit value is expected, then we compare the value if not JsonUtils.checkJsonValues(value, expectedValue, params): # Ups, the invocation failed! if valueErrorMessage is None or len(valueErrorMessage) == 0: valueErrorMessage = ('Unexpected LinOTP %s.%s invocation' ' value: %s (expected was: %s)' % (linotpController, linotpAction, str(value), str(expectedValue))) self.fail(valueErrorMessage) else: if passResponse is None or \ isinstance(passResponse, bool): if passResponse: return res else: # If no value is expected and the full response is not needed, # then return only the value! return value else: # return both value and passResponse lookup value.. return (value, JsonUtils.getJson(res, passResponse)) if passResponse is None or \ isinstance(passResponse, bool): if passResponse: # return full response return res else: pass # return nothing else: # value is Ok, then return only the passResponse lookup value... return JsonUtils.getJson(res, passResponse)
def invokeLinotp(self, linotpController, linotpAction, expectedValue=None, valueErrorMessage=None, passResponse=False, headers=None, **params): # Append dictionaries and convert all unicode names or values # to predefined encoded string (in praxis utf-8). def encodeDict(encoding, *anotherDict): retDict = {} for temp in anotherDict: if not temp is None: for key in temp.keys(): value = temp[key] if isinstance(key, unicode): key = key.encode(encoding) if isinstance(value, unicode): value = value.encode(encoding) elif not isinstance(value, basestring): value = str(value) retDict[key] = value return retDict # By default we perform only get requests postMethod = False if 'method' in params: # Allow only get and post methods! self.assertTrue( params['method'].lower() in ['get', 'post'], "Invalid or unsupported Web method: " + params['method']) postMethod = params['method'] == 'post' # Process params and headers... # We do not allow transport of Unicode strings. If Unicode string # is provided, we convert the unicode value to utf-8 string! req_params = encodeDict('utf-8', self.GlobalParams.get(), params) req_headers = encodeDict('utf-8', self.Headers.get(), headers) # Perform the web-request... if postMethod: rsp = self.app.post(url(controller=linotpController, action=linotpAction), params=req_params, headers=req_headers) else: rsp = self.app.get(url(controller=linotpController, action=linotpAction), params=req_params, headers=req_headers) # The web-request must not fail! self.assertEqual(rsp.status_int, 200, rsp.status) # The result is always json! res = JsonUtils.getBody(rsp) # rsp.json_body # result Status must be always True! self.assertTrue( JsonUtils.getJson(res, ['result', 'status']) is True, ("Failed LinOTP %s.%s invocation (result: %s)" % (linotpController, linotpAction, str(rsp)))) value = JsonUtils.getJson(res, ['result', 'value']) if value is None: self.fail( ("The LinOTP %s.%s invocation returned no value (result: %s)" % (linotpController, linotpAction, str(rsp)))) elif not expectedValue is None: # If an explicit value is expected, then we compare the value if not JsonUtils.checkJsonValues(value, expectedValue, params): # Ups, the invocation failed! if valueErrorMessage is None or len(valueErrorMessage) == 0: valueErrorMessage = ('Unexpected LinOTP %s.%s invocation' ' value: %s (expected was: %s)' % (linotpController, linotpAction, str(value), str(expectedValue))) self.fail(valueErrorMessage) else: if passResponse is None or \ isinstance(passResponse, bool): if passResponse: return res else: # If no value is expected and the full response is not needed, # then return only the value! return value else: # return both value and passResponse lookup value.. return (value, JsonUtils.getJson(res, passResponse)) if passResponse is None or \ isinstance(passResponse, bool): if passResponse: # return full response return res else: pass # return nothing else: # value is Ok, then return only the passResponse lookup value... return JsonUtils.getJson(res, passResponse)