2017-04-27 11:55:50 +01:00
|
|
|
|
from unittest.mock import ANY
|
2016-12-22 11:43:11 +00:00
|
|
|
|
|
2018-02-20 11:22:17 +00:00
|
|
|
|
import pytest
|
2021-10-11 17:41:23 +01:00
|
|
|
|
from flask import url_for
|
2018-02-20 11:22:17 +00:00
|
|
|
|
|
2021-10-11 17:41:23 +01:00
|
|
|
|
from app.models.user import User
|
2020-03-26 12:41:46 +00:00
|
|
|
|
from tests.conftest import normalize_spaces
|
2015-12-01 13:23:54 +00:00
|
|
|
|
|
2016-01-19 15:50:31 +00:00
|
|
|
|
|
2022-01-04 15:40:42 +00:00
|
|
|
|
def test_render_register_returns_template_with_form(
|
|
|
|
|
|
client_request,
|
|
|
|
|
|
):
|
|
|
|
|
|
client_request.logout()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
page = client_request.get_url("/register")
|
2016-01-15 17:46:09 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert page.find("input", attrs={"name": "auth_type"}).attrs["value"] == "sms_auth"
|
|
|
|
|
|
assert page.select_one("#email_address")["spellcheck"] == "false"
|
|
|
|
|
|
assert page.select_one("#email_address")["autocomplete"] == "email"
|
|
|
|
|
|
assert page.select_one("#password")["autocomplete"] == "new-password"
|
|
|
|
|
|
assert "Create an account" in page.text
|
2015-12-01 13:23:54 +00:00
|
|
|
|
|
2016-01-22 17:24:14 +00:00
|
|
|
|
|
2018-11-15 15:38:43 +00:00
|
|
|
|
def test_logged_in_user_redirects_to_account(
|
|
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
):
|
2018-11-15 15:38:43 +00:00
|
|
|
|
client_request.get(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2018-11-15 15:38:43 +00:00
|
|
|
|
_expected_status=302,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
_expected_redirect=url_for("main.show_accounts_or_dashboard"),
|
2018-11-15 15:38:43 +00:00
|
|
|
|
)
|
2015-12-01 13:23:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
|
"phone_number_to_register_with",
|
|
|
|
|
|
[
|
|
|
|
|
|
"+12023900460",
|
|
|
|
|
|
"+1800-555-5555",
|
|
|
|
|
|
],
|
|
|
|
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
|
"password",
|
|
|
|
|
|
[
|
|
|
|
|
|
"the quick brown fox",
|
|
|
|
|
|
" the quick brown fox ",
|
|
|
|
|
|
],
|
|
|
|
|
|
)
|
2017-02-03 10:42:01 +00:00
|
|
|
|
def test_register_creates_new_user_and_redirects_to_continue_page(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
mock_send_verify_code,
|
|
|
|
|
|
mock_register_user,
|
|
|
|
|
|
mock_get_user_by_email_not_found,
|
2018-02-19 16:53:29 +00:00
|
|
|
|
mock_email_is_not_already_in_use,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
mock_send_verify_email,
|
|
|
|
|
|
mock_login,
|
2017-08-29 14:52:24 +01:00
|
|
|
|
phone_number_to_register_with,
|
2017-12-11 16:09:19 +00:00
|
|
|
|
password,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
user_data = {
|
|
|
|
|
|
"name": "Some One Valid",
|
|
|
|
|
|
"email_address": "notfound@example.gsa.gov",
|
|
|
|
|
|
"mobile_number": phone_number_to_register_with,
|
|
|
|
|
|
"password": password,
|
|
|
|
|
|
"auth_type": "sms_auth",
|
|
|
|
|
|
}
|
2016-01-19 15:50:31 +00:00
|
|
|
|
|
2022-01-04 15:40:42 +00:00
|
|
|
|
page = client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data=user_data,
|
|
|
|
|
|
_follow_redirects=True,
|
|
|
|
|
|
)
|
2017-04-27 11:55:50 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert (
|
|
|
|
|
|
page.select("main p")[0].text
|
|
|
|
|
|
== "An email has been sent to notfound@example.gsa.gov."
|
|
|
|
|
|
)
|
2016-03-17 13:07:52 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_send_verify_email.assert_called_with(ANY, user_data["email_address"])
|
|
|
|
|
|
mock_register_user.assert_called_with(
|
|
|
|
|
|
user_data["name"],
|
|
|
|
|
|
user_data["email_address"],
|
|
|
|
|
|
user_data["mobile_number"],
|
|
|
|
|
|
user_data["password"],
|
|
|
|
|
|
user_data["auth_type"],
|
|
|
|
|
|
)
|
2015-12-01 13:23:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
2017-04-27 11:55:50 +01:00
|
|
|
|
def test_register_continue_handles_missing_session_sensibly(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-04-27 11:55:50 +01:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
2017-04-27 11:55:50 +01:00
|
|
|
|
# session is not set
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.get(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.registration_continue",
|
|
|
|
|
|
_expected_redirect=url_for("main.show_accounts_or_dashboard"),
|
2022-01-04 15:40:42 +00:00
|
|
|
|
)
|
2017-04-27 11:55:50 +01:00
|
|
|
|
|
|
|
|
|
|
|
2017-02-03 10:42:01 +00:00
|
|
|
|
def test_process_register_returns_200_when_mobile_number_is_invalid(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
mock_send_verify_code,
|
|
|
|
|
|
mock_get_user_by_email_not_found,
|
|
|
|
|
|
mock_login,
|
|
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
page = client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data={
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "Bad Mobile",
|
|
|
|
|
|
"email_address": "bad_mobile@example.gsa.gov",
|
|
|
|
|
|
"mobile_number": "not good",
|
|
|
|
|
|
"password": "validPassword!",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
},
|
|
|
|
|
|
_expected_status=200,
|
|
|
|
|
|
)
|
2016-01-21 11:33:53 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert "The string supplied did not seem to be a phone number" in page.text
|
2016-01-21 11:33:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
2017-02-03 10:42:01 +00:00
|
|
|
|
def test_should_return_200_when_email_is_not_gov_uk(
|
2020-03-26 12:41:46 +00:00
|
|
|
|
client_request,
|
2023-07-12 12:09:44 -04:00
|
|
|
|
mock_get_organizations,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
):
|
2020-03-26 12:41:46 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
page = client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2020-03-26 12:41:46 +00:00
|
|
|
|
_data={
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "Firstname Lastname",
|
|
|
|
|
|
"email_address": "bad_mobile@example.not.right",
|
|
|
|
|
|
"mobile_number": "2020900123",
|
|
|
|
|
|
"password": "validPassword!",
|
2020-03-26 12:41:46 +00:00
|
|
|
|
},
|
|
|
|
|
|
_expected_status=200,
|
|
|
|
|
|
)
|
2016-01-21 11:33:53 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert (
|
|
|
|
|
|
"Enter a public sector email address or find out who can use Notify"
|
|
|
|
|
|
in normalize_spaces(page.select_one(".usa-error-message").text)
|
2020-03-26 12:41:46 +00:00
|
|
|
|
)
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert page.select_one(".usa-error-message a")["href"] == url_for("main.features")
|
2016-01-21 12:12:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
|
"email_address",
|
2023-09-11 16:51:30 -04:00
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"notfound@example.gsa.gov",
|
|
|
|
|
|
"example@lsquo.net",
|
2023-09-11 16:51:30 -04:00
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
)
|
2017-02-03 10:42:01 +00:00
|
|
|
|
def test_should_add_user_details_to_session(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2022-09-12 17:38:53 -07:00
|
|
|
|
mocker,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
mock_send_verify_code,
|
|
|
|
|
|
mock_register_user,
|
|
|
|
|
|
mock_get_user_by_email_not_found,
|
2023-07-12 12:09:44 -04:00
|
|
|
|
mock_get_organizations_with_unusual_domains,
|
2018-02-19 16:53:29 +00:00
|
|
|
|
mock_email_is_not_already_in_use,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
mock_send_verify_email,
|
|
|
|
|
|
mock_login,
|
2019-05-28 16:11:54 +01:00
|
|
|
|
email_address,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data={
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "Test Codes",
|
|
|
|
|
|
"email_address": email_address,
|
|
|
|
|
|
"mobile_number": "+12023123123",
|
|
|
|
|
|
"password": "validPassword!",
|
|
|
|
|
|
},
|
2019-05-28 16:11:54 +01:00
|
|
|
|
)
|
2022-01-04 15:40:42 +00:00
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert session["user_details"]["email"] == email_address
|
2016-01-21 12:12:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
2020-06-16 18:04:29 +01:00
|
|
|
|
def test_should_return_200_if_password_is_on_list_of_commonly_used_passwords(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
mock_get_user_by_email,
|
|
|
|
|
|
mock_login,
|
|
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
page = client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data={
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "Bad Mobile",
|
|
|
|
|
|
"email_address": "bad_mobile@example.gsa.gov",
|
|
|
|
|
|
"mobile_number": "+12021234123",
|
|
|
|
|
|
"password": "password",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
},
|
|
|
|
|
|
_expected_status=200,
|
|
|
|
|
|
)
|
2016-01-21 12:12:06 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert "Choose a password that’s harder to guess" in page.text
|
2016-03-09 15:12:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
2017-02-03 10:42:01 +00:00
|
|
|
|
def test_register_with_existing_email_sends_emails(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
api_user_active,
|
|
|
|
|
|
mock_get_user_by_email,
|
|
|
|
|
|
mock_send_already_registered_email,
|
|
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
2016-03-09 15:12:33 +00:00
|
|
|
|
user_data = {
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "Already Hasaccount",
|
|
|
|
|
|
"email_address": api_user_active["email_address"],
|
|
|
|
|
|
"mobile_number": "+12025900460",
|
|
|
|
|
|
"password": "validPassword!",
|
2016-03-09 15:12:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data=user_data,
|
2023-08-25 09:12:23 -07:00
|
|
|
|
_expected_redirect=url_for("main.registration_continue"),
|
2022-01-04 15:40:42 +00:00
|
|
|
|
)
|
2016-12-22 11:43:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
2023-09-11 16:51:30 -04:00
|
|
|
|
("email_address", "expected_value"),
|
2023-08-25 09:12:23 -07:00
|
|
|
|
[
|
|
|
|
|
|
("first.last@example.com", "First Last"),
|
|
|
|
|
|
("first.middle.last@example.com", "First Middle Last"),
|
|
|
|
|
|
("first.m.last@example.com", "First Last"),
|
|
|
|
|
|
("first.last-last@example.com", "First Last-Last"),
|
|
|
|
|
|
("first.o'last@example.com", "First O’Last"),
|
|
|
|
|
|
("first.last+testing@example.com", "First Last"),
|
|
|
|
|
|
("first.last+testing+testing@example.com", "First Last"),
|
|
|
|
|
|
("first.last6@example.com", "First Last"),
|
|
|
|
|
|
("first.last.212@example.com", "First Last"),
|
|
|
|
|
|
("first.2.last@example.com", "First Last"),
|
|
|
|
|
|
("first.2b.last@example.com", "First Last"),
|
|
|
|
|
|
("first.1.2.3.last@example.com", "First Last"),
|
|
|
|
|
|
("first.last.1.2.3@example.com", "First Last"),
|
|
|
|
|
|
# Instances where we can’t make a good-enough guess:
|
|
|
|
|
|
("example123@example.com", None),
|
|
|
|
|
|
("f.last@example.com", None),
|
|
|
|
|
|
("f.m.last@example.com", None),
|
|
|
|
|
|
],
|
|
|
|
|
|
)
|
2020-08-10 15:56:48 +01:00
|
|
|
|
def test_shows_name_on_registration_page_from_invite(
|
2018-07-02 09:08:21 +01:00
|
|
|
|
client_request,
|
|
|
|
|
|
fake_uuid,
|
|
|
|
|
|
email_address,
|
|
|
|
|
|
expected_value,
|
2021-03-16 17:58:27 +00:00
|
|
|
|
sample_invite,
|
|
|
|
|
|
mock_get_invited_user_by_id,
|
2018-07-02 09:08:21 +01:00
|
|
|
|
):
|
2023-08-25 09:12:23 -07:00
|
|
|
|
sample_invite["email_address"] = email_address
|
2018-07-02 09:08:21 +01:00
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
session["invited_user_id"] = sample_invite
|
2019-06-05 10:47:55 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
page = client_request.get("main.register_from_invite")
|
|
|
|
|
|
assert page.select_one("input[name=name]").get("value") == expected_value
|
2018-07-02 09:08:21 +01:00
|
|
|
|
|
|
|
|
|
|
|
2020-08-11 11:22:59 +01:00
|
|
|
|
def test_shows_hidden_email_address_on_registration_page_from_invite(
|
2020-08-10 15:56:48 +01:00
|
|
|
|
client_request,
|
|
|
|
|
|
fake_uuid,
|
2021-03-16 17:58:27 +00:00
|
|
|
|
sample_invite,
|
|
|
|
|
|
mock_get_invited_user_by_id,
|
2020-08-10 15:56:48 +01:00
|
|
|
|
):
|
|
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
session["invited_user_id"] = sample_invite
|
2020-08-10 15:56:48 +01:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
page = client_request.get("main.register_from_invite")
|
|
|
|
|
|
assert normalize_spaces(page.select_one("main p").text) == (
|
|
|
|
|
|
"Your account will be created with this email address: invited_user@test.gsa.gov"
|
2020-08-10 15:56:48 +01:00
|
|
|
|
)
|
2023-08-25 09:12:23 -07:00
|
|
|
|
hidden_input = page.select_one("form .usa-sr-only input")
|
2020-08-10 15:56:48 +01:00
|
|
|
|
for attr, value in (
|
2023-08-25 09:12:23 -07:00
|
|
|
|
("type", "email"),
|
|
|
|
|
|
("name", "username"),
|
|
|
|
|
|
("id", "username"),
|
|
|
|
|
|
("value", "invited_user@test.gsa.gov"),
|
|
|
|
|
|
("disabled", "disabled"),
|
|
|
|
|
|
("tabindex", "-1"),
|
|
|
|
|
|
("aria-hidden", "true"),
|
|
|
|
|
|
("autocomplete", "username"),
|
2020-08-10 15:56:48 +01:00
|
|
|
|
):
|
|
|
|
|
|
assert hidden_input[attr] == value
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
|
"extra_data",
|
2023-09-11 16:51:30 -04:00
|
|
|
|
[
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{},
|
|
|
|
|
|
# The username field is present in the page but the POST request
|
|
|
|
|
|
# should ignore it
|
|
|
|
|
|
{"username": "invited@user.com"},
|
|
|
|
|
|
{"username": "anythingelse@example.com"},
|
2023-09-11 16:51:30 -04:00
|
|
|
|
],
|
2023-08-25 09:12:23 -07:00
|
|
|
|
)
|
2017-11-14 15:03:05 +00:00
|
|
|
|
def test_register_from_invite(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
fake_uuid,
|
2018-02-19 16:53:29 +00:00
|
|
|
|
mock_email_is_not_already_in_use,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
mock_register_user,
|
|
|
|
|
|
mock_send_verify_code,
|
|
|
|
|
|
mock_accept_invite,
|
2021-03-16 17:58:27 +00:00
|
|
|
|
mock_get_invited_user_by_id,
|
|
|
|
|
|
sample_invite,
|
2020-08-10 15:56:48 +01:00
|
|
|
|
extra_data,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
session["invited_user_id"] = sample_invite["id"]
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register_from_invite",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data=dict(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
name="Registered in another Browser",
|
|
|
|
|
|
email_address=sample_invite["email_address"],
|
|
|
|
|
|
mobile_number="+12024900460",
|
|
|
|
|
|
service=sample_invite["service"],
|
|
|
|
|
|
password="somreallyhardthingtoguess",
|
|
|
|
|
|
auth_type="sms_auth",
|
2020-08-10 15:56:48 +01:00
|
|
|
|
**extra_data
|
|
|
|
|
|
),
|
2023-08-25 09:12:23 -07:00
|
|
|
|
_expected_redirect=url_for("main.verify"),
|
2017-11-13 13:39:31 +00:00
|
|
|
|
)
|
2018-07-02 09:08:21 +01:00
|
|
|
|
mock_register_user.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"Registered in another Browser",
|
|
|
|
|
|
sample_invite["email_address"],
|
|
|
|
|
|
"+12024900460",
|
|
|
|
|
|
"somreallyhardthingtoguess",
|
|
|
|
|
|
"sms_auth",
|
2021-03-16 17:58:27 +00:00
|
|
|
|
),
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_get_invited_user_by_id.assert_called_once_with(sample_invite["id"])
|
2016-12-22 15:24:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
2017-02-03 10:42:01 +00:00
|
|
|
|
def test_register_from_invite_when_user_registers_in_another_browser(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
api_user_active,
|
|
|
|
|
|
mock_get_user_by_email,
|
|
|
|
|
|
mock_accept_invite,
|
2021-03-16 17:58:27 +00:00
|
|
|
|
mock_get_invited_user_by_id,
|
|
|
|
|
|
sample_invite,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
sample_invite["email_address"] = api_user_active["email_address"]
|
2022-01-04 15:40:42 +00:00
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
session["invited_user_id"] = sample_invite["id"]
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register_from_invite",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data={
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "Registered in another Browser",
|
|
|
|
|
|
"email_address": api_user_active["email_address"],
|
|
|
|
|
|
"mobile_number": api_user_active["mobile_number"],
|
|
|
|
|
|
"service": sample_invite["service"],
|
|
|
|
|
|
"password": "somreallyhardthingtoguess",
|
|
|
|
|
|
"auth_type": "sms_auth",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
},
|
2023-08-25 09:12:23 -07:00
|
|
|
|
_expected_redirect=url_for("main.verify"),
|
2017-11-13 13:39:31 +00:00
|
|
|
|
)
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
|
"invite_email_address", ["gov-user@gsa.gov", "non-gov-user@example.com"]
|
|
|
|
|
|
)
|
2017-11-14 15:03:05 +00:00
|
|
|
|
def test_register_from_email_auth_invite(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-11-14 15:03:05 +00:00
|
|
|
|
sample_invite,
|
2018-02-19 16:53:29 +00:00
|
|
|
|
mock_email_is_not_already_in_use,
|
2017-11-14 15:03:05 +00:00
|
|
|
|
mock_register_user,
|
|
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mock_send_verify_email,
|
|
|
|
|
|
mock_send_verify_code,
|
|
|
|
|
|
mock_accept_invite,
|
2018-05-02 10:27:01 +01:00
|
|
|
|
mock_create_event,
|
2019-01-18 16:13:29 +00:00
|
|
|
|
mock_add_user_to_service,
|
2020-08-03 13:37:34 +01:00
|
|
|
|
mock_get_service,
|
2021-03-16 17:58:27 +00:00
|
|
|
|
mock_get_invited_user_by_id,
|
2019-01-18 16:13:29 +00:00
|
|
|
|
invite_email_address,
|
2021-03-05 12:19:36 +00:00
|
|
|
|
service_one,
|
|
|
|
|
|
fake_uuid,
|
|
|
|
|
|
mocker,
|
2017-11-14 15:03:05 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_login_user = mocker.patch("app.models.user.login_user")
|
|
|
|
|
|
sample_invite["auth_type"] = "email_auth"
|
|
|
|
|
|
sample_invite["email_address"] = invite_email_address
|
2022-01-04 15:40:42 +00:00
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
session["invited_user_id"] = sample_invite["id"]
|
2021-10-13 11:31:27 +01:00
|
|
|
|
# Prove that the user isn’t already signed in
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert "user_id" not in session
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
|
|
|
|
|
data = {
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "invited user",
|
|
|
|
|
|
"email_address": sample_invite["email_address"],
|
|
|
|
|
|
"mobile_number": "2028675301",
|
|
|
|
|
|
"password": "FSLKAJHFNvdzxgfyst",
|
|
|
|
|
|
"service": sample_invite["service"],
|
|
|
|
|
|
"auth_type": "email_auth",
|
2017-11-14 15:03:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register_from_invite",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data=data,
|
|
|
|
|
|
_expected_redirect=url_for(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.service_dashboard",
|
|
|
|
|
|
service_id=sample_invite["service"],
|
2022-01-04 15:40:42 +00:00
|
|
|
|
),
|
|
|
|
|
|
)
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
|
|
|
|
|
# doesn't send any 2fa code
|
|
|
|
|
|
assert not mock_send_verify_email.called
|
|
|
|
|
|
assert not mock_send_verify_code.called
|
|
|
|
|
|
# creates user with email_auth set
|
|
|
|
|
|
mock_register_user.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
data["name"],
|
|
|
|
|
|
data["email_address"],
|
|
|
|
|
|
data["mobile_number"],
|
|
|
|
|
|
data["password"],
|
|
|
|
|
|
data["auth_type"],
|
2017-11-14 15:03:05 +00:00
|
|
|
|
)
|
2021-03-16 17:58:27 +00:00
|
|
|
|
# this is actually called twice, at the beginning of the function and then by the activate_user function
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_get_invited_user_by_id.assert_called_with(sample_invite["id"])
|
|
|
|
|
|
mock_accept_invite.assert_called_once_with(
|
|
|
|
|
|
sample_invite["service"], sample_invite["id"]
|
|
|
|
|
|
)
|
2021-10-11 17:41:23 +01:00
|
|
|
|
|
2017-11-14 15:03:05 +00:00
|
|
|
|
# just logs them in
|
2023-08-25 09:12:23 -07:00
|
|
|
|
mock_login_user.assert_called_once_with(
|
|
|
|
|
|
User(
|
|
|
|
|
|
{
|
|
|
|
|
|
"id": fake_uuid, # This ID matches the return value of mock_register_user
|
|
|
|
|
|
"platform_admin": False,
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
2021-10-11 17:41:23 +01:00
|
|
|
|
mock_add_user_to_service.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
sample_invite["service"],
|
2021-10-11 17:41:23 +01:00
|
|
|
|
fake_uuid, # This ID matches the return value of mock_register_user
|
2023-08-25 09:12:23 -07:00
|
|
|
|
{"manage_api_keys", "manage_service", "send_messages", "view_activity"},
|
2021-10-11 17:41:23 +01:00
|
|
|
|
[],
|
|
|
|
|
|
)
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
2022-01-04 15:40:42 +00:00
|
|
|
|
with client_request.session_transaction() as session:
|
2021-10-13 11:31:27 +01:00
|
|
|
|
# The user is signed in
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert "user_id" in session
|
2017-11-14 15:03:05 +00:00
|
|
|
|
# invited user details are still there so they can get added to the service
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert session["invited_user_id"] == sample_invite["id"]
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_can_register_email_auth_without_phone_number(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-11-14 15:03:05 +00:00
|
|
|
|
sample_invite,
|
2018-02-19 16:53:29 +00:00
|
|
|
|
mock_email_is_not_already_in_use,
|
2017-11-14 15:03:05 +00:00
|
|
|
|
mock_register_user,
|
|
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mock_send_verify_email,
|
|
|
|
|
|
mock_send_verify_code,
|
|
|
|
|
|
mock_accept_invite,
|
2018-05-02 10:27:01 +01:00
|
|
|
|
mock_create_event,
|
2019-01-18 16:13:29 +00:00
|
|
|
|
mock_add_user_to_service,
|
2020-08-03 13:37:34 +01:00
|
|
|
|
mock_get_service,
|
2021-03-16 17:58:27 +00:00
|
|
|
|
mock_get_invited_user_by_id,
|
2017-11-14 15:03:05 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
sample_invite["auth_type"] = "email_auth"
|
2022-01-04 15:40:42 +00:00
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
session["invited_user_id"] = sample_invite["id"]
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
|
|
|
|
|
data = {
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "invited user",
|
|
|
|
|
|
"email_address": sample_invite["email_address"],
|
|
|
|
|
|
"mobile_number": "",
|
|
|
|
|
|
"password": "FSLKAJHFNvdzxgfyst",
|
|
|
|
|
|
"service": sample_invite["service"],
|
|
|
|
|
|
"auth_type": "email_auth",
|
2017-11-14 15:03:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register_from_invite",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data=data,
|
|
|
|
|
|
_expected_redirect=url_for(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.service_dashboard",
|
|
|
|
|
|
service_id=sample_invite["service"],
|
2022-01-04 15:40:42 +00:00
|
|
|
|
),
|
|
|
|
|
|
)
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
|
|
|
|
|
mock_register_user.assert_called_once_with(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
ANY, ANY, None, ANY, ANY # mobile_number
|
2017-11-14 15:03:05 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_cannot_register_with_sms_auth_and_missing_mobile_number(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-11-14 15:03:05 +00:00
|
|
|
|
mock_send_verify_code,
|
|
|
|
|
|
mock_get_user_by_email_not_found,
|
|
|
|
|
|
mock_login,
|
|
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
page = client_request.post(
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"main.register",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
_data={
|
2023-08-25 09:12:23 -07:00
|
|
|
|
"name": "Missing Mobile",
|
|
|
|
|
|
"email_address": "missing_mobile@example.gsa.gov",
|
|
|
|
|
|
"password": "validPassword!",
|
2022-01-04 15:40:42 +00:00
|
|
|
|
},
|
|
|
|
|
|
_expected_status=200,
|
2022-08-05 00:25:03 -07:00
|
|
|
|
)
|
2017-11-14 15:03:05 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
err = page.select_one(".usa-error-message")
|
|
|
|
|
|
assert err.text.strip() == "Error: Cannot be empty"
|
|
|
|
|
|
assert err.attrs["data-error-label"] == "mobile_number"
|
2017-11-14 15:53:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_register_from_invite_form_doesnt_show_mobile_number_field_if_email_auth(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2021-03-16 17:58:27 +00:00
|
|
|
|
sample_invite,
|
|
|
|
|
|
mock_get_invited_user_by_id,
|
2017-11-14 15:53:38 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
2023-08-25 09:12:23 -07:00
|
|
|
|
sample_invite["auth_type"] = "email_auth"
|
2022-01-04 15:40:42 +00:00
|
|
|
|
with client_request.session_transaction() as session:
|
2023-08-25 09:12:23 -07:00
|
|
|
|
session["invited_user_id"] = sample_invite["id"]
|
2017-11-14 15:53:38 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
page = client_request.get("main.register_from_invite")
|
2017-11-14 15:53:38 +00:00
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
|
assert (
|
|
|
|
|
|
page.find("input", attrs={"name": "auth_type"}).attrs["value"] == "email_auth"
|
|
|
|
|
|
)
|
|
|
|
|
|
assert page.find("input", attrs={"name": "mobile_number"}) is None
|