Beispiel #1
0
 def request(
     self,
     method,
     path,
     query_params=None,
     body=None,
     authenticator=None,
     headers=None,
 ):
     if authenticator:
         authenticator()
     if method == transport.HttpMethod.POST:
         if path == "/login":
             token = "AdminAccessToken"
             expected_header = {"Content-Type": "application/x-www-form-urlencoded"}
             if headers != expected_header:
                 raise TypeError(f"Must send {expected_header}")
         elif path == "/login/5":
             token = "UserAccessToken"
         access_token = json.dumps(
             {"access_token": token, "token_type": "Bearer", "expires_in": 3600}
         )
         response = transport.Response(
             ok=True,
             value=bytes(access_token, encoding="utf-8"),
             response_mode=transport.ResponseMode.STRING,
         )
     elif (method == transport.HttpMethod.DELETE) and (path == "/logout"):
         response = transport.Response(
             ok=True, value=b"", response_mode=transport.ResponseMode.STRING
         )
     else:
         raise TypeError("Bad transport layer call")
     return response
    def request(
        self,
        method: transport.HttpMethod,
        path: str,
        query_params: Optional[MutableMapping[str, str]] = None,
        body: Optional[bytes] = None,
        authenticator: Optional[Callable[[], Dict[str, str]]] = None,
        headers: Optional[MutableMapping[str, str]] = None,
    ) -> transport.Response:

        url = f"{self.api_path}{path}"
        if headers is None:
            headers = {}
        if authenticator:
            headers.update(authenticator())
        logging.info("%s(%s)", method.name, url)
        try:
            resp = self.session.request(method.name,
                                        url,
                                        params=query_params,
                                        data=body,
                                        headers=headers)
        except IOError as exc:
            ret = transport.Response(False, str(exc))
        else:
            if resp.ok:
                ret = transport.Response(True, resp.text)
            else:
                ret = transport.Response(False, resp.text)

        return ret
Beispiel #3
0
 def request(
     self,
     method,
     path,
     query_params=None,
     body=None,
     authenticator=None,
     transport_options=None,
 ):
     if authenticator:
         authenticator(transport_options)
     if method == transport.HttpMethod.POST:
         if path.endswith(("login", "login/5")):
             if path.endswith("login"):
                 token = "AdminAccessToken"
                 expected_headers = {
                     "Content-Type": "application/x-www-form-urlencoded"
                 }
                 expected_headers.update(
                     transport_options.get("headers", {}))
                 if transport_options["headers"] != expected_headers:
                     raise TypeError(f"Must send {expected_headers}")
             else:
                 token = "UserAccessToken"
             access_token = json.dumps({
                 "access_token": token,
                 "token_type": "Bearer",
                 "expires_in": 3600
             })
             response = transport.Response(
                 ok=True,
                 value=bytes(access_token, encoding="utf-8"),
                 response_mode=transport.ResponseMode.STRING,
             )
         elif path.endswith("/api/token"):
             access_token = {
                 "access_token": "anOauthToken",
                 "token_type": "Bearer",
                 "expires_in": 3600,
                 "refresh_token": "anOauthRefreshToken",
             }
             response = transport.Response(
                 ok=True,
                 value=json.dumps(access_token).encode("utf8"),
                 response_mode=transport.ResponseMode.STRING,
             )
     elif method == transport.HttpMethod.DELETE and path.endswith("logout"):
         response = transport.Response(
             ok=True,
             value=b"",
             response_mode=transport.ResponseMode.STRING)
     else:
         raise TypeError("Bad transport layer call")
     return response
