Exemplo n.º 1
0
    def test_get_with_failed_auth(self, mock_oauth2_session, mock_cache):
        """A new OAuth2 token is fetched on an auth error."""
        mock_session = Mock(
            spec_set=("authorized", "fetch_token", "register_compliance_hook")
        )
        mock_session.authorized = False
        err_resp = Response()
        err_resp.status_code = 400
        err_resp._content = json.dumps({"detail": "Incorrect username or password"})
        err = HTTPError(response=err_resp)
        mock_session.fetch_token.side_effect = err
        mock_oauth2_session.return_value = mock_session
        mock_cache.get.return_value = None

        session = CTMSSession("https://ctms.example.com", "id", "secret")
        with self.assertRaises(HTTPError) as context:
            session.get("/ctms", params={"primary_email": "*****@*****.**"})
        assert context.exception == err

        mock_oauth2_session.assert_called_once()
        assert mock_session.register_compliance_hook.call_count == 2
        mock_cache.get.assert_called_once_with("ctms_token")
        mock_session.fetch_token.assert_called_once_with(
            client_id="id",
            client_secret="secret",
            token_url="https://ctms.example.com/token",
        )
Exemplo n.º 2
0
    def test_get_with_existing_auth(self, mock_oauth2_session, mock_cache):
        """An existing OAuth2 token is reused without calling fetch_token."""
        mock_session = Mock(
            spec_set=("authorized", "request", "register_compliance_hook")
        )
        mock_session.authorized = True
        mock_response = Mock(spec_set=("status_code",))
        mock_response.status_code = 200
        mock_session.request.return_value = mock_response
        mock_oauth2_session.return_value = mock_session
        mock_cache.get.return_value = self.EXAMPLE_TOKEN

        session = CTMSSession("https://ctms.example.com", "id", "secret")
        resp = session.get("/ctms", params={"primary_email": "*****@*****.**"})
        assert resp == mock_response

        mock_oauth2_session.assert_called_once_with(
            client=ANY,
            token=self.EXAMPLE_TOKEN,
            auto_refresh_url="https://ctms.example.com/token",
            auto_refresh_kwargs={"client_id": "id", "client_secret": "secret"},
            token_updater=ANY,
        )
        assert mock_session.register_compliance_hook.call_count == 2
        mock_cache.get.assert_called_once_with("ctms_token")
        mock_session.request.assert_called_once_with(
            "GET",
            "https://ctms.example.com/ctms",
            params={"primary_email": "*****@*****.**"},
        )
Exemplo n.º 3
0
    def test_init_long_api_url(self):
        """CTMSSession() uses protocol and netloc of api_url."""

        session = CTMSSession(
            "https://ctms.example.com/docs?refresh=1", "client_id", "client_secret"
        )
        assert session.api_url == "https://ctms.example.com"
Exemplo n.º 4
0
    def test_get_with_re_auth(self, mock_oauth2_session, mock_cache):
        """A new OAuth2 token is fetched on an auth error."""
        mock_session = Mock(spec_set=(
            "authorized",
            "fetch_token",
            "request",
            "register_compliance_hook",
        ))
        mock_session.authorized = True
        new_token = {
            "access_token": "a.different.base64.string",
            "token_type": "bearer",
            "expires_in": 7200,
            "expires_at": 161715000.999,
        }
        mock_session.fetch_token.return_value = new_token
        mock_response_1 = Mock(spec_set=("status_code", ))
        mock_response_1.status_code = 401
        mock_response_2 = Mock(spec_set=("status_code", ))
        mock_response_2.status_code = 200
        mock_session.request.side_effect = [mock_response_1, mock_response_2]
        mock_oauth2_session.return_value = mock_session
        mock_cache.get.return_value = self.EXAMPLE_TOKEN

        session = CTMSSession("https://ctms.example.com", "id", "secret")
        resp = session.get("/ctms",
                           params={"primary_email": "*****@*****.**"})
        assert resp == mock_response_2

        mock_oauth2_session.assert_called_once()
        assert mock_session.register_compliance_hook.call_count == 2
        mock_cache.get.assert_called_once_with("ctms_token")
        mock_session.fetch_token.assert_called_once_with(
            client_id="id",
            client_secret="secret",
            token_url="https://ctms.example.com/token",
        )
        mock_cache.set.assert_called_once_with("ctms_token",
                                               new_token,
                                               timeout=6840)
        mock_session.request.assert_called_with(
            "GET",
            "https://ctms.example.com/ctms",
            params={"primary_email": "*****@*****.**"},
        )
        assert mock_session.request.call_count == 2
Exemplo n.º 5
0
    def test_get_with_new_auth(self, mock_oauth2_session, mock_cache):
        """An OAuth2 token is fetched if needed."""
        mock_session = Mock(spec_set=(
            "authorized",
            "fetch_token",
            "request",
            "register_compliance_hook",
        ))
        mock_session.authorized = False
        mock_session.fetch_token.return_value = self.EXAMPLE_TOKEN
        mock_response = Mock(spec_set=("status_code", ))
        mock_response.status_code = 200
        mock_session.request.return_value = mock_response
        mock_oauth2_session.return_value = mock_session
        mock_cache.get.return_value = None

        session = CTMSSession("https://ctms.example.com", "id", "secret")
        resp = session.get("/ctms",
                           params={"primary_email": "*****@*****.**"})
        assert resp == mock_response

        mock_oauth2_session.assert_called_once_with(
            client=ANY,
            token=None,
            auto_refresh_url="https://ctms.example.com/token",
            auto_refresh_kwargs={
                "client_id": "id",
                "client_secret": "secret"
            },
            token_updater=ANY,
        )
        assert mock_session.register_compliance_hook.call_count == 2
        mock_cache.get.assert_called_once_with("ctms_token")
        mock_session.fetch_token.assert_called_once_with(
            client_id="id",
            client_secret="secret",
            token_url="https://ctms.example.com/token",
        )
        mock_cache.set.assert_called_once_with("ctms_token",
                                               self.EXAMPLE_TOKEN,
                                               timeout=3420)
        mock_session.request.assert_called_once_with(
            "GET",
            "https://ctms.example.com/ctms",
            params={"primary_email": "*****@*****.**"},
        )
Exemplo n.º 6
0
    def test_init_bad_parameter(self):
        """CTMSSession() fails if parameters are bad."""

        params = {
            "api_url": "http://ctms.example.com",
            "client_id": "id",
            "client_secret": "secret",
        }
        CTMSSession(**params)  # Doesn't raise

        bad_param_values = {
            "api_url": ("/ctms", "ctms.example.com", "https://"),
            "client_id": ("",),
            "client_secret": ("",),
            "token_cache_key": ("",),
        }
        for key, values in bad_param_values.items():
            for value in values:
                bad_params = params.copy()
                bad_params[key] = value
                with self.assertRaises(ValueError):
                    CTMSSession(**bad_params)