Пример #1
0
    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)
Пример #2
0
    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)