diff --git a/isic_cli/cli/user.py b/isic_cli/cli/user.py index 3a9cd23..98b013e 100644 --- a/isic_cli/cli/user.py +++ b/isic_cli/cli/user.py @@ -1,8 +1,10 @@ from __future__ import annotations import json +import sys from typing import TYPE_CHECKING +from authlib.integrations.base_client.errors import OAuthError import click if TYPE_CHECKING: @@ -22,8 +24,18 @@ def login(obj: IsicContext): if obj.user: click.echo(f'Hello {obj.user["email"]}!') else: - obj.oauth.login() - click.echo("Success!") + try: + obj.oauth.login() + except OAuthError as e: + if e.error == "invalid_grant": + click.secho( + "Logging in timed out or had an unexpected error. Please try again.", fg="red" + ) + sys.exit(1) + else: + raise + else: + click.secho("Success!", fg="green") @user.command() diff --git a/tests/test_user.py b/tests/test_user.py index bd5d84f..d8e692d 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,5 +1,7 @@ from __future__ import annotations +from authlib.integrations.base_client.errors import OAuthError +from girder_cli_oauth_client import GirderCliOAuthClient import pytest @@ -8,3 +10,15 @@ def test_user_login_logged_in(cli_run): result = cli_run(["user", "login"]) assert result.exit_code == 0 assert "Hello" in result.output + + +@pytest.mark.usefixtures("_isolated_filesystem") +def test_user_login_oauth_timeout(cli_run, mocker): + mock_login = mocker.patch.object( + GirderCliOAuthClient, "login", side_effect=OAuthError(error="invalid_grant") + ) + + result = cli_run(["user", "login"]) + assert result.exit_code == 1 + assert "Logging in timed out or had an unexpected error" in result.output + mock_login.assert_called_once()