From eeffe2ec43b5af53ae2a4f4870731dbe99579be0 Mon Sep 17 00:00:00 2001 From: Kegan Maher Date: Tue, 13 Feb 2024 17:40:37 +0000 Subject: [PATCH] test(admin): pre_login_user success and failure --- benefits/core/admin.py | 10 +++++-- tests/pytest/core/test_admin.py | 52 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/benefits/core/admin.py b/benefits/core/admin.py index bd32e1369..cb468b629 100644 --- a/benefits/core/admin.py +++ b/benefits/core/admin.py @@ -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, @@ -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.") diff --git a/tests/pytest/core/test_admin.py b/tests/pytest/core/test_admin.py index e02280f50..36bfa3434 100644 --- a/tests/pytest/core/test_admin.py +++ b/tests/pytest/core/test_admin.py @@ -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 @@ -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()