Merge pull request #1129 from GSA/1114-reviseexpand-on-recent-batch-table-on-the-dashboard-page

Revise/expand on "Recent Batch" table on the dashboard page.
This commit is contained in:
Carlo Costino
2024-01-26 15:03:08 -05:00
committed by GitHub
8 changed files with 232 additions and 238 deletions

View File

@@ -71,49 +71,32 @@ FAKE_ONE_OFF_NOTIFICATION = {
"total": 1,
}
MOCK_ONE_OFF_JOB = {
"data": {
"api_key": "mocked_api_key",
"billable_units": 1,
"carrier": "mocked_carrier",
"client_reference": "mocked_client_reference",
"created_at": "2024-01-04T20:43:52+00:00",
"created_by": {
"email_address": "mocked_email@example.com",
"id": "mocked_user_id",
"name": "mocked_user",
},
"document_download_count": None,
"id": "mocked_notification_id",
"international": False,
"job": {"id": "mocked_job_id", "original_file_name": "mocked_file.txt"},
"job_row_number": 0,
"key_name": "mocked_key_name",
"key_type": "normal",
"normalised_to": "+12133166548",
"notification_type": "sms",
"personalisation": {"phonenumber": "+12133166548"},
"phone_prefix": "1",
"provider_response": "mocked_provider_response",
"rate_multiplier": 1.0,
"reference": "mocked_reference",
"reply_to_text": "mocked_reply_text",
"sent_at": "2024-01-04T20:43:53+00:00",
"sent_by": "mocked_sender",
"service": "mocked_service_id",
"status": "sending",
"template": {
"content": "((day of week)) and ((fave color))",
"id": "bd9caa7e-00ee-4c5a-839e-10ae1a7e6f73",
"name": "personalized",
"redact_personalisation": False,
"subject": None,
MOCK_JOBS = {
"data": [
{
"archived": False,
"created_at": "2024-01-04T20:43:52+00:00",
"created_by": {
"id": "mocked_user_id",
"name": "mocked_user",
},
"id": "mocked_notification_id",
"job_status": "finished",
"notification_count": 1,
"original_file_name": "mocked_file.csv",
"processing_finished": "2024-01-25T23:02:25+00:00",
"processing_started": "2024-01-25T23:02:24+00:00",
"scheduled_for": None,
"service": "21b3ee3d-1cb0-4666-bfa0-9c5ac26d3fe3",
"service_name": {"name": "Mock Texting Service"},
"statistics": [{"count": 1, "status": "sending"}],
"template": "6a456418-498c-4c86-b0cd-9403c14a216c",
"template_name": "Mock Template Name",
"template_type": "sms",
"version": 1,
},
"to": "+12133166548",
"updated_at": "2024-01-04T20:43:53+00:00",
}
"template_version": 3,
"updated_at": "2024-01-25T23:02:25+00:00",
}
]
}
@@ -309,7 +292,7 @@ def test_accepting_invite_removes_invite_from_session(
sample_invite["email_address"] = user["email_address"]
client_request.login(user)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -725,7 +708,7 @@ def test_new_invited_user_verifies_and_added_to_service(
token="thisisnotarealtoken",
_expected_redirect=url_for("main.register_from_invite"),
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,

View File

@@ -85,49 +85,32 @@ FAKE_ONE_OFF_NOTIFICATION = {
"total": 1,
}
MOCK_ONE_OFF_JOB = {
"data": {
"api_key": "mocked_api_key",
"billable_units": 1,
"carrier": "mocked_carrier",
"client_reference": "mocked_client_reference",
"created_at": "2024-01-04T20:43:52+00:00",
"created_by": {
"email_address": "mocked_email@example.com",
"id": "mocked_user_id",
"name": "mocked_user",
},
"document_download_count": None,
"id": "mocked_notification_id",
"international": False,
"job": {"id": "mocked_job_id", "original_file_name": "mocked_file.txt"},
"job_row_number": 0,
"key_name": "mocked_key_name",
"key_type": "normal",
"normalised_to": "+12133166548",
"notification_type": "sms",
"personalisation": {"phonenumber": "+12133166548"},
"phone_prefix": "1",
"provider_response": "mocked_provider_response",
"rate_multiplier": 1.0,
"reference": "mocked_reference",
"reply_to_text": "mocked_reply_text",
"sent_at": "2024-01-04T20:43:53+00:00",
"sent_by": "mocked_sender",
"service": "mocked_service_id",
"status": "sending",
"template": {
"content": "((day of week)) and ((fave color))",
"id": "bd9caa7e-00ee-4c5a-839e-10ae1a7e6f73",
"name": "personalized",
"redact_personalisation": False,
"subject": None,
MOCK_JOBS = {
"data": [
{
"archived": False,
"created_at": "2024-01-04T20:43:52+00:00",
"created_by": {
"id": "mocked_user_id",
"name": "mocked_user",
},
"id": "mocked_notification_id",
"job_status": "finished",
"notification_count": 1,
"original_file_name": "mocked_file.csv",
"processing_finished": "2024-01-25T23:02:25+00:00",
"processing_started": "2024-01-25T23:02:24+00:00",
"scheduled_for": None,
"service": "21b3ee3d-1cb0-4666-bfa0-9c5ac26d3fe3",
"service_name": {"name": "Mock Texting Service"},
"statistics": [{"count": 1, "status": "sending"}],
"template": "6a456418-498c-4c86-b0cd-9403c14a216c",
"template_name": "Mock Template Name",
"template_type": "sms",
"version": 1,
},
"to": "+12133166548",
"updated_at": "2024-01-04T20:43:53+00:00",
}
"template_version": 3,
"updated_at": "2024-01-25T23:02:25+00:00",
}
]
}
stub_template_stats = [
@@ -218,7 +201,7 @@ def test_get_started(
"app.template_statistics_client.get_template_statistics_for_service",
return_value=copy.deepcopy(stub_template_stats),
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -248,7 +231,7 @@ def test_get_started_is_hidden_once_templates_exist(
"app.template_statistics_client.get_template_statistics_for_service",
return_value=copy.deepcopy(stub_template_stats),
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -275,7 +258,7 @@ def test_inbound_messages_not_visible_to_service_without_permissions(
mock_get_inbound_sms_summary,
):
service_one["permissions"] = []
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -303,7 +286,6 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_messages(
mock_get_inbound_sms_summary,
):
service_one["permissions"] = ["inbound_sms"]
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -312,7 +294,8 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_messages(
"main.service_dashboard",
service_id=SERVICE_ONE_ID,
)
mock_get_jobs.assert_called_once_with(SERVICE_ONE_ID)
mock_get_jobs.assert_called_with(SERVICE_ONE_ID)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
banner = page.select("a.banner-dashboard")[1]
assert (
normalize_spaces(banner.text)
@@ -335,7 +318,6 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_no_messages(
mock_get_inbound_sms_summary_with_no_messages,
):
service_one["permissions"] = ["inbound_sms"]
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -344,7 +326,8 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_no_messages(
"main.service_dashboard",
service_id=SERVICE_ONE_ID,
)
mock_get_jobs.assert_called_once_with(SERVICE_ONE_ID)
mock_get_jobs.assert_called_with(SERVICE_ONE_ID)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
banner = page.select("a.banner-dashboard")[1]
assert normalize_spaces(banner.text) == "0 text messages received"
assert banner["href"] == url_for("main.inbox", service_id=SERVICE_ONE_ID)
@@ -585,7 +568,7 @@ def test_should_show_recent_templates_on_dashboard(
"app.template_statistics_client.get_template_statistics_for_service",
return_value=copy.deepcopy(stub_template_stats),
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -642,7 +625,7 @@ def test_should_not_show_recent_templates_on_dashboard_if_only_one_template_used
"app.template_statistics_client.get_template_statistics_for_service",
return_value=stats,
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -782,7 +765,6 @@ def test_should_show_upcoming_jobs_on_dashboard(
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -792,7 +774,8 @@ def test_should_show_upcoming_jobs_on_dashboard(
service_id=SERVICE_ONE_ID,
)
mock_get_jobs.assert_called_once_with(SERVICE_ONE_ID)
mock_get_jobs.assert_called_with(SERVICE_ONE_ID)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mock_get_scheduled_job_stats.assert_called_once_with(SERVICE_ONE_ID)
assert normalize_spaces(page.select_one("main h2").text) == ("In the next few days")
@@ -824,7 +807,7 @@ def test_should_not_show_upcoming_jobs_on_dashboard_if_count_is_0(
"soonest_scheduled_for": None,
},
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -850,7 +833,7 @@ def test_should_not_show_upcoming_jobs_on_dashboard_if_service_has_no_jobs(
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -904,7 +887,7 @@ def test_correct_font_size_for_big_numbers(
service_one["permissions"] = permissions
mocker.patch("app.main.views.dashboard.get_dashboard_totals", return_value=totals)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -938,7 +921,6 @@ def test_should_not_show_jobs_on_dashboard_for_users_with_uploads_page(
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -947,7 +929,8 @@ def test_should_not_show_jobs_on_dashboard_for_users_with_uploads_page(
"main.service_dashboard",
service_id=SERVICE_ONE_ID,
)
mock_get_jobs.assert_called_once_with(SERVICE_ONE_ID)
mock_get_jobs.assert_called_with(SERVICE_ONE_ID)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
for filename in {
"export 1/1/2016.xls",
"all email addresses.xlsx",
@@ -1209,7 +1192,7 @@ def test_menu_send_messages(
):
service_one["permissions"] = ["email", "sms"]
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1246,7 +1229,7 @@ def test_menu_manage_service(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1283,7 +1266,7 @@ def test_menu_main_settings(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1319,7 +1302,7 @@ def test_menu_manage_api_keys(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1359,7 +1342,7 @@ def test_menu_all_services_for_platform_admin_user(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1404,7 +1387,7 @@ def test_route_for_service_permissions(
mocker.patch(
"app.service_api_client.get_global_notification_count", side_effect=_get
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1460,7 +1443,7 @@ def test_service_dashboard_updates_gets_dashboard_totals(
"sms": {"requested": 456, "delivered": 0, "failed": 0},
},
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1586,7 +1569,7 @@ def test_org_breadcrumbs_do_not_show_if_service_has_no_org(
mock_get_annual_usage_for_service,
mock_get_free_sms_fragment_limit,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1653,7 +1636,7 @@ def test_org_breadcrumbs_show_if_user_is_a_member_of_the_services_org(
id_=ORGANISATION_ID,
),
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1689,7 +1672,7 @@ def test_org_breadcrumbs_do_not_show_if_user_is_a_member_of_the_services_org_but
)
mocker.patch("app.models.service.Organization")
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1727,7 +1710,7 @@ def test_org_breadcrumbs_show_if_user_is_platform_admin(
),
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1763,7 +1746,7 @@ def test_breadcrumb_shows_if_service_is_suspended(
"app.service_api_client.get_service", return_value={"data": service_one_json}
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1797,7 +1780,7 @@ def test_service_dashboard_shows_usage(
"count": 500,
},
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1840,7 +1823,7 @@ def test_service_dashboard_shows_free_allowance(
}
],
)
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1864,7 +1847,7 @@ def test_service_dashboard_shows_batched_jobs(
mock_get_annual_usage_for_service,
mock_get_free_sms_fragment_limit,
):
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,

View File

@@ -57,49 +57,32 @@ FAKE_ONE_OFF_NOTIFICATION = {
"total": 1,
}
MOCK_ONE_OFF_JOB = {
"data": {
"api_key": "mocked_api_key",
"billable_units": 1,
"carrier": "mocked_carrier",
"client_reference": "mocked_client_reference",
"created_at": "2024-01-04T20:43:52+00:00",
"created_by": {
"email_address": "mocked_email@example.com",
"id": "mocked_user_id",
"name": "mocked_user",
},
"document_download_count": None,
"id": "mocked_notification_id",
"international": False,
"job": {"id": "mocked_job_id", "original_file_name": "mocked_file.txt"},
"job_row_number": 0,
"key_name": "mocked_key_name",
"key_type": "normal",
"normalised_to": "+12133166548",
"notification_type": "sms",
"personalisation": {"phonenumber": "+12133166548"},
"phone_prefix": "1",
"provider_response": "mocked_provider_response",
"rate_multiplier": 1.0,
"reference": "mocked_reference",
"reply_to_text": "mocked_reply_text",
"sent_at": "2024-01-04T20:43:53+00:00",
"sent_by": "mocked_sender",
"service": "mocked_service_id",
"status": "sending",
"template": {
"content": "((day of week)) and ((fave color))",
"id": "bd9caa7e-00ee-4c5a-839e-10ae1a7e6f73",
"name": "personalized",
"redact_personalisation": False,
"subject": None,
MOCK_JOBS = {
"data": [
{
"archived": False,
"created_at": "2024-01-04T20:43:52+00:00",
"created_by": {
"id": "mocked_user_id",
"name": "mocked_user",
},
"id": "mocked_notification_id",
"job_status": "finished",
"notification_count": 1,
"original_file_name": "mocked_file.csv",
"processing_finished": "2024-01-25T23:02:25+00:00",
"processing_started": "2024-01-25T23:02:24+00:00",
"scheduled_for": None,
"service": "21b3ee3d-1cb0-4666-bfa0-9c5ac26d3fe3",
"service_name": {"name": "Mock Texting Service"},
"statistics": [{"count": 1, "status": "sending"}],
"template": "6a456418-498c-4c86-b0cd-9403c14a216c",
"template_name": "Mock Template Name",
"template_type": "sms",
"version": 1,
},
"to": "+12133166548",
"updated_at": "2024-01-04T20:43:53+00:00",
}
"template_version": 3,
"updated_at": "2024-01-25T23:02:25+00:00",
}
]
}
@@ -139,7 +122,7 @@ def test_sign_out_user(
with client_request.session_transaction() as session:
assert session.get("user_id") is not None
# Check we are logged in
mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",