Coverage report: 96%

Files Functions Classes

coverage.py v7.15.0, created at 2026-07-07 12:45 +0000

File function   statements missing excluded   coverage
product_risk_suite/manage.py main   6 2 0   67%
product_risk_suite/manage.py (no function)   5 0 0   100%
product_risk_suite/product/__init__.py (no function)   0 0 0   100%
product_risk_suite/product/admin.py ProductRiskAnalysisAdmin.n_entries   1 0 0   100%
product_risk_suite/product/admin.py upgrade_to_latest_risk_version   17 2 0   88%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.created_at_display   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.last_change_display   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.get_form   5 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.formfield_for_manytomany   17 6 0   65%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_Id   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_outdated   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_title   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_asset   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_origin   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_stride   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_accepted   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.tm_linked   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_initial   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_mitigated   1 0 0   100%
product_risk_suite/product/admin.py ProductRiskEntryAdmin.risk_after_mitigation   3 0 0   100%
product_risk_suite/product/admin.py (no function)   56 0 0   100%
product_risk_suite/product/apps.py (no function)   3 0 0   100%
product_risk_suite/product/migrations/0001_initial.py (no function)   6 0 0   100%
product_risk_suite/product/migrations/0002_alter_product_analyzes_and_more.py (no function)   4 0 0   100%
product_risk_suite/product/migrations/0003_productriskentry_svg_id_alter_product_slug_and_more.py (no function)   4 0 0   100%
product_risk_suite/product/migrations/0004_alter_product_options.py (no function)   4 0 0   100%
product_risk_suite/product/migrations/0005_remove_productriskentry_svg_id.py migrate_pop_pre_svg_ids   9 5 0   44%
product_risk_suite/product/migrations/0005_remove_productriskentry_svg_id.py (no function)   6 0 0   100%
product_risk_suite/product/migrations/0006_productriskentry_svg_id.py migrate_push_pre_svg_ids   8 4 0   50%
product_risk_suite/product/migrations/0006_productriskentry_svg_id.py (no function)   6 0 0   100%
product_risk_suite/product/migrations/0007_productriskentry_created_at_productriskentry_last_change.py (no function)   5 0 0   100%
product_risk_suite/product/migrations/__init__.py (no function)   0 0 0   100%
product_risk_suite/product/models.py ProductRiskEntry.__str__   6 0 0   100%
product_risk_suite/product/models.py ProductRiskEntry.list_svg_ids   1 0 0   100%
product_risk_suite/product/models.py ProductRiskAnalysis.__str__   1 0 0   100%
product_risk_suite/product/models.py ProductRiskAnalysis.get_risk_summary   22 0 0   100%
product_risk_suite/product/models.py Product.__str__   1 0 0   100%
product_risk_suite/product/models.py (no function)   35 0 0   100%
product_risk_suite/product/templatetags/__init__.py (no function)   0 0 0   100%
product_risk_suite/product/templatetags/extras.py subtract   3 1 0   67%
product_risk_suite/product/templatetags/extras.py get   4 2 0   50%
product_risk_suite/product/templatetags/extras.py (no function)   6 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryTest.setUp   23 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryTest.test_product_risk_entry_str   10 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryTest.test_list_svg_ids_empty_when_none_assigned   3 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryTest.test_list_svg_ids_returns_tech_names_of_assigned_connections   7 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisTest.setUp   29 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisTest.test_str   4 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisTest.test_get_risk_summary   19 0 0   100%
product_risk_suite/product/tests.py ProductTest.setUp   1 0 0   100%
product_risk_suite/product/tests.py ProductTest.test_str   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.setUp   30 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest._admin   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_changelist_view_returns_200   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_add_view_returns_200   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_change_view_returns_200   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_add_view_help_text_for_new_entry   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_change_view_help_text_for_existing_entry   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_id   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_title   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_asset   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_origin   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_stride   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_initial   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_accepted_false   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_accepted_true   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_mitigated_false   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_mitigated_true   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_after_mitigation_none_when_unmitigated   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_risk_after_mitigation_value_when_mitigated   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_tm_linked_false_without_svg_id   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_display_tm_linked_true_with_svg_id   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_svg_id_queryset_filtered_to_product_connection_names   12 0 0   100%
product_risk_suite/product/tests.py ProductRiskEntryAdminTest.test_svg_id_queryset_unfiltered_for_new_entry   9 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.setUp   18 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.setUp.make_risk   5 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest._url   1 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_no_permission_returns_403   3 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_with_view_permission_returns_200   2 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_nonexistent_product_returns_404   3 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_nonexistent_analysis_returns_404   3 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_context_contains_correct_product   3 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_context_contains_correct_analysis   3 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_context_entries_match_analysis   6 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_context_entries_ordered_by_custom_id   5 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_context_risk_summary_has_expected_keys   5 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_context_risk_summary_counts_entries   3 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_product_edit_false_for_viewer   3 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisViewTest.test_product_edit_true_for_editor   3 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest.setUp   15 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest._admin   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest.test_changelist_returns_200   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest.test_add_view_returns_200   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest.test_change_view_returns_200   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest.test_n_entries_with_two_entries   1 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest.test_n_entries_with_empty_analysis   2 0 0   100%
product_risk_suite/product/tests.py ProductRiskAnalysisAdminTest.test_n_entries_reflected_in_changelist   2 0 0   100%
product_risk_suite/product/tests.py ProductIndexTemplateTest.setUp   3 0 0   100%
product_risk_suite/product/tests.py ProductIndexTemplateTest.test_product_index_template_no_missing_vars   4 0 0   100%
product_risk_suite/product/tests.py ProductViewTemplateTest.setUp   5 0 0   100%
product_risk_suite/product/tests.py ProductViewTemplateTest.test_product_template_no_missing_vars   4 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisTemplateTest.setUp   30 0 0   100%
product_risk_suite/product/tests.py ProductAnalysisTemplateTest.test_product_analysis_template_no_missing_vars   4 0 0   100%
product_risk_suite/product/tests.py _make_versioned_risk   5 0 0   100%
product_risk_suite/product/tests.py UpgradeRiskVersionAdminActionTest.setUp   12 0 0   100%
product_risk_suite/product/tests.py UpgradeRiskVersionAdminActionTest._post_action   1 0 0   100%
product_risk_suite/product/tests.py UpgradeRiskVersionAdminActionTest.test_upgrades_entry_pointing_to_outdated_risk   3 0 0   100%
product_risk_suite/product/tests.py UpgradeRiskVersionAdminActionTest.test_leaves_entry_unchanged_when_already_current   3 0 0   100%
product_risk_suite/product/tests.py UpgradeRiskVersionAdminActionTest.test_handles_mix_of_outdated_and_current_entries   5 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedAdminDisplayTest.setUp   9 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedAdminDisplayTest._admin   2 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedAdminDisplayTest.test_risk_outdated_false_when_not_current   1 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedAdminDisplayTest.test_risk_outdated_true_when_current   1 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedIconTemplateTest.setUp   19 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedIconTemplateTest.test_outdated_icon_shown_when_entry_has_outdated_risk   2 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedIconTemplateTest.test_outdated_icon_is_a_link_to_diff_view   2 0 0   100%
product_risk_suite/product/tests.py RiskOutdatedIconTemplateTest.test_outdated_icon_absent_when_all_risks_are_current   2 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.setUp   21 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest._url   2 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_no_product_permission_returns_403   2 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_unknown_entry_returns_404   2 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_authorized_user_gets_200   2 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_shows_both_version_numbers   4 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_shows_old_and_new_title   4 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_changed_field_marker_present   3 0 0   100%
product_risk_suite/product/tests.py RiskDiffViewTest.test_entry_already_current_shows_no_diff_message   4 0 0   100%
product_risk_suite/product/tests.py (no function)   114 0 0   100%
product_risk_suite/product/urls.py (no function)   3 0 0   100%
product_risk_suite/product/views.py product_index   3 0 0   100%
product_risk_suite/product/views.py product   5 0 0   100%
product_risk_suite/product/views.py risk_diff   16 2 0   88%
product_risk_suite/product/views.py risk_diff._stride_str   1 0 0   100%
product_risk_suite/product/views.py risk_diff._smv_str   4 1 0   75%
product_risk_suite/product/views.py product_analysis   9 0 0   100%
product_risk_suite/product/views.py (no function)   23 0 0   100%
product_risk_suite/product_risk_suite/__init__.py (no function)   0 0 0   100%
product_risk_suite/product_risk_suite/asgi.py (no function)   4 4 0   0%
product_risk_suite/product_risk_suite/ldap_settings.py (no function)   11 11 0   0%
product_risk_suite/product_risk_suite/settings.py (no function)   35 2 0   94%
product_risk_suite/product_risk_suite/test_settings.py (no function)   5 0 0   100%
product_risk_suite/product_risk_suite/tests.py ShowLoginViewTest.setUp   1 0 0   100%
product_risk_suite/product_risk_suite/tests.py ShowLoginViewTest.test_unauthenticated_renders_login_page   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py ShowLoginViewTest.test_authenticated_redirects_to_product   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py LoginViewTest.setUp   1 0 0   100%
product_risk_suite/product_risk_suite/tests.py LoginViewTest.test_get_renders_login_page   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py LoginViewTest.test_post_valid_credentials_redirects_to_product   2 0 0   100%
product_risk_suite/product_risk_suite/tests.py LoginViewTest.test_post_wrong_password_shows_error   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py LoginViewTest.test_post_unknown_user_shows_error   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py LoginViewTest.test_post_missing_credentials_shows_error   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py LoginViewTest.test_post_valid_login_authenticates_user   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py LogoutViewTest.setUp   1 0 0   100%
product_risk_suite/product_risk_suite/tests.py LogoutViewTest.test_logout_redirects_to_root   3 0 0   100%
product_risk_suite/product_risk_suite/tests.py LogoutViewTest.test_logout_clears_session   5 0 0   100%
product_risk_suite/product_risk_suite/tests.py (no function)   21 0 0   100%
product_risk_suite/product_risk_suite/urls.py (no function)   11 0 0   100%
product_risk_suite/product_risk_suite/views.py showLogin   4 0 0   100%
product_risk_suite/product_risk_suite/views.py login_view   14 0 0   100%
product_risk_suite/product_risk_suite/views.py logout_view   3 0 0   100%
product_risk_suite/product_risk_suite/views.py (no function)   8 0 0   100%
product_risk_suite/product_risk_suite/wsgi.py (no function)   4 4 0   0%
product_risk_suite/risk_assessment/__init__.py (no function)   0 0 0   100%
product_risk_suite/risk_assessment/admin.py SecurityRequirementAdmin.norm   1 0 0   100%
product_risk_suite/risk_assessment/admin.py SecurityRequirementAdmin.short   1 0 0   100%
product_risk_suite/risk_assessment/admin.py SecurityRequirementAdmin.description   1 0 0   100%
product_risk_suite/risk_assessment/admin.py RiskAdmin.get_fieldsets   3 1 0   67%
product_risk_suite/risk_assessment/admin.py RiskAdmin.stride_str   1 0 0   100%
product_risk_suite/risk_assessment/admin.py RiskAdmin.save_model   8 0 0   100%
product_risk_suite/risk_assessment/admin.py RiskAdmin.save_related   4 0 0   100%
product_risk_suite/risk_assessment/admin.py RiskAdmin.response_change   7 0 0   100%
product_risk_suite/risk_assessment/admin.py RiskRatingAdmin.risk_str   1 0 0   100%
product_risk_suite/risk_assessment/admin.py update_evidences   2 2 0   0%
product_risk_suite/risk_assessment/admin.py (no function)   77 0 0   100%
product_risk_suite/risk_assessment/apps.py (no function)   3 0 0   100%
product_risk_suite/risk_assessment/forms.py EvidenceUpdateProductForm.__init__   3 3 0   0%
product_risk_suite/risk_assessment/forms.py (no function)   8 0 0   100%
product_risk_suite/risk_assessment/migrations/0001_initial.py (no function)   8 0 0   100%
product_risk_suite/risk_assessment/migrations/0002_evidence_evidence_link.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/0003_alter_stride_name.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/0004_alter_securityrequirement_slug.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/0005_riskmitigation_title.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/0006_likelihoodexample_severityexample_and_more.py (no function)   5 0 0   100%
product_risk_suite/risk_assessment/migrations/0007_suggestedmitigationvalidation_and_more.py (no function)   5 0 0   100%
product_risk_suite/risk_assessment/migrations/0008_alter_risk_suggested_mitigation_validation.py (no function)   5 0 0   100%
product_risk_suite/risk_assessment/migrations/0009_alter_riskmitigation_security_requirements.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/0010_alter_securityrequirement_options.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/0011_evidence_product.py (no function)   5 0 0   100%
product_risk_suite/risk_assessment/migrations/0012_rename_livecycle_lifecycle_and_more.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/0013_risk_is_current_risk_version_alter_risk_custom_id_and_more.py (no function)   4 0 0   100%
product_risk_suite/risk_assessment/migrations/__init__.py (no function)   0 0 0   100%
product_risk_suite/risk_assessment/models.py truncate   3 0 0   100%
product_risk_suite/risk_assessment/models.py Asset.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py LifeCycle.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py Origin.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py SecurityRequirement.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py Stride.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py Stride.save   2 0 0   100%
product_risk_suite/risk_assessment/models.py Stride.clean   3 0 0   100%
product_risk_suite/risk_assessment/models.py SuggestedMitigationValidation.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py Risk.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py Risk.has_newer_version   1 0 0   100%
product_risk_suite/risk_assessment/models.py Risk.stride_str   2 0 0   100%
product_risk_suite/risk_assessment/models.py Risk.list_stride   1 0 0   100%
product_risk_suite/risk_assessment/models.py SeverityName.to_human_str   11 0 0   100%
product_risk_suite/risk_assessment/models.py SeverityExample.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py LikelihoodName.to_human_str   8 1 0   88%
product_risk_suite/risk_assessment/models.py LikelihoodExample.__str__   1 1 0   0%
product_risk_suite/risk_assessment/models.py _RiskRating__loo_help_list   5 0 0   100%
product_risk_suite/risk_assessment/models.py _RiskRating__sev_help_list   5 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.risk_level   5 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.risk_level_to_color   8 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.color_class   5 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.risk_color_class   1 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.calc_risk   1 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.risk   1 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.color_likelihood_of_occurrence   1 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.color_severity_of_impact   1 0 0   100%
product_risk_suite/risk_assessment/models.py RiskRating.color_risk   1 0 0   100%
product_risk_suite/risk_assessment/models.py Status.__str__   1 0 0   100%
product_risk_suite/risk_assessment/models.py Status.is_todo   1 0 0   100%
product_risk_suite/risk_assessment/models.py Status.web_idx_name   6 0 0   100%
product_risk_suite/risk_assessment/models.py Status.save   2 0 0   100%
product_risk_suite/risk_assessment/models.py Status.clean   3 0 0   100%
product_risk_suite/risk_assessment/models.py Evidence.__str__   5 0 0   100%
product_risk_suite/risk_assessment/models.py Evidence.color_due_date   6 0 0   100%
product_risk_suite/risk_assessment/models.py RiskMitigation.list_security_requirements   1 0 0   100%
product_risk_suite/risk_assessment/models.py RiskMitigation.__str__   3 0 0   100%
product_risk_suite/risk_assessment/models.py (no function)   151 0 0   100%
product_risk_suite/risk_assessment/tests.py FreeMethodTests.test_truncate   3 0 0   100%
product_risk_suite/risk_assessment/tests.py AssetTest.test_simple   3 0 0   100%
product_risk_suite/risk_assessment/tests.py AssetTest.test_unique   7 0 0   100%
product_risk_suite/risk_assessment/tests.py AssetTest.test_str   2 0 0   100%
product_risk_suite/risk_assessment/tests.py LifeCycleTest.test_simple   3 0 0   100%
product_risk_suite/risk_assessment/tests.py LifeCycleTest.test_unique   7 0 0   100%
product_risk_suite/risk_assessment/tests.py LifeCycleTest.test_str   2 0 0   100%
product_risk_suite/risk_assessment/tests.py OriginTest.test_simple   3 0 0   100%
product_risk_suite/risk_assessment/tests.py OriginTest.test_unique   7 0 0   100%
product_risk_suite/risk_assessment/tests.py OriginTest.test_str   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementTest.test_simple   3 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementTest.test_unique   7 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementTest.test_str   2 0 0   100%
product_risk_suite/risk_assessment/tests.py StrideTest.test_simple   3 0 0   100%
product_risk_suite/risk_assessment/tests.py StrideTest.test_no_create_unallowed   6 0 0   100%
product_risk_suite/risk_assessment/tests.py StrideTest.test_unique   9 2 0   78%
product_risk_suite/risk_assessment/tests.py StrideTest.test_str   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskTest.setUp   7 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskTest.test_simple   10 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskTest.test_stride_str   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskTest.test_list_strid   3 0 0   100%
product_risk_suite/risk_assessment/tests.py SeverityNameTest.test_human_str   4 0 0   100%
product_risk_suite/risk_assessment/tests.py LikelihoodNameTest.test_human_str   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.setUp   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.test_risk   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.test_risk_level   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.test_risk_level_to_color   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.test_color_class   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.test_risk_color_class   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.test_str   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingTest.test_color_props   6 0 0   100%
product_risk_suite/risk_assessment/tests.py StatusTest.setUp   4 0 0   100%
product_risk_suite/risk_assessment/tests.py StatusTest.test_str   4 0 0   100%
product_risk_suite/risk_assessment/tests.py StatusTest.test_is_todo   4 0 0   100%
product_risk_suite/risk_assessment/tests.py StatusTest.test_web_idx_name   3 0 0   100%
product_risk_suite/risk_assessment/tests.py StatusTest.test_invalid   8 0 0   100%
product_risk_suite/risk_assessment/tests.py EvidenceTest.setUp   10 0 0   100%
product_risk_suite/risk_assessment/tests.py EvidenceTest.test_str   3 0 0   100%
product_risk_suite/risk_assessment/tests.py EvidenceTest.test_color_due_date   8 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskMitigationTest.setUp   12 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskMitigationTest.test_str   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskMitigationTest.test_list_sec_req   8 0 0   100%
product_risk_suite/risk_assessment/tests.py SeverityExampleTest.test_simple   5 0 0   100%
product_risk_suite/risk_assessment/tests.py LikelihoodExampleTest.test_simple   4 0 0   100%
product_risk_suite/risk_assessment/tests.py SuggestedMitigationValidationTest.test_simple   8 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.setUp   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest._get   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_asset_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_origin_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_lifecycle_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_securityrequirement_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_risk_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_riskmitigation_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_riskrating_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_evidence_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_severityexample_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_likelihoodexample_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAssessmentAdminChangelistTest.test_suggestedmitigationvalidation_changelist   1 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementAdminTest.setUp   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementAdminTest.test_norm_display   1 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementAdminTest.test_short_display   1 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementAdminTest.test_description_display   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAdminTest.setUp   16 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAdminTest.test_stride_str_display_single   1 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskAdminTest.test_stride_str_display_multiple   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingAdminTest.setUp   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskRatingAdminTest.test_risk_str_display   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementsViewTest.setUp   5 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementsViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementsViewTest.test_authenticated_returns_200   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementsViewTest.test_context_contains_all_requirements   7 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementsViewTest.test_context_empty_when_no_requirements_exist   4 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementViewTest.setUp   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementViewTest.test_authenticated_returns_200   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementViewTest.test_nonexistent_slug_returns_404   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SecurityRequirementViewTest.test_context_contains_correct_requirement   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.setUp   5 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_authenticated_returns_200   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_severities_has_five_entries   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_severities_have_str_and_value_keys   5 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_loos_has_five_entries   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_risk_is_complete_5x5_matrix   6 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_risk_corner_values   5 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_risk_color_is_complete_5x5_matrix   6 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_example_severities_populated   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_example_loos_populated   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_example_severities_empty_without_data   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskInfoViewTest.test_context_example_loos_empty_without_data   4 0 0   100%
product_risk_suite/risk_assessment/tests.py SuggestionViewTest.setUp   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SuggestionViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SuggestionViewTest.test_authenticated_returns_200   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SuggestionViewTest.test_nonexistent_id_returns_404   2 0 0   100%
product_risk_suite/risk_assessment/tests.py SuggestionViewTest.test_context_contains_correct_suggestion   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.setUp   5 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_default_version_is_1   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_default_is_current_is_true   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_has_newer_version_false_when_current   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_has_newer_version_true_when_not_current   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_str_includes_version_number   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_str_includes_custom_id   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_same_custom_id_different_versions_allowed   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskVersioningModelTest.test_duplicate_custom_id_and_version_raises_integrity_error   7 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.setUp   10 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest._post   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_no_checkbox_updates_title_in_place   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_no_checkbox_does_not_create_new_version   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_no_checkbox_keeps_risk_current   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_checkbox_creates_version_2   2 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_checkbox_new_version_has_updated_data   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_checkbox_new_version_is_current   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_checkbox_old_version_becomes_not_current   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_checkbox_old_version_data_is_unchanged   4 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_checkbox_copies_stride_to_new_version   3 0 0   100%
product_risk_suite/risk_assessment/tests.py RiskSaveAsNewVersionFormTest.test_checkbox_redirects_to_new_version_change_form   3 0 0   100%
product_risk_suite/risk_assessment/tests.py (no function)   151 0 0   100%
product_risk_suite/risk_assessment/urls.py (no function)   3 0 0   100%
product_risk_suite/risk_assessment/views.py security_requirements   8 0 0   100%
product_risk_suite/risk_assessment/views.py security_requirement   3 0 0   100%
product_risk_suite/risk_assessment/views.py risk_info   19 0 0   100%
product_risk_suite/risk_assessment/views.py suggestion_view   3 0 0   100%
product_risk_suite/risk_assessment/views.py EvidenceUpdateProductView.form_valid   23 23 0   0%
product_risk_suite/risk_assessment/views.py EvidenceUpdateProductView.form_invalid   2 2 0   0%
product_risk_suite/risk_assessment/views.py EvidenceUpdateProductView.get_context_data   6 6 0   0%
product_risk_suite/risk_assessment/views.py (no function)   30 0 0   100%
product_risk_suite/threat_model/__init__.py (no function)   0 0 0   100%
product_risk_suite/threat_model/admin.py ThreatModelConnectionNameAdmin.product   1 0 0   100%
product_risk_suite/threat_model/admin.py ThreatModelAdmin.product   1 0 0   100%
product_risk_suite/threat_model/admin.py ThreatModelAdmin.available_connections   1 0 0   100%
product_risk_suite/threat_model/admin.py (no function)   17 0 0   100%
product_risk_suite/threat_model/apps.py (no function)   3 0 0   100%
product_risk_suite/threat_model/migrations/0001_initial.py (no function)   6 0 0   100%
product_risk_suite/threat_model/migrations/0002_threatmodelconnectionname_human_name.py (no function)   4 0 0   100%
product_risk_suite/threat_model/migrations/0003_threatmodelconnectionname_id.py migrate_assign_ids   4 2 0   50%
product_risk_suite/threat_model/migrations/0003_threatmodelconnectionname_id.py (no function)   5 0 0   100%
product_risk_suite/threat_model/migrations/0004_threatmodelconnectionname_primary_key.py migrate_pop_tm_cn   7 5 0   29%
product_risk_suite/threat_model/migrations/0004_threatmodelconnectionname_primary_key.py migrate_push_tm_cn   7 4 0   43%
product_risk_suite/threat_model/migrations/0004_threatmodelconnectionname_primary_key.py (no function)   8 0 0   100%
product_risk_suite/threat_model/migrations/0005_threatmodelconnectionname_product.py fix_invalid_products   5 3 0   40%
product_risk_suite/threat_model/migrations/0005_threatmodelconnectionname_product.py (no function)   6 0 0   100%
product_risk_suite/threat_model/migrations/__init__.py (no function)   0 0 0   100%
product_risk_suite/threat_model/models.py ThreatModel.__str__   1 0 0   100%
product_risk_suite/threat_model/models.py ThreatModel.__remove_svg_attribute   4 1 0   75%
product_risk_suite/threat_model/models.py ThreatModel.__remove_dark_mode_from_style   5 0 0   100%
product_risk_suite/threat_model/models.py ThreatModel.get_clean_svg_content   6 0 0   100%
product_risk_suite/threat_model/models.py ThreatModel.list_connection_names   1 0 0   100%
product_risk_suite/threat_model/models.py ThreatModel.save   12 0 0   100%
product_risk_suite/threat_model/models.py (no function)   20 0 0   100%
product_risk_suite/threat_model/shared_models.py ThreatModelConnectionName.__str__   3 0 0   100%
product_risk_suite/threat_model/shared_models.py (no function)   7 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameTest.setUp   1 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameTest.test_simple   13 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelTest.setUp   1 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelTest.test_simple   14 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelTest.test_str   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelTest.test_list_connection_names_empty_when_none_assigned   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelTest.test_list_connection_names_returns_tech_names   6 0 0   100%
product_risk_suite/threat_model/tests.py _make_risk   5 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelIndexViewTest.setUp   6 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelIndexViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelIndexViewTest.test_authenticated_returns_200   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelIndexViewTest.test_context_includes_accessible_tm   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelIndexViewTest.test_context_excludes_inaccessible_tm   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelIndexViewTest.test_context_empty_for_user_without_any_permission   4 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.setUp   8 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_authenticated_returns_200   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_nonexistent_slug_returns_404   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_inaccessible_product_returns_404   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_context_contains_tm   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_context_svg_content_is_string   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_context_svg_removes_dark_mode_style   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_context_risk_entries_empty_when_no_entries_linked   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_context_names_empty_when_no_entries_linked   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest._setup_risk_entry   10 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_context_risk_entries_populated_when_entry_linked   6 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelDetailViewTest.test_context_names_populated_when_entry_linked   4 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelSvgAccessTest.setUp   9 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelSvgAccessTest.test_unauthenticated_redirects_to_login   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelSvgAccessTest.test_authorized_user_gets_200   4 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelSvgAccessTest.test_unauthorized_user_gets_403   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelSvgAccessTest.test_unknown_file_gets_404   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminConfigTest.setUp   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminConfigTest.test_list_display   1 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminConfigTest.test_exclude   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminConfigTest.test_ordering   1 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminConfigTest.test_product_method_returns_product_title   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminConfigTest.setUp   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminConfigTest.test_list_display   1 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminConfigTest.test_exclude   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminConfigTest.test_product_method_returns_product_title   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminConfigTest.test_available_connections_zero_when_none   2 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminConfigTest.test_available_connections_counts_linked_names   5 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminViewTest.setUp   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminViewTest.test_changelist_returns_200   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminViewTest.test_changeform_returns_200   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelConnectionNameAdminViewTest.test_changelist_excludes_id_and_product_id_columns   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminViewTest.setUp   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminViewTest.test_changelist_returns_200   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminViewTest.test_changelist_shows_available_connections_column   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminViewTest.test_changeform_returns_200   3 0 0   100%
product_risk_suite/threat_model/tests.py ThreatModelAdminViewTest.test_changeform_excludes_slug_and_connection_names   4 0 0   100%
product_risk_suite/threat_model/tests.py (no function)   75 0 0   100%
product_risk_suite/threat_model/urls.py (no function)   3 0 0   100%
product_risk_suite/threat_model/views.py serve_threat_model_svg   4 0 0   100%
product_risk_suite/threat_model/views.py threat_model_index   4 0 0   100%
product_risk_suite/threat_model/views.py threat_model   36 5 0   86%
product_risk_suite/threat_model/views.py (no function)   17 0 0   100%
Total     2588 107 0   96%

No items found using the specified filter.