Coverage for cefa80e9fe64862f378d2281d0c0c63e151cc69a: 99%

Files Functions Classes

coverage.py v7.14.0, created at 2026-06-19 09:10 +0000

File function   statements missing excluded   coverage
backend / app / __init__.py (no function)   0 0 0   100%
backend / app / config.py get_settings   1 0 0   100%
backend / app / config.py (no function)   15 0 0   100%
backend / app / constants.py (no function)   1 0 0   100%
backend / app / dependencies / __init__.py (no function)   0 0 0   100%
backend / app / dependencies / auth.py verify_api_key   3 0 0   100%
backend / app / dependencies / auth.py (no function)   7 0 0   100%
backend / app / dependencies / aws_storage.py get_aws_storage   1 0 0   100%
backend / app / dependencies / aws_storage.py (no function)   4 0 0   100%
backend / app / dependencies / gh_client.py get_github_client   1 0 0   100%
backend / app / dependencies / gh_client.py (no function)   4 0 0   100%
backend / app / dependencies / redis_client.py get_redis_client   1 1 0   0%
backend / app / dependencies / redis_client.py (no function)   4 0 0   100%
backend / app / main.py lifespan   8 0 0   100%
backend / app / main.py (no function)   11 0 0   100%
backend / app / routers / __init__.py (no function)   0 0 0   100%
backend / app / routers / badge.py _badge_color   6 0 0   100%
backend / app / routers / badge.py _get_coverage   13 0 0   100%
backend / app / routers / badge.py redirect   4 0 0   100%
backend / app / routers / badge.py get_response   3 0 0   100%
backend / app / routers / badge.py badge   18 0 0   100%
backend / app / routers / badge.py (no function)   21 0 0   100%
backend / app / routers / coverage.py invalidate_cache   8 0 0   100%
backend / app / routers / coverage.py get_file   8 0 0   100%
backend / app / routers / coverage.py create_upload_session   2 0 0   100%
backend / app / routers / coverage.py (no function)   23 0 0   100%
backend / app / schemas.py (no function)   17 0 0   100%
backend / app / utils / __init__.py (no function)   0 0 0   100%
backend / app / utils / aws_storage.py AWSStorage.__init__   8 0 0   100%
backend / app / utils / aws_storage.py AWSStorage.__aenter__   5 0 0   100%
backend / app / utils / aws_storage.py AWSStorage.__aexit__   2 0 0   100%
backend / app / utils / aws_storage.py AWSStorage._generate_site_id   13 0 0   100%
backend / app / utils / aws_storage.py AWSStorage.create_upload_session   6 0 0   100%
backend / app / utils / aws_storage.py AWSStorage.get_file   9 0 1   100%
backend / app / utils / aws_storage.py (no function)   25 0 0   100%
backend / app / utils / github_client.py GithubClient.__init__   3 0 0   100%
backend / app / utils / github_client.py GithubClient.ensure_initialized   2 0 0   100%
backend / app / utils / github_client.py GithubClient._headers   1 0 0   100%
backend / app / utils / github_client.py GithubClient.__aenter__   5 0 0   100%
backend / app / utils / github_client.py GithubClient.__aexit__   2 0 0   100%
backend / app / utils / github_client.py GithubClient._get   9 0 0   100%
backend / app / utils / github_client.py GithubClient.get_latest_commits   4 0 0   100%
backend / app / utils / github_client.py GithubClient.get_commit_statuses   4 0 0   100%
backend / app / utils / github_client.py (no function)   17 0 0   100%
backend / tests / __init__.py (no function)   0 0 0   100%
backend / tests / conftest.py _use_test_settings   9 0 0   100%
backend / tests / conftest.py api_key   1 0 0   100%
backend / tests / conftest.py mock_s3_client   1 0 0   100%
backend / tests / conftest.py mock_sts_client   1 0 0   100%
backend / tests / conftest.py _patch_aiobotocore   7 0 0   100%
backend / tests / conftest.py _patch_aiobotocore._s3_ctx   1 0 0   100%
backend / tests / conftest.py _patch_aiobotocore._sts_ctx   1 0 0   100%
backend / tests / conftest.py _patch_aiobotocore.fake_create_client   4 0 1   100%
backend / tests / conftest.py _reset_aws_mocks   2 0 0   100%
backend / tests / conftest.py mock_redis   1 0 0   100%
backend / tests / conftest.py client   2 0 0   100%
backend / tests / conftest.py _override_redis   3 0 0   100%
backend / tests / conftest.py disable_redis   5 0 0   100%
backend / tests / conftest.py set_stamina_testing   1 0 0   100%
backend / tests / conftest.py (no function)   34 0 0   100%
backend / tests / test_badge.py get_commit   6 0 0   100%
backend / tests / test_badge.py TestBadge.test_returns_green_svg_for_successful_coverage   9 0 0   100%
backend / tests / test_badge.py TestBadge.test_returns_red_svg_for_failed_coverage   7 0 0   100%
backend / tests / test_badge.py TestBadge.test_returns_gray_badge_when_no_coverage_status   7 0 0   100%
backend / tests / test_badge.py TestBadge.test_returns_gray_badge_when_no_commits   4 0 0   100%
backend / tests / test_badge.py TestBadge.test_serves_cached_badge_from_redis   5 0 0   100%
backend / tests / test_badge.py TestBadge.test_caches_generated_badge_in_redis   11 0 0   100%
backend / tests / test_badge.py TestBadge.test_no_store_headers_for_github_camo   7 0 0   100%
backend / tests / test_badge.py TestBadge.test_public_cache_headers_for_regular_clients   7 0 0   100%
backend / tests / test_badge.py TestBadge.test_redis_read_error_falls_through_to_github   7 0 0   100%
backend / tests / test_badge.py TestBadge.test_redis_write_error_still_returns_badge   8 0 0   100%
backend / tests / test_badge.py TestBadge.test_skips_skip_ci_commits   11 0 0   100%
backend / tests / test_badge.py TestBadge.test_check_up_to_5_commits   10 0 0   100%
backend / tests / test_badge.py TestBadge.test_commit_without_coverage_status   6 0 0   100%
backend / tests / test_badge.py TestBadge.test_stop_on_first_commit_without_skip_ci   9 0 0   100%
backend / tests / test_badge.py TestBadge.test_retry_on_github_api_failure   9 0 0   100%
backend / tests / test_badge.py TestBadge.test_server_error_on_github_api_commit_route_failure   5 0 0   100%
backend / tests / test_badge.py TestBadge.test_server_error_on_github_api_status_route_failure   7 0 0   100%
backend / tests / test_badge.py TestBadge.test_dont_write_cache_on_github_api_failure   7 0 0   100%
backend / tests / test_badge.py TestBadge.test_get_badge_without_redis   8 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_redirects_to_target_url   6 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_redirects_for_failed_coverage   6 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_returns_404_when_no_coverage_status   5 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_returns_404_when_no_commits   3 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_returns_404_when_commit_has_only_non_coverage_status   5 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_skips_skip_ci_commits   11 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_check_up_to_5_commits   10 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_stop_on_first_commit_without_skip_ci   8 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_retry_on_github_api_failure   8 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_server_error_on_github_api_commit_route_failure   4 0 0   100%
backend / tests / test_badge.py TestBadgeRedirect.test_server_error_on_github_api_status_route_failure   6 0 0   100%
backend / tests / test_badge.py (no function)   52 0 0   100%
backend / tests / test_create_site.py TestCreateSiteAuth.test_missing_token_returns_401   2 0 0   100%
backend / tests / test_create_site.py TestCreateSiteAuth.test_invalid_token_returns_403   2 0 0   100%
backend / tests / test_create_site.py TestCreateSiteAuth.test_valid_token_returns_200   3 0 0   100%
backend / tests / test_create_site.py TestCreateSite.test_returns_session   15 0 0   100%
backend / tests / test_create_site.py TestCreateSite.test_retries_on_site_id_collision   6 0 0   100%
backend / tests / test_create_site.py TestCreateSite.test_fails_after_max_attempts_on_site_id_collision   6 0 0   100%
backend / tests / test_create_site.py TestCreateSite.test_s3_error_propagates   3 0 0   100%
backend / tests / test_create_site.py (no function)   15 0 0   100%
backend / tests / test_get_file.py _mock_s3_body   3 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_returns_html_content   6 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_returns_css_content_type   5 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_unknown_extension_returns_octet_stream   5 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_missing_file_returns_404   3 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_empty_path_serves_index_html   3 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_directory_path_serves_index_html   3 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_invalid_site_id_returns_422   5 0 0   100%
backend / tests / test_get_file.py TestGetFile.test_path_traversal_returns_422   7 0 0   100%
backend / tests / test_get_file.py (no function)   17 0 0   100%
backend / tests / test_invalidate_cache.py TestInvalidateCacheAuth.test_missing_token_returns_401   2 0 0   100%
backend / tests / test_invalidate_cache.py TestInvalidateCacheAuth.test_invalid_token_returns_403   2 0 0   100%
backend / tests / test_invalidate_cache.py TestInvalidateCacheAuth.test_valid_token_returns_200   2 0 0   100%
backend / tests / test_invalidate_cache.py TestInvalidateCache.test_deletes_badge_cache_key   4 0 0   100%
backend / tests / test_invalidate_cache.py TestInvalidateCache.test_returns_500_on_redis_error   3 0 0   100%
backend / tests / test_invalidate_cache.py TestInvalidateCache.test_invalidates_cache_key_per_repo   2 0 0   100%
backend / tests / test_invalidate_cache.py TestInvalidateCache.test_no_redis_configured_does_not_error   3 0 0   100%
backend / tests / test_invalidate_cache.py (no function)   12 0 0   100%
backend / tests / test_utils / test_aws_storage.py test_init   2 0 0   100%
backend / tests / test_utils / test_aws_storage.py test_double_init   3 0 1   100%
backend / tests / test_utils / test_aws_storage.py test_generate_site_id_not_initialized   3 0 0   100%
backend / tests / test_utils / test_aws_storage.py test_get_file_not_initialized   3 0 0   100%
backend / tests / test_utils / test_aws_storage.py (no function)   11 0 0   100%
backend / tests / test_utils / test_github_client.py test_init   2 0 0   100%
backend / tests / test_utils / test_github_client.py test_double_init   3 0 1   100%
backend / tests / test_utils / test_github_client.py test_get_latest_commits_not_initialized   3 0 0   100%
backend / tests / test_utils / test_github_client.py test_get_commit_statuses_not_initialized   3 0 0   100%
backend / tests / test_utils / test_github_client.py (no function)   11 0 0   100%
cli / src / covered / __init__.py (no function)   0 0 0   100%
cli / src / covered / cli.py _get_coverage_info   7 0 0   100%
cli / src / covered / cli.py _request   7 0 0   100%
cli / src / covered / cli.py _upload_files   9 0 0   100%
cli / src / covered / cli.py _upload_files.upload_one   3 0 0   100%
cli / src / covered / cli.py _main   47 0 0   100%
cli / src / covered / cli.py upload   6 0 0   100%
cli / src / covered / cli.py (no function)   20 0 0   100%
cli / tests / conftest.py mock_main   2 0 0   100%
cli / tests / conftest.py _isolate_covered_env   1 0 1   100%
cli / tests / conftest.py _set_stamina_testing   1 0 0   100%
cli / tests / conftest.py setup_terminal   2 0 0   100%
cli / tests / conftest.py (no function)   14 0 0   100%
cli / tests / test_cli.py test_script   2 0 0   100%
cli / tests / test_cli.py (no function)   6 0 0   100%
cli / tests / test_cli_options.py test_upload_rejects_api_url_with_trailing_slash   6 0 0   100%
cli / tests / test_cli_options.py test_upload_requires_existing_directory   4 0 0   100%
cli / tests / test_cli_options.py test_upload_rejects_file_as_directory_argument   5 0 0   100%
cli / tests / test_cli_options.py test_upload_reads_all_options_from_env_vars   13 0 0   100%
cli / tests / test_cli_options.py test_upload_cli_flags_override_env_vars   3 0 0   100%
cli / tests / test_cli_options.py test_upload_missing_required_option_fails   5 0 0   100%
cli / tests / test_cli_options.py test_upload_default_concurrency_is_50   3 0 0   100%
cli / tests / test_cli_options.py test_upload_default_coverage_threshold_is_100   3 0 0   100%
cli / tests / test_cli_options.py test_upload_purge_cache_flag_propagates_true   3 0 0   100%
cli / tests / test_cli_options.py test_upload_no_purge_cache_default_is_false   3 0 0   100%
cli / tests / test_cli_options.py test_upload_help_lists_all_options   4 0 0   100%
cli / tests / test_cli_options.py (no function)   17 0 0   100%
cli / tests / test_coverage_parsing.py _write_index   1 0 0   100%
cli / tests / test_coverage_parsing.py test_get_coverage_info_returns_none_when_index_missing   1 0 0   100%
cli / tests / test_coverage_parsing.py test_get_coverage_info_parses_pc_cov_span_template   2 0 0   100%
cli / tests / test_coverage_parsing.py test_get_coverage_info_returns_none_when_no_pattern_matches   2 0 0   100%
cli / tests / test_coverage_parsing.py test_get_coverage_info_handles_decimal_values   4 0 0   100%
cli / tests / test_coverage_parsing.py test_get_coverage_info_handles_integer_values   4 0 0   100%
cli / tests / test_coverage_parsing.py (no function)   8 0 0   100%
cli / tests / test_is_default_branch_deprecation.py test_is_default_branch_true   7 0 0   100%
cli / tests / test_is_default_branch_deprecation.py test_is_default_branch_false   7 0 0   100%
cli / tests / test_is_default_branch_deprecation.py test_is_default_branch_and_purge_cache   7 0 0   100%
cli / tests / test_is_default_branch_deprecation.py (no function)   10 0 0   100%
cli / tests / test_main.py _main_kwargs   1 0 0   100%
cli / tests / test_main.py patched_main   7 0 0   100%
cli / tests / test_main.py test_main_creates_session_then_uploads_then_sets_status   7 0 0   100%
cli / tests / test_main.py test_main_sets_success_status_when_coverage_meets_threshold   4 0 0   100%
cli / tests / test_main.py test_main_sets_failure_status_when_coverage_below_threshold   4 0 0   100%
cli / tests / test_main.py test_main_status_at_threshold_is_success   4 0 0   100%
cli / tests / test_main.py test_main_skips_status_update_when_coverage_missing   4 0 0   100%
cli / tests / test_main.py test_main_exits_with_error_when_status_post_fails   4 0 0   100%
cli / tests / test_main.py test_main_status_target_url_points_at_site   4 0 0   100%
cli / tests / test_main.py test_main_status_request_headers   5 0 0   100%
cli / tests / test_main.py test_main_skips_cache_purge_when_purge_cache_false   3 0 0   100%
cli / tests / test_main.py test_main_invalidates_cache_when_purge_cache_true   5 0 0   100%
cli / tests / test_main.py test_main_logs_failure_but_continues_when_invalidate_cache_fails   3 0 0   100%
cli / tests / test_main.py test_main_fetches_readme_with_html_accept_header   6 0 0   100%
cli / tests / test_main.py test_main_purge_aborts_when_readme_fetch_fails   3 0 0   100%
cli / tests / test_main.py test_main_purge_aborts_when_badge_not_found_in_readme   3 0 0   100%
cli / tests / test_main.py test_main_purges_camo_url_extracted_from_readme   4 0 0   100%
cli / tests / test_main.py test_main_badge_regex_only_matches_camo_with_matching_canonical_src   4 0 0   100%
cli / tests / test_main.py test_main_logs_failure_when_camo_purge_returns_non_200   3 0 0   100%
cli / tests / test_main.py test_main_create_site_uses_api_key_header_and_120s_timeout   5 0 0   100%
cli / tests / test_main.py (no function)   42 0 0   100%
cli / tests / test_request.py test_request_returns_response_on_first_success   5 0 0   100%
cli / tests / test_request.py test_request_retries_on_transport_error_then_succeeds   4 0 0   100%
cli / tests / test_request.py test_request_retries_on_5xx_then_succeeds   4 0 0   100%
cli / tests / test_request.py test_request_does_not_retry_on_4xx   4 0 0   100%
cli / tests / test_request.py test_request_gives_up_after_three_attempts   4 0 0   100%
cli / tests / test_request.py test_request_passes_parameters   8 0 0   100%
cli / tests / test_request.py test_request_uses_configured_timeout   4 0 0   100%
cli / tests / test_request.py (no function)   13 0 0   100%
cli / tests / test_upload_files.py FakeS3Client.__init__   1 0 0   100%
cli / tests / test_upload_files.py FakeS3Client.__aenter__   1 0 0   100%
cli / tests / test_upload_files.py FakeS3Client.__aexit__   1 0 0   100%
cli / tests / test_upload_files.py patched_aiobotocore   4 0 0   100%
cli / tests / test_upload_files.py test_upload_files_uploads_every_file_recursively   10 0 0   100%
cli / tests / test_upload_files.py test_upload_files_skips_directories   9 0 0   100%
cli / tests / test_upload_files.py test_upload_files_uses_relative_key_under_site_prefix   5 0 0   100%
cli / tests / test_upload_files.py test_upload_files_returns_uploaded_count   7 0 0   100%
cli / tests / test_upload_files.py test_upload_files_empty_directory_returns_zero   5 0 0   100%
cli / tests / test_upload_files.py test_upload_files_preserves_file_bytes   6 0 0   100%
cli / tests / test_upload_files.py test_upload_files_passes_session_credentials_to_s3_client   6 0 0   100%
cli / tests / test_upload_files.py test_upload_files_respects_concurrency_limit   9 0 0   100%
cli / tests / test_upload_files.py test_upload_files_respects_concurrency_limit.put_object   5 0 0   100%
cli / tests / test_upload_files.py test_upload_files_propagates_s3_errors   5 0 0   100%
cli / tests / test_upload_files.py test_upload_files_propagates_s3_errors.put_object   1 0 0   100%
cli / tests / test_upload_files.py (no function)   26 0 0   100%
cli / tests / utils.py (no function)   1 0 0   100%
Total     1351 1 5   99%

No items found using the specified filter.