mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-23 15:57:23 -04:00
380 lines
11 KiB
Python
380 lines
11 KiB
Python
import uuid
|
||
from itertools import repeat
|
||
|
||
import pytest
|
||
from flask import url_for
|
||
|
||
from tests.conftest import SERVICE_ONE_ID, SERVICE_TWO_ID, normalize_spaces
|
||
|
||
OS1, OS2, OS3, S1, S2, S3 = repeat(uuid.uuid4(), 6)
|
||
|
||
SAMPLE_DATA = {
|
||
"organizations": [
|
||
{
|
||
"name": "org_1",
|
||
"id": "o1",
|
||
"count_of_live_services": 1,
|
||
},
|
||
{
|
||
"name": "org_2",
|
||
"id": "o2",
|
||
"count_of_live_services": 2,
|
||
},
|
||
{
|
||
"name": "org_3",
|
||
"id": "o3",
|
||
"count_of_live_services": 0,
|
||
},
|
||
],
|
||
"services": [
|
||
{
|
||
"name": "org_service_1",
|
||
"id": OS1,
|
||
"restricted": False,
|
||
"organization": "o1",
|
||
},
|
||
{
|
||
"name": "org_service_2",
|
||
"id": OS2,
|
||
"restricted": False,
|
||
"organization": "o1",
|
||
},
|
||
{
|
||
"name": "org_service_3",
|
||
"id": OS3,
|
||
"restricted": True,
|
||
"organization": "o1",
|
||
},
|
||
{
|
||
"name": "service_1",
|
||
"id": S1,
|
||
"restricted": False,
|
||
"organization": None,
|
||
},
|
||
{
|
||
"name": "service_2",
|
||
"id": S2,
|
||
"restricted": False,
|
||
"organization": None,
|
||
},
|
||
{
|
||
"name": "service_3",
|
||
"id": S3,
|
||
"restricted": True,
|
||
"organization": None,
|
||
},
|
||
],
|
||
}
|
||
|
||
|
||
@pytest.fixture
|
||
def mock_get_orgs_and_services(mocker):
|
||
return mocker.patch(
|
||
"app.user_api_client.get_organizations_and_services_for_user",
|
||
return_value=SAMPLE_DATA,
|
||
)
|
||
|
||
|
||
def test_choose_account_should_show_choose_accounts_page(
|
||
client_request,
|
||
mock_get_non_empty_organizations_and_services_for_user,
|
||
mock_get_organization,
|
||
):
|
||
resp = client_request.get("main.choose_account")
|
||
page = resp.find("main", {"id": "main-content"})
|
||
|
||
assert normalize_spaces(page.h1.text) == "Choose service"
|
||
outer_list_items = page.select("nav ul")[0].select("li")
|
||
headings = page.select("main h2")
|
||
|
||
assert len(outer_list_items) == 8
|
||
|
||
assert normalize_spaces(headings[0].text) == "Live services"
|
||
|
||
# first org
|
||
assert outer_list_items[0].a.text == "Org 1"
|
||
assert outer_list_items[0].a["href"] == url_for(
|
||
".organization_dashboard", org_id="o1"
|
||
)
|
||
assert normalize_spaces(
|
||
outer_list_items[0].select_one(".browse-list-hint").text
|
||
) == ("1 live service")
|
||
|
||
# second org
|
||
assert outer_list_items[1].a.text == "Org 2"
|
||
assert outer_list_items[1].a["href"] == url_for(
|
||
".organization_dashboard", org_id="o2"
|
||
)
|
||
assert normalize_spaces(
|
||
outer_list_items[1].select_one(".browse-list-hint").text
|
||
) == ("2 live services")
|
||
|
||
# third org
|
||
assert outer_list_items[2].a.text == "Org 3"
|
||
assert outer_list_items[2].a["href"] == url_for(
|
||
".organization_dashboard", org_id="o3"
|
||
)
|
||
assert normalize_spaces(
|
||
outer_list_items[2].select_one(".browse-list-hint").text
|
||
) == ("0 live services")
|
||
|
||
# live services
|
||
assert outer_list_items[3].a.text == "Service 1"
|
||
assert outer_list_items[3].a["href"] == url_for(
|
||
".service_dashboard", service_id=SERVICE_TWO_ID
|
||
)
|
||
assert outer_list_items[4].a.text == "Service 2"
|
||
assert outer_list_items[4].a["href"] == url_for(
|
||
".service_dashboard", service_id=SERVICE_TWO_ID
|
||
)
|
||
assert outer_list_items[5].a.text == "service one"
|
||
assert outer_list_items[5].a["href"] == url_for(
|
||
".service_dashboard", service_id="12345"
|
||
)
|
||
assert outer_list_items[6].a.text == "service one (org 2)"
|
||
assert outer_list_items[6].a["href"] == url_for(
|
||
".service_dashboard", service_id="12345"
|
||
)
|
||
assert outer_list_items[7].a.text == "service two (org 2)"
|
||
assert outer_list_items[7].a["href"] == url_for(
|
||
".service_dashboard", service_id="67890"
|
||
)
|
||
|
||
assert normalize_spaces(headings[1].text) == "Trial mode services"
|
||
|
||
# trial services
|
||
trial_services_list_items = page.select("nav ul")[1].select("li")
|
||
assert len(trial_services_list_items) == 3
|
||
assert trial_services_list_items[0].a.text == "service three"
|
||
assert trial_services_list_items[0].a["href"] == url_for(
|
||
".service_dashboard", service_id="abcde"
|
||
)
|
||
assert trial_services_list_items[1].a.text == "service three"
|
||
assert trial_services_list_items[1].a["href"] == url_for(
|
||
".service_dashboard", service_id="abcde"
|
||
)
|
||
|
||
assert mock_get_organization.call_args_list == []
|
||
|
||
|
||
def test_choose_account_should_show_choose_accounts_page_if_no_services(
|
||
client_request,
|
||
mock_get_orgs_and_services,
|
||
mock_get_organization,
|
||
mock_get_organization_services,
|
||
):
|
||
mock_get_orgs_and_services.return_value = {"organizations": [], "services": []}
|
||
resp = client_request.get("main.choose_account")
|
||
page = resp.find("main", {"id": "main-content"})
|
||
|
||
links = page.find_all("a")
|
||
assert len(links) == 1
|
||
add_service_link = links[0]
|
||
assert normalize_spaces(page.h1.text) == "Choose service"
|
||
assert normalize_spaces(add_service_link.text) == "Add a new service"
|
||
assert not page.select("main h2")
|
||
assert add_service_link["href"] == url_for("main.add_service")
|
||
|
||
|
||
@pytest.mark.parametrize(
|
||
("orgs_and_services", "expected_headings"),
|
||
[
|
||
(
|
||
{"organizations": [], "services": []},
|
||
[
|
||
"Platform admin",
|
||
],
|
||
),
|
||
(
|
||
SAMPLE_DATA,
|
||
[
|
||
"Platform admin",
|
||
"Live services",
|
||
"Trial mode services",
|
||
],
|
||
),
|
||
(
|
||
{
|
||
"organizations": [],
|
||
"services": [
|
||
{
|
||
"name": "Live service",
|
||
"id": OS2,
|
||
"restricted": False,
|
||
"organization": None,
|
||
}
|
||
],
|
||
},
|
||
[
|
||
"Platform admin",
|
||
"Live services",
|
||
],
|
||
),
|
||
(
|
||
{
|
||
"organizations": [],
|
||
"services": [
|
||
{
|
||
"name": "Trial service",
|
||
"id": OS2,
|
||
"restricted": True,
|
||
"organization": None,
|
||
}
|
||
],
|
||
},
|
||
[
|
||
"Platform admin",
|
||
"Trial mode services",
|
||
],
|
||
),
|
||
],
|
||
)
|
||
def test_choose_account_should_should_organizations_link_for_platform_admin(
|
||
client_request,
|
||
platform_admin_user,
|
||
mock_get_organizations,
|
||
mock_get_orgs_and_services,
|
||
mock_get_organization_services,
|
||
mock_get_service_and_organization_counts,
|
||
orgs_and_services,
|
||
expected_headings,
|
||
):
|
||
mock_get_orgs_and_services.return_value = orgs_and_services
|
||
client_request.login(platform_admin_user)
|
||
|
||
page = client_request.get("main.choose_account")
|
||
|
||
first_item = page.select_one(".browse-list-item")
|
||
first_link = first_item.select_one("a")
|
||
first_hint = first_item.select_one(".browse-list-hint")
|
||
assert first_link.text == "All organizations"
|
||
assert first_link["href"] == url_for("main.organizations")
|
||
assert normalize_spaces(first_hint.text) == "3 organizations, 9,999 live services"
|
||
|
||
assert [
|
||
normalize_spaces(h2.text) for h2 in page.select("main h2")
|
||
] == expected_headings
|
||
|
||
|
||
# Moving the back to service link into the top navigation
|
||
|
||
# def test_choose_account_should_show_back_to_service_link(
|
||
# client_request,
|
||
# mock_get_orgs_and_services,
|
||
# mock_get_organization,
|
||
# mock_get_organization_services,
|
||
# ):
|
||
# resp = client_request.get("main.choose_account")
|
||
|
||
# service_navigation = resp.find(
|
||
# "div", {"class": "navigation-service usa-breadcrumb"}
|
||
# )
|
||
# back_to_service_link = service_navigation.a
|
||
|
||
# assert back_to_service_link["href"] == url_for("main.show_accounts_or_dashboard")
|
||
# assert back_to_service_link.text == "Back to service one"
|
||
|
||
|
||
def test_choose_account_should_not_show_back_to_service_link_if_no_service_in_session(
|
||
client_request,
|
||
mock_get_orgs_and_services,
|
||
mock_get_organization,
|
||
mock_get_organization_services,
|
||
):
|
||
with client_request.session_transaction() as session:
|
||
session["service_id"] = None
|
||
page = client_request.get("main.choose_account")
|
||
|
||
assert len(page.select(".navigation-service usa-breadcrumb a")) == 0
|
||
|
||
|
||
def test_choose_account_should_not_show_back_to_service_link_if_not_signed_in(
|
||
client_request, mock_get_service, mocker
|
||
):
|
||
|
||
mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user")
|
||
client_request.logout()
|
||
|
||
with client_request.session_transaction() as session:
|
||
session["service_id"] = SERVICE_ONE_ID
|
||
page = client_request.get("main.sign_in")
|
||
|
||
assert page.select_one("h1").text == "Sign in" # We’re not signed in
|
||
assert page.select_one(".navigation-service usa-breadcrumb a") is None
|
||
|
||
|
||
@pytest.mark.parametrize(
|
||
"active",
|
||
[
|
||
False,
|
||
pytest.param(True),
|
||
],
|
||
)
|
||
def test_choose_account_should_not_show_back_to_service_link_if_service_archived(
|
||
client_request,
|
||
service_one,
|
||
mock_get_orgs_and_services,
|
||
mock_get_organization,
|
||
mock_get_organization_services,
|
||
active,
|
||
):
|
||
service_one["active"] = active
|
||
with client_request.session_transaction() as session:
|
||
session["service_id"] = service_one["id"]
|
||
page = client_request.get("main.choose_account")
|
||
|
||
assert normalize_spaces(page.select_one("h1").text) == "Choose service"
|
||
if active:
|
||
assert page.select_one(".navigation-service a") is None
|
||
else:
|
||
assert page.select_one(".navigation-service a") is None
|
||
|
||
|
||
def test_should_not_show_back_to_service_if_user_doesnt_belong_to_service(
|
||
client_request,
|
||
fake_uuid,
|
||
mock_get_service,
|
||
service_two,
|
||
):
|
||
mock_get_service.return_value = service_two
|
||
expected_page_text = (
|
||
# Page has no ‘back to’ link
|
||
"You’re not allowed to see this page "
|
||
"To check your permissions, speak to a member of your team who can manage settings, team and usage."
|
||
)
|
||
page = client_request.get(
|
||
"main.view_template",
|
||
service_id=mock_get_service.return_value["id"],
|
||
template_id=fake_uuid,
|
||
_expected_status=403,
|
||
_test_page_title=False,
|
||
)
|
||
|
||
assert normalize_spaces(page.select_one(".grid-row .grid-col-8").text).startswith(
|
||
normalize_spaces(expected_page_text)
|
||
)
|
||
|
||
|
||
def test_should_show_back_to_service_if_user_belongs_to_service(
|
||
client_request,
|
||
fake_uuid,
|
||
mock_get_service,
|
||
mock_get_service_template,
|
||
service_one,
|
||
):
|
||
mock_get_service.return_value = service_one
|
||
expected_page_text = (
|
||
"Test Service Switch service " "Send messages " "Dashboard"
|
||
) # TODO: set sidebar variables in common test module
|
||
|
||
page = client_request.get(
|
||
"main.view_template",
|
||
service_id=mock_get_service.return_value["id"],
|
||
template_id=fake_uuid,
|
||
_test_page_title=False,
|
||
)
|
||
|
||
assert normalize_spaces(
|
||
page.select_one("header + .grid-container").text
|
||
).startswith(normalize_spaces(expected_page_text))
|