Beispiel #4
0
    def request(
        self,
        method: transport.HttpMethod,
        path: str,
        query_params: Optional[MutableMapping[str, str]] = None,
        body: Optional[bytes] = None,
        authenticator: transport.TAuthenticator = None,
        transport_options: Optional[transport.TransportOptions] = None,
    ) -> transport.Response:

        headers = {}
        timeout = self.settings.timeout
        if authenticator:
            headers.update(authenticator(transport_options or {}))
        if transport_options:
            if transport_options.get("headers"):
                headers.update(transport_options["headers"])
            if transport_options.get("timeout"):
                timeout = transport_options["timeout"]
        self.logger.info("%s(%s)", method.name, path)
        try:
            resp = self.session.request(
                method.name,
                path,
                auth=NullAuth(),
                params=query_params,
                data=body,
                headers=headers,
                timeout=timeout,
            )
        except IOError as exc:
            ret = transport.Response(
                False,
                bytes(str(exc), encoding="utf-8"),
                transport.ResponseMode.STRING,
            )
        else:
            ret = transport.Response(
                resp.ok,
                resp.content,
                transport.response_mode(resp.headers.get("content-type")),
            )
            encoding = cast(
                Optional[str],
                requests.utils.get_encoding_from_headers(resp.headers))
            if encoding:
                ret.encoding = encoding

        return ret
    def request(
        self,
        method: transport.HttpMethod,
        path: str,
        query_params: Optional[MutableMapping[str, str]] = None,
        body: Optional[bytes] = None,
        authenticator: Optional[Callable[[], Dict[str, str]]] = None,
        headers: Optional[MutableMapping[str, str]] = None,
        transport_options: Optional[transport.TransportSettings] = None,
    ) -> transport.Response:

        url = f"{self.api_path}{path}"
        if headers is None:
            headers = {}
        if authenticator:
            headers.update(authenticator())
        timeout = self.settings.timeout
        if transport_options:
            timeout = transport_options.timeout
        logging.info("%s(%s)", method.name, url)
        try:
            resp = self.session.request(
                method.name,
                url,
                auth=NullAuth(),
                params=query_params,
                data=body,
                headers=headers,
                timeout=timeout,
            )
        except IOError as exc:
            ret = transport.Response(
                False,
                bytes(str(exc), encoding="utf-8"),
                transport.ResponseMode.STRING,
            )
        else:
            ret = transport.Response(
                resp.ok,
                resp.content,
                transport.response_mode(resp.headers.get("content-type")),
            )
            encoding = cast(
                Optional[str],
                requests.utils.get_encoding_from_headers(resp.headers))
            if encoding:
                ret.encoding = encoding

        return ret
def test_env_variables_override_config_file_credentials(
    auth_session: auth.AuthSession,
    mocker,
    monkeypatch,
    test_env_client_id: str,
    test_env_client_secret: str,
    expected_id: str,
    expected_secret: str,
):
    monkeypatch.setenv("LOOKERSDK_CLIENT_ID", test_env_client_id)
    monkeypatch.setenv("LOOKERSDK_CLIENT_SECRET", test_env_client_secret)
    mocked_request = mocker.patch.object(MockTransport, "request")
    mocked_request.return_value = transport.Response(
        ok=True,
        value=json.dumps({
            "access_token": "AdminAccessToken",
            "token_type": "Bearer",
            "expires_in": 3600,
        }).encode("utf-8"),
        response_mode=transport.ResponseMode.STRING,
    )

    auth_session.authenticate()

    expected_body = urllib.parse.urlencode({
        "client_id": expected_id,
        "client_secret": expected_secret
    }).encode("utf-8")
    mocked_request.assert_called()
    actual_request_body = mocked_request.call_args[1]["body"]
    assert actual_request_body == expected_body
Beispiel #7
0
def test_return_raises_an_SDKError_for_bad_responses(api):
    with pytest.raises(error.SDKError) as exc:
        api._return(
            transport.Response(
                ok=False,
                value=b"some error message",
                response_mode=transport.ResponseMode.STRING,
            ),
            str,
        )
    assert "some error message" in str(exc.value)
Beispiel #8
0
    ],
)
def test_get_serialized(
    api: api_methods.APIMethods, test_body: api_methods.TBody, expected: Optional[bytes]
):
    actual = api._get_serialized(test_body)
    assert actual == expected


@pytest.mark.parametrize(
    "test_response, test_structure, expected",
    [
        (
            transport.Response(
                ok=True,
                value=bytes(range(0, 10)),
                response_mode=transport.ResponseMode.BINARY,
            ),
            Union[str, bytes],
            bytes(range(0, 10)),
        ),
        (
            transport.Response(
                ok=True,
                value=b"some response text",
                response_mode=transport.ResponseMode.STRING,
            ),
            Union[str, bytes],
            "some response text",
        ),
        (
Beispiel #9
0
            b'[{"workspace_id": "dev"}, {"workspace_id": "dev"}]',
        ),
    ],
)
def test_get_serialized(api: api_methods.APIMethods,
                        test_body: api_methods.TBody,
                        expected: Optional[bytes]):
    actual = api._get_serialized(test_body)
    assert actual == expected


@pytest.mark.parametrize(  # type: ignore
    "test_response, test_structure, expected",
    [
        (
            transport.Response(ok=True, value="some response text"),
            str,
            "some response text",
        ),
        (transport.Response(ok=True, value=""), None, None),
        (
            transport.Response(
                ok=True,
                value=(
                    json.dumps(
                        {  # type: ignore
                            "current_version": {  # type: ignore
                                "full_version": "6.18.4",
                                "status": "fully functional",
                                "swagger_url": None,
                                "version": None,