From 08cb4a25761d532b93a24869b067533b2a1bc6b2 Mon Sep 17 00:00:00 2001 From: Ben Thorner Date: Fri, 26 Feb 2021 18:19:47 +0000 Subject: [PATCH] Simplify tests for excluded navigation endpoints Previously each navigation class had a list of endpoint to "exclude", which was only used in tests to ensure that all endpoints in the app were covered: either they are present in navigation, or excluded. However, over time the "exclude" lists have grown long and repetitive, and maintaining each of them individually adds extra work [1][2]. This switches to a more DRY approach, where the list of excluded endpoints is defined once, close to the single point of use in the test. Note the resulting test is _slightly_ less prescriptive, as it will now pass if an endpoint exist one in navigation, even if it should also exist in another. This seems a reasonable compromise. [1]: https://github.com/alphagov/notifications-admin/pull/3788/files#r572809972 [2]: https://github.com/alphagov/notifications-admin/pull/3794/files#diff-39387df3a9f89b313976957e7b5457be20deab1017b2d895541b142b957f1972 --- app/navigation.py | 1071 +--------------------------------- tests/app/test_navigation.py | 371 ++++++++++-- 2 files changed, 339 insertions(+), 1103 deletions(-) diff --git a/app/navigation.py b/app/navigation.py index 28ce97c59..9c3abef18 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -6,14 +6,13 @@ from flask import request class Navigation: mapping = {} - exclude = {} selected_class = "selected" def __init__(self): self.mapping = { navigation: { # if not specified, assume endpoints are all in the `main` blueprint. - self._get_endpoint_with_blueprint(endpoint) for endpoint in endpoints + self.get_endpoint_with_blueprint(endpoint) for endpoint in endpoints } for navigation, endpoints in self.mapping.items() } @@ -24,19 +23,13 @@ class Navigation: for navigation_item, endpoints in self.mapping.items() ))) - @property - def endpoints_without_navigation(self): - return tuple( - self._get_endpoint_with_blueprint(endpoint) for endpoint in self.exclude - ) + ('static', 'status.show_status', 'metrics') - def is_selected(self, navigation_item): if request.endpoint in self.mapping[navigation_item]: return " " + self.selected_class return '' @staticmethod - def _get_endpoint_with_blueprint(endpoint): + def get_endpoint_with_blueprint(endpoint): return endpoint if '.' in endpoint else 'main.{}'.format(endpoint) @@ -123,265 +116,6 @@ class HeaderNavigation(Navigation): }, } - exclude = { - 'accept_invite', - 'accept_org_invite', - 'accessibility_statement', - 'action_blocked', - 'add_data_retention', - 'add_organisation', - 'add_organisation_from_gp_service', - 'add_organisation_from_nhs_local_service', - 'add_service', - 'add_service_template', - 'api_callbacks', - 'api_documentation', - 'api_integration', - 'api_keys', - 'archive_service', - 'begin_tour', - 'branding_request', - 'callbacks', - 'cancel_invited_org_user', - 'cancel_invited_user', - 'cancel_job', - 'cancel_letter', - 'cancel_letter_job', - 'check_and_resend_text_code', - 'check_and_resend_verification_code', - 'check_messages', - 'no_cookie.check_messages_preview', - 'check_notification', - 'no_cookie.check_notification_preview', - 'check_tour_notification', - 'choose_account', - 'choose_from_contact_list', - 'choose_service', - 'choose_template', - 'choose_template_to_copy', - 'confirm_edit_organisation_name', - 'confirm_edit_user_email', - 'confirm_edit_user_mobile_number', - 'confirm_redact_template', - 'count_content_length', - 'conversation', - 'conversation_reply', - 'conversation_reply_with_template', - 'conversation_updates', - 'cookies', - 'copy_template', - 'create_api_key', - 'data_retention', - 'delete_service_template', - 'delete_template_folder', - 'delivery_and_failure', - 'delivery_status_callback', - 'design_content', - 'download_contact_list', - 'download_notifications_csv', - 'edit_data_retention', - 'edit_organisation_agreement', - 'edit_organisation_billing_details', - 'edit_organisation_crown_status', - 'edit_organisation_domains', - 'edit_organisation_email_branding', - 'edit_organisation_letter_branding', - 'edit_organisation_go_live_notes', - 'edit_organisation_name', - 'edit_organisation_notes', - 'edit_organisation_type', - 'edit_provider', - 'edit_service_billing_details', - 'edit_service_notes', - 'edit_service_template', - 'edit_template_postage', - 'edit_user_org_permissions', - 'edit_user_email', - 'edit_user_mobile_number', - 'edit_user_permissions', - 'email_not_received', - 'email_template', - 'error', - 'estimate_usage', - 'forgot_password', - 'get_example_csv', - 'get_notifications_as_json', - 'get_started', - 'get_started_old', - 'go_to_dashboard_after_tour', - 'guidance_index', - 'branding_and_customisation', - 'create_and_send_messages', - 'edit_and_format_messages', - 'send_files_by_email', - 'upload_a_letter', - 'letter_specification', - 'history', - 'inbound_sms_admin', - 'inbox', - 'inbox_download', - 'inbox_updates', - 'index', - 'information_risk_management', - 'information_security', - 'invite_org_user', - 'invite_user', - 'no_cookie.letter_branding_preview_image', - 'letter_spec', - 'letter_template', - 'link_service_to_organisation', - 'manage_org_users', - 'manage_template_folder', - 'manage_users', - 'monthly', - 'new_password', - 'old_integration_testing', - 'old_roadmap', - 'old_service_dashboard', - 'old_terms', - 'old_using_notify', - 'organisation_dashboard', - 'organisation_trial_mode_services', - 'organisation_settings', - 'organisation_preview_email_branding', - 'organisation_preview_letter_branding', - 'performance', - 'privacy', - 'public_agreement', - 'public_download_agreement', - 'received_text_messages_callback', - 'redact_template', - 'register', - 'register_from_invite', - 'register_from_org_invite', - 'registration_continue', - 'remove_user_from_organisation', - 'remove_user_from_service', - 'request_to_go_live', - 'resend_email_link', - 'resend_email_verification', - 'resume_service', - 'returned_letter_summary', - 'returned_letters', - 'returned_letters_report', - 'revoke_api_key', - 'send_messages', - 'send_notification', - 'send_one_off', - 'send_one_off_letter_address', - 'send_one_off_step', - 'send_one_off_to_myself', - 'no_cookie.send_test_preview', - 'send_from_contact_list', - 'send_uploaded_letter', - 'service_add_email_reply_to', - 'service_add_letter_contact', - 'service_add_sms_sender', - 'service_agreement', - 'service_accept_agreement', - 'service_confirm_agreement', - 'service_confirm_delete_email_reply_to', - 'service_confirm_delete_letter_contact', - 'service_confirm_delete_sms_sender', - 'service_dashboard', - 'service_dashboard_updates', - 'service_delete_email_reply_to', - 'service_delete_letter_contact', - 'service_delete_sms_sender', - 'service_download_agreement', - 'service_edit_email_reply_to', - 'service_edit_letter_contact', - 'service_edit_sms_sender', - 'service_email_reply_to', - 'service_letter_contact_details', - 'service_make_blank_default_letter_contact', - 'service_name_change', - 'service_name_change_confirm', - 'service_preview_email_branding', - 'service_preview_letter_branding', - 'service_set_auth_type', - 'service_set_channel', - 'send_files_by_email_contact_details', - 'service_set_broadcast_account_type', - 'service_set_email_branding', - 'service_set_inbound_number', - 'service_set_inbound_sms', - 'service_set_international_letters', - 'service_set_international_sms', - 'service_set_letter_branding', - 'service_set_letters', - 'service_set_reply_to_email', - 'service_set_sms_prefix', - 'service_settings', - 'service_sms_senders', - 'service_switch_count_as_live', - 'service_switch_live', - 'service_set_permission', - 'service_verify_reply_to_address', - 'service_verify_reply_to_address_updates', - 'services_or_dashboard', - 'set_free_sms_allowance', - 'set_message_limit', - 'set_rate_limit', - 'set_sender', - 'set_template_sender', - 'show_accounts_or_dashboard', - 'sign_out', - 'start_job', - 'submit_request_to_go_live', - 'template_history', - 'template_usage', - 'tour_step', - 'trial_mode', - 'upload_contact_list', - 'check_contact_list', - 'save_contact_list', - 'contact_list', - 'delete_contact_list', - 'upload_letter', - 'uploaded_letter_preview', - 'uploaded_letters', - 'uploads', - 'usage', - 'view_job', - 'view_job_csv', - 'view_job_updates', - 'view_jobs', - 'view_letter_notification_as_preview', - 'no_cookie.view_letter_template_preview', - 'view_letter_upload_as_preview', - 'view_notification', - 'view_notification_updates', - 'view_notifications', - 'view_notifications_csv', - 'view_template', - 'view_template_version', - 'no_cookie.view_template_version_preview', - 'view_template_versions', - 'guest_list', - 'old_guest_list', - 'who_can_use_notify', - 'who_its_for', - 'broadcast_tour', - 'broadcast_dashboard', - 'broadcast_dashboard_previous', - 'broadcast_dashboard_updates', - 'broadcast', - 'preview_broadcast_areas', - 'choose_broadcast_library', - 'choose_broadcast_area', - 'choose_broadcast_sub_area', - 'remove_broadcast_area', - 'preview_broadcast_message', - 'view_current_broadcast', - 'view_previous_broadcast', - 'approve_broadcast_message', - 'reject_broadcast_message', - 'cancel_broadcast_message', - 'new_broadcast', - 'write_new_broadcast', - } - # header HTML now comes from GOVUK Frontend so requires a boolean, not an attribute def is_selected(self, navigation_item): return request.endpoint in self.mapping[navigation_item] @@ -538,201 +272,6 @@ class MainNavigation(Navigation): }, } - exclude = { - 'accept_invite', - 'accept_org_invite', - 'accessibility_statement', - 'add_data_retention', - 'add_organisation', - 'add_service', - 'archive_service', - 'archive_user', - 'bat_phone', - 'begin_tour', - 'callbacks', - 'cancel_invited_org_user', - 'cancel_invited_user', - 'cancel_job', - 'cancel_letter', - 'cancel_letter_job', - 'check_and_resend_text_code', - 'check_and_resend_verification_code', - 'no_cookie.check_messages_preview', - 'no_cookie.check_notification_preview', - 'check_tour_notification', - 'choose_account', - 'choose_service', - 'clear_cache', - 'confirm_edit_organisation_name', - 'count_content_length', - 'conversation_reply_with_template', - 'conversation_updates', - 'cookies', - 'create_email_branding', - 'create_letter_branding', - 'data_retention', - 'delete_template_folder', - 'delivery_and_failure', - 'design_content', - 'documentation', - 'download_contact_list', - 'download_notifications_csv', - 'edit_data_retention', - 'edit_organisation_agreement', - 'edit_organisation_billing_details', - 'edit_organisation_crown_status', - 'edit_organisation_email_branding', - 'edit_organisation_domains', - 'edit_organisation_go_live_notes', - 'edit_organisation_letter_branding', - 'edit_organisation_name', - 'edit_organisation_notes', - 'edit_organisation_type', - 'edit_provider', - 'edit_service_billing_details', - 'edit_service_notes', - 'edit_sms_provider_ratio', - 'edit_user_org_permissions', - 'email_branding', - 'email_not_received', - 'email_template', - 'error', - 'features', - 'features_email', - 'features_letters', - 'features_sms', - 'feedback', - 'find_services_by_name', - 'find_users_by_email', - 'forgot_password', - 'get_example_csv', - 'get_notifications_as_json', - 'get_started', - 'get_started_old', - 'go_to_dashboard_after_tour', - 'guidance_index', - 'branding_and_customisation', - 'create_and_send_messages', - 'edit_and_format_messages', - 'send_files_by_email', - 'upload_a_letter', - 'letter_specification', - 'history', - 'how_to_pay', - 'inbound_sms_admin', - 'inbox_download', - 'inbox_updates', - 'index', - 'information_risk_management', - 'information_security', - 'integration_testing', - 'invite_org_user', - 'letter_branding', - 'no_cookie.letter_branding_preview_image', - 'live_services', - 'live_services_csv', - 'letter_spec', - 'letter_template', - 'message_status', - 'manage_org_users', - 'new_password', - 'notifications_sent_by_service', - 'old_integration_testing', - 'old_roadmap', - 'old_service_dashboard', - 'old_terms', - 'old_using_notify', - 'organisation_dashboard', - 'organisation_trial_mode_services', - 'organisation_preview_email_branding', - 'organisation_preview_letter_branding', - 'organisation_settings', - 'organisations', - 'performance', - 'platform_admin', - 'platform_admin_list_complaints', - 'platform_admin_reports', - 'platform_admin_returned_letters', - 'platform_admin_splash_page', - 'pricing', - 'privacy', - 'public_agreement', - 'public_download_agreement', - 'redact_template', - 'register', - 'register_from_invite', - 'register_from_org_invite', - 'registration_continue', - 'remove_user_from_organisation', - 'resend_email_link', - 'resend_email_verification', - 'resume_service', - 'returned_letters_report', - 'revalidate_email_sent', - 'roadmap', - 'security', - 'send_notification', - 'send_from_contact_list', - 'send_uploaded_letter', - 'service_dashboard_updates', - 'service_delete_email_reply_to', - 'service_delete_letter_contact', - 'service_delete_sms_sender', - 'service_download_agreement', - 'service_switch_count_as_live', - 'service_switch_live', - 'service_set_permission', - 'services_or_dashboard', - 'show_accounts_or_dashboard', - 'sign_in', - 'sign_out', - 'start_job', - 'support', - 'support_public', - 'suspend_service', - 'template_history', - 'terms', - 'thanks', - 'tour_step', - 'triage', - 'trial_mode', - 'trial_mode_new', - 'trial_services', - 'two_factor', - 'two_factor_email', - 'two_factor_email_sent', - 'two_factor_email_interstitial', - 'update_email_branding', - 'update_letter_branding', - 'usage_for_all_services', - 'user_information', - 'user_profile', - 'user_profile_email', - 'user_profile_email_authenticate', - 'user_profile_email_confirm', - 'user_profile_mobile_number', - 'user_profile_mobile_number_authenticate', - 'user_profile_mobile_number_confirm', - 'user_profile_name', - 'user_profile_password', - 'user_profile_disable_platform_admin_view', - 'using_notify', - 'verify', - 'verify_email', - 'view_job_csv', - 'view_job_updates', - 'view_letter_notification_as_preview', - 'no_cookie.view_letter_template_preview', - 'view_letter_upload_as_preview', - 'view_notification_updates', - 'view_notifications_csv', - 'view_provider', - 'view_providers', - 'no_cookie.view_template_version_preview', - 'who_can_use_notify', - 'who_its_for', - } - class CaseworkNavigation(Navigation): @@ -770,309 +309,6 @@ class CaseworkNavigation(Navigation): }, } - exclude = { - 'accept_invite', - 'accept_org_invite', - 'accessibility_statement', - 'action_blocked', - 'add_data_retention', - 'add_organisation', - 'add_organisation_from_gp_service', - 'add_organisation_from_nhs_local_service', - 'add_service', - 'add_service_template', - 'api_callbacks', - 'api_documentation', - 'api_integration', - 'api_keys', - 'archive_service', - 'archive_user', - 'bat_phone', - 'begin_tour', - 'branding_request', - 'callbacks', - 'cancel_invited_org_user', - 'cancel_invited_user', - 'cancel_job', - 'cancel_letter', - 'cancel_letter_job', - 'check_and_resend_text_code', - 'check_and_resend_verification_code', - 'check_messages', - 'no_cookie.check_messages_preview', - 'check_notification', - 'no_cookie.check_notification_preview', - 'check_tour_notification', - 'choose_account', - 'choose_service', - 'choose_template_to_copy', - 'clear_cache', - 'count_content_length', - 'edit_organisation_agreement', - 'edit_organisation_billing_details', - 'edit_organisation_crown_status', - 'edit_organisation_domains', - 'edit_organisation_email_branding', - 'edit_organisation_go_live_notes', - 'edit_organisation_letter_branding', - 'edit_organisation_notes', - 'confirm_edit_organisation_name', - 'confirm_edit_user_email', - 'confirm_edit_user_mobile_number', - 'confirm_redact_template', - 'conversation', - 'conversation_reply', - 'conversation_reply_with_template', - 'conversation_updates', - 'cookies', - 'copy_template', - 'create_api_key', - 'create_email_branding', - 'create_letter_branding', - 'data_retention', - 'delete_service_template', - 'delete_template_folder', - 'delivery_and_failure', - 'delivery_status_callback', - 'design_content', - 'documentation', - 'download_contact_list', - 'download_notifications_csv', - 'edit_data_retention', - 'edit_organisation_agreement', - 'edit_organisation_crown_status', - 'edit_organisation_domains', - 'edit_organisation_name', - 'edit_organisation_type', - 'edit_provider', - 'edit_service_billing_details', - 'edit_service_notes', - 'edit_sms_provider_ratio', - 'edit_service_template', - 'edit_template_postage', - 'edit_user_email', - 'edit_user_mobile_number', - 'edit_user_org_permissions', - 'edit_user_permissions', - 'email_branding', - 'email_not_received', - 'email_template', - 'error', - 'estimate_usage', - 'features', - 'features_email', - 'features_letters', - 'features_sms', - 'feedback', - 'find_services_by_name', - 'find_users_by_email', - 'forgot_password', - 'get_example_csv', - 'get_notifications_as_json', - 'get_started', - 'get_started_old', - 'go_to_dashboard_after_tour', - 'guidance_index', - 'branding_and_customisation', - 'create_and_send_messages', - 'edit_and_format_messages', - 'send_files_by_email', - 'upload_a_letter', - 'letter_specification', - 'history', - 'how_to_pay', - 'inbound_sms_admin', - 'inbox_download', - 'inbox_updates', - 'inbox', - 'index', - 'information_risk_management', - 'information_security', - 'integration_testing', - 'invite_org_user', - 'invite_user', - 'no_cookie.letter_branding_preview_image', - 'letter_branding', - 'letter_spec', - 'letter_template', - 'link_service_to_organisation', - 'live_services', - 'live_services_csv', - 'manage_org_users', - 'manage_template_folder', - 'manage_users', - 'message_status', - 'monthly', - 'new_password', - 'notifications_sent_by_service', - 'old_integration_testing', - 'old_roadmap', - 'old_service_dashboard', - 'old_terms', - 'old_using_notify', - 'organisation_dashboard', - 'organisation_trial_mode_services', - 'organisation_preview_email_branding', - 'organisation_preview_letter_branding', - 'organisation_settings', - 'organisations', - 'performance', - 'platform_admin_list_complaints', - 'platform_admin_reports', - 'platform_admin_returned_letters', - 'platform_admin', - 'platform_admin_splash_page', - 'pricing', - 'privacy', - 'public_agreement', - 'public_download_agreement', - 'received_text_messages_callback', - 'redact_template', - 'register_from_invite', - 'register_from_org_invite', - 'register', - 'registration_continue', - 'remove_user_from_organisation', - 'remove_user_from_service', - 'request_to_go_live', - 'resend_email_link', - 'resend_email_verification', - 'resume_service', - 'returned_letter_summary', - 'returned_letters', - 'returned_letters_report', - 'revalidate_email_sent', - 'revoke_api_key', - 'roadmap', - 'security', - 'send_messages', - 'send_notification', - 'no_cookie.send_test_preview', - 'send_from_contact_list', - 'send_uploaded_letter', - 'service_add_email_reply_to', - 'service_add_letter_contact', - 'service_add_sms_sender', - 'service_agreement', - 'service_accept_agreement', - 'service_confirm_agreement', - 'service_confirm_delete_email_reply_to', - 'service_confirm_delete_letter_contact', - 'service_confirm_delete_sms_sender', - 'service_dashboard', - 'service_dashboard_updates', - 'service_delete_email_reply_to', - 'service_delete_letter_contact', - 'service_delete_sms_sender', - 'service_download_agreement', - 'service_edit_email_reply_to', - 'service_edit_letter_contact', - 'service_edit_sms_sender', - 'service_email_reply_to', - 'service_letter_contact_details', - 'service_make_blank_default_letter_contact', - 'service_name_change', - 'service_name_change_confirm', - 'service_preview_email_branding', - 'service_preview_letter_branding', - 'service_set_auth_type', - 'service_set_channel', - 'send_files_by_email_contact_details', - 'service_set_broadcast_account_type', - 'service_set_email_branding', - 'service_set_inbound_number', - 'service_set_inbound_sms', - 'service_set_international_letters', - 'service_set_international_sms', - 'service_set_letters', - 'service_set_reply_to_email', - 'service_set_sms_prefix', - 'service_settings', - 'service_sms_senders', - 'service_switch_count_as_live', - 'service_switch_live', - 'service_set_permission', - 'service_verify_reply_to_address', - 'service_verify_reply_to_address_updates', - 'services_or_dashboard', - 'set_free_sms_allowance', - 'set_message_limit', - 'set_rate_limit', - 'service_set_letter_branding', - 'set_sender', - 'set_template_sender', - 'show_accounts_or_dashboard', - 'sign_in', - 'sign_out', - 'start_job', - 'submit_request_to_go_live', - 'support', - 'support_public', - 'suspend_service', - 'template_history', - 'template_usage', - 'terms', - 'thanks', - 'tour_step', - 'triage', - 'trial_mode', - 'trial_mode_new', - 'trial_services', - 'two_factor', - 'two_factor_email', - 'two_factor_email_sent', - 'two_factor_email_interstitial', - 'update_email_branding', - 'update_letter_branding', - 'usage', - 'usage_for_all_services', - 'user_information', - 'user_profile', - 'user_profile_email', - 'user_profile_email_authenticate', - 'user_profile_email_confirm', - 'user_profile_mobile_number', - 'user_profile_mobile_number_authenticate', - 'user_profile_mobile_number_confirm', - 'user_profile_name', - 'user_profile_password', - 'user_profile_disable_platform_admin_view', - 'using_notify', - 'verify', - 'verify_email', - 'view_job_csv', - 'view_job_updates', - 'view_letter_notification_as_preview', - 'no_cookie.view_letter_template_preview', - 'view_letter_upload_as_preview', - 'view_notification_updates', - 'view_notifications_csv', - 'view_provider', - 'view_providers', - 'view_template', - 'view_template_version', - 'no_cookie.view_template_version_preview', - 'view_template_versions', - 'guest_list', - 'old_guest_list', - 'who_can_use_notify', - 'who_its_for', - 'broadcast', - 'preview_broadcast_areas', - 'choose_broadcast_library', - 'choose_broadcast_area', - 'choose_broadcast_sub_area', - 'remove_broadcast_area', - 'preview_broadcast_message', - 'view_current_broadcast', - 'view_previous_broadcast', - 'approve_broadcast_message', - 'reject_broadcast_message', - 'cancel_broadcast_message', - 'new_broadcast', - 'write_new_broadcast', - } - class OrgNavigation(Navigation): @@ -1108,306 +344,3 @@ class OrgNavigation(Navigation): 'organisation_trial_mode_services', } } - - exclude = { - 'accept_invite', - 'accept_org_invite', - 'accessibility_statement', - 'action_blocked', - 'add_data_retention', - 'add_organisation', - 'add_organisation_from_gp_service', - 'add_organisation_from_nhs_local_service', - 'add_service', - 'add_service_template', - 'api_callbacks', - 'api_documentation', - 'api_integration', - 'api_keys', - 'archive_service', - 'archive_user', - 'bat_phone', - 'begin_tour', - 'branding_request', - 'callbacks', - 'cancel_invited_org_user', - 'cancel_invited_user', - 'cancel_job', - 'cancel_letter', - 'cancel_letter_job', - 'check_and_resend_text_code', - 'check_and_resend_verification_code', - 'check_messages', - 'no_cookie.check_messages_preview', - 'check_notification', - 'no_cookie.check_notification_preview', - 'check_tour_notification', - 'choose_account', - 'choose_from_contact_list', - 'choose_service', - 'choose_template', - 'choose_template_to_copy', - 'clear_cache', - 'confirm_edit_user_email', - 'confirm_edit_user_mobile_number', - 'confirm_redact_template', - 'count_content_length', - 'conversation', - 'conversation_reply', - 'conversation_reply_with_template', - 'conversation_updates', - 'cookies', - 'copy_template', - 'create_api_key', - 'create_email_branding', - 'create_letter_branding', - 'data_retention', - 'delete_service_template', - 'delete_template_folder', - 'delivery_and_failure', - 'delivery_status_callback', - 'design_content', - 'documentation', - 'download_contact_list', - 'download_notifications_csv', - 'edit_data_retention', - 'edit_provider', - 'edit_service_billing_details', - 'edit_service_notes', - 'edit_service_template', - 'edit_sms_provider_ratio', - 'edit_template_postage', - 'edit_user_email', - 'edit_user_mobile_number', - 'edit_user_permissions', - 'email_branding', - 'email_not_received', - 'email_template', - 'error', - 'estimate_usage', - 'features', - 'features_email', - 'features_letters', - 'features_sms', - 'feedback', - 'find_services_by_name', - 'find_users_by_email', - 'forgot_password', - 'get_example_csv', - 'get_notifications_as_json', - 'get_started', - 'get_started_old', - 'go_to_dashboard_after_tour', - 'guidance_index', - 'branding_and_customisation', - 'create_and_send_messages', - 'edit_and_format_messages', - 'send_files_by_email', - 'upload_a_letter', - 'letter_specification', - 'history', - 'how_to_pay', - 'inbound_sms_admin', - 'inbox', - 'inbox_download', - 'inbox_updates', - 'index', - 'information_risk_management', - 'information_security', - 'integration_testing', - 'invite_user', - 'letter_branding', - 'no_cookie.letter_branding_preview_image', - 'letter_spec', - 'letter_template', - 'link_service_to_organisation', - 'live_services', - 'live_services_csv', - 'manage_template_folder', - 'manage_users', - 'message_status', - 'monthly', - 'new_password', - 'notifications_sent_by_service', - 'old_integration_testing', - 'old_roadmap', - 'old_service_dashboard', - 'old_terms', - 'old_using_notify', - 'organisations', - 'performance', - 'platform_admin', - 'platform_admin_list_complaints', - 'platform_admin_reports', - 'platform_admin_returned_letters', - 'platform_admin_splash_page', - 'pricing', - 'privacy', - 'public_agreement', - 'public_download_agreement', - 'received_text_messages_callback', - 'redact_template', - 'register', - 'register_from_invite', - 'register_from_org_invite', - 'registration_continue', - 'remove_user_from_service', - 'request_to_go_live', - 'resend_email_link', - 'resend_email_verification', - 'resume_service', - 'returned_letter_summary', - 'returned_letters', - 'returned_letters_report', - 'revalidate_email_sent', - 'revoke_api_key', - 'roadmap', - 'security', - 'send_messages', - 'send_notification', - 'send_one_off', - 'send_one_off_letter_address', - 'send_one_off_step', - 'send_one_off_to_myself', - 'no_cookie.send_test_preview', - 'send_from_contact_list', - 'send_uploaded_letter', - 'service_add_email_reply_to', - 'service_add_letter_contact', - 'service_add_sms_sender', - 'service_agreement', - 'service_accept_agreement', - 'service_confirm_agreement', - 'service_confirm_delete_email_reply_to', - 'service_confirm_delete_letter_contact', - 'service_confirm_delete_sms_sender', - 'service_dashboard', - 'service_dashboard_updates', - 'service_delete_email_reply_to', - 'service_delete_letter_contact', - 'service_delete_sms_sender', - 'service_download_agreement', - 'service_edit_email_reply_to', - 'service_edit_letter_contact', - 'service_edit_sms_sender', - 'service_email_reply_to', - 'service_letter_contact_details', - 'service_make_blank_default_letter_contact', - 'service_name_change', - 'service_name_change_confirm', - 'service_preview_email_branding', - 'service_preview_letter_branding', - 'service_set_auth_type', - 'service_set_channel', - 'send_files_by_email_contact_details', - 'service_set_broadcast_account_type', - 'service_set_email_branding', - 'service_set_inbound_number', - 'service_set_inbound_sms', - 'service_set_international_letters', - 'service_set_international_sms', - 'service_set_letters', - 'service_set_reply_to_email', - 'service_set_sms_prefix', - 'service_settings', - 'service_sms_senders', - 'service_switch_count_as_live', - 'service_switch_live', - 'service_set_permission', - 'service_verify_reply_to_address', - 'service_verify_reply_to_address_updates', - 'services_or_dashboard', - 'set_free_sms_allowance', - 'set_message_limit', - 'set_rate_limit', - 'service_set_letter_branding', - 'set_sender', - 'set_template_sender', - 'show_accounts_or_dashboard', - 'sign_in', - 'sign_out', - 'start_job', - 'submit_request_to_go_live', - 'support', - 'support_public', - 'suspend_service', - 'template_history', - 'template_usage', - 'terms', - 'thanks', - 'tour_step', - 'triage', - 'trial_mode', - 'trial_mode_new', - 'trial_services', - 'two_factor', - 'two_factor_email', - 'two_factor_email_sent', - 'two_factor_email_interstitial', - 'update_email_branding', - 'update_letter_branding', - 'upload_contact_list', - 'check_contact_list', - 'save_contact_list', - 'contact_list', - 'delete_contact_list', - 'upload_letter', - 'uploaded_letter_preview', - 'uploaded_letters', - 'uploads', - 'usage', - 'usage_for_all_services', - 'user_information', - 'user_profile', - 'user_profile_email', - 'user_profile_email_authenticate', - 'user_profile_email_confirm', - 'user_profile_mobile_number', - 'user_profile_mobile_number_authenticate', - 'user_profile_mobile_number_confirm', - 'user_profile_name', - 'user_profile_password', - 'user_profile_disable_platform_admin_view', - 'using_notify', - 'verify', - 'verify_email', - 'view_job', - 'view_job_csv', - 'view_job_updates', - 'view_jobs', - 'view_letter_notification_as_preview', - 'no_cookie.view_letter_template_preview', - 'view_letter_upload_as_preview', - 'view_notification', - 'view_notification_updates', - 'view_notifications', - 'view_notifications_csv', - 'view_provider', - 'view_providers', - 'view_template', - 'view_template_version', - 'no_cookie.view_template_version_preview', - 'view_template_versions', - 'guest_list', - 'old_guest_list', - 'who_can_use_notify', - 'who_its_for', - 'broadcast_tour', - 'broadcast_dashboard', - 'broadcast_dashboard_previous', - 'broadcast_dashboard_updates', - 'broadcast', - 'preview_broadcast_areas', - 'choose_broadcast_library', - 'choose_broadcast_area', - 'choose_broadcast_sub_area', - 'remove_broadcast_area', - 'preview_broadcast_message', - 'view_current_broadcast', - 'view_previous_broadcast', - 'approve_broadcast_message', - 'reject_broadcast_message', - 'cancel_broadcast_message', - 'new_broadcast', - 'write_new_broadcast', - } diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py index 5d921b1f2..c0f370354 100644 --- a/tests/app/test_navigation.py +++ b/tests/app/test_navigation.py @@ -6,10 +6,334 @@ from app.navigation import ( CaseworkNavigation, HeaderNavigation, MainNavigation, + Navigation, OrgNavigation, ) from tests.conftest import ORGANISATION_ID, SERVICE_ONE_ID, normalize_spaces +EXCLUDED_ENDPOINTS = tuple(map(Navigation.get_endpoint_with_blueprint, { + 'accept_invite', + 'accept_org_invite', + 'accessibility_statement', + 'action_blocked', + 'add_data_retention', + 'add_organisation', + 'add_organisation_from_gp_service', + 'add_organisation_from_nhs_local_service', + 'add_service', + 'add_service_template', + 'api_callbacks', + 'api_documentation', + 'api_integration', + 'api_keys', + 'approve_broadcast_message', + 'archive_service', + 'archive_user', + 'bat_phone', + 'begin_tour', + 'branding_and_customisation', + 'branding_request', + 'broadcast', + 'broadcast_dashboard', + 'broadcast_dashboard_previous', + 'broadcast_dashboard_updates', + 'broadcast_tour', + 'callbacks', + 'cancel_broadcast_message', + 'cancel_invited_org_user', + 'cancel_invited_user', + 'cancel_job', + 'cancel_letter', + 'cancel_letter_job', + 'check_and_resend_text_code', + 'check_and_resend_verification_code', + 'check_contact_list', + 'check_messages', + 'check_notification', + 'check_tour_notification', + 'choose_account', + 'choose_broadcast_area', + 'choose_broadcast_library', + 'choose_broadcast_sub_area', + 'choose_from_contact_list', + 'choose_service', + 'choose_template', + 'choose_template_to_copy', + 'clear_cache', + 'confirm_edit_organisation_name', + 'confirm_edit_user_email', + 'confirm_edit_user_mobile_number', + 'confirm_redact_template', + 'contact_list', + 'conversation', + 'conversation_reply', + 'conversation_reply_with_template', + 'conversation_updates', + 'cookies', + 'copy_template', + 'count_content_length', + 'create_and_send_messages', + 'create_api_key', + 'create_email_branding', + 'create_letter_branding', + 'data_retention', + 'delete_contact_list', + 'delete_service_template', + 'delete_template_folder', + 'delivery_and_failure', + 'delivery_status_callback', + 'design_content', + 'documentation', + 'download_contact_list', + 'download_notifications_csv', + 'edit_and_format_messages', + 'edit_data_retention', + 'edit_organisation_agreement', + 'edit_organisation_billing_details', + 'edit_organisation_crown_status', + 'edit_organisation_domains', + 'edit_organisation_email_branding', + 'edit_organisation_go_live_notes', + 'edit_organisation_letter_branding', + 'edit_organisation_name', + 'edit_organisation_notes', + 'edit_organisation_type', + 'edit_provider', + 'edit_service_billing_details', + 'edit_service_notes', + 'edit_service_template', + 'edit_sms_provider_ratio', + 'edit_template_postage', + 'edit_user_email', + 'edit_user_mobile_number', + 'edit_user_org_permissions', + 'edit_user_permissions', + 'email_branding', + 'email_not_received', + 'email_template', + 'error', + 'estimate_usage', + 'features', + 'features_email', + 'features_letters', + 'features_sms', + 'feedback', + 'find_services_by_name', + 'find_users_by_email', + 'forgot_password', + 'get_example_csv', + 'get_notifications_as_json', + 'get_started', + 'get_started_old', + 'go_to_dashboard_after_tour', + 'guest_list', + 'guidance_index', + 'history', + 'how_to_pay', + 'inbound_sms_admin', + 'inbox', + 'inbox_download', + 'inbox_updates', + 'index', + 'information_risk_management', + 'information_security', + 'integration_testing', + 'invite_org_user', + 'invite_user', + 'letter_branding', + 'letter_spec', + 'letter_specification', + 'letter_template', + 'link_service_to_organisation', + 'live_services', + 'live_services_csv', + 'manage_org_users', + 'manage_template_folder', + 'manage_users', + 'message_status', + 'monthly', + 'new_broadcast', + 'new_password', + 'no_cookie.check_messages_preview', + 'no_cookie.check_notification_preview', + 'no_cookie.letter_branding_preview_image', + 'no_cookie.send_test_preview', + 'no_cookie.view_letter_template_preview', + 'no_cookie.view_template_version_preview', + 'notifications_sent_by_service', + 'old_guest_list', + 'old_integration_testing', + 'old_roadmap', + 'old_service_dashboard', + 'old_terms', + 'old_using_notify', + 'organisation_dashboard', + 'organisation_preview_email_branding', + 'organisation_preview_letter_branding', + 'organisation_settings', + 'organisation_trial_mode_services', + 'organisations', + 'performance', + 'platform_admin', + 'platform_admin_list_complaints', + 'platform_admin_reports', + 'platform_admin_returned_letters', + 'platform_admin_splash_page', + 'preview_broadcast_areas', + 'preview_broadcast_message', + 'pricing', + 'privacy', + 'public_agreement', + 'public_download_agreement', + 'received_text_messages_callback', + 'redact_template', + 'register', + 'register_from_invite', + 'register_from_org_invite', + 'registration_continue', + 'reject_broadcast_message', + 'remove_broadcast_area', + 'remove_user_from_organisation', + 'remove_user_from_service', + 'request_to_go_live', + 'resend_email_link', + 'resend_email_verification', + 'resume_service', + 'returned_letter_summary', + 'returned_letters', + 'returned_letters_report', + 'revalidate_email_sent', + 'revoke_api_key', + 'roadmap', + 'save_contact_list', + 'security', + 'send_files_by_email', + 'send_files_by_email_contact_details', + 'send_from_contact_list', + 'send_messages', + 'send_notification', + 'send_one_off', + 'send_one_off_letter_address', + 'send_one_off_step', + 'send_one_off_to_myself', + 'send_uploaded_letter', + 'service_accept_agreement', + 'service_add_email_reply_to', + 'service_add_letter_contact', + 'service_add_sms_sender', + 'service_agreement', + 'service_confirm_agreement', + 'service_confirm_delete_email_reply_to', + 'service_confirm_delete_letter_contact', + 'service_confirm_delete_sms_sender', + 'service_dashboard', + 'service_dashboard_updates', + 'service_delete_email_reply_to', + 'service_delete_letter_contact', + 'service_delete_sms_sender', + 'service_download_agreement', + 'service_edit_email_reply_to', + 'service_edit_letter_contact', + 'service_edit_sms_sender', + 'service_email_reply_to', + 'service_letter_contact_details', + 'service_make_blank_default_letter_contact', + 'service_name_change', + 'service_name_change_confirm', + 'service_preview_email_branding', + 'service_preview_letter_branding', + 'service_set_auth_type', + 'service_set_broadcast_account_type', + 'service_set_channel', + 'service_set_email_branding', + 'service_set_inbound_number', + 'service_set_inbound_sms', + 'service_set_international_letters', + 'service_set_international_sms', + 'service_set_letter_branding', + 'service_set_letters', + 'service_set_permission', + 'service_set_reply_to_email', + 'service_set_sms_prefix', + 'service_settings', + 'service_sms_senders', + 'service_switch_count_as_live', + 'service_switch_live', + 'service_verify_reply_to_address', + 'service_verify_reply_to_address_updates', + 'services_or_dashboard', + 'set_free_sms_allowance', + 'set_message_limit', + 'set_rate_limit', + 'set_sender', + 'set_template_sender', + 'show_accounts_or_dashboard', + 'sign_in', + 'sign_out', + 'start_job', + 'submit_request_to_go_live', + 'support', + 'support_public', + 'suspend_service', + 'template_history', + 'template_usage', + 'terms', + 'thanks', + 'tour_step', + 'triage', + 'trial_mode', + 'trial_mode_new', + 'trial_services', + 'two_factor', + 'two_factor_email', + 'two_factor_email_interstitial', + 'two_factor_email_sent', + 'update_email_branding', + 'update_letter_branding', + 'upload_a_letter', + 'upload_contact_list', + 'upload_letter', + 'uploaded_letter_preview', + 'uploaded_letters', + 'uploads', + 'usage', + 'usage_for_all_services', + 'user_information', + 'user_profile', + 'user_profile_disable_platform_admin_view', + 'user_profile_email', + 'user_profile_email_authenticate', + 'user_profile_email_confirm', + 'user_profile_mobile_number', + 'user_profile_mobile_number_authenticate', + 'user_profile_mobile_number_confirm', + 'user_profile_name', + 'user_profile_password', + 'using_notify', + 'verify', + 'verify_email', + 'view_current_broadcast', + 'view_job', + 'view_job_csv', + 'view_job_updates', + 'view_jobs', + 'view_letter_notification_as_preview', + 'view_letter_upload_as_preview', + 'view_notification', + 'view_notification_updates', + 'view_notifications', + 'view_notifications_csv', + 'view_previous_broadcast', + 'view_provider', + 'view_providers', + 'view_template', + 'view_template_version', + 'view_template_versions', + 'who_can_use_notify', + 'who_its_for', + 'write_new_broadcast', +})) + def flask_app(): app = Flask('app') @@ -42,13 +366,6 @@ def test_navigation_items_are_properly_defined(navigation_instance): endpoint, type(navigation_instance).__name__ ) - assert ( - endpoint not in navigation_instance.endpoints_without_navigation - ), '{} is listed in {}.mapping and {}.exclude'.format( - endpoint, - type(navigation_instance).__name__, - type(navigation_instance).__name__, - ) assert ( navigation_instance.endpoints_with_navigation.count(endpoint) == 1 ), '{} found more than once in {}.mapping'.format( @@ -57,41 +374,27 @@ def test_navigation_items_are_properly_defined(navigation_instance): ) -@pytest.mark.parametrize('navigation_instance', navigation_instances) -def test_excluded_navigation_items_are_properly_defined(navigation_instance): - for endpoint in navigation_instance.endpoints_without_navigation: +def test_excluded_navigation_items_are_properly_defined(): + for endpoint in EXCLUDED_ENDPOINTS: assert ( endpoint in all_endpoints - ), '{} is not a real endpoint (in {}.exclude)'.format( - endpoint, - type(navigation_instance).__name__ - ) + ), f'{endpoint} is not a real endpoint (in EXCLUDED_ENDPOINTS)' + assert ( - endpoint not in navigation_instance.endpoints_with_navigation - ), '{} is listed in {}.exclude and {}.mapping'.format( - endpoint, - type(navigation_instance).__name__, - type(navigation_instance).__name__, - ) - assert ( - navigation_instance.endpoints_without_navigation.count(endpoint) == 1 - ), '{} found more than once in {}.exclude'.format( - endpoint, - type(navigation_instance).__name__ - ) + EXCLUDED_ENDPOINTS.count(endpoint) == 1 + ), f'{endpoint} found more than once in EXCLUDED_ENDPOINTS' @pytest.mark.parametrize('navigation_instance', navigation_instances) def test_all_endpoints_are_covered(navigation_instance): + covered_endpoints = ( + navigation_instance.endpoints_with_navigation + + EXCLUDED_ENDPOINTS + + ('static', 'status.show_status', 'metrics') + ) + for endpoint in all_endpoints: - if not endpoint == 'main.monthly_billing_usage': - assert endpoint in ( - navigation_instance.endpoints_with_navigation + - navigation_instance.endpoints_without_navigation - ), '{} is not listed or excluded in {}'.format( - endpoint, - type(navigation_instance).__name__ - ) + assert endpoint in covered_endpoints, f'{endpoint} is not listed or excluded' @pytest.mark.parametrize('navigation_instance', navigation_instances)