From dbc8db8be60830ddb9d2fe83da6654b43ece48fe Mon Sep 17 00:00:00 2001 From: James Demery Date: Wed, 3 Dec 2025 10:22:57 -0500 Subject: [PATCH] Revert "BB2-4303: Revert changes to fix selenium tests (#1431)" This reverts commit 21d5cacd7bf3ad595e9be64a9c7235f308a0c2c6. --- .../create_test_user_and_application.py | 149 +++++++++--------- dev-local/utility-functions.bash | 17 +- docker-compose.selenium.yml | 2 +- msls-local/{Dockerfile => Dockerfile.msls} | 0 msls-local/Makefile | 2 +- 5 files changed, 95 insertions(+), 75 deletions(-) rename msls-local/{Dockerfile => Dockerfile.msls} (100%) diff --git a/apps/testclient/management/commands/create_test_user_and_application.py b/apps/testclient/management/commands/create_test_user_and_application.py index 64fcaf297..650fdf190 100644 --- a/apps/testclient/management/commands/create_test_user_and_application.py +++ b/apps/testclient/management/commands/create_test_user_and_application.py @@ -12,10 +12,15 @@ from datetime import timedelta, datetime from django.conf import settings from apps.authorization.models import update_grants +from apps.authorization.models import ArchivedDataAccessGrant, DataAccessGrant +# Imports for quieting things during startup. +from waffle.models import Switch + +from uuid import uuid4 -def create_group(name="BlueButton"): +def create_group(name="BlueButton"): g, created = Group.objects.get_or_create(name=name) if created: print("%s group created" % (name)) @@ -24,41 +29,29 @@ def create_group(name="BlueButton"): return g -def create_user(group, usr): - u_name = "fred" +def create_user(the_group): + username = "rogersf" first_name = "Fred" - last_name = "Flinstone" - email = "fred@example.com" - password = "foobarfoobarfoobar" + last_name = "Rogers" + email = "mrrogers@landofmakebelieve.gov" + password = uuid4() user_type = "BEN" - if usr is not None: - u_name = usr - first_name = "{}{}".format(usr, "First") - last_name = "{}{}".format(usr, "Last") - email = "{}.{}@example.com".format(first_name, last_name) - user_type = "DEV" - - if User.objects.filter(username=u_name).exists(): - User.objects.filter(username=u_name).delete() - - u = None - - if usr is not None: - u = User.objects.create_user(username=u_name, - first_name=first_name, - last_name=last_name, - email=email) - u.set_unusable_password() - else: - # create a sample user 'fred' for dev local that has a usable password - u = User.objects.create_user(username=u_name, - first_name=first_name, - last_name=last_name, - email=email, - password=password,) - - UserProfile.objects.create(user=u, + # We will do this over-and-over. + # If we don't already exist, then create the user. + if User.objects.filter(username=username).exists(): + print(f"👟 {username} already exists. Skipping test user creation.") + return User.objects.get(username=username) + + # If the user didn't exist, it is our first time through. + # Create the user. + user_obj = User.objects.create(username=username, + first_name=first_name, + last_name=last_name, + email=email, + password=password,) + user_obj.set_unusable_password() + UserProfile.objects.create(user=user_obj, user_type=user_type, create_applications=True, password_reset_question_1='1', @@ -67,17 +60,17 @@ def create_user(group, usr): password_reset_answer_2='Frank', password_reset_question_3='3', password_reset_answer_3='Bentley') + user_obj.groups.add(the_group) - u.groups.add(group) - - if usr is None: - if not Crosswalk.objects.filter(_user_id_hash="ee78989d1d9ba0b98f3cfbd52479f10c7631679c17563186f70fbef038cc9536").exists(): - c, g_o_c = Crosswalk.objects.get_or_create(user=u, - fhir_id_v2=settings.DEFAULT_SAMPLE_FHIR_ID_V2, - _user_id_hash="ee78989d1d9ba0b98f3cfbd52479f10c7631679c17563186f70fbef038cc9536") - else: - print("Skipping crosswalk creation; already exists.") - return u + # CROSSWALK + # Removing any existing crosswalks for this artificial user. + # Why? Just in case. + user_id_hash = "ee78989d1d9ba0b98f3cfbd52479f10c7631679c17563186f70fbef038cc9536" + Crosswalk.objects.filter(_user_id_hash=user_id_hash).delete() + Crosswalk.objects.get_or_create(user=user_obj, + fhir_id_v2=settings.DEFAULT_SAMPLE_FHIR_ID_V2, + _user_id_hash=user_id_hash) + return user_obj def create_application(user): @@ -110,47 +103,59 @@ def create_application(user): return the_app -def create_test_token(user, application): +def create_test_token(the_user, the_app): + # Set expiration one day from now. now = timezone.now() expires = now + timedelta(days=1) - token_value = "sample-token-string" - scopes = application.scope.all() + scopes = the_app.scope.all() scope = [] for s in scopes: scope.append(s.slug) - AccessToken.objects.filter(token=token_value).delete() - t = AccessToken.objects.create(user=user, application=application, - token=token_value, + # We have to have a tokent with token="sample-token-string", because we + # rely on it existing for unit tests. Which are actually integration tests. + if AccessToken.objects.filter(token="sample-token-string").exists(): + t = AccessToken.objects.get(token="sample-token-string") + t.expires = expires + t.save() + else: + AccessToken.objects.create(user=the_user, + application=the_app, + # This needs to be "sample-token-string", because + # we have tests that rely on it. + token="sample-token-string", expires=expires, - scope=' '.join(scope)) - return t + scope=' '.join(scope),) + + +def get_switch(name): + try: + sw = Switch.objects.get(name=name) + return sw.active + except Exception as e: + print(f"Could not get switch {name}: {e}") + + +def set_switch(name, b): + sw, _ = Switch.objects.get_or_create(name=name) + sw.active = b + sw.save() class Command(BaseCommand): help = 'Create a test user and application for the test client' - def add_arguments(self, parser): - parser.add_argument("-u", "--user", help="Name of the user to be created (unique).") - parser.add_argument("-a", "--app", help="Name of the application to be created (unique).") - parser.add_argument("-r", "--redirect", help="Redirect url of the application.") - def handle(self, *args, **options): - usr = options["user"] - app = options["app"] - redirect = options["redirect"] - - g = create_group() - u = create_user(g, usr) - a = create_application(u) # a = create_application(u, g, app, redirect) - t = None - if usr is None and app is None: - t = create_test_token(u, a) - update_grants() - print("Name:", a.name) - print("client_id:", a.client_id) - print("client_secret:", a.client_secret) - print("access_token:", t.token if t else "None") - print("redirect_uri:", a.redirect_uris) + + set_switch('outreach_email', False) + + the_group = create_group() + the_user = create_user(the_group) + the_app = create_application(the_user) + create_test_token(the_user, the_app) + update_grants() + + # Restore switch to whatever it was. + set_switch('outreach_email', True) diff --git a/dev-local/utility-functions.bash b/dev-local/utility-functions.bash index 99f955092..d0193a324 100755 --- a/dev-local/utility-functions.bash +++ b/dev-local/utility-functions.bash @@ -24,7 +24,22 @@ check_valid_env () { echo "Exiting." return -2 fi - + + + if [[ "${bfd}" == "local" && "${auth}" == "live" ]]; then + echo "⚠️ ${bfd}/${auth} may work for SLSX testing, but not for BFD calls." + fi + + if [[ "${bfd}" == "test" && "${auth}" == "mock" ]]; then + echo "⛔ ${bfd}/${auth} is not a valid combination. Exiting." + return -3 + fi + + if [[ "${bfd}" == "sbx" && "${auth}" == "mock" ]]; then + echo "⛔ ${bfd}/${auth} is not a valid combination. Exiting." + return -4 + fi + echo "✅ check_valid_env" } diff --git a/docker-compose.selenium.yml b/docker-compose.selenium.yml index 55ab55289..f05b58072 100755 --- a/docker-compose.selenium.yml +++ b/docker-compose.selenium.yml @@ -24,7 +24,7 @@ services: - "5900:5900" msls: - build: ./msls-local + build: ./dev-local command: bash -c "python -m debugpy --listen 0.0.0.0:7890 app.py" ports: - "8080:8080" diff --git a/msls-local/Dockerfile b/msls-local/Dockerfile.msls similarity index 100% rename from msls-local/Dockerfile rename to msls-local/Dockerfile.msls diff --git a/msls-local/Makefile b/msls-local/Makefile index 737b164c5..a1318dea6 100644 --- a/msls-local/Makefile +++ b/msls-local/Makefile @@ -4,4 +4,4 @@ build-local: docker build \ --platform "linux/amd64" \ -t msls-local:latest \ - -f Dockerfile . \ No newline at end of file + -f Dockerfile.msls . \ No newline at end of file