Skip to content

Commit

Permalink
test(admin): pre_login_user success and failure
Browse files Browse the repository at this point in the history
  • Loading branch information
thekaveman committed Feb 14, 2024
1 parent 84956df commit eeffe2e
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 3 deletions.
10 changes: 7 additions & 3 deletions benefits/core/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
logger = logging.getLogger(__name__)


GOOGLE_USER_INFO_URL = "https://www.googleapis.com/oauth2/v3/userinfo"


for model in [
models.EligibilityType,
models.EligibilityVerifier,
Expand All @@ -32,13 +35,14 @@ def pre_login_user(user, request):
}

# Request Google user info to get name and email
url = "https://www.googleapis.com/oauth2/v3/userinfo"
response = requests.get(url, headers=headers, timeout=settings.REQUESTS_TIMEOUT)
response = requests.get(GOOGLE_USER_INFO_URL, headers=headers, timeout=settings.REQUESTS_TIMEOUT)
user_data = response.json()
logger.debug(f"Updating admin user data from Google for user with email: {user_data['email']}")
logger.debug(f"Updating user data from Google for user with email: {user_data['email']}")

user.first_name = user_data["given_name"]
user.last_name = user_data["family_name"]
user.username = user_data["email"]
user.email = user_data["email"]
user.save()
else:
logger.warning("google_sso_access_token not found in session.")
52 changes: 52 additions & 0 deletions tests/pytest/core/test_admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
import pytest
from django.contrib.auth.models import User
import benefits.core.admin
from benefits.core.admin import GOOGLE_USER_INFO_URL, pre_login_user


@pytest.fixture
def model_AdminUser():
return User.objects.create(email="user@calitp.org", first_name="", last_name="", username="")


@pytest.mark.django_db
Expand All @@ -10,3 +18,47 @@ def test_admin_registered(client):
assert ("/admin/login/?next=/admin/", 302) in response.redirect_chain
assert response.request["PATH_INFO"] == "/admin/login/"
assert "google_sso/login.html" in response.template_name


@pytest.mark.django_db
def test_pre_login_user(mocker, model_AdminUser):
assert model_AdminUser.email == "user@calitp.org"
assert model_AdminUser.first_name == ""
assert model_AdminUser.last_name == ""
assert model_AdminUser.username == ""

response_from_google = {
"username": "admin@calitp.org",
"given_name": "Admin",
"family_name": "User",
"email": "admin@calitp.org",
}

mocked_request = mocker.Mock()
mocked_response = mocker.Mock()
mocked_response.json.return_value = response_from_google
requests_spy = mocker.patch("benefits.core.admin.requests.get", return_value=mocked_response)

pre_login_user(model_AdminUser, mocked_request)

requests_spy.assert_called_once()
assert GOOGLE_USER_INFO_URL in requests_spy.call_args.args
assert model_AdminUser.email == response_from_google["email"]
assert model_AdminUser.first_name == response_from_google["given_name"]
assert model_AdminUser.last_name == response_from_google["family_name"]
assert model_AdminUser.username == response_from_google["username"]


@pytest.mark.django_db
def test_pre_login_user_no_session_token(mocker, model_AdminUser):
mocked_request = mocker.Mock()
mocked_request.session.get.return_value = None
logger_spy = mocker.spy(benefits.core.admin, "logger")

pre_login_user(model_AdminUser, mocked_request)

assert model_AdminUser.email == "user@calitp.org"
assert model_AdminUser.first_name == ""
assert model_AdminUser.last_name == ""
assert model_AdminUser.username == ""
logger_spy.warning.assert_called_once()

1 comment on commit eeffe2e

@machikoyasuda
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thekaveman love these refactors. very instructive!

Please sign in to comment.