This commit is contained in:
Rachid Mrad 2023-12-12 18:28:25 -05:00
parent 8febad976d
commit e7e3df0422
No known key found for this signature in database
GPG key ID: EF38E4CEC4A8F3CF
6 changed files with 107 additions and 99 deletions

View file

@ -69,7 +69,7 @@ class OpenIdConnectBackend(ModelBackend):
# Overwrite first_name and last_name if not empty string
for key, value in kwargs.items():
# Check if the key is not first_name or last_name or value is not empty string
if key not in ['first_name', 'last_name'] or value:
if key not in ["first_name", "last_name"] or value:
setattr(user, key, value)
user.save()

View file

@ -4,8 +4,8 @@ from django.utils import timezone
from registrar.models import User
from ..backends import OpenIdConnectBackend # Adjust the import path based on your project structure
class OpenIdConnectBackendTestCase(TestCase):
class OpenIdConnectBackendTestCase(TestCase):
def setUp(self):
self.backend = OpenIdConnectBackend()
self.kwargs = {

View file

@ -58,7 +58,7 @@ def openid(request):
request.session["next"] = request.GET.get("next", "/")
try:
logger.info('openid() calls create_authn_request in oidc')
logger.info("openid() calls create_authn_request in oidc")
return CLIENT.create_authn_request(request.session)
except Exception as err:
return error_page(request, err)
@ -72,22 +72,23 @@ def login_callback(request):
# test for need for identity verification and if it is satisfied
# if not satisfied, redirect user to login with stepped up acr_value
if requires_step_up_auth(userinfo):
logger.info('login_callback() calls get_step_up_acr_value and create_authn_request in oidc')
logger.info("login_callback() calls get_step_up_acr_value and create_authn_request in oidc")
# add acr_value to request.session
request.session["acr_value"] = CLIENT.get_step_up_acr_value()
return CLIENT.create_authn_request(request.session)
logger.info(f'login_callback() before calling authenticate: {userinfo}')
logger.info(f"login_callback() before calling authenticate: {userinfo}")
try:
user_in_db = User.objects.get(username=userinfo["sub"])
if user_in_db:
logger.info(f"This user exists in the DB (before authenticate): {user_in_db.first_name} {user_in_db.last_name}")
logger.info(
f"This user exists in the DB (before authenticate): {user_in_db.first_name} {user_in_db.last_name}"
)
except:
pass
user = authenticate(request=request, **userinfo)
if user:
login(request, user)

View file

@ -105,7 +105,7 @@ class Command(BaseCommand):
f"""{TerminalColors.YELLOW}
> Found linked user for contact:
{contact} {contact.email} {contact.first_name} {contact.last_name}
> The linked user is {eligible_user}
> The linked user is {eligible_user} {eligible_user.username}
{TerminalColors.ENDC}""", # noqa
)
@ -113,8 +113,10 @@ class Command(BaseCommand):
# ---- LET'S KEEP A LIGHT TOUCH
if not eligible_user.first_name or not eligible_user.last_name:
processed_user = eligible_user
processed_user.first_name = contact.first_name
processed_user.last_name = contact.last_name
# (expression has type "str | None", variable has type "str | int | Combinable")
# so we'll ignore type
processed_user.first_name = contact.first_name # type: ignore
processed_user.last_name = contact.last_name # type: ignore
processed_user.save()
return (
@ -150,7 +152,6 @@ class Command(BaseCommand):
processed_users,
):
for contact in Contact.objects.all():
# DEBUG:
TerminalHelper.print_conditional(
debug_on,

View file

@ -5,88 +5,96 @@ from registrar.models import (
Contact,
)
from django.core.management import call_command
from unittest.mock import patch
from registrar.management.commands.copy_names_from_contacts_to_users import Command
class TestOrganizationMigration(TestCase):
class TestDataUpdates(TestCase):
def setUp(self):
"""Defines the file name of migration_json and the folder its contained in"""
"""We cannot setup the user details because contacts will override the first and last names in its save method
so we will initiate the users, setup the contacts and link them, and leave the rest of the setup for the test(s).
"""
self.user1 = User.objects.create(username="user1")
self.user2 = User.objects.create(username="user2")
self.user3 = User.objects.create(username="user3")
self.userX = User.objects.create(username="user4")
# The last user created triggers the creation of a contact and attaches itself to it. @Neil wth is going on?
# This bs_user defuses that situation so we can test the code.
self.bs_user = User.objects.create()
# self.user1, _ = User.objects.get_or_create(username="user1")
# self.user2 = User.objects.create(username="user2", first_name="Joey", last_name="")
# self.user3 = User.objects.create(username="user3", first_name="a special first name", last_name="a special last name")
# self.userX = User.objects.create(username="emailX@igorville.gov", first_name="firstX", last_name="lastX")
# self.contact1, _ = Contact.objects.get_or_create(user=self.user1, email="email1@igorville.gov", first_name="first1", last_name="last1")
# self.contact2 = Contact.objects.create(user=self.user2, email="email2@igorville.gov", first_name="first2", last_name="last2")
# self.contact3 = Contact.objects.create(user=None, email="email3@igorville.gov", first_name="first3", last_name="last3")
# self.contact4 = Contact.objects.create(user=None, email="email4@igorville.gov", first_name="first4", last_name="last4")
# self.contact1 = Contact.objects.create(email="email1@igorville.gov", first_name="first1", last_name="last1")
# self.contact2 = Contact.objects.create(email="email2@igorville.gov", first_name="first2", last_name="last2")
# self.contact3 = Contact.objects.create(email="email3@igorville.gov", first_name="first3", last_name="last3")
# self.contact4 = Contact.objects.create(email="email4@igorville.gov", first_name="first4", last_name="last4")
# self.user1 = User.objects.create(contact=self.contact1)
# self.user2 = User.objects.create(contact=self.contact2, username="user2", first_name="Joey", last_name="")
# self.user3 = User.objects.create(username="user3", first_name="a special first name", last_name="a special last name")
# self.userX = User.objects.create(username="emailX@igorville.gov", first_name="firstX", last_name="lastX")
self.contact1 = Contact.objects.create(
user=self.user1, email="email1@igorville.gov", first_name="first1", last_name="last1"
)
self.contact2 = Contact.objects.create(
user=self.user2, email="email2@igorville.gov", first_name="first2", last_name="last2"
)
self.contact3 = Contact.objects.create(
user=self.user3, email="email3@igorville.gov", first_name="first3", last_name="last3"
)
self.contact4 = Contact.objects.create(email="email4@igorville.gov", first_name="first4", last_name="last4")
self.command = Command()
def tearDown(self):
"""Deletes all DB objects related to migrations"""
# Delete users
"""Clean up"""
# Delete users and contacts
User.objects.all().delete()
Contact.objects.all().delete()
def test_script_updates_linked_users(self):
"""Test the script that copies contacts' first and last names into associated users that
are eligible (first or last are blank or undefined)"""
user1, _ = User.objects.get_or_create(username="user1")
contact1, _ = Contact.objects.get_or_create(user=user1, email="email1@igorville.gov", first_name="first1", last_name="last1")
# Set up the users' first and last names here so
# they that they don't get overwritten by Contact's save()
# User with no first or last names
self.user1.first_name = ""
self.user1.last_name = ""
self.user1.save()
# User with a first name but no last name
self.user2.last_name = ""
self.user2.save()
# self.user1.first_name = ""
# self.user1.last_name = ""
# self.user2.last_name = ""
# self.user1.save()
# self.user2.save()
# User with a first and last name
self.user3.first_name = "An existing first name"
self.user3.last_name = "An existing last name"
self.user3.save()
# users we SKIPPED
# Unlinked user
# To make this test useful, we will set the last_name to ""
self.userX.first_name = "Unlinked user's first name"
self.userX.last_name = ""
self.userX.save()
# Call the parent method the same way we do it in the script
skipped_contacts = []
# users we found that are linked to contacts
eligible_users = []
# users we PROCESSED
processed_users = []
(
skipped_contacts,
eligible_users,
processed_users,
) = self.command.process_contacts(
True,
# Set debugging to False
False,
skipped_contacts,
eligible_users,
processed_users,
)
# self.user1.refresh_from_db()
# self.user2.refresh_from_db()
# self.user3.refresh_from_db()
# self.userX.refresh_from_db()
self.assertEqual(user1.first_name, "first1")
self.assertEqual(user1.last_name, "last1")
# self.assertEqual(self.user2.first_name, "first2")
# self.assertEqual(self.user2.last_name, "last2")
# self.assertEqual(self.user3.first_name, "a special first name")
# self.assertEqual(self.user3.last_name, "a special last name")
# self.assertEqual(self.userX.first_name, "firstX")
# self.assertEqual(self.userX.last_name, "lastX")
# Trigger DB refresh
self.user1.refresh_from_db()
self.user2.refresh_from_db()
self.user3.refresh_from_db()
self.userX.refresh_from_db()
# Asserts
self.assertEqual(self.user1.first_name, "first1")
self.assertEqual(self.user1.last_name, "last1")
self.assertEqual(self.user2.first_name, "first2")
self.assertEqual(self.user2.last_name, "last2")
self.assertEqual(self.user3.first_name, "An existing first name")
self.assertEqual(self.user3.last_name, "An existing last name")
self.assertEqual(self.userX.first_name, "Unlinked user's first name")
self.assertEqual(self.userX.last_name, "")

View file

@ -657,7 +657,6 @@ class TestUser(TestCase):
class TestContact(TestCase):
def setUp(self):
self.email = "mayor@igorville.gov"
self.user, _ = User.objects.get_or_create(email=self.email, first_name="Rachid", last_name="Mrad")
@ -700,4 +699,3 @@ class TestContact(TestCase):
# Updating the contact's email does not propagate
self.assertEqual(self.contact.email, "joey.baloney@diaperville.com")
self.assertEqual(self.user.email, "mayor@igorville.gov")