mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-06-21 05:32:44 -04:00
make some progress
This commit is contained in:
3
Makefile
3
Makefile
@@ -78,7 +78,8 @@ dead-code:
|
||||
.PHONY: e2e-test
|
||||
e2e-test: export NEW_RELIC_ENVIRONMENT=test
|
||||
e2e-test: ## Run end-to-end integration tests
|
||||
poetry run pytest -v --browser chromium --browser firefox --browser webkit tests/end_to_end
|
||||
# poetry run pytest -v --browser chromium --browser firefox --browser webkit tests/end_to_end
|
||||
poetry run pytest -v --browser chromium tests/end_to_end
|
||||
|
||||
.PHONY: js-lint
|
||||
js-lint: ## Run javascript linting scanners
|
||||
|
||||
@@ -12,7 +12,7 @@ from flask import (
|
||||
)
|
||||
from flask_login import current_user
|
||||
|
||||
from app import login_manager
|
||||
from app import login_manager, user_api_client
|
||||
from app.main import main
|
||||
from app.main.forms import LoginForm
|
||||
from app.main.views.verify import activate_user
|
||||
@@ -24,16 +24,13 @@ from app.utils.login import is_safe_redirect_url
|
||||
@main.route("/sign-in", methods=(["GET", "POST"]))
|
||||
@hide_from_search_engines
|
||||
def sign_in():
|
||||
|
||||
redirect_url = request.args.get("next")
|
||||
|
||||
# TODO this is not the right test to do to find test users
|
||||
if os.getenv("NOTIFY_E2E_TEST_EMAIL") == 'ken.kehl@fedramp.gov':
|
||||
user_id = session["user_details"]["id"]
|
||||
activate_user(user_id)
|
||||
return redirect(
|
||||
url_for("main.show_accounts_or_dashboard", next=redirect_url)
|
||||
)
|
||||
if os.getenv("NOTIFY_E2E_TEST_EMAIL") == "ken.kehl@fedramp.gov":
|
||||
user = user_api_client.get_user_by_email("ken.kehl@fedramp.gov")
|
||||
activate_user(user["id"])
|
||||
return redirect(url_for("main.show_accounts_or_dashboard", next=redirect_url))
|
||||
|
||||
if current_user and current_user.is_authenticated:
|
||||
if redirect_url and is_safe_redirect_url(redirect_url):
|
||||
@@ -68,7 +65,7 @@ def sign_in():
|
||||
invited_user.accept_invite()
|
||||
|
||||
# TODO this is not the right test to do to find test users
|
||||
if os.getenv("NOTIFY_E2E_TEST_EMAIL") == 'ken.kehl@fedramp.gov':
|
||||
if os.getenv("NOTIFY_E2E_TEST_EMAIL") == "ken.kehl@fedramp.gov":
|
||||
user_id = session["user_details"]["id"]
|
||||
activate_user(user_id)
|
||||
return redirect(
|
||||
@@ -78,10 +75,8 @@ def sign_in():
|
||||
user.send_login_code()
|
||||
|
||||
if user.sms_auth:
|
||||
|
||||
return redirect(url_for(".two_factor_sms", next=redirect_url))
|
||||
|
||||
|
||||
if user.email_auth:
|
||||
return redirect(
|
||||
url_for(".two_factor_email_sent", next=redirect_url)
|
||||
|
||||
@@ -16,9 +16,6 @@ from app.utils.login import redirect_to_sign_in
|
||||
def verify():
|
||||
user_id = session["user_details"]["id"]
|
||||
|
||||
print(f"RETURN ABRUPT WITH ACTIVATE USER")
|
||||
return activate_user(user_id)
|
||||
|
||||
def _check_code(code):
|
||||
return user_api_client.check_verify_code(user_id, code, "sms")
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ from uuid import UUID, uuid4
|
||||
|
||||
import pytest
|
||||
from bs4 import BeautifulSoup
|
||||
from dotenv import load_dotenv
|
||||
from flask import Flask, url_for
|
||||
from notifications_python_client.errors import HTTPError
|
||||
from notifications_utils.url_safe_token import generate_token
|
||||
@@ -33,6 +34,8 @@ from . import (
|
||||
user_json,
|
||||
)
|
||||
|
||||
load_dotenv()
|
||||
|
||||
|
||||
class ElementNotFound(Exception):
|
||||
pass
|
||||
@@ -3689,7 +3692,8 @@ def end_to_end_authenticated_context(browser):
|
||||
|
||||
auth_state_path = os.path.join(
|
||||
# TODO
|
||||
"playwright/.auth/", "state.json"
|
||||
"playwright/.auth/",
|
||||
"state.json"
|
||||
# os.getenv("NOTIFY_E2E_AUTH_STATE_PATH"), "state.json"
|
||||
)
|
||||
context = browser.new_context(storage_state=auth_state_path)
|
||||
|
||||
@@ -2,52 +2,52 @@ import datetime
|
||||
import os
|
||||
import re
|
||||
|
||||
import pytest
|
||||
from dotenv import load_dotenv
|
||||
from playwright.sync_api import expect
|
||||
|
||||
|
||||
def test_accounts_page(end_to_end_context):
|
||||
load_dotenv()
|
||||
def _bypass_sign_in(end_to_end_context):
|
||||
# Open a new page and go to the staging site.
|
||||
page = end_to_end_context.new_page()
|
||||
print(page)
|
||||
page.goto(os.getenv("NOTIFY_E2E_TEST_URI"))
|
||||
|
||||
accounts_uri = "{}accounts".format(os.getenv("NOTIFY_E2E_TEST_URI"))
|
||||
page.goto(accounts_uri)
|
||||
sign_in_button = page.get_by_role("link", name="Sign in")
|
||||
|
||||
# Check to make sure that we've arrived at the next page.
|
||||
# Test trying to sign in. Because we are loading the email and password
|
||||
sign_in_button.click()
|
||||
|
||||
# Wait for the next page to fully load.
|
||||
page.wait_for_load_state("domcontentloaded")
|
||||
print(page)
|
||||
return page
|
||||
|
||||
|
||||
def test_accounts_page(end_to_end_context):
|
||||
|
||||
page = _bypass_sign_in(end_to_end_context)
|
||||
|
||||
# Check to make sure that we've arrived at the next page.
|
||||
# Check the page title exists and matches what we expect.
|
||||
expect(page).to_have_title(re.compile("Choose service"))
|
||||
|
||||
# Check for the sign in heading.
|
||||
sign_in_heading = page.get_by_role("heading", name="Choose service")
|
||||
expect(sign_in_heading).to_be_visible()
|
||||
|
||||
# Retrieve some prominent elements on the page for testing.
|
||||
add_service_button = page.get_by_role(
|
||||
"button", name=re.compile("Add a new service")
|
||||
)
|
||||
|
||||
expect(add_service_button).to_be_visible()
|
||||
expect(page).to_have_title(re.compile("Dashboard"))
|
||||
|
||||
|
||||
def test_add_new_service_workflow(end_to_end_context):
|
||||
page = end_to_end_context.new_page()
|
||||
page.goto(os.getenv("NOTIFY_E2E_TEST_URI"))
|
||||
|
||||
#sign_in_button = page.get_by_role("link", name="Sign in")
|
||||
|
||||
# Test trying to sign in. Because we are loading the email and password
|
||||
#sign_in_button.click()
|
||||
|
||||
# Wait for the next page to fully load.
|
||||
page.wait_for_load_state("domcontentloaded")
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Not authenticating test users.")
|
||||
def test_add_new_service_workflow(end_to_end_authenticated_context):
|
||||
# Prepare for adding a new service later in the test.
|
||||
current_date_time = datetime.datetime.now()
|
||||
new_service_name = "E2E Federal Test Service {now} - {browser_type}".format(
|
||||
now=current_date_time.strftime("%m/%d/%Y %H:%M:%S"),
|
||||
browser_type=end_to_end_authenticated_context.browser.browser_type.name,
|
||||
browser_type=end_to_end_context.browser.browser_type.name,
|
||||
)
|
||||
|
||||
# Open a new page and go to the staging site.
|
||||
page = end_to_end_authenticated_context.new_page()
|
||||
|
||||
accounts_uri = "{}accounts".format(os.getenv("NOTIFY_E2E_TEST_URI"))
|
||||
|
||||
page.goto(accounts_uri)
|
||||
|
||||
@@ -5,9 +5,9 @@ import pytest
|
||||
from playwright.sync_api import expect
|
||||
|
||||
|
||||
def test_landing_page(end_to_end_context):
|
||||
def test_landing_page(browser):
|
||||
# Open a new page and go to the staging site.
|
||||
page = end_to_end_context.new_page()
|
||||
page = browser.new_page()
|
||||
page.goto(os.getenv("NOTIFY_E2E_TEST_URI"))
|
||||
|
||||
# Check to make sure that we've arrived at the next page.
|
||||
@@ -22,6 +22,7 @@ def test_landing_page(end_to_end_context):
|
||||
)
|
||||
sign_in_button = page.get_by_role("link", name="Sign in")
|
||||
benefits_studio_email = page.get_by_role("link", name="tts-benefits-studio@gsa.gov")
|
||||
print(page)
|
||||
|
||||
# Check to make sure the elements are visible.
|
||||
expect(main_header).to_be_visible()
|
||||
@@ -49,118 +50,120 @@ def test_landing_page(end_to_end_context):
|
||||
).to_be_visible()
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Not authenticating test users.")
|
||||
def test_sign_in_and_mfa_pages(end_to_end_context):
|
||||
# Open a new page and go to the staging site.
|
||||
page = end_to_end_context.new_page()
|
||||
page.goto(os.getenv("NOTIFY_E2E_TEST_URI"))
|
||||
|
||||
sign_in_button = page.get_by_role("link", name="Sign in")
|
||||
|
||||
# Test trying to sign in.
|
||||
sign_in_button.click()
|
||||
|
||||
# Check to make sure that we've arrived at the next page.
|
||||
page.wait_for_load_state("domcontentloaded")
|
||||
|
||||
# Check the page title exists and matches what we expect.
|
||||
expect(page).to_have_title(re.compile("Sign in"))
|
||||
|
||||
# Check for the sign in heading.
|
||||
sign_in_heading = page.get_by_role("heading", name="Sign in")
|
||||
expect(sign_in_heading).to_be_visible()
|
||||
|
||||
# Check for the sign in form elements.
|
||||
# NOTE: Playwright cannot find input elements by role and recommends using
|
||||
# get_by_label() instead; however, hidden form elements do not have
|
||||
# labels associated with them, hence the XPath!
|
||||
# See https://playwright.dev/python/docs/api/class-page#page-get-by-label
|
||||
# and https://playwright.dev/python/docs/locators#locate-by-css-or-xpath
|
||||
# for more information.
|
||||
email_address_input = page.get_by_label("Email address")
|
||||
password_input = page.get_by_label("Password")
|
||||
csrf_token = page.locator('xpath=//input[@name="csrf_token"]')
|
||||
continue_button = page.get_by_role("button", name=re.compile("Continue"))
|
||||
forgot_password_link = page.get_by_role("link", name="Forgot your password?")
|
||||
|
||||
# Make sure form elements are visible and not visible as expected.
|
||||
expect(email_address_input).to_be_visible()
|
||||
expect(password_input).to_be_visible()
|
||||
expect(continue_button).to_be_visible()
|
||||
expect(forgot_password_link).to_be_visible()
|
||||
|
||||
expect(csrf_token).to_be_hidden()
|
||||
|
||||
# Make sure form elements are configured correctly with the right
|
||||
# attributes.
|
||||
expect(email_address_input).to_have_attribute("type", "email")
|
||||
expect(password_input).to_have_attribute("type", "password")
|
||||
expect(csrf_token).to_have_attribute("type", "hidden")
|
||||
expect(continue_button).to_have_attribute("type", "submit")
|
||||
expect(forgot_password_link).to_have_attribute("href", "/forgot-password")
|
||||
|
||||
# Sign in to the site.
|
||||
email_address_input.fill(os.getenv("NOTIFY_E2E_TEST_EMAIL"))
|
||||
password_input.fill(os.getenv("NOTIFY_E2E_TEST_PASSWORD"))
|
||||
continue_button.click()
|
||||
|
||||
# Wait for the next page to fully load.
|
||||
page.wait_for_load_state("domcontentloaded")
|
||||
|
||||
# Check the page title exists and matches what we expect.
|
||||
expect(page).to_have_title(re.compile("Check your phone"))
|
||||
|
||||
# Check for the sign in heading.
|
||||
sign_in_heading = page.get_by_role("heading", name="Check your phone")
|
||||
expect(sign_in_heading).to_be_visible()
|
||||
|
||||
# Check for the sign in form elements.
|
||||
# NOTE: Playwright cannot find input elements by role and recommends using
|
||||
# get_by_label() instead; however, hidden form elements do not have
|
||||
# labels associated with them, hence the XPath!
|
||||
# See https://playwright.dev/python/docs/api/class-page#page-get-by-label
|
||||
# and https://playwright.dev/python/docs/locators#locate-by-css-or-xpath
|
||||
# for more information.
|
||||
mfa_input = page.get_by_label("Text message code")
|
||||
csrf_token = page.locator('xpath=//input[@name="csrf_token"]')
|
||||
continue_button = page.get_by_role("button", name=re.compile("Continue"))
|
||||
not_received_message_link = page.get_by_role(
|
||||
"link", name="Not received a text message?"
|
||||
)
|
||||
|
||||
# Make sure form elements are visible and not visible as expected.
|
||||
expect(mfa_input).to_be_visible()
|
||||
expect(continue_button).to_be_visible()
|
||||
expect(not_received_message_link).to_be_visible()
|
||||
|
||||
expect(csrf_token).to_be_hidden()
|
||||
|
||||
# Make sure form elements are configured correctly with the right
|
||||
# attributes.
|
||||
expect(mfa_input).to_have_attribute("type", "tel")
|
||||
expect(mfa_input).to_have_attribute("pattern", "[0-9]*")
|
||||
expect(csrf_token).to_have_attribute("type", "hidden")
|
||||
expect(continue_button).to_have_attribute("type", "submit")
|
||||
expect(not_received_message_link).to_have_attribute("href", "/text-not-received")
|
||||
|
||||
# Enter MFA code and continue.
|
||||
# TODO: Revisit this at a later point in time.
|
||||
# totp = pyotp.TOTP(
|
||||
# os.getenv('MFA_TOTP_SECRET'),
|
||||
# digits=int(os.getenv('MFA_TOTP_LENGTH'))
|
||||
# )
|
||||
|
||||
# mfa_input.fill('totp.now()')
|
||||
# continue_button.click()
|
||||
|
||||
# # Check to make sure that we've arrived at the next page.
|
||||
# page.wait_for_load_state('domcontentloaded')
|
||||
|
||||
# # Check that no MFA code error happened.
|
||||
# code_not_found_error = page.get_by_text('Code not found')
|
||||
# expect(code_not_found_error).to_have_count(0)
|
||||
|
||||
# # Check the page title exists and matches what we expect.
|
||||
# # This could be either the Dashboard of a service if there is only
|
||||
# # one, or choosing a service if there are multiple.
|
||||
# expect(page).to_have_title(re.compile('Dashboard|Choose service'))
|
||||
# def test_sign_in_and_mfa_pages(end_to_end_context):
|
||||
# # Open a new page and go to the staging site.
|
||||
# page = end_to_end_context.new_page()
|
||||
# page.goto(os.getenv("NOTIFY_E2E_TEST_URI"))
|
||||
# print(f"test_sign_in_and_mfa_pages initial {page}")
|
||||
#
|
||||
# sign_in_button = page.get_by_role("link", name="Sign in")
|
||||
#
|
||||
# # Test trying to sign in.
|
||||
# sign_in_button.click()
|
||||
#
|
||||
# # Check to make sure that we've arrived at the next page.
|
||||
# page.wait_for_load_state("domcontentloaded")
|
||||
#
|
||||
# # Check the page title exists and matches what we expect.
|
||||
# expect(page).to_have_title(re.compile("Sign in"))
|
||||
#
|
||||
# # Check for the sign in heading.
|
||||
# sign_in_heading = page.get_by_role("heading", name="Sign in")
|
||||
# expect(sign_in_heading).to_be_visible()
|
||||
#
|
||||
# # Check for the sign in form elements.
|
||||
# # NOTE: Playwright cannot find input elements by role and recommends using
|
||||
# # get_by_label() instead; however, hidden form elements do not have
|
||||
# # labels associated with them, hence the XPath!
|
||||
# # See https://playwright.dev/python/docs/api/class-page#page-get-by-label
|
||||
# # and https://playwright.dev/python/docs/locators#locate-by-css-or-xpath
|
||||
# # for more information.
|
||||
# email_address_input = page.get_by_label("Email address")
|
||||
# password_input = page.get_by_label("Password")
|
||||
# csrf_token = page.locator('xpath=//input[@name="csrf_token"]')
|
||||
# continue_button = page.get_by_role("button", name=re.compile("Continue"))
|
||||
# forgot_password_link = page.get_by_role("link", name="Forgot your password?")
|
||||
#
|
||||
# # Make sure form elements are visible and not visible as expected.
|
||||
# expect(email_address_input).to_be_visible()
|
||||
# expect(password_input).to_be_visible()
|
||||
# expect(continue_button).to_be_visible()
|
||||
# expect(forgot_password_link).to_be_visible()
|
||||
#
|
||||
# expect(csrf_token).to_be_hidden()
|
||||
#
|
||||
# # Make sure form elements are configured correctly with the right
|
||||
# # attributes.
|
||||
# expect(email_address_input).to_have_attribute("type", "email")
|
||||
# expect(password_input).to_have_attribute("type", "password")
|
||||
# expect(csrf_token).to_have_attribute("type", "hidden")
|
||||
# expect(continue_button).to_have_attribute("type", "submit")
|
||||
# expect(forgot_password_link).to_have_attribute("href", "/forgot-password")
|
||||
#
|
||||
# # Sign in to the site.
|
||||
# email_address_input.fill(os.getenv("NOTIFY_E2E_TEST_EMAIL"))
|
||||
# password_input.fill(os.getenv("NOTIFY_E2E_TEST_PASSWORD"))
|
||||
# print(f"email and password {os.getenv('NOTIFY_E2E_TEST_EMAIL')} {os.getenv('NOTIFY_E2E_TEST_PASSWORD')}")
|
||||
# continue_button.click()
|
||||
#
|
||||
# # Wait for the next page to fully load.
|
||||
# page.wait_for_load_state("domcontentloaded")
|
||||
#
|
||||
# # Check the page title exists and matches what we expect.
|
||||
# print(f"test_sign_in_and_mfa_pages finally is {page}")
|
||||
# expect(page).to_have_title(re.compile("Check your phone"))
|
||||
#
|
||||
# # Check for the sign in heading.
|
||||
# sign_in_heading = page.get_by_role("heading", name="Check your phone")
|
||||
# expect(sign_in_heading).to_be_visible()
|
||||
#
|
||||
# # Check for the sign in form elements.
|
||||
# # NOTE: Playwright cannot find input elements by role and recommends using
|
||||
# # get_by_label() instead; however, hidden form elements do not have
|
||||
# # labels associated with them, hence the XPath!
|
||||
# # See https://playwright.dev/python/docs/api/class-page#page-get-by-label
|
||||
# # and https://playwright.dev/python/docs/locators#locate-by-css-or-xpath
|
||||
# # for more information.
|
||||
# mfa_input = page.get_by_label("Text message code")
|
||||
# csrf_token = page.locator('xpath=//input[@name="csrf_token"]')
|
||||
# continue_button = page.get_by_role("button", name=re.compile("Continue"))
|
||||
# not_received_message_link = page.get_by_role(
|
||||
# "link", name="Not received a text message?"
|
||||
# )
|
||||
#
|
||||
# # Make sure form elements are visible and not visible as expected.
|
||||
# expect(mfa_input).to_be_visible()
|
||||
# expect(continue_button).to_be_visible()
|
||||
# expect(not_received_message_link).to_be_visible()
|
||||
#
|
||||
# expect(csrf_token).to_be_hidden()
|
||||
#
|
||||
# # Make sure form elements are configured correctly with the right
|
||||
# # attributes.
|
||||
# expect(mfa_input).to_have_attribute("type", "tel")
|
||||
# expect(mfa_input).to_have_attribute("pattern", "[0-9]*")
|
||||
# expect(csrf_token).to_have_attribute("type", "hidden")
|
||||
# expect(continue_button).to_have_attribute("type", "submit")
|
||||
# expect(not_received_message_link).to_have_attribute("href", "/text-not-received")
|
||||
#
|
||||
# # Enter MFA code and continue.
|
||||
# # TODO: Revisit this at a later point in time.
|
||||
# # totp = pyotp.TOTP(
|
||||
# # os.getenv('MFA_TOTP_SECRET'),
|
||||
# # digits=int(os.getenv('MFA_TOTP_LENGTH'))
|
||||
# # )
|
||||
#
|
||||
# # mfa_input.fill('totp.now()')
|
||||
# # continue_button.click()
|
||||
#
|
||||
# # # Check to make sure that we've arrived at the next page.
|
||||
# # page.wait_for_load_state('domcontentloaded')
|
||||
#
|
||||
# # # Check that no MFA code error happened.
|
||||
# # code_not_found_error = page.get_by_text('Code not found')
|
||||
# # expect(code_not_found_error).to_have_count(0)
|
||||
#
|
||||
# # # Check the page title exists and matches what we expect.
|
||||
# # # This could be either the Dashboard of a service if there is only
|
||||
# # # one, or choosing a service if there are multiple.
|
||||
# # expect(page).to_have_title(re.compile('Dashboard|Choose service'))
|
||||
|
||||
Reference in New Issue
Block a user