Coverage report: 95%

Files Functions Classes

coverage.py v7.14.3, created at 2026-06-28 16:00 +0000

      Statements   Branches   Total
File function   coverage statements missing excluded   coverage branches partial   coverage
app/backend/src/app.py _run_api_server   0% 18 18 0   100% 0 0   0%
app/backend/src/app.py start_api_worker   0% 3 3 0   100% 0 0   0%
app/backend/src/app.py log_unhandled_exception   0% 4 4 0   0% 2 0   0%
app/backend/src/app.py common_init   0% 8 8 0   0% 4 0   0%
app/backend/src/app.py main   0% 33 33 0   0% 16 0   0%
app/backend/src/app.py (no function)   0% 39 39 0   0% 6 0   0%
app/backend/src/couchers/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/abuse.py nonvisible_user_state   100% 7 0 0   100% 6 0   100%
app/backend/src/couchers/abuse.py maybe_log_nonvisible_user_access   100% 13 0 0   100% 4 0   100%
app/backend/src/couchers/abuse.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/config.py Config.__init__   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/config.py Config.copy_from   100% 10 0 0   100% 2 0   100%
app/backend/src/couchers/config.py Config.copy   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/config.py Config.check   57% 28 12 0   59% 32 13   58%
app/backend/src/couchers/config.py Config.load_from_env   96% 23 1 0   95% 20 1   95%
app/backend/src/couchers/config.py Config.__getitem__   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/config.py Config.__setitem__   70% 10 3 0   62% 8 1   67%
app/backend/src/couchers/config.py Config.__delitem__   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/config.py Config.get   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/config.py (no function)   100% 29 0 0   100% 0 0   100%
app/backend/src/couchers/constants.py (no function)   100% 51 0 0   100% 0 0   100%
app/backend/src/couchers/context.py NonInteractiveAbortException.__init__   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/context.py NonInteractiveAbortException.code   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/context.py NonInteractiveAbortException.details   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/context.py NonInteractiveAbortException.__str__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/context.py CouchersContext.__init__   89% 19 2 0   75% 8 2   85%
app/backend/src/couchers/context.py CouchersContext.__verify_interactive   50% 2 1 0   50% 2 1   50%
app/backend/src/couchers/context.py CouchersContext.__verify_logged_in   50% 2 1 0   50% 2 1   50%
app/backend/src/couchers/context.py CouchersContext.is_logged_in   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.is_logged_out   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.abort   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/context.py CouchersContext.abort_with_error_code   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/context.py CouchersContext.set_cookies   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.set_response_headers   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext._send_cookies   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.headers   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.get_header   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.user_id   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.is_api_key   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/context.py CouchersContext.token   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.localization   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.serialize_shadowed   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.get_boolean_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.get_string_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.get_integer_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.get_float_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext.get_object_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py CouchersContext._get_growthbook   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/context.py make_interactive_context   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py make_one_off_interactive_user_context   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py make_media_context   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py make_background_user_context   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py make_notification_user_context   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py make_logged_out_context   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/context.py (no function)   100% 48 0 2   100% 0 0   100%
app/backend/src/couchers/crypto.py b64encode   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py b64decode   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py b64encode_unpadded   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py b64decode_unpadded   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py _urlsafe_random_b64   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py urlsafe_secure_token   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py cookiesafe_secure_token   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py hash_password   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py verify_password   60% 5 2 0   100% 0 0   60%
app/backend/src/couchers/crypto.py random_hex   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py secure_compare   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py generate_hash_signature   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py simple_hash_signature   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/crypto.py verify_hash_signature   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py generate_random_5digit_string   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py verify_token   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py stable_secure_uniform   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py get_secret   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py aead_generate_nonce   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py aead_generate_key   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/crypto.py aead_encrypt   100% 4 0 0   50% 2 1   83%
app/backend/src/couchers/crypto.py aead_decrypt   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py simple_encrypt   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py simple_decrypt   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py encrypt_proto   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py decrypt_proto   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py create_sofa_id   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py encode_sofa   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py decode_sofa   100% 6 0 0   100% 4 0   100%
app/backend/src/couchers/crypto.py encrypt_page_token   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py decrypt_page_token   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py asym_encrypt   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py asym_decrypt   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py generate_asym_keypair   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py generate_invite_code   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/crypto.py (no function)   100% 60 0 0   100% 0 0   100%
app/backend/src/couchers/db.py apply_migrations   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/db.py _get_base_engine   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/db.py session_scope   57% 23 10 0   50% 4 2   56%
app/backend/src/couchers/db.py worker_repeatable_read_session_scope   57% 23 10 0   50% 4 2   56%
app/backend/src/couchers/db.py db_post_fork   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/db.py are_friends   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/db.py get_parent_node_at_location   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/db.py _get_node_parents_recursive_cte_subquery   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/db.py get_node_parents_recursively   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/db.py _can_moderate_any_cluster   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/db.py can_moderate_node   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/db.py can_moderate_at   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/db.py is_user_in_node_geography   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/db.py timezone_at_coordinate   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/db.py (no function)   100% 43 0 2   100% 0 0   100%
app/backend/src/couchers/descriptor_pool.py get_descriptors_pb   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/descriptor_pool.py get_descriptor_pool   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/descriptor_pool.py (no function)   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/email/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBase.string_key_base   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBase.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBase.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBase.get_body_blocks   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBase._body_builder   100% 8 0 0   83% 6 1   93%
app/backend/src/couchers/email/blocks.py EmailBase.test_instances   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBase._localize   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py UserInfo.from_protobuf   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py UserInfo.dummy_bob   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder.__init__   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder.build   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder.para   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder.quote   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder.user   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder.action   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder.block   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder._text   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py EmailBlocksBuilder._markup   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/blocks.py (no function)   100% 56 0 6   100% 0 0   100%
app/backend/src/couchers/email/calendar_events.py create_host_request_attachment   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/calendar_events.py create_host_request_calendar   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/calendar_events.py create_host_request_event   100% 13 0 0   100% 2 0   100%
app/backend/src/couchers/email/calendar_events.py create_host_request_cancellation_attachment   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/calendar_events.py create_host_request_cancellation_calendar   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/email/calendar_events.py event_to_calendar   100% 5 0 0   50% 2 1   86%
app/backend/src/couchers/email/calendar_events.py calendar_to_attachment   100% 6 0 0   50% 2 1   88%
app/backend/src/couchers/email/calendar_events.py get_host_request_event_uid   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/calendar_events.py (no function)   100% 18 0 0   100% 0 0   100%
app/backend/src/couchers/email/dev.py print_dev_email   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/email/dev.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/dump_emails.py CommandLineArgs.parse   0% 6 6 0   100% 0 0   0%
app/backend/src/couchers/email/dump_emails.py RenderedVariation.html_filename   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/dump_emails.py RenderedVariation.plaintext_filename   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/dump_emails.py _ordered_locales   100% 3 0 0   50% 2 1   80%
app/backend/src/couchers/email/dump_emails.py dump_all   100% 22 0 0   83% 12 2   94%
app/backend/src/couchers/email/dump_emails.py dump_email   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/dump_emails.py write_index   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/email/dump_emails.py main   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/email/dump_emails.py (no function)   97% 33 1 0   50% 2 1   94%
app/backend/src/couchers/email/emails.py AccountDeletionStartedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionStartedEmail.get_body_blocks   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionStartedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionStartedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionCompletedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionCompletedEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionCompletedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionCompletedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionRecoveredEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionRecoveredEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py AccountDeletionRecoveredEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ActivenessProbeEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ActivenessProbeEmail.get_body_blocks   91% 11 1 0   50% 2 1   85%
app/backend/src/couchers/email/emails.py ActivenessProbeEmail.from_notification   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ActivenessProbeEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py APIKeyIssuedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py APIKeyIssuedEmail.get_body_blocks   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py APIKeyIssuedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py APIKeyIssuedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BadgeChangedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BadgeChangedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BadgeChangedEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BadgeChangedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BadgeChangedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BirthdateChangedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BirthdateChangedEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BirthdateChangedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py BirthdateChangedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessageReceivedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessageReceivedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessageReceivedEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessageReceivedEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessageReceivedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessageReceivedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessagesMissedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessagesMissedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessagesMissedEmail.get_preview_line   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/email/emails.py ChatMessagesMissedEmail.get_body_blocks   100% 9 0 0   100% 4 0   100%
app/backend/src/couchers/email/emails.py ChatMessagesMissedEmail.from_notification   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ChatMessagesMissedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCreatedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCreatedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCreatedEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCreatedEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCreatedEmail.from_notification   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/email/emails.py DiscussionCreatedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCommentEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCommentEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCommentEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCommentEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCommentEmail.from_notification   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DiscussionCommentEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DonationReceivedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DonationReceivedEmail.get_body_blocks   100% 11 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DonationReceivedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py DonationReceivedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailChangedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailChangedEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailChangedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailChangedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailChangeConfirmationEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailChangeConfirmationEmail.get_body_blocks   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailChangeConfirmationEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailVerifiedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailVerifiedEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EmailVerifiedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventInfo.get_details_block   79% 14 3 0   75% 4 1   78%
app/backend/src/couchers/email/emails.py EventInfo.get_description_block   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventInfo.get_view_action_block   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventInfo.from_proto   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventInfo.dummy   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCreatedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCreatedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCreatedEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCreatedEmail.get_body_blocks   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/email/emails.py EventCreatedEmail.from_notification   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCreatedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventUpdatedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventUpdatedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventUpdatedEmail.get_body_blocks   100% 12 0 0   100% 2 0   100%
app/backend/src/couchers/email/emails.py EventUpdatedEmail.from_notification   50% 8 4 0   12% 8 1   31%
app/backend/src/couchers/email/emails.py EventUpdatedEmail._updated_item_str_to_enum   0% 13 13 0   0% 10 0   0%
app/backend/src/couchers/email/emails.py EventUpdatedEmail._updated_item_to_string_key   100% 13 0 0   100% 10 0   100%
app/backend/src/couchers/email/emails.py EventUpdatedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventOrganizerInvitedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventOrganizerInvitedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventOrganizerInvitedEmail.get_body_blocks   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventOrganizerInvitedEmail.from_notification   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/email/emails.py EventOrganizerInvitedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCommentEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCommentEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCommentEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCommentEmail.get_body_blocks   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCommentEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCommentEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventReminderEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventReminderEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventReminderEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventReminderEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventReminderEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCancelledEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCancelledEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCancelledEmail.get_body_blocks   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCancelledEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventCancelledEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventDeletedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventDeletedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventDeletedEmail.get_body_blocks   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py EventDeletedEmail.from_notification   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/email/emails.py EventDeletedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendReferenceReceivedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendReferenceReceivedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendReferenceReceivedEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendReferenceReceivedEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendReferenceReceivedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendReferenceReceivedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestReceivedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestReceivedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestReceivedEmail.get_body_blocks   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestReceivedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestReceivedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestAcceptedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestAcceptedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestAcceptedEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestAcceptedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py FriendRequestAcceptedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py GenderChangedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py GenderChangedEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py GenderChangedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py GenderChangedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestCreatedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestCreatedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestCreatedEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestCreatedEmail.get_body_blocks   100% 9 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestCreatedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestCreatedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestReminderEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestReminderEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestReminderEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestReminderEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestReminderEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMessageEmail.string_key_base   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMessageEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMessageEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMessageEmail.get_body_blocks   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMessageEmail.from_notification   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/email/emails.py HostRequestMessageEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMissedMessagesEmail.string_key_base   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMissedMessagesEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMissedMessagesEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMissedMessagesEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestMissedMessagesEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestStatusChangedEmail.string_key_base   83% 12 2 0   88% 8 1   85%
app/backend/src/couchers/email/emails.py HostRequestStatusChangedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestStatusChangedEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostRequestStatusChangedEmail.from_notification   75% 16 4 0   75% 8 2   75%
app/backend/src/couchers/email/emails.py HostRequestStatusChangedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReceivedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReceivedEmail.string_role_subkey   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReceivedEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReceivedEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReceivedEmail.get_body_blocks   100% 10 0 0   100% 2 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReceivedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReceivedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReminderEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReminderEmail.string_role_subkey   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReminderEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReminderEmail.get_body_blocks   100% 9 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReminderEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py HostReferenceReminderEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ModeratorNoteEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ModeratorNoteEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ModeratorNoteEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py NewBlogPostEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py NewBlogPostEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py NewBlogPostEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py NewBlogPostEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py NewBlogPostEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py NewBlogPostEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py OnboardingReminderEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py OnboardingReminderEmail.get_body_blocks   100% 20 0 0   100% 2 0   100%
app/backend/src/couchers/email/emails.py OnboardingReminderEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordChangedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordChangedEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordChangedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordResetCompletedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordResetCompletedEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordResetCompletedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordResetStartedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordResetStartedEmail.get_body_blocks   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordResetStartedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PasswordResetStartedEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PhoneNumberChangeEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PhoneNumberChangeEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PhoneNumberChangeEmail.from_change_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PhoneNumberChangeEmail.from_verify_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PhoneNumberChangeEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationFailedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationFailedEmail.get_body_blocks   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationFailedEmail.from_notification   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/email/emails.py PostalVerificationFailedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationPostcardSentEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationPostcardSentEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationPostcardSentEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationPostcardSentEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationSucceededEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationSucceededEmail.get_body_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py PostalVerificationSucceededEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupVerifyEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupVerifyEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupVerifyEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupVerifyEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupContinueEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupContinueEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupContinueEmail.get_body_blocks   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py SignupContinueEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py StrongVerificationFailedEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py StrongVerificationFailedEmail.get_body_blocks   83% 12 2 0   83% 6 1   83%
app/backend/src/couchers/email/emails.py StrongVerificationFailedEmail.from_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py StrongVerificationFailedEmail.test_instances   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py StrongVerificationSucceededEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py StrongVerificationSucceededEmail.get_body_blocks   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py StrongVerificationSucceededEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ThreadReplyEmail.string_key_base   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ThreadReplyEmail.get_subject_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ThreadReplyEmail.get_preview_line   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ThreadReplyEmail.get_body_blocks   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py ThreadReplyEmail.from_notification   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/email/emails.py ThreadReplyEmail.test_instances   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py _localize_host_request_date   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/emails.py (no function)   100% 487 0 0   100% 0 0   100%
app/backend/src/couchers/email/locales.py get_emails_i18next   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/locales.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/queuing.py _queue_email   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/email/queuing.py queue_email   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/queuing.py queue_userless_email   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/email/queuing.py queue_system_email   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/email/queuing.py (no function)   100% 19 0 0   100% 0 0   100%
app/backend/src/couchers/email/rendering.py render_email   100% 10 0 0   100% 2 0   100%
app/backend/src/couchers/email/rendering.py render_plaintext_body   93% 30 2 0   94% 18 1   94%
app/backend/src/couchers/email/rendering.py _to_plaintext   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/email/rendering.py _get_footer_template_args   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/email/rendering.py _get_footer_template_args.localize   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/rendering.py render_html_body   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/email/rendering.py HTMLRenderer.render   90% 20 2 0   92% 12 1   91%
app/backend/src/couchers/email/rendering.py HTMLRenderer._merge_action_blocks   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/email/rendering.py HTMLRenderer.default   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/email/rendering.py HTMLRenderer.from_template   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/email/rendering.py (no function)   100% 37 0 0   100% 0 0   100%
app/backend/src/couchers/email/smtp.py embed_html_relative_images   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/email/smtp.py embed_html_relative_images.process_relative_src_match   90% 10 1 0   50% 2 1   83%
app/backend/src/couchers/email/smtp.py email_proto_to_message   88% 25 3 0   86% 14 2   87%
app/backend/src/couchers/email/smtp.py _add_email_part   100% 16 0 0   80% 10 2   92%
app/backend/src/couchers/email/smtp.py send_smtp_email   70% 10 3 0   50% 2 1   67%
app/backend/src/couchers/email/smtp.py _replace_header_verbatim   83% 6 1 0   75% 4 1   80%
app/backend/src/couchers/email/smtp.py (no function)   100% 20 0 0   100% 0 0   100%
app/backend/src/couchers/event_log.py log_event   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/event_log.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py _fetch_features   0% 13 13 0   0% 2 0   0%
app/backend/src/couchers/experimentation.py _apply_response   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py _set_last_fetch_time   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py seconds_since_last_fetch   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/experimentation.py _write_cache   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py _read_cache   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/experimentation.py _refresh_loop   14% 7 6 0   25% 4 1   18%
app/backend/src/couchers/experimentation.py _load_local_flags   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/experimentation.py setup_experimentation   96% 28 1 0   88% 8 1   94%
app/backend/src/couchers/experimentation.py _record_exposure   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py _record_feature_usage   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py _create_evaluator   88% 8 1 0   50% 2 1   80%
app/backend/src/couchers/experimentation.py _create_evaluator.on_experiment_viewed   100% 2 0 0   50% 2 1   75%
app/backend/src/couchers/experimentation.py _create_evaluator.on_feature_usage   100% 2 0 0   100% 2 0   100%
app/backend/src/couchers/experimentation.py _global_evaluator   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py _feature_value   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/experimentation.py get_global_boolean_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py get_global_string_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py get_global_integer_value   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/experimentation.py get_global_float_value   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/experimentation.py get_global_object_value   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/experimentation.py (no function)   100% 49 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/badges.py user_add_badge   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/helpers/badges.py user_remove_badge   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/badges.py (no function)   100% 11 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/clusters.py create_node   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/clusters.py create_cluster   93% 15 1 0   50% 2 1   88%
app/backend/src/couchers/helpers/clusters.py (no function)   100% 10 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/completed_profile.py has_completed_profile   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/helpers/completed_profile.py has_completed_profile_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/completed_profile.py (no function)   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/geoip.py geoip_approximate_location   13% 15 13 0   25% 4 1   16%
app/backend/src/couchers/helpers/geoip.py geoip_asn   11% 18 16 0   17% 6 1   12%
app/backend/src/couchers/helpers/geoip.py (no function)   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/postal_verification.py generate_postal_verification_code   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/postal_verification.py has_postal_verification   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/postal_verification.py (no function)   100% 9 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/strong_verification.py has_strong_verification   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/helpers/strong_verification.py get_strong_verification_fields   100% 13 0 0   100% 6 0   100%
app/backend/src/couchers/helpers/strong_verification.py (no function)   100% 9 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/upload_uses.py get_upload_uses   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/helpers/upload_uses.py get_upload_uses_for_keys   100% 16 0 0   100% 8 0   100%
app/backend/src/couchers/helpers/upload_uses.py (no function)   100% 20 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/__init__.py (no function)   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.__init__   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/i18n/context.py LocalizationContext.__setattr__   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/i18n/context.py LocalizationContext.localized_timezone   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.try_localize_language_name_from_iso639   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.try_localize_region_name_from_iso3166   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.localize_string   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.localize_list   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.localize_date   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/i18n/context.py LocalizationContext.localize_date_from_iso   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.localize_datetime   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.localize_time   0% 3 3 0   0% 2 0   0%
app/backend/src/couchers/i18n/context.py LocalizationContext.en_utc   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py LocalizationContext.from_user   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/context.py (no function)   100% 29 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py I18Next.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py I18Next.add_translation   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/i18n/i18next.py I18Next.find_string   100% 7 0 0   100% 6 0   100%
app/backend/src/couchers/i18n/i18next.py I18Next.localize   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/i18n/i18next.py I18Next.localize_with_markup   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/i18n/i18next.py Translation.__init__   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py Translation.locale   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py Translation.load_json_dict   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py Translation.load_json_dict.add_strings   86% 7 1 0   83% 6 1   85%
app/backend/src/couchers/i18n/i18next.py Translation.add_string   100% 2 0 0   100% 2 0   100%
app/backend/src/couchers/i18n/i18next.py Translation.find_string   100% 7 0 0   88% 8 1   93%
app/backend/src/couchers/i18n/i18next.py Translation.localize   0% 4 4 0   0% 2 0   0%
app/backend/src/couchers/i18n/i18next.py Translation.localize_with_markup   0% 4 4 0   0% 2 0   0%
app/backend/src/couchers/i18n/i18next.py String.render   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py String.render_with_markup   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py StringTemplate.can_render   100% 5 0 0   100% 6 0   100%
app/backend/src/couchers/i18n/i18next.py StringTemplate.render   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py StringTemplate.render_with_markup   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py StringTemplate._render   92% 13 1 0   90% 10 1   91%
app/backend/src/couchers/i18n/i18next.py StringTemplate.parse   100% 10 0 0   100% 6 0   100%
app/backend/src/couchers/i18n/i18next.py LocalizationError.__init__   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/i18next.py full_string_key   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/i18n/i18next.py (no function)   100% 43 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/locales.py get_supported_locales   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/locales.py is_supported_locale   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/locales.py to_supported_locale   100% 18 0 0   88% 8 1   96%
app/backend/src/couchers/i18n/locales.py get_locale_fallbacks   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/i18n/locales.py get_babel_locale   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/locales.py load_locales   93% 15 1 0   88% 8 1   91%
app/backend/src/couchers/i18n/locales.py get_main_i18next   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/locales.py get_admin_i18next   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/locales.py get_translation_component   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/locales.py (no function)   100% 20 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py localize_string   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/i18n/localize.py localize_list   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py try_localize_language_name_from_iso639   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/i18n/localize.py try_localize_region_name_from_iso3166   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py localize_date   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py localize_time   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py localize_datetime   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py _get_cldr_date_pattern   94% 16 1 0   90% 10 1   92%
app/backend/src/couchers/i18n/localize.py _get_cldr_time_pattern   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/i18n/localize.py _combine_cldr_date_time_patterns   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py localize_timezone   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py format_phone_number   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/i18n/localize.py (no function)   100% 22 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py _binned_now   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py _try_get_and_update_user_details   100% 16 0 0   100% 6 0   100%
app/backend/src/couchers/interceptors.py abort_handler   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py abort_handler.f   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py unauthenticated_handler   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py _descriptor_has_sensitive   100% 13 0 0   100% 10 0   100%
app/backend/src/couchers/interceptors.py _sanitize_plan   100% 8 0 0   100% 6 0   100%
app/backend/src/couchers/interceptors.py _sanitize_message   73% 11 3 0   60% 10 2   67%
app/backend/src/couchers/interceptors.py _sanitized_bytes   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/interceptors.py _sanitized_bytes   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/interceptors.py _sanitized_bytes   100% 7 0 0   100% 4 0   100%
app/backend/src/couchers/interceptors.py _store_log   80% 10 2 0   50% 2 1   75%
app/backend/src/couchers/interceptors.py CouchersMiddlewareInterceptor.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py CouchersMiddlewareInterceptor.intercept_service   95% 39 2 0   67% 6 2   91%
app/backend/src/couchers/interceptors.py CouchersMiddlewareInterceptor.intercept_service.function_without_couchers_stuff   96% 49 2 0   79% 14 3   92%
app/backend/src/couchers/interceptors.py CouchersMiddlewareInterceptor.intercept_service.timed_serde   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py CouchersMiddlewareInterceptor.intercept_service.timed_serde.wrapped   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py parse_headers   100% 15 0 0   100% 6 0   100%
app/backend/src/couchers/interceptors.py AbortError.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py find_auth_level   100% 9 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py validate_auth_level   75% 4 1 0   75% 4 1   75%
app/backend/src/couchers/interceptors.py check_permissions   100% 9 0 0   100% 10 0   100%
app/backend/src/couchers/interceptors.py MediaInterceptor.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py MediaInterceptor.intercept_service   75% 12 3 0   50% 6 3   67%
app/backend/src/couchers/interceptors.py MediaInterceptor.intercept_service.function_without_session   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py OTelInterceptor.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/interceptors.py OTelInterceptor.intercept_service   0% 11 11 0   0% 4 0   0%
app/backend/src/couchers/interceptors.py OTelInterceptor.intercept_service.tracing_function   0% 10 10 0   100% 0 0   0%
app/backend/src/couchers/interceptors.py ErrorSanitizationInterceptor.intercept_service   75% 8 2 0   50% 4 2   67%
app/backend/src/couchers/interceptors.py ErrorSanitizationInterceptor.intercept_service.sanitizing_function   100% 11 0 0   100% 2 0   100%
app/backend/src/couchers/interceptors.py (no function)   100% 74 0 2   100% 0 0   100%
app/backend/src/couchers/jobs/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/definitions.py JobHandler.__call__   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/jobs/definitions.py JobHandler.__name__   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/jobs/definitions.py Job.name   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/definitions.py Job.payload_type   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/definitions.py (no function)   100% 22 0 4   100% 0 0   100%
app/backend/src/couchers/jobs/enqueue.py queue_job   83% 6 1 0   75% 4 1   80%
app/backend/src/couchers/jobs/enqueue.py (no function)   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py send_email   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py purge_login_tokens   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py purge_password_reset_tokens   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py purge_account_deletion_tokens   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py send_message_notifications   100% 12 0 0   100% 4 0   100%
app/backend/src/couchers/jobs/handlers.py send_request_notifications   100% 20 0 0   100% 8 0   100%
app/backend/src/couchers/jobs/handlers.py send_onboarding_emails   100% 14 0 0   100% 4 0   100%
app/backend/src/couchers/jobs/handlers.py send_reference_reminders   100% 20 0 0   100% 6 0   100%
app/backend/src/couchers/jobs/handlers.py send_host_request_reminders   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/jobs/handlers.py add_users_to_email_list   53% 30 14 0   60% 10 2   55%
app/backend/src/couchers/jobs/handlers.py add_users_to_email_list.sync_subscriber   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/jobs/handlers.py enforce_community_membership   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py update_recommendation_scores   100% 60 0 0   100% 4 0   100%
app/backend/src/couchers/jobs/handlers.py update_recommendation_scores.poor_man_gaussian   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py update_recommendation_scores.int_   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py update_recommendation_scores.float_   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py update_badges   100% 11 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py update_badges.update_badge   100% 11 0 0   100% 6 0   100%
app/backend/src/couchers/jobs/handlers.py finalize_strong_verification   96% 46 2 0   83% 12 2   93%
app/backend/src/couchers/jobs/handlers.py send_activeness_probes   97% 29 1 0   81% 16 3   91%
app/backend/src/couchers/jobs/handlers.py update_randomized_locations   100% 10 0 0   100% 2 0   100%
app/backend/src/couchers/jobs/handlers.py update_randomized_locations.gen_randomized_coords   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/handlers.py send_event_reminders   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/jobs/handlers.py check_expo_push_receipts   93% 28 2 0   79% 14 3   88%
app/backend/src/couchers/jobs/handlers.py send_postal_verification_postcard   86% 14 2 0   50% 2 1   81%
app/backend/src/couchers/jobs/handlers.py check_mypostcard_jobs   0% 8 8 0   0% 4 0   0%
app/backend/src/couchers/jobs/handlers.py check_database_consistency   67% 48 16 0   53% 32 11   61%
app/backend/src/couchers/jobs/handlers.py auto_approve_moderation_queue   100% 17 0 0   100% 8 0   100%
app/backend/src/couchers/jobs/handlers.py (no function)   100% 66 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/worker.py process_job   90% 42 4 0   100% 6 0   92%
app/backend/src/couchers/jobs/worker.py service_jobs   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/jobs/worker.py _run_job_and_schedule   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/jobs/worker.py run_scheduler   100% 5 0 0   75% 4 1   89%
app/backend/src/couchers/jobs/worker.py _run_forever   0% 12 12 0   0% 2 0   0%
app/backend/src/couchers/jobs/worker.py start_jobs_scheduler   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/jobs/worker.py start_jobs_worker   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/jobs/worker.py (no function)   100% 32 0 0   100% 0 0   100%
app/backend/src/couchers/markup.py markdown_to_html   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/markup.py markdown_to_plaintext   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/markup.py html_to_plaintext   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/markup.py _HTMLToPlaintext.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/markup.py _HTMLToPlaintext.handle_starttag   100% 2 0 0   100% 2 0   100%
app/backend/src/couchers/markup.py _HTMLToPlaintext.handle_data   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/markup.py (no function)   100% 12 0 0   100% 0 0   100%
app/backend/src/couchers/materialized_views.py create_materialized_view_with_different_ddl   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/materialized_views.py create_materialized_view_with_different_ddl.create_indexes   100% 2 0 0   100% 2 0   100%
app/backend/src/couchers/materialized_views.py make_lite_users_selectable   100% 7 0 0   100% 2 0   100%
app/backend/src/couchers/materialized_views.py make_clustered_users_selectable   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/materialized_views.py float_   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/materialized_views.py refresh_materialized_views   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/materialized_views.py refresh_materialized_views_rapid   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/materialized_views.py (no function)   100% 49 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_in_jobs_duration_histogram   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_in_servicer_duration_histogram   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_in_servicer_setup_errors_counter   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_in_servicer_perf_histograms   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/metrics.py observe_in_servicer_setup_histogram   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/metrics.py observe_in_servicer_pool_wait_histogram   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_in_servicer_serde_histogram   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py start_worker_resource_sampler   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/metrics.py start_worker_resource_sampler.sample   0% 4 4 0   100% 0 0   0%
app/backend/src/couchers/metrics.py observe_api_call   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py _make_gauge_from_query   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py _make_gauge_from_query.f   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py _make_labeled_gauge_from_query   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py _make_labeled_gauge_from_query.f   100% 7 0 0   100% 4 0   100%
app/backend/src/couchers/metrics.py active_users_by_platform_statement   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py _set_active_users_by_platform   100% 7 0 0   100% 2 0   100%
app/backend/src/couchers/metrics.py observe_revenue   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_moderation_action   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_moderation_visibility_transition   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_moderation_queue_item_created   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_moderation_queue_item_resolved   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_moderation_queue_resolution_time   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_nonvisible_user_access   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_native_bundle_age   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_native_binary_age   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_native_update_decision   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_native_banned_bundle_hit   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_native_ota_manifest_request   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py observe_native_client_checkin   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py _feature_flags_staleness_seconds   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py _stringify_flag_value   88% 8 1 0   83% 6 1   86%
app/backend/src/couchers/metrics.py observe_feature_flag_evaluation   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py create_prometheus_server   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/metrics.py create_prometheus_server.app   100% 7 0 0   100% 4 0   100%
app/backend/src/couchers/metrics.py (no function)   100% 157 0 0   50% 2 1   99%
app/backend/src/couchers/migrations/env.py _next_ordinal   0% 6 6 0   0% 4 0   0%
app/backend/src/couchers/migrations/env.py process_revision_directives   0% 2 2 0   0% 2 0   0%
app/backend/src/couchers/migrations/env.py include_name   0% 5 5 0   0% 4 0   0%
app/backend/src/couchers/migrations/env.py include_object   0% 3 3 0   0% 2 0   0%
app/backend/src/couchers/migrations/env.py run_migrations_offline   0% 4 4 0   100% 0 0   0%
app/backend/src/couchers/migrations/env.py run_migrations_online   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/migrations/env.py (no function)   87% 30 4 0   33% 6 2   78%
app/backend/src/couchers/models/__init__.py (no function)   100% 23 0 0   100% 0 0   100%
app/backend/src/couchers/models/activeness_probe.py ActivenessProbe.is_pending   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/activeness_probe.py (no function)   100% 24 0 2   100% 0 0   100%
app/backend/src/couchers/models/admin.py (no function)   100% 40 0 2   100% 0 0   100%
app/backend/src/couchers/models/auth.py UserSession.is_valid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/auth.py LoginToken.is_valid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/auth.py LoginToken.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/auth.py PasswordResetToken.is_valid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/auth.py PasswordResetToken.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/auth.py (no function)   100% 45 0 2   100% 0 0   100%
app/backend/src/couchers/models/background_jobs.py BackgroundJob.ready_for_retry   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/background_jobs.py BackgroundJob.__repr__   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/background_jobs.py (no function)   100% 29 0 0   100% 0 0   100%
app/backend/src/couchers/models/base.py (no function)   100% 11 0 0   100% 0 0   100%
app/backend/src/couchers/models/clusters.py Cluster.is_leaf   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/clusters.py Page.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/clusters.py PageVersion.coordinates   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/clusters.py PageVersion.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/clusters.py (no function)   100% 124 0 3   100% 0 0   100%
app/backend/src/couchers/models/conversations.py Conversation.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/conversations.py GroupChat.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/conversations.py GroupChatSubscription.muted_display   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/models/conversations.py GroupChatSubscription.is_muted   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/conversations.py GroupChatSubscription.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/conversations.py Message.is_normal_message   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/conversations.py Message.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/conversations.py (no function)   100% 79 0 2   100% 0 0   100%
app/backend/src/couchers/models/discussions.py (no function)   100% 113 0 2   100% 0 0   100%
app/backend/src/couchers/models/donations.py (no function)   100% 32 0 2   100% 0 0   100%
app/backend/src/couchers/models/events.py EventOccurrence.coordinates   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/events.py EventOccurrence.start_time   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/events.py EventOccurrence._start_time_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/events.py EventOccurrence.end_time   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/events.py EventOccurrence._end_time_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/events.py (no function)   100% 123 0 3   100% 0 0   100%
app/backend/src/couchers/models/host_requests.py HostRequest.can_write_reference   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/host_requests.py HostRequest.can_write_reference_expr   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/host_requests.py HostRequest.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/host_requests.py (no function)   100% 73 0 5   100% 0 0   100%
app/backend/src/couchers/models/logging.py (no function)   100% 94 0 0   100% 0 0   100%
app/backend/src/couchers/models/mod_note.py ModNote.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/mod_note.py ModNote.is_pending   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/mod_note.py (no function)   100% 20 0 2   100% 0 0   100%
app/backend/src/couchers/models/moderation.py ModerationState.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/moderation.py ModerationQueueItem.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/moderation.py ModerationLog.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/moderation.py get_moderated_models   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/models/moderation.py (no function)   100% 77 0 2   100% 0 0   100%
app/backend/src/couchers/models/notifications.py NotificationTopicAction.__init__   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/models/notifications.py NotificationTopicAction.unpack   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/notifications.py NotificationTopicAction.display   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/notifications.py NotificationTopicAction.__str__   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/notifications.py Notification.topic   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/notifications.py Notification.action   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/notifications.py (no function)   100% 157 0 2   100% 0 0   100%
app/backend/src/couchers/models/ota.py (no function)   100% 33 0 2   100% 0 0   100%
app/backend/src/couchers/models/postal_verification.py PostalVerificationAttempt.is_valid   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/postal_verification.py PostalVerificationAttempt._is_valid_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/postal_verification.py (no function)   100% 41 0 2   100% 0 0   100%
app/backend/src/couchers/models/public_trips.py (no function)   100% 25 0 3   100% 0 0   100%
app/backend/src/couchers/models/rest.py ContributorForm.is_filled   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/rest.py ContributorForm.should_notify   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/rest.py SignupFlow.token_is_valid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/rest.py SignupFlow.account_is_filled   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/rest.py SignupFlow.is_completed   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/rest.py AccountDeletionToken.is_valid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/rest.py AccountDeletionToken.__repr__   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/rest.py Reference.should_report   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/rest.py (no function)   100% 258 0 3   100% 0 0   100%
app/backend/src/couchers/models/static.py (no function)   100% 18 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py InitiatedUpload.is_valid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py Upload._url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py Upload.thumbnail_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py Upload.full_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py get_avatar_photo_subquery   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py get_avatar_upload   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py has_avatar_photo_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/uploads.py (no function)   100% 53 0 2   100% 0 0   100%
app/backend/src/couchers/models/users.py User.has_completed_my_home   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User._has_completed_my_home_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.jailed_missing_tos   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.jailed_missing_community_guidelines   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.jailed_pending_mod_notes   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User._jailed_pending_mod_notes_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.jailed_pending_activeness_probe   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User._jailed_pending_activeness_probe_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.is_jailed   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User._is_jailed_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.is_missing_location   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.is_visible   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User._is_visible_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.is_shadowed   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/models/users.py User._is_shadowed_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.coordinates   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.display_joined   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.display_last_active   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.phone_is_verified   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User._phone_is_verified_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.phone_code_expired   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py User.__repr__   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/users.py (no function)   100% 228 0 6   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt.is_valid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt._is_valid_expression   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt.is_visible   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt._raw_birthdate_match   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt.matches_birthdate   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt._raw_gender_match   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt.matches_gender   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py StrongVerificationAttempt.has_strong_verification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/models/verification.py (no function)   100% 65 0 2   100% 0 0   100%
app/backend/src/couchers/moderation/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/moderation/utils.py create_moderation   100% 15 0 0   100% 2 0   100%
app/backend/src/couchers/moderation/utils.py (no function)   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/native_updates.py client_info_from_request   100% 7 0 0   100% 2 0   100%
app/backend/src/couchers/native_updates.py _clock_state   100% 7 0 0   100% 6 0   100%
app/backend/src/couchers/native_updates.py decide_native_update   100% 22 0 0   100% 10 0   100%
app/backend/src/couchers/native_updates.py (no function)   100% 40 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/background.py _send_email_notification   100% 15 0 0   100% 8 0   100%
app/backend/src/couchers/notifications/background.py _send_push_notification   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/background.py handle_notification   100% 26 0 0   93% 14 1   98%
app/backend/src/couchers/notifications/background.py handle_email_digests   0% 16 16 0   0% 6 0   0%
app/backend/src/couchers/notifications/background.py (no function)   100% 22 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/expo_api.py send_expo_push_notification   0% 19 19 0   0% 6 0   0%
app/backend/src/couchers/notifications/expo_api.py get_expo_push_receipts   53% 15 7 0   75% 4 1   58%
app/backend/src/couchers/notifications/expo_api.py (no function)   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/locales.py get_notifs_i18next   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/locales.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/notify.py notify   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/notify.py mark_notifications_seen   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/notify.py (no function)   100% 12 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/push.py push_to_subscription   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/push.py _push_to_user   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/notifications/push.py push_to_user   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/push.py (no function)   100% 27 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/quick_links.py _generate_quick_link   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/quick_links.py decode_quick_link   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/notifications/quick_links.py generate_do_not_email   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/quick_links.py generate_unsub_topic_key   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/notifications/quick_links.py generate_unsub_topic_action   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/quick_links.py generate_quick_decline_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/quick_links.py can_unsubscribe_topic_key   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/quick_links.py (no function)   100% 18 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_email.py get_send_email_payload   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/notifications/render_email.py get_notification_email   90% 102 10 0   91% 98 9   90%
app/backend/src/couchers/notifications/render_email.py get_source_data_header   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_email.py get_ics_attachment   100% 8 0 0   100% 6 0   100%
app/backend/src/couchers/notifications/render_email.py get_list_unsubscribe_header   100% 6 0 0   100% 4 0   100%
app/backend/src/couchers/notifications/render_email.py get_topic_action_unsubscribe_text   97% 71 2 0   99% 68 1   98%
app/backend/src/couchers/notifications/render_email.py get_topic_key_unsubscribe_text   71% 7 2 0   75% 4 1   73%
app/backend/src/couchers/notifications/render_email.py get_email_footer   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_email.py UserTemplateArgs.from_protobuf_user   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_email.py (no function)   100% 28 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py render_push_notification   90% 110 11 0   91% 106 10   90%
app/backend/src/couchers/notifications/render_push.py render_adhoc_push_notification   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _get_content   100% 13 0 0   88% 8 1   95%
app/backend/src/couchers/notifications/render_push.py _get_string   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/notifications/render_push.py _avatar_url_or_default   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_account_deletion__start   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_account_deletion__complete   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_account_deletion__recovered   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_activeness__probe   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_api_key__create   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_badge__add   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_badge__remove   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_birthdate__change   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_chat__message   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_chat__missed_messages   0% 4 4 0   0% 2 0   0%
app/backend/src/couchers/notifications/render_push.py _render_donation__received   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_discussion__create   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_discussion__comment   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_email_address__change   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_email_address__verify   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_event__create_any   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_push.py _render_event__create_approved   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_event__update   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_event__invite_organizer   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_push.py _render_event__comment   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_event__reminder   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_event__cancel   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_event__delete   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_push.py _render_friend_request__create   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_friend_request__accept   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_gender__change   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_general__new_blog_post   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_host_request__create   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_host_request__message   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_host_request__missed_messages   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_push.py _render_host_request__reminder   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_host_request__accept   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_host_request__reject   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_push.py _render_host_request__cancel   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_host_request__confirm   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_modnote__create   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_onboarding__reminder   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_password__change   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_password_reset__start   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_password_reset__complete   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_phone_number__change   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_phone_number__verify   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_postal_verification__postcard_sent   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_postal_verification__success   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_push.py _render_postal_verification__failed   0% 8 8 0   0% 4 0   0%
app/backend/src/couchers/notifications/render_push.py _render_reference__receive_friend   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_reference__receive   67% 6 2 0   50% 2 1   62%
app/backend/src/couchers/notifications/render_push.py _render_reference__receive_hosted   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/notifications/render_push.py _render_reference__receive_surfed   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_reference__reminder   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_reference__reminder_surfed   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_reference__reminder_hosted   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_thread__reply   80% 10 2 0   75% 4 1   79%
app/backend/src/couchers/notifications/render_push.py _render_verification__sv_success   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _render_verification__sv_fail   70% 10 3 0   67% 6 2   69%
app/backend/src/couchers/notifications/render_push.py _format_host_request_start_date   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py _format_event_start_datetime   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/render_push.py (no function)   100% 75 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/send_raw_push_notification.py is_known_invalid_endpoint   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/send_raw_push_notification.py PushNotificationError.__init__   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/notifications/send_raw_push_notification.py _send_web_push   0% 11 11 0   0% 8 0   0%
app/backend/src/couchers/notifications/send_raw_push_notification.py _send_expo   0% 25 25 0   0% 14 0   0%
app/backend/src/couchers/notifications/send_raw_push_notification.py send_raw_push_notification_v2   0% 32 32 0   0% 8 0   0%
app/backend/src/couchers/notifications/send_raw_push_notification.py (no function)   100% 31 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/settings.py get_preference   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/settings.py get_topic_actions_by_delivery_type   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/notifications/settings.py reset_preference   0% 4 4 0   0% 2 0   0%
app/backend/src/couchers/notifications/settings.py set_preference   100% 7 0 0   100% 4 0   100%
app/backend/src/couchers/notifications/settings.py get_user_setting_groups   100% 13 0 0   100% 6 0   100%
app/backend/src/couchers/notifications/settings.py (no function)   100% 17 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/utils.py can_notify_deleted_user   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/utils.py get_topic_action_description   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/utils.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/web_push_api.py gen_vapid_keys   0% 5 5 0   100% 0 0   0%
app/backend/src/couchers/notifications/web_push_api.py get_vapid_public_key_from_private_key   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/web_push_api.py generate_vapid_authorization   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/notifications/web_push_api.py send_web_push   0% 4 4 0   100% 0 0   0%
app/backend/src/couchers/notifications/web_push_api.py decode_key   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/notifications/web_push_api.py parse_subscription_info   0% 4 4 0   100% 0 0   0%
app/backend/src/couchers/notifications/web_push_api.py (no function)   100% 17 0 0   100% 0 0   100%
app/backend/src/couchers/perf.py start_perf   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/perf.py read_perf   80% 5 1 0   50% 2 1   71%
app/backend/src/couchers/perf.py _before_cursor_execute   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/perf.py _after_cursor_execute   91% 11 1 0   83% 6 1   88%
app/backend/src/couchers/perf.py register_perf_listeners   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/perf.py (no function)   100% 17 0 0   100% 0 0   100%
app/backend/src/couchers/phone/check.py is_e164_format   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/phone/check.py is_known_operator   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/phone/check.py (no function)   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/phone/sms.py generate_random_code   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/phone/sms.py looks_like_a_code   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/phone/sms.py format_message   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/phone/sms.py send_sms   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/phone/sms.py (no function)   100% 11 0 0   100% 0 0   100%
app/backend/src/couchers/postal/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/postal/address_validation.py validate_address   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/postal/address_validation.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/postal/my_postcard.py _generate_back_left_side_png   100% 17 0 0   100% 0 0   100%
app/backend/src/couchers/postal/my_postcard.py _credentials   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/postal/my_postcard.py _authenticate   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/postal/my_postcard.py _place_order   0% 5 5 0   100% 0 0   0%
app/backend/src/couchers/postal/my_postcard.py send_postcard   90% 10 1 0   83% 6 1   88%
app/backend/src/couchers/postal/my_postcard.py get_order_ids   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/postal/my_postcard.py download_pdf   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/postal/my_postcard.py (no function)   100% 20 0 0   100% 0 0   100%
app/backend/src/couchers/profiling.py _reconcile   100% 15 0 0   100% 8 0   100%
app/backend/src/couchers/profiling.py _reconcile_loop   0% 3 3 0   0% 2 0   0%
app/backend/src/couchers/profiling.py setup_profiling   0% 5 5 0   0% 2 0   0%
app/backend/src/couchers/profiling.py (no function)   100% 16 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/check.py _get_user_events_in_past_time_interval   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/check.py _save_rate_limit_violation   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/check.py _user_has_violated_rate_limit_in_past_time_interval   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/check.py process_rate_limits_and_check_abort   100% 11 0 0   100% 8 0   100%
app/backend/src/couchers/rate_limits/check.py (no function)   100% 13 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/definitions.py _get_user_host_requests_in_past_time_interval   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/definitions.py _get_user_friend_requests_in_past_time_interval   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/definitions.py _get_user_initiated_chats_in_past_time_interval   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/rate_limits/definitions.py (no function)   100% 15 0 0   100% 0 0   100%
app/backend/src/couchers/reranker.py reranker   87% 15 2 0   83% 12 2   85%
app/backend/src/couchers/reranker.py (no function)   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_terms_of_service   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_icon   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_region_dict   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_region_code_iso3166_alpha3_to_alpha2   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py region_is_allowed   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_language_dict   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_badge_data   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_badge_dict   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_static_badge_dict   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py language_is_allowed   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_postcard_front_image   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_postcard_font   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_postcard_metadata   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py get_postcard_back_left_template   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/resources.py copy_resources_to_database   81% 21 4 0   62% 8 1   76%
app/backend/src/couchers/resources.py (no function)   100% 45 0 0   100% 0 0   100%
app/backend/src/couchers/sentry.py report_error   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/sentry.py report_message   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/sentry.py (no function)   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/server.py _InstrumentedThreadPoolExecutor.submit   0% 4 4 0   100% 0 0   0%
app/backend/src/couchers/server.py create_main_server   97% 36 1 0   50% 2 1   95%
app/backend/src/couchers/server.py create_media_server   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/server.py (no function)   100% 42 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py mod_note_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py abort_on_invalid_password   100% 6 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/account.py _volunteer_info_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.GetAccountInfo   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.ChangePasswordV2   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/account.py Account.ChangeEmailV2   100% 15 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/account.py Account.ChangeLanguagePreference   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.FillContributorForm   100% 9 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.GetContributorFormInfo   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.ChangePhone   100% 29 0 0   100% 14 0   100%
app/backend/src/couchers/servicers/account.py Account.VerifyPhone   89% 19 2 0   80% 10 2   86%
app/backend/src/couchers/servicers/account.py Account.InitiateStrongVerification   89% 19 2 0   67% 6 2   84%
app/backend/src/couchers/servicers/account.py Account.GetStrongVerificationAttemptStatus   80% 5 1 0   50% 2 1   71%
app/backend/src/couchers/servicers/account.py Account.DeleteStrongVerificationData   100% 14 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/account.py Account.DeleteAccount   100% 15 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/account.py Account.ListModNotes   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.ListActiveSessions   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.ListActiveSessions._active_session_to_pb   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.LogOutSession   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.LogOutOtherSessions   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/account.py Account.SetProfilePublicVisibility   0% 4 4 0   100% 0 0   0%
app/backend/src/couchers/servicers/account.py Account.CreateInviteCode   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.DisableInviteCode   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/account.py Account.ListInviteCodes   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/account.py Account.GetReminders   100% 18 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/account.py Account.GetMyVolunteerInfo   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/account.py Account.UpdateMyVolunteerInfo   79% 33 7 0   68% 22 7   75%
app/backend/src/couchers/servicers/account.py Iris.Webhook   89% 18 2 0   62% 8 1   81%
app/backend/src/couchers/servicers/account.py (no function)   100% 74 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py log_admin_action   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py _live_ota_package_ids   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py _extract_ota_manifest   71% 14 4 0   67% 6 2   70%
app/backend/src/couchers/servicers/admin.py _ota_package_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py _user_to_details   100% 7 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/admin.py _content_report_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py _reference_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py Admin.GetUserDetails   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/admin.py Admin.GetUser   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/admin.py Admin.SearchUsers   61% 49 19 0   57% 44 19   59%
app/backend/src/couchers/servicers/admin.py Admin.ChangeUserGender   89% 9 1 0   50% 2 1   82%
app/backend/src/couchers/servicers/admin.py Admin.ChangeUserBirthdate   82% 11 2 0   50% 4 2   73%
app/backend/src/couchers/servicers/admin.py Admin.AddBadge   92% 13 1 0   88% 8 1   90%
app/backend/src/couchers/servicers/admin.py Admin.RemoveBadge   79% 14 3 0   62% 8 3   73%
app/backend/src/couchers/servicers/admin.py Admin.SetPassportSexGenderException   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/admin.py Admin.BanUser   75% 8 2 0   50% 4 2   67%
app/backend/src/couchers/servicers/admin.py Admin.UnbanUser   75% 8 2 0   50% 4 2   67%
app/backend/src/couchers/servicers/admin.py Admin.ShadowUser   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/servicers/admin.py Admin.UnshadowUser   78% 9 2 0   50% 4 2   69%
app/backend/src/couchers/servicers/admin.py Admin.AddAdminNote   94% 16 1 0   83% 6 1   91%
app/backend/src/couchers/servicers/admin.py Admin.GetContentReport   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/admin.py Admin.GetContentReportsForAuthor   80% 5 1 0   50% 2 1   71%
app/backend/src/couchers/servicers/admin.py Admin.SendModNote   90% 10 1 0   75% 4 1   86%
app/backend/src/couchers/servicers/admin.py Admin.MarkUserNeedsLocationUpdate   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/admin.py Admin.DeleteUser   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/admin.py Admin.RecoverDeletedUser   88% 8 1 0   50% 2 1   80%
app/backend/src/couchers/servicers/admin.py Admin.CreateApiKey   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/admin.py Admin.GetChats   94% 17 1 0   50% 2 1   89%
app/backend/src/couchers/servicers/admin.py Admin.GetChats.get_chat_user_info   100% 4 0 0   50% 2 1   83%
app/backend/src/couchers/servicers/admin.py Admin.GetChats.message_to_pb   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/servicers/admin.py Admin.GetChats.get_messages_for_conversation   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/servicers/admin.py Admin.GetChats.get_host_request_pb   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/servicers/admin.py Admin.GetChats.get_group_chat_pb   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/servicers/admin.py Admin.DeleteEvent   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/admin.py Admin.ListUserIds   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py Admin.EditReferenceText   78% 9 2 0   50% 4 2   69%
app/backend/src/couchers/servicers/admin.py Admin.DeleteReference   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py Admin.GetUserReferences   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/admin.py Admin.GetFriendRequests   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/admin.py Admin.GetFriendRequests.get_chat_user_info   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/admin.py Admin.GetFriendRequests.friend_request_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py Admin.GetNonvisibleUserAccessLog   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/admin.py Admin.EditDiscussion   0% 8 8 0   0% 6 0   0%
app/backend/src/couchers/servicers/admin.py Admin.DeleteDiscussion   75% 8 2 0   50% 4 2   67%
app/backend/src/couchers/servicers/admin.py Admin.EditReply   0% 15 15 0   0% 8 0   0%
app/backend/src/couchers/servicers/admin.py Admin.AddUsersToModerationUserList   100% 19 0 0   92% 12 1   97%
app/backend/src/couchers/servicers/admin.py Admin.ListModerationUserLists   80% 5 1 0   50% 2 1   71%
app/backend/src/couchers/servicers/admin.py Admin.RemoveUserFromModerationUserList   93% 15 1 0   90% 10 1   92%
app/backend/src/couchers/servicers/admin.py Admin.CreateAccountDeletionLink   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/admin.py Admin.AccessStats   92% 13 1 0   75% 4 1   88%
app/backend/src/couchers/servicers/admin.py Admin.SetLastDonated   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/admin.py Admin.CreateAdminTag   100% 9 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/admin.py Admin.ListAdminTags   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/admin.py Admin.AddAdminTagToUser   92% 13 1 0   83% 6 1   89%
app/backend/src/couchers/servicers/admin.py Admin.RemoveAdminTagFromUser   85% 13 2 0   67% 6 2   79%
app/backend/src/couchers/servicers/admin.py Admin.SetModScore   0% 6 6 0   0% 2 0   0%
app/backend/src/couchers/servicers/admin.py Admin.ListAdminActions   100% 14 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/admin.py Admin.ListUserUploads   100% 12 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/admin.py Admin.CreateOTAPackage   85% 26 4 0   80% 10 2   83%
app/backend/src/couchers/servicers/admin.py Admin.ListOTAPackages   85% 13 2 0   75% 8 2   81%
app/backend/src/couchers/servicers/admin.py Admin.BanOTAPackage   100% 11 0 0   83% 6 1   94%
app/backend/src/couchers/servicers/admin.py (no function)   100% 99 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/api.py API.Ping   100% 22 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/api.py API.GetUser   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/api.py API.GetLiteUser   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/api.py API.GetLiteUsers   100% 16 0 0   100% 8 0   100%
app/backend/src/couchers/servicers/api.py API.UpdateProfile   100% 162 0 0   100% 158 0   100%
app/backend/src/couchers/servicers/api.py API.ListFriends   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/api.py API.RemoveFriend   100% 11 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/api.py API.ListMutualFriends   92% 12 1 0   75% 4 1   88%
app/backend/src/couchers/servicers/api.py API.SendFriendRequest   89% 19 2 0   80% 10 2   86%
app/backend/src/couchers/servicers/api.py API.SendFriendRequest.create_friend_relationship   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/api.py API.ListFriendRequests   100% 11 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/api.py API.RespondFriendRequest   93% 14 1 0   75% 4 1   89%
app/backend/src/couchers/servicers/api.py API.CancelFriendRequest   92% 12 1 0   50% 2 1   86%
app/backend/src/couchers/servicers/api.py API.InitiateMediaUpload   100% 11 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/api.py API.ListBadgeUsers   90% 10 1 0   50% 2 1   83%
app/backend/src/couchers/servicers/api.py response_rate_to_pb   100% 13 0 0   100% 10 0   100%
app/backend/src/couchers/servicers/api.py get_num_references   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/api.py user_model_to_pb   97% 67 2 0   96% 54 2   97%
app/backend/src/couchers/servicers/api.py lite_user_to_pb   83% 6 1 0   75% 4 1   80%
app/backend/src/couchers/servicers/api.py (no function)   100% 68 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/auth.py _auth_res   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/auth.py create_session   100% 15 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/auth.py delete_session   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/auth.py _username_available   100% 9 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/auth.py Auth.SignupFlow   92% 131 11 0   83% 64 9   89%
app/backend/src/couchers/servicers/auth.py Auth.UsernameValid   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/auth.py Auth.Authenticate   100% 18 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/auth.py Auth.GetAuthState   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/auth.py Auth.Deauthenticate   100% 7 0 0   50% 2 1   89%
app/backend/src/couchers/servicers/auth.py Auth.ResetPassword   100% 10 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/auth.py Auth.CompletePasswordResetV2   100% 13 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/auth.py Auth.ConfirmChangeEmailV2   100% 11 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/auth.py Auth.ConfirmDeleteAccount   92% 13 1 0   50% 2 1   87%
app/backend/src/couchers/servicers/auth.py Auth.RecoverAccount   90% 10 1 0   50% 2 1   83%
app/backend/src/couchers/servicers/auth.py Auth.Unsubscribe   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/auth.py Auth.AntiBot   0% 14 14 0   0% 4 0   0%
app/backend/src/couchers/servicers/auth.py Auth.AntiBotPolicy   0% 6 6 0   0% 6 0   0%
app/backend/src/couchers/servicers/auth.py Auth.GetInviteCodeInfo   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/auth.py (no function)   100% 46 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/auth_unsubscribe.py handle_unsubscribe   60% 30 12 0   50% 12 2   57%
app/backend/src/couchers/servicers/auth_unsubscribe.py (no function)   100% 15 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/blocking.py is_not_visible   100% 11 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/blocking.py Blocking.BlockUser   91% 11 1 0   83% 6 1   88%
app/backend/src/couchers/servicers/blocking.py Blocking.UnblockUser   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/servicers/blocking.py Blocking.GetBlockedUsers   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/blocking.py (no function)   100% 15 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py _ota_multipart_body   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py _ota_multipart_body.part   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py _native_ota_manifest_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py _is_update_id_banned   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/bugs.py _newest_non_banned_ota_package   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/bugs.py _observe_native_check_metrics   100% 8 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/bugs.py _fetch_signed_manifest   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs._version   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.Version   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.ReportBug   100% 17 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.Status   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.GetDescriptors   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.GetNativeUpdateManifest   100% 15 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.ReportDiagnostics   100% 13 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.CheckNativeStatus   100% 17 0 0   100% 8 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.GeolocationSearchInfo   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/servicers/bugs.py Bugs.GeolocationClickInfo   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/servicers/bugs.py Bugs.EvaluateFeatureFlag   100% 7 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/bugs.py Bugs.LogExperimentExposure   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/bugs.py (no function)   100% 53 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py _parents_to_pb   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py communities_to_pb   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py community_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py Communities.GetCommunity   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/communities.py Communities.ListCommunities   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py Communities.SearchCommunities   100% 8 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/communities.py Communities.ListRecentCommunities   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py Communities.ListGroups   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py Communities.ListAdmins   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/communities.py Communities.AddAdmin   87% 15 2 0   80% 10 2   84%
app/backend/src/couchers/servicers/communities.py Communities.RemoveAdmin   80% 15 3 0   70% 10 3   76%
app/backend/src/couchers/servicers/communities.py Communities.ListMembers   80% 10 2 0   50% 4 2   71%
app/backend/src/couchers/servicers/communities.py Communities.ListNearbyUsers   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/communities.py Communities.ListPlaces   0% 7 7 0   0% 2 0   0%
app/backend/src/couchers/servicers/communities.py Communities.ListGuides   0% 7 7 0   0% 2 0   0%
app/backend/src/couchers/servicers/communities.py Communities.ListEvents   79% 24 5 0   60% 10 4   74%
app/backend/src/couchers/servicers/communities.py Communities.ListDiscussions   80% 10 2 0   50% 4 2   71%
app/backend/src/couchers/servicers/communities.py Communities.JoinCommunity   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/servicers/communities.py Communities.LeaveCommunity   91% 11 1 0   83% 6 1   88%
app/backend/src/couchers/servicers/communities.py Communities.ListUserCommunities   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py Communities.ListAllCommunities   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/communities.py (no function)   100% 47 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py _message_to_pb   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py _get_visible_members_for_subscription   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py _get_visible_admins_for_subscription   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py _user_can_message   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py generate_message_notifications   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/conversations.py _add_message_to_subscription   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py _create_chat   100% 12 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py _get_message_subscription   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py _get_visible_message_subscription   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py _unseen_message_count   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py _mute_info   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py Conversations.ListGroupChats   100% 7 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py Conversations.GetGroupChat   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py Conversations.GetDirectMessage   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py Conversations.GetUpdates   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/servicers/conversations.py Conversations.GetGroupChatMessages   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py Conversations.MarkLastSeenGroupChat   75% 8 2 0   50% 4 2   67%
app/backend/src/couchers/servicers/conversations.py Conversations.MuteGroupChat   85% 13 2 0   70% 10 3   78%
app/backend/src/couchers/servicers/conversations.py Conversations.SetGroupChatArchiveStatus   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/conversations.py Conversations.SearchMessages   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/conversations.py Conversations.CreateGroupChat   84% 25 4 0   75% 16 4   80%
app/backend/src/couchers/servicers/conversations.py Conversations.SendMessage   92% 13 1 0   83% 6 1   89%
app/backend/src/couchers/servicers/conversations.py Conversations.SendDirectMessage   81% 27 5 0   64% 14 5   76%
app/backend/src/couchers/servicers/conversations.py Conversations.EditGroupChat   100% 11 0 0   88% 8 1   95%
app/backend/src/couchers/servicers/conversations.py Conversations.MakeGroupChatAdmin   82% 17 3 0   75% 12 3   79%
app/backend/src/couchers/servicers/conversations.py Conversations.RemoveGroupChatAdmin   88% 17 2 0   83% 12 2   86%
app/backend/src/couchers/servicers/conversations.py Conversations.InviteToGroupChat   89% 19 2 0   83% 12 2   87%
app/backend/src/couchers/servicers/conversations.py Conversations.RemoveGroupChatUser   77% 13 3 0   62% 8 3   71%
app/backend/src/couchers/servicers/conversations.py Conversations.LeaveGroupChat   100% 11 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/conversations.py (no function)   100% 60 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/discussions.py discussion_to_pb   100% 9 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/discussions.py generate_create_discussion_notifications   80% 10 2 0   67% 6 2   75%
app/backend/src/couchers/servicers/discussions.py Discussions.CreateDiscussion   88% 24 3 0   71% 14 4   82%
app/backend/src/couchers/servicers/discussions.py Discussions.CreateDiscussion.create_object   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/discussions.py Discussions.GetDiscussion   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/discussions.py Discussions.UpdateDiscussion   85% 27 4 0   62% 16 6   77%
app/backend/src/couchers/servicers/discussions.py Discussions.DeleteDiscussion   82% 11 2 0   67% 6 2   76%
app/backend/src/couchers/servicers/discussions.py Discussions.ListMyCommunitiesDiscussions   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/discussions.py (no function)   100% 31 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/donations.py _create_stripe_customer   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/donations.py Donations.InitiateDonation   93% 14 1 0   75% 8 2   86%
app/backend/src/couchers/servicers/donations.py Donations.GetDonationPortalLink   86% 7 1 0   75% 4 1   82%
app/backend/src/couchers/servicers/donations.py Stripe.Webhook   90% 42 4 0   100% 6 0   92%
app/backend/src/couchers/servicers/donations.py (no function)   100% 28 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/editor.py load_community_geom   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/editor.py volunteer_to_pb   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/editor.py generate_new_blog_post_notifications   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/editor.py Editor.CreateCommunity   67% 12 4 0   25% 4 1   56%
app/backend/src/couchers/servicers/editor.py Editor.UpdateCommunity   100% 15 0 0   70% 10 3   88%
app/backend/src/couchers/servicers/editor.py Editor.ListEventCommunityInviteRequests   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/editor.py Editor.ListEventCommunityInviteRequests._request_to_pb   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/editor.py Editor.DecideEventCommunityInviteRequest   87% 15 2 0   75% 8 2   83%
app/backend/src/couchers/servicers/editor.py Editor.SendBlogPostNotification   67% 6 2 0   50% 4 2   60%
app/backend/src/couchers/servicers/editor.py Editor.MakeUserVolunteer   100% 15 0 0   100% 10 0   100%
app/backend/src/couchers/servicers/editor.py Editor.UpdateVolunteer   100% 25 0 0   100% 20 0   100%
app/backend/src/couchers/servicers/editor.py Editor.ListVolunteers   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/editor.py Editor.ListPostcards   0% 8 8 0   0% 2 0   0%
app/backend/src/couchers/servicers/editor.py Editor.ListPostcards._attempt_to_pb   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/servicers/editor.py Editor.DownloadPostcardPdf   0% 7 7 0   0% 4 0   0%
app/backend/src/couchers/servicers/editor.py (no function)   100% 45 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/events.py _is_event_owner   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/events.py _is_event_organizer   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/events.py _can_moderate_event   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/events.py _can_edit_event   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/events.py event_to_pb   100% 16 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/events.py _get_event_and_occurrence_query   100% 6 0 0   75% 4 1   90%
app/backend/src/couchers/servicers/events.py _get_event_and_occurrence_one   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/events.py _get_event_and_occurrence_one_or_none   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/events.py _check_occurrence_time_validity   100% 8 0 0   100% 8 0   100%
app/backend/src/couchers/servicers/events.py get_users_to_notify_for_new_event   67% 9 3 0   75% 4 1   69%
app/backend/src/couchers/servicers/events.py generate_event_create_notifications   81% 16 3 0   67% 6 2   77%
app/backend/src/couchers/servicers/events.py generate_event_update_notifications   90% 10 1 0   75% 4 1   86%
app/backend/src/couchers/servicers/events.py generate_event_cancel_notifications   90% 10 1 0   75% 4 1   86%
app/backend/src/couchers/servicers/events.py generate_event_delete_notifications   0% 7 7 0   0% 2 0   0%
app/backend/src/couchers/servicers/events.py Events.CreateEvent   93% 56 4 0   82% 28 5   89%
app/backend/src/couchers/servicers/events.py Events.CreateEvent.create_occurrence   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/events.py Events.ScheduleEvent   79% 38 8 0   60% 20 8   72%
app/backend/src/couchers/servicers/events.py Events.ScheduleEvent.create_occurrence   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/events.py Events.UpdateEvent   88% 64 8 0   79% 38 8   84%
app/backend/src/couchers/servicers/events.py Events.GetEvent   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/events.py Events.CancelEvent   75% 12 3 0   50% 6 3   67%
app/backend/src/couchers/servicers/events.py Events.RequestCommunityInvite   86% 22 3 0   75% 12 3   82%
app/backend/src/couchers/servicers/events.py Events.ListEventOccurrences   84% 19 3 0   67% 6 2   80%
app/backend/src/couchers/servicers/events.py Events.ListEventAttendees   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/events.py Events.ListEventSubscribers   88% 8 1 0   50% 2 1   80%
app/backend/src/couchers/servicers/events.py Events.ListEventOrganizers   88% 8 1 0   50% 2 1   80%
app/backend/src/couchers/servicers/events.py Events.TransferEvent   85% 20 3 0   71% 14 4   79%
app/backend/src/couchers/servicers/events.py Events.SetEventSubscription   88% 16 2 0   80% 10 2   85%
app/backend/src/couchers/servicers/events.py Events.SetEventAttendance   83% 18 3 0   67% 12 4   77%
app/backend/src/couchers/servicers/events.py Events.ListMyEvents   96% 45 2 0   86% 22 3   93%
app/backend/src/couchers/servicers/events.py Events.ListAllEvents   100% 14 0 0   75% 4 1   94%
app/backend/src/couchers/servicers/events.py Events.InviteEventOrganizer   83% 18 3 0   70% 10 3   79%
app/backend/src/couchers/servicers/events.py Events.RemoveEventOrganizer   78% 18 4 0   67% 12 4   73%
app/backend/src/couchers/servicers/events.py (no function)   100% 62 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/galleries.py _get_max_photos_for_user   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/galleries.py _can_edit_gallery   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/galleries.py _gallery_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/galleries.py Galleries.GetGallery   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/galleries.py Galleries.AddPhotoToGallery   100% 23 0 0   100% 10 0   100%
app/backend/src/couchers/servicers/galleries.py Galleries.RemovePhotoFromGallery   92% 13 1 0   83% 6 1   89%
app/backend/src/couchers/servicers/galleries.py Galleries.MovePhoto   93% 29 2 0   83% 18 3   89%
app/backend/src/couchers/servicers/galleries.py Galleries.UpdatePhotoCaption   92% 13 1 0   83% 6 1   89%
app/backend/src/couchers/servicers/galleries.py Galleries.GetGalleryEditInfo   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/galleries.py (no function)   100% 19 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/gis.py _build_geojson_select   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/gis.py _statement_to_geojson_response   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/gis.py GIS.GetUsers   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/gis.py GIS.GetClusteredUsers   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/gis.py GIS.GetCommunities   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/servicers/gis.py GIS.GetPlaces   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/servicers/gis.py GIS.GetGuides   0% 3 3 0   100% 0 0   0%
app/backend/src/couchers/servicers/gis.py (no function)   100% 24 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/groups.py _parents_to_pb   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/groups.py group_to_pb   100% 6 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/groups.py Groups.GetGroup   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/groups.py Groups.ListAdmins   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/groups.py Groups.ListMembers   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/groups.py Groups.ListPlaces   0% 7 7 0   0% 2 0   0%
app/backend/src/couchers/servicers/groups.py Groups.ListGuides   0% 7 7 0   0% 2 0   0%
app/backend/src/couchers/servicers/groups.py Groups.ListEvents   80% 15 3 0   50% 4 2   74%
app/backend/src/couchers/servicers/groups.py Groups.ListDiscussions   89% 9 1 0   50% 2 1   82%
app/backend/src/couchers/servicers/groups.py Groups.JoinGroup   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/servicers/groups.py Groups.LeaveGroup   89% 9 1 0   75% 4 1   85%
app/backend/src/couchers/servicers/groups.py Groups.ListUserGroups   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/groups.py (no function)   100% 32 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/jail.py _get_jail_info   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/jail.py Jail.JailInfo   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/jail.py Jail.AcceptTOS   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/jail.py Jail.SetLocation   89% 9 1 0   50% 2 1   82%
app/backend/src/couchers/servicers/jail.py Jail.AcceptCommunityGuidelines   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/jail.py Jail.AcknowledgePendingModNote   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/jail.py Jail.RespondToActivenessProbe   92% 12 1 0   83% 6 1   89%
app/backend/src/couchers/servicers/jail.py (no function)   100% 20 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/media.py get_media_auth_interceptor   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/media.py get_media_auth_interceptor.is_authorized   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/media.py Media.UploadConfirmation   86% 7 1 0   50% 2 1   78%
app/backend/src/couchers/servicers/media.py (no function)   100% 14 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/moderation.py _resolve_queue_item   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/moderation.py bulk_set_user_content_visibility   100% 27 0 0   100% 12 0   100%
app/backend/src/couchers/servicers/moderation.py _enqueue_pending_notifications   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/moderation.py moderation_state_to_pb   96% 28 1 0   94% 16 1   95%
app/backend/src/couchers/servicers/moderation.py Moderation.GetModerationQueue   90% 42 4 0   86% 28 2   89%
app/backend/src/couchers/servicers/moderation.py Moderation.GetModerationState   100% 7 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/moderation.py Moderation.GetModerationLog   94% 16 1 0   90% 10 1   92%
app/backend/src/couchers/servicers/moderation.py Moderation.ModerateContent   94% 65 4 0   80% 30 6   89%
app/backend/src/couchers/servicers/moderation.py Moderation._get_queue_item_for_state   83% 6 1 0   75% 4 1   80%
app/backend/src/couchers/servicers/moderation.py Moderation.SetUserContentVisibility   100% 14 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/moderation.py Moderation.ListModerationStates   94% 18 1 0   90% 10 1   93%
app/backend/src/couchers/servicers/moderation.py (no function)   100% 33 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/notifications.py get_vapid_public_key   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/notifications.py notification_to_pb   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/notifications.py Notifications.GetNotificationSettings   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/notifications.py Notifications.SetNotificationSettings   89% 18 2 0   75% 8 2   85%
app/backend/src/couchers/servicers/notifications.py Notifications.ListNotifications   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/notifications.py Notifications.MarkNotificationSeen   80% 5 1 0   50% 2 1   71%
app/backend/src/couchers/servicers/notifications.py Notifications.MarkAllNotificationsSeen   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/notifications.py Notifications.GetVapidPublicKey   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/servicers/notifications.py Notifications.RegisterPushNotificationSubscription   90% 10 1 0   75% 4 1   86%
app/backend/src/couchers/servicers/notifications.py Notifications.SendTestPushNotification   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/notifications.py Notifications.RegisterMobilePushNotificationSubscription   94% 18 1 0   75% 8 2   88%
app/backend/src/couchers/servicers/notifications.py Notifications.SendTestMobilePushNotification   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/notifications.py Notifications.SendDevPushNotification   100% 6 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/notifications.py Notifications.DebugRedeliverPushNotification   100% 10 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/notifications.py (no function)   100% 40 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/pages.py _is_page_owner   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/pages.py _can_moderate_page   100% 6 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/pages.py page_to_pb   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/pages.py Pages.CreatePlace   92% 26 2 0   86% 14 2   90%
app/backend/src/couchers/servicers/pages.py Pages.CreateGuide   93% 30 2 0   88% 16 2   91%
app/backend/src/couchers/servicers/pages.py Pages.GetPage   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/servicers/pages.py Pages.UpdatePage   93% 30 2 0   92% 24 2   93%
app/backend/src/couchers/servicers/pages.py Pages.TransferPage   88% 16 2 0   80% 10 2   85%
app/backend/src/couchers/servicers/pages.py Pages.ListUserPlaces   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/pages.py Pages.ListUserGuides   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/pages.py (no function)   100% 23 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/postal_verification.py _attempt_to_address_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/postal_verification.py PostalVerification.InitiatePostalVerification   88% 24 3 0   93% 14 1   89%
app/backend/src/couchers/servicers/postal_verification.py PostalVerification.ConfirmPostalAddress   92% 12 1 0   83% 6 1   89%
app/backend/src/couchers/servicers/postal_verification.py PostalVerification.GetPostalVerificationStatus   96% 28 1 0   86% 14 2   93%
app/backend/src/couchers/servicers/postal_verification.py PostalVerification.VerifyPostalCode   95% 21 1 0   88% 8 1   93%
app/backend/src/couchers/servicers/postal_verification.py PostalVerification.CancelPostalVerification   88% 8 1 0   75% 4 1   83%
app/backend/src/couchers/servicers/postal_verification.py PostalVerification.ListPostalVerificationAttempts   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/postal_verification.py (no function)   100% 29 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py format_volunteer_link   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/public.py _get_public_users   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py _get_signup_page_info   67% 9 3 0   25% 4 1   54%
app/backend/src/couchers/servicers/public.py _get_donation_stats   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py _get_volunteers   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py _get_volunteers.format_volunteer   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py Public.GetPublicUsers   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py Public.GetPublicUser   92% 12 1 0   88% 8 1   90%
app/backend/src/couchers/servicers/public.py Public.GetSignupPageInfo   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py Public.GetVolunteers   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py Public.GetDonationStats   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public.py (no function)   100% 35 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public_trips.py _is_description_long_enough   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public_trips.py _parse_page_token   50% 4 2 0   50% 2 1   50%
app/backend/src/couchers/servicers/public_trips.py _same_gender_filter   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/public_trips.py public_trip_to_pb   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/public_trips.py PublicTrips.CreatePublicTrip   89% 37 4 0   85% 26 4   87%
app/backend/src/couchers/servicers/public_trips.py PublicTrips.GetPublicTrip   91% 11 1 0   83% 6 1   88%
app/backend/src/couchers/servicers/public_trips.py PublicTrips.ListPublicTrips   85% 13 2 0   67% 6 2   79%
app/backend/src/couchers/servicers/public_trips.py PublicTrips.ListPublicTripsByUser   81% 31 6 0   61% 18 5   73%
app/backend/src/couchers/servicers/public_trips.py PublicTrips.UpdatePublicTrip   85% 53 8 0   81% 42 8   83%
app/backend/src/couchers/servicers/public_trips.py (no function)   100% 32 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/references.py reference_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/references.py get_host_req_and_check_can_write_ref   95% 20 1 0   90% 10 1   93%
app/backend/src/couchers/servicers/references.py check_valid_reference   75% 4 1 0   75% 4 1   75%
app/backend/src/couchers/servicers/references.py get_pending_references_to_write   100% 18 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/references.py References.ListReferences   100% 25 0 0   100% 14 0   100%
app/backend/src/couchers/servicers/references.py References.WriteFriendReference   95% 20 1 0   88% 8 1   93%
app/backend/src/couchers/servicers/references.py References.WriteFriendReference.create_object   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/references.py References.WriteHostRequestReference   100% 22 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/references.py References.WriteHostRequestReference.create_object   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/references.py References.HostRequestIndicateDidntMeetup   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/references.py References.AvailableWriteReferences   100% 11 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/references.py References.ListPendingReferencesToWrite   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/references.py References.GetHostRequestReferenceStatus   100% 15 0 0   75% 4 1   95%
app/backend/src/couchers/servicers/references.py (no function)   100% 34 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/reporting.py Reporting.Report   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/reporting.py (no function)   100% 12 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/requests.py message_to_pb   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/requests.py host_request_to_pb   100% 7 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/requests.py _possibly_observe_first_response_time   100% 6 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/requests.py _is_host_request_long_enough   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/requests.py Requests.CreateHostRequest   100% 59 0 0   100% 34 0   100%
app/backend/src/couchers/servicers/requests.py Requests.GetHostRequest   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/requests.py Requests.ListHostRequests   98% 44 1 0   96% 26 1   97%
app/backend/src/couchers/servicers/requests.py Requests.RespondHostRequest   93% 72 5 0   86% 36 5   91%
app/backend/src/couchers/servicers/requests.py Requests.RespondHostRequest.count_host_response   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/requests.py Requests.GetHostRequestMessages   82% 11 2 0   50% 4 2   73%
app/backend/src/couchers/servicers/requests.py Requests.SendHostRequestMessage   100% 24 0 0   100% 10 0   100%
app/backend/src/couchers/servicers/requests.py Requests.GetHostRequestUpdates   79% 19 4 0   60% 10 4   72%
app/backend/src/couchers/servicers/requests.py Requests.MarkLastSeenHostRequest   67% 15 5 0   50% 10 3   60%
app/backend/src/couchers/servicers/requests.py Requests.SetHostRequestArchiveStatus   71% 7 2 0   50% 4 2   64%
app/backend/src/couchers/servicers/requests.py Requests.GetResponseRate   100% 5 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/requests.py Requests.SendHostRequestFeedback   100% 10 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/requests.py (no function)   100% 47 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/resources.py Resources.GetTermsOfService   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/resources.py Resources.GetCommunityGuidelines   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/resources.py Resources.GetRegions   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/resources.py Resources.GetLanguages   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/resources.py Resources.GetBadges   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/resources.py (no function)   100% 14 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py _join_with_space   83% 6 1 0   75% 4 1   80%
app/backend/src/couchers/servicers/search.py _build_tsv   100% 11 0 0   67% 6 2   88%
app/backend/src/couchers/servicers/search.py _build_doc   100% 11 0 0   100% 6 0   100%
app/backend/src/couchers/servicers/search.py _similarity   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py _gen_search_elements   100% 22 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/search.py _gen_search_elements.execute_search_statement   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py _search_users   80% 5 1 0   50% 2 1   71%
app/backend/src/couchers/servicers/search.py _search_pages   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/search.py _search_events   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py _search_clusters   83% 6 1 0   50% 2 1   75%
app/backend/src/couchers/servicers/search.py _user_search_inner   71% 91 26 0   66% 70 20   69%
app/backend/src/couchers/servicers/search.py Search.Search   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py Search.UserSearch   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py Search.UserSearchV2   100% 8 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py Search.UserSearchV2._user_to_search_user   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/search.py Search.EventSearch   94% 65 4 0   91% 44 2   93%
app/backend/src/couchers/servicers/search.py (no function)   100% 42 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/threads.py pack_thread_id   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/threads.py unpack_thread_id   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/threads.py total_num_responses   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/threads.py thread_to_pb   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/servicers/threads.py generate_reply_notifications   86% 58 8 0   72% 32 9   81%
app/backend/src/couchers/servicers/threads.py Threads.GetThread   96% 24 1 0   93% 14 1   95%
app/backend/src/couchers/servicers/threads.py Threads.PostReply   100% 13 0 0   100% 4 0   100%
app/backend/src/couchers/servicers/threads.py Threads.PostReply.create_object   100% 9 0 0   100% 2 0   100%
app/backend/src/couchers/servicers/threads.py Threads.UpdateReply   77% 22 5 0   64% 14 5   72%
app/backend/src/couchers/servicers/threads.py Threads.DeleteReply   76% 17 4 0   67% 12 4   72%
app/backend/src/couchers/servicers/threads.py (no function)   100% 32 0 0   100% 0 0   100%
app/backend/src/couchers/slack.py send_slack_message   88% 8 1 0   75% 4 1   83%
app/backend/src/couchers/slack.py (no function)   100% 5 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py username_or_email   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/sql.py username_or_id   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/sql.py username_or_email_or_id   86% 7 1 0   83% 6 1   85%
app/backend/src/couchers/sql.py _shadow_clause   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/sql.py _users_block_each_other   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py users_visible   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py where_users_column_visible   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py users_visible_to_each_other   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py where_user_columns_visible_to_each_other   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py where_moderated_content_visible_to_user_column   100% 7 0 0   50% 2 1   89%
app/backend/src/couchers/sql.py where_moderated_content_visible   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/sql.py moderation_state_column_visible   100% 6 0 0   75% 4 1   90%
app/backend/src/couchers/sql.py _relevant_user_blocks   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py to_bool   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/sql.py (no function)   100% 20 0 6   100% 0 0   100%
app/backend/src/couchers/supervisor.py supervise   95% 22 1 0   92% 12 1   94%
app/backend/src/couchers/supervisor.py supervise.handle_signal   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/supervisor.py (no function)   100% 12 0 0   100% 0 0   100%
app/backend/src/couchers/tasks.py send_signup_email   100% 16 0 0   100% 6 0   100%
app/backend/src/couchers/tasks.py send_email_changed_confirmation_to_new_email   71% 7 2 0   50% 4 2   64%
app/backend/src/couchers/tasks.py send_content_report_email   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/tasks.py maybe_send_reference_report_email   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/tasks.py send_rate_limit_violation_report_email   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/tasks.py send_duplicate_strong_verification_email   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/tasks.py maybe_send_contributor_form_email   50% 2 1 0   50% 2 1   50%
app/backend/src/couchers/tasks.py send_event_community_invite_request_email   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/tasks.py send_account_deletion_report_email   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/tasks.py enforce_community_memberships   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/tasks.py enforce_community_memberships_for_user   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/tasks.py (no function)   100% 29 0 0   100% 0 0   100%
app/backend/src/couchers/templating.py Jinja2Template.render   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/templating.py _get_jinja_env   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/templating.py _finalize   100% 8 0 0   100% 4 0   100%
app/backend/src/couchers/templating.py (no function)   100% 17 0 0   100% 0 0   100%
app/backend/src/couchers/tracing.py FeatureFlagRatioSampler.should_sample   0% 2 2 0   100% 0 0   0%
app/backend/src/couchers/tracing.py FeatureFlagRatioSampler.get_description   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/tracing.py setup_tracing   0% 8 8 0   0% 2 0   0%
app/backend/src/couchers/tracing.py (no function)   100% 21 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py app_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py icon_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py profile_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py user_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py edit_profile_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py signup_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py account_settings_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py notification_settings_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py feature_preview_link   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/urls.py password_reset_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py host_request_link_host   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/urls.py host_request_link_guest   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/urls.py host_request   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py messages_link   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/urls.py chat_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py event_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py community_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py discussion_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py leave_reference_link   75% 4 1 0   50% 2 1   67%
app/backend/src/couchers/urls.py profile_references_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py friend_requests_link   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/urls.py media_upload_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py change_email_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py donation_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py donation_cancelled_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py donation_success_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py complete_strong_verification_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py delete_account_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py recover_account_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py unsubscribe_link   0% 1 1 0   100% 0 0   0%
app/backend/src/couchers/urls.py quick_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py media_url   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py console_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py invite_code_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py postal_verification_link   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/urls.py (no function)   100% 36 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py is_valid_user_id   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py is_valid_username   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py is_valid_name   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/utils.py is_valid_email   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py Timestamp_from_datetime   80% 5 1 0   50% 2 1   71%
app/backend/src/couchers/utils.py Duration_from_timedelta   100% 3 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py parse_date   100% 4 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py date_to_api   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py to_aware_datetime   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py to_timezone   80% 5 1 0   75% 4 1   78%
app/backend/src/couchers/utils.py now   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py minimum_allowed_birthdate   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py today   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py now_in_timezone   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py today_in_timezone   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py wrap_coordinate   93% 14 1 0   83% 6 1   90%
app/backend/src/couchers/utils.py wrap_coordinate.__wrap_gen   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/utils.py wrap_coordinate.__wrap_flip   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/utils.py wrap_coordinate.__wrap_rem   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/utils.py create_coordinate   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py create_polygon_lat_lng   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py create_polygon_lng_lat   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py geojson_to_geom   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py to_multi   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py get_coordinates   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/utils.py get_coordinates   100% 0 0 1   100% 0 0   100%
app/backend/src/couchers/utils.py get_coordinates   100% 4 0 0   100% 2 0   100%
app/backend/src/couchers/utils.py http_date   100% 3 0 0   100% 2 0   100%
app/backend/src/couchers/utils.py _create_tasty_cookie   82% 11 2 0   50% 2 1   77%
app/backend/src/couchers/utils.py create_session_cookies   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py create_lang_cookie   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py _parse_cookie   100% 7 0 0   100% 4 0   100%
app/backend/src/couchers/utils.py parse_session_cookie   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py parse_user_id_cookie   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py parse_ui_lang_cookie   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py parse_api_key   75% 8 2 0   67% 6 2   71%
app/backend/src/couchers/utils.py parse_sofa_cookie   100% 8 0 0   100% 2 0   100%
app/backend/src/couchers/utils.py generate_sofa_cookie   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py remove_duplicates_retain_order   100% 5 0 0   100% 4 0   100%
app/backend/src/couchers/utils.py date_in_timezone   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py millis_from_dt   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py dt_from_millis   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py dt_to_page_token   100% 2 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py dt_from_page_token   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py last_active_coarsen   100% 1 0 0   100% 0 0   100%
app/backend/src/couchers/utils.py not_none   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/utils.py is_geom   67% 3 1 0   50% 2 1   60%
app/backend/src/couchers/utils.py (no function)   100% 65 0 6   100% 0 0   100%
app/backend/src/healthcheck.py (no function)   0% 5 5 0   0% 2 0   0%
app/backend/src/run_locally.py parse_env_lines   0% 5 5 0   0% 4 0   0%
app/backend/src/run_locally.py read_db_password   0% 3 3 0   100% 0 0   0%
app/backend/src/run_locally.py update_env   0% 4 4 0   100% 0 0   0%
app/backend/src/run_locally.py main   0% 10 10 0   0% 6 0   0%
app/backend/src/run_locally.py (no function)   0% 9 9 0   100% 0 0   0%
app/backend/src/tests/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py postgres_engine   83% 6 1 0   50% 2 1   75%
app/backend/src/tests/conftest.py postgres_conn   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py testdb_engine   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py testdb_conn   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py setup_testdb   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py _truncate_non_static_tables   100% 12 0 0   88% 8 1   95%
app/backend/src/tests/conftest.py db   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py db_class   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py testconfig   100% 71 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py Flags.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py Flags.set_boolean   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py Flags.set_string   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py Flags.set_integer   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/conftest.py Flags.set_float   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/conftest.py Flags.set_object   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/conftest.py flags   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py FeatureFlags.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py FeatureFlags.set   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py FeatureFlags.set_definition   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py feature_flags   100% 5 0 1   100% 0 0   100%
app/backend/src/tests/conftest.py fast_passwords   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py fast_passwords.fast_hash   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py fast_passwords.fast_verify   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py email_collector   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py push_collector   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py moderator   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/conftest.py (no function)   100% 58 0 2   100% 0 0   100%
app/backend/src/tests/fixtures/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py create_schema_from_models   100% 7 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/db.py populate_testing_resources   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py drop_database   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py autocommit_engine   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py make_user   100% 9 0 0   100% 4 0   100%
app/backend/src/tests/fixtures/db.py generate_user   100% 36 0 0   100% 12 0   100%
app/backend/src/tests/fixtures/db.py get_user_id_and_token   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py make_friends   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py make_user_block   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py make_user_invisible   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py get_friend_relationship   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py add_users_to_new_moderation_list   100% 8 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/db.py pg_dump_is_available   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py make_volunteer   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/db.py (no function)   100% 32 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py process_jobs   100% 2 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector._mock_queue_email   100% 3 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.__enter__   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.__exit__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.count   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.count_for_recipient   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.count_for_mods   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/fixtures/misc.py EmailCollector.count_for_reports   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.pop_for_recipient   100% 6 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.pop_for_mods   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py EmailCollector.pop_for_reports   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py PushCollector.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py PushCollector._mock_push_to_user   100% 3 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/misc.py PushCollector.__enter__   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py PushCollector.__exit__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py PushCollector.count_for_user   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py PushCollector.pop_for_user   100% 6 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_host_request   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_group_chat   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_friend_request   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_event_occurrence   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_comment   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_reply   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_discussion   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_reference   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/misc.py Moderator.approve_thread_post   83% 6 1 0   75% 4 1   80%
app/backend/src/tests/fixtures/misc.py (no function)   100% 47 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py _MockCouchersContext.headers   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/fixtures/sessions.py _MockCouchersContext.get_header   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py CookieMetadataPlugin.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py CookieMetadataPlugin.__call__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py MetadataKeeperInterceptor.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py MetadataKeeperInterceptor.intercept_unary_unary   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py FakeRpcError.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py FakeRpcError.code   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py FakeRpcError.details   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py MockGrpcContext.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py MockGrpcContext.abort   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py MockGrpcContext.invocation_metadata   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py MockGrpcContext.send_initial_metadata   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/fixtures/sessions.py FakeChannel.__init__   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py FakeChannel.add_generic_rpc_handlers   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py FakeChannel.unary_unary   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py FakeChannel.unary_unary.fake_handler   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py run_server   100% 14 0 0   100% 2 0   100%
app/backend/src/tests/fixtures/sessions.py auth_api_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_api_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_admin_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_editor_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_moderation_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_account_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_jail_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_stripe_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_iris_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py real_bugs_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py media_session   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py api_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py gis_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py public_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py public_trips_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py conversations_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py requests_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py threads_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py discussions_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py donations_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py pages_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py communities_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py groups_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py blocking_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py notifications_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py account_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py search_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py references_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py galleries_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py reporting_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py events_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py postal_verification_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py bugs_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py resources_session   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/fixtures/sessions.py (no function)   100% 136 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_GetAccountInfo   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_donation_banner_no_drive   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_donation_banner_never_donated   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_donation_banner_donated_before_drive   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_donation_banner_donated_after_drive   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_donation_banner_donated_exactly_at_drive_start   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_GetAccountInfo_regression   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangePasswordV2_normal   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangePasswordV2_regression   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangePasswordV2_normal_short_password   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangePasswordV2_normal_long_password   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangePasswordV2_normal_insecure_password   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangePasswordV2_normal_wrong_password   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangePasswordV2_normal_no_passwords   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_wrong_password   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_wrong_email   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_invalid_email   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_email_in_use   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_no_change   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_wrong_token   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_tokens_two_hour_window   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_tokens_two_hour_window.two_hours_one_minute_in_future   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_tokens_two_hour_window.one_minute_ago   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeEmailV2_sends_proper_emails   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ChangeLanguagePreference   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_contributor_form   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_DeleteAccount_start   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_DeleteAccount_message_storage   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_full_delete_account_with_recovery   100% 78 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_multiple_delete_tokens   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ListActiveSessions_pagination   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ListActiveSessions_details   100% 33 0 0   100% 2 0   100%
app/backend/src/tests/test_account.py test_ListActiveSessions_details.dummy_geoip   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_LogOutSession   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_LogOutOtherSessions   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_CreateInviteCode   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_DisableInviteCode   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_ListInviteCodes   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_reminders   100% 69 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_confirm_host_request_reminder   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_my_home_reminder   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py test_volunteer_stuff   100% 72 0 0   100% 0 0   100%
app/backend/src/tests/test_account.py (no function)   100% 60 0 0   100% 0 0   100%
app/backend/src/tests/test_activeness_probes.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_activeness_probes.py test_activeness_probes_happy_path_inactive   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_activeness_probes.py test_activeness_probes_happy_path_active   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_activeness_probes.py test_activeness_probes_disabled   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_activeness_probes.py test_activeness_probes_expiry   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_activeness_probes.py (no function)   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_access_by_normal_user   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetNonvisibleUserAccessLog   100% 27 0 0   100% 2 0   100%
app/backend/src/tests/test_admin.py test_GetUser   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetUserDetails   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ChangeUserGender   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ChangeUserBirthdate   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_BanUser   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_UnbanUser   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ShadowUser   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_UnshadowUser   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ShadowUser_blank_note   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AddAdminNote   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AddAdminNote_blank   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AddAdminNote_data   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AddAdminNote_both_note_and_data   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AddAdminNote_neither   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AddAdminNote_invalid_json   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_admin_content_reports   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_DeleteUser   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_RecoverDeletedUser_after_user_initiated_deletion   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_CreateApiKey   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetChats   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_badges   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_DeleteEvent   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ListUserIds   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_EditReferenceText   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_DeleteReference_deprecated   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetUserReferences   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetUserReferences_not_found   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetFriendRequests   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetFriendRequests._add_friend_request   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_GetFriendRequests_not_found   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AddUsersToModerationUserList   100% 42 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_RemoveUserFromModerationUserList   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_admin_delete_account_url   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_AccessStats   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_SetLastDonated   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_admin_actions_level   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_admin_actions_on_mutations   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_create_admin_tag   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_create_admin_tag_duplicate   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_create_admin_tag_empty   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_list_admin_tags   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_add_admin_tag_to_user   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_add_admin_tag_to_user_duplicate   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_add_admin_tag_to_user_tag_not_found   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_remove_admin_tag_from_user   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_remove_admin_tag_from_user_not_assigned   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_search_users_by_admin_tag   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_search_users_by_admin_note   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ListAdminActions_empty   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ListAdminActions_returns_newest_first_with_target_info   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ListAdminActions_filter_by_admin_and_target   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ListAdminActions_pagination   100% 14 0 0   100% 2 0   100%
app/backend/src/tests/test_admin.py test_ListUserUploads   100% 17 0 0   100% 2 0   100%
app/backend/src/tests/test_admin.py test_ListUserUploads_pagination   100% 15 0 0   100% 2 0   100%
app/backend/src/tests/test_admin.py test_ListUserUploads_uses   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ListUserUploads_not_found   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py _ota_manifest   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py _ota_signed_multipart   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py _ota_signed_multipart.part   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py _patch_ota_cdn   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py _patch_ota_cdn.fake   100% 4 0 0   100% 2 0   100%
app/backend/src/tests/test_admin.py test_CreateOTAPackage   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_CreateOTAPackage_invalid   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_CreateOTAPackage_rejects_duplicate_version   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_ListOTAPackages   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_BanOTAPackage   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_BanOTAPackage_requires_reason   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py test_BanOTAPackage_not_found   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_admin.py (no function)   100% 85 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_ping   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_coords   100% 46 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_get_user   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_user_model_to_pb_ghost_user   100% 53 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_user_model_to_pb_ghost_user_blocked   100% 53 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_viewing_nonvisible_user_profile_is_logged   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_viewing_blocked_user_profile_is_not_logged   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_admin_viewing_ghost_users_sees_full_profile   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_lite_coords   100% 49 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_lite_get_user   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetLiteUsers   100% 38 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_update_profile   100% 55 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_update_profile_do_not_email   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_language_abilities   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_pending_friend_request_count   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_friend_request_flow   100% 79 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_RemoveFriend_regression   100% 32 0 0   100% 4 0   100%
app/backend/src/tests/test_api.py test_cant_friend_request_twice   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_cant_friend_request_pending   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_cant_friend_request_already_friends   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_cant_friend_request_incomplete_profile   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_excessive_friend_requests_are_reported   100% 23 0 0   100% 4 0   100%
app/backend/src/tests/test_api.py test_ListFriends   100% 51 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_ListMutualFriends   100% 27 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_mutual_friends_self   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_CancelFriendRequest   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_accept_friend_request   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_reject_friend_request   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_hosting_preferences   100% 79 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_badges   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_user_add_badge_is_idempotent   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_ListBadgeUsers_excludes_ghost_users   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetLiteUser_ghost_user_by_username   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetLiteUser_ghost_user_by_id   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetLiteUser_blocked_user   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetLiteUser_blocking_user   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetLiteUsers_ghost_users   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetLiteUsers_blocked_users   100% 31 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetUser_ghost_user_by_id   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetUser_blocked_user   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py test_GetUser_blocking_user   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_api.py (no function)   100% 70 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py test_create_servers   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py FakeProcess.__init__   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py FakeProcess.is_alive   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py FakeProcess.terminate   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py FakeProcess.join   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py FakeServer.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py FakeServer.stop   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py FakeServer.wait   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py _as_children   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py test_supervise_returns_crashed_child_and_drains_the_rest   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py test_supervise_returns_none_on_graceful_shutdown   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py test_supervise_returns_none_on_graceful_shutdown.fire_on_register   100% 2 0 0   100% 2 0   100%
app/backend/src/tests/test_app.py test_supervise_only_terminates_live_children   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py test_supervise_drains_parent_servers_within_the_shutdown_window   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_app.py (no function)   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py get_session_cookie_tokens   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_UsernameValid   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_incremental   100% 98 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_funnel_counters   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py _quick_signup   100% 31 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_basic_login   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_login_part_signed_up_verified_email   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_login_part_signed_up_not_verified_email   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_banned_user   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_shadowed_user_login_logged   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_deleted_user   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_invalid_token   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_password_reset_v2   100% 43 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_password_reset_no_such_user   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_password_reset_invalid_token_v2   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_logout_invalid_token   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_without_password   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_invalid_birthdate   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_invalid_email   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_existing_email   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_banned_user_email   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_deleted_user_email   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_continue_with_email   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_resend_email   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_successful_authenticate   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_unsuccessful_authenticate   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_complete_signup   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_token_regression   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_opt_out_of_newsletter   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_GetAuthState   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_no_feedback_regression   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_banned_username   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_GetInviteCodeInfo   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_GetInviteCodeInfo_no_avatar   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_GetInviteCodeInfo_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_SignupFlow_invite_code   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_with_motivations   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_motivations_incremental   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_motivations_cannot_be_refilled   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_motivations_required   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_motivations_all_options   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py test_signup_motivations_empty_motivations_list   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_auth.py (no function)   100% 63 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py now_5_min_in_future   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py _check_job_counter   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_email_job   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_email_job.mock_print_dev_email   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_purge_login_tokens   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_purge_password_reset_tokens   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_purge_account_deletion_tokens   100% 16 0 0   100% 2 0   100%
app/backend/src/tests/test_bg_jobs.py test_enforce_community_memberships   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_refresh_materialized_views   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_service_jobs   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_service_jobs.raising_sleep   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_scheduler   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_scheduler.purge_login_tokens   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_bg_jobs.py test_scheduler.send_message_notifications   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_bg_jobs.py test_scheduler.mock_monotonic   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_scheduler.mock_sleep   100% 3 0 0   100% 2 0   100%
app/backend/src/tests/test_bg_jobs.py test_scheduler.mock_run_job_and_schedule   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_job_retry   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_job_retry.mock_job   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_no_jobs_no_problem   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_basic   100% 39 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_muted   100% 40 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_request_notifications_host_request   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_request_notifications_host_request_with_followup   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_request_notifications_two_requests_one_with_followup   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_seen   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_seen.now_30_min_in_future   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_onboarding_emails   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_reference_reminders   100% 37 0 0   100% 6 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_host_request_reminders   100% 47 0 0   100% 6 0   100%
app/backend/src/tests/test_bg_jobs.py test_add_users_to_email_list   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_update_recommendation_scores   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_update_badges   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_update_badges_awards_moderator_to_superuser   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_update_badges_skips_moderator_when_flag_off   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_request_notifications_blocked_users_no_notification   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_host_request_reminders_blocked_users_no_notification   96% 23 1 0   75% 4 1   93%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_blocked_users_no_notification   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_update_badges_volunteers   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_update_badges_volunteer_status_change   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.FirstResult.scalars   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.FirstResult.unique   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.SecondResult.all   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.DummySession.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.DummySession.execute   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.DummySession.commit   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.DummySession.flush   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.fake_session_scope   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.fake_session_scope.Ctx.__enter__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py test_send_message_notifications_empty_unseen_simple.fake_session_scope.Ctx.__exit__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bg_jobs.py (no function)   100% 67 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py test_BlockUser   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py test_make_user_block   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py test_UnblockUser   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py test_GetBlockedUsers   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py test_relationships_userblock_dot_user   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py test_is_not_visible   100% 99 0 0   100% 0 0   100%
app/backend/src/tests/test_blocking.py (no function)   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_bugs_disabled   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_bugs   100% 9 0 0   0% 2 2   82%
app/backend/src/tests/test_bugs.py test_bugs.dud_post   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_bugs.dud_post._PostReturn.json   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_bugs_with_user   100% 10 0 0   0% 2 2   83%
app/backend/src/tests/test_bugs.py test_bugs_with_user.dud_post   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_bugs_with_user.dud_post._PostReturn.json   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_bugs_fails_on_network_error   100% 9 0 0   0% 2 2   82%
app/backend/src/tests/test_bugs.py test_bugs_fails_on_network_error.dud_post   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_version   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_status   100% 8 0 0   100% 2 0   100%
app/backend/src/tests/test_bugs.py test_GetDescriptors   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _get_events   75% 4 1 0   50% 2 1   67%
app/backend/src/tests/test_bugs.py test_report_diagnostics_anonymous   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_report_diagnostics_authenticated   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_report_diagnostics_with_value   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_report_diagnostics_with_occurred   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_report_diagnostics_invalid_json   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_report_diagnostics_empty_batch   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_report_diagnostics_too_many   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_report_diagnostics_frontend_version   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_anonymous   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_authenticated   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_authenticated_records_mapping   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_anonymous_does_not_record_mapping   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_append_only_log_of_sightings   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_blocks_expired_binary   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _multipart_part_json   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _FakeCDNResponse.__init__   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _FakeCDNResponse.raise_for_status   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _patch_cdn   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _add_ota_package   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_serves_matching_package   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_resolves_per_platform   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_serves_newest_by_created_at   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_banned_package_excluded   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_runtime_mismatch_returns_directive   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_only_banned_package_returns_directive   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_without_runtime_version_returns_directive   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_native_update_manifest_no_package_returns_directive   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py _ota_check_req   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_ota_block_with_newer_bundle   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_ota_block_without_target_raises   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_ota_block_only_older_target_raises   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_banned_ota_block_with_successor   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_check_native_status_banned_ota_block_no_successor_raises   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_log_experiment_exposure   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py test_log_experiment_exposure_deduped   100% 9 0 0   100% 2 0   100%
app/backend/src/tests/test_bugs.py test_log_experiment_exposure_anonymous_ignored   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_bugs.py (no function)   100% 68 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py test_initial_ics_content   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py test_cancellation_ics_content   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py _normalize_ics   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py test_host_request_attachments   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py test_host_request_attachments_disabled   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py _get_email_ics_attachment_calendar_event   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_calendar_events.py _get_ics_event_sequence   75% 4 1 0   50% 4 2   62%
app/backend/src/tests/test_calendar_events.py (no function)   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py create_1d_polygon   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py create_1d_point   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py create_community   100% 21 0 0   100% 4 0   100%
app/backend/src/tests/test_communities.py create_group   100% 18 0 0   100% 4 0   100%
app/backend/src/tests/test_communities.py create_place   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py create_discussion   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py create_event   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py get_community_id   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py get_group_id   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py testing_communities   100% 71 0 0   100% 4 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_GetCommunity   100% 104 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListCommunities   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListCommunities_all   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListUserCommunities   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListOtherUserCommunities   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListGroups   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListAdmins   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_AddAdmin   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_RemoveAdmin   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListMembers   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListNearbyUsers   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListDiscussions   100% 25 0 0   100% 8 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_is_user_in_node_geography   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListEvents   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_empty_query_aborts   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_min_length_lt_3_aborts   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_typo_matches_existing_name   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_word_similarity_matches_partial_word   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_results_sorted_by_similarity   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_no_results_returns_empty   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListAllCommunities   100% 54 0 0   100% 2 0   100%
app/backend/src/tests/test_communities.py TestCommunities.test_ListRecentCommunities   100% 26 0 0   100% 2 0   100%
app/backend/src/tests/test_communities.py test_JoinCommunity_and_LeaveCommunity   100% 32 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py test_LeaveCommunity_regression   100% 27 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py test_enforce_community_memberships_for_user   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_communities.py (no function)   100% 79 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py _complete_config   100% 18 0 0   100% 12 0   100%
app/backend/src/tests/test_config.py test_load_from_env   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py test_load_from_env_types   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py test_getitem   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py test_setitem   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py test_instances_state_are_independent   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py test_copy   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py test_check_config_only_references_known_keys   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_config.py (no function)   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_list_group_chats   100% 46 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_list_empty_group_chats   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_list_group_chats_ordering   100% 49 0 0   100% 2 0   100%
app/backend/src/tests/test_conversations.py test_list_group_chats_ordering_after_left   100% 54 0 0   100% 2 0   100%
app/backend/src/tests/test_conversations.py test_get_group_chat_messages   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_get_group_chat_messages_pagination   100% 20 0 0   100% 2 0   100%
app/backend/src/tests/test_conversations.py test_get_group_chat_messages_joined_left   100% 37 0 0   100% 2 0   100%
app/backend/src/tests/test_conversations.py test_get_group_chat_info   100% 31 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_get_group_chat_info_denied   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_get_group_chat_info_left   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_remove_group_chat_user   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_edit_group_chat   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_make_remove_group_chat_admin   100% 32 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_send_message   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_send_direct_message   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_excessive_chat_initiations_are_reported   100% 23 0 0   100% 4 0   100%
app/backend/src/tests/test_conversations.py test_send_direct_message_rate_limit   100% 26 0 0   100% 4 0   100%
app/backend/src/tests/test_conversations.py test_leave_invite_to_group_chat   100% 66 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_group_chats_with_messages_before_join   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_invite_to_dm   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_sole_admin_leaves   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_search_messages   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_search_messages_left_joined   100% 34 0 0   100% 2 0   100%
app/backend/src/tests/test_conversations.py test_admin_behaviour   100% 71 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_add_remove_admin_failures   100% 51 0 0   100% 2 0   100%
app/backend/src/tests/test_conversations.py test_last_seen   100% 36 0 0   100% 2 0   100%
app/backend/src/tests/test_conversations.py test_mark_last_seen_clears_notifications   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_mark_last_seen_clears_notifications.unseen_notification_count   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_one_dm_per_pair   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_GetDirectMessage   100% 32 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_total_unseen   100% 39 0 0   100% 6 0   100%
app/backend/src/tests/test_conversations.py test_regression_ListGroupChats_pagination   100% 22 0 0   100% 4 0   100%
app/backend/src/tests/test_conversations.py test_muting   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_archiving   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_archiving_per_user   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_archiving_with_list_group_chats   100% 46 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_archiving_chat_not_found   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_archiving_after_leaving_chat   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_archiving_dm   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_archiving_idempotent   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_chat_notifications   100% 48 0 0   100% 6 0   100%
app/backend/src/tests/test_conversations.py test_chat_notifications.send_msg   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_chat_notifications.parse_message_payload   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py test_incomplete_profile   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_conversations.py (no function)   100% 57 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_b64   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_simple_crypto   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_hash_sigs   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_asym_crypto   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_stable_secure_uniform   100% 24 0 0   100% 2 0   100%
app/backend/src/tests/test_crypto.py test_encrypt_decrypt_proto_roundtrip   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_encrypt_decrypt_proto_with_different_fields   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_decrypt_proto_wrong_key   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_decrypt_proto_invalid_data   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_decrypt_proto_invalid_encrypted_data   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_encrypt_proto_different_keys_different_output   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_create_sofa_id   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_sofa_payload_roundtrip   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_sofa_payload_invalid_data   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_sofa_payload_too_short   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_sofa_payload_tampered_sofa_id   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_sofa_payload_tampered_proto   100% 11 0 0   50% 2 1   92%
app/backend/src/tests/test_crypto.py test_sofa_payload_same_id_same_output   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py test_sofa_payload_different_ids_different_output   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_crypto.py (no function)   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_is_valid_user_id   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_is_valid_email   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_is_valid_username   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_is_valid_name   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_parse_date   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_get_parent_node_at_location   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py pg_dump   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py sort_pg_dump_output   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_sort_pg_dump_output   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py strip_leading_whitespace   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py restore_db_after_migration_test   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_migrations   100% 17 0 0   50% 2 1   95%
app/backend/src/tests/test_db.py test_migrations.message   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_slugify   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_database_consistency_check   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_db.py test_migration_ordinals   76% 33 8 0   62% 16 6   71%
app/backend/src/tests/test_db.py (no function)   100% 35 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_create_discussion_errors   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_create_and_get_discussion   100% 57 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_update_discussion   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_update_discussion_permission_denied   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_update_deleted_discussion   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_delete_discussion_by_creator   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_delete_discussion_permission_denied_for_non_creator   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_deleted_discussion_not_in_list   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_deleted_discussion_thread_still_accessible   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_delete_comment_shows_placeholder_with_replies   100% 32 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_admin_delete_discussion   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_discussion_notifications_regression   100% 42 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_create_discussion_creates_moderation_state   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_shadowed_discussion_visible_to_author_only   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_shadowed_discussion_excluded_from_listings   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_approved_discussion_visible_to_others   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_hidden_discussion_filtered_for_author_too   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_list_my_communities_discussions_respects_moderation   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_update_discussion_creates_version_record   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_update_discussion_multiple_edits_creates_multiple_version_records   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_delete_discussion_creates_version_record   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py test_admin_delete_discussion_creates_version_record   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_discussions.py (no function)   100% 37 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_donations_disabled   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_one_time_donation_flow   100% 37 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_recurring_donation_flow   100% 46 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_customer_portal_url   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_merch_invoice_flow   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_merch_invoice_flow_nonexistent_user   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_slack_notification_on_merch_purchase   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_slack_notification_on_merch_purchase_unknown_user   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_slack_notification_on_one_time_donation   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_slack_notification_on_recurring_donation   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_revenue_metric_on_donation   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py test_revenue_metric_on_merch   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py fire_stripe_event   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_donations.py (no function)   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_dummy_data.py test_add_dummy_data   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_dummy_data.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_dump_emails.py test_dump_email_samples   100% 11 0 0   100% 4 0   100%
app/backend/src/tests/test_dump_emails.py (no function)   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_access_by_normal_user   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_access_by_editor_user   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_access_by_superuser   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_CreateCommunity_invalid_geojson   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateCommunity_invalid_geojson   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateCommunity_invalid_id   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateCommunity   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_CreateCommunity   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateCommunity2   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_MakeUserVolunteer   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_MakeUserVolunteer_default_values   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_MakeUserVolunteer_hide_on_team_page   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_MakeUserVolunteer_user_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_MakeUserVolunteer_already_volunteer   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_MakeUserVolunteer_invalid_date   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer_partial_update   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer_not_found   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer_invalid_started_date   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer_invalid_stopped_date   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer_reinstate   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer_reinstate_already_current   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_UpdateVolunteer_reinstate_conflict_with_stopped   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_ListVolunteers   100% 21 0 0   100% 2 0   100%
app/backend/src/tests/test_editor.py test_ListVolunteers_with_past   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_ListVolunteers_ordering   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py test_ListVolunteers_empty   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_editor.py (no function)   100% 42 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_signup_verification_email   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_report_email   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_reference_report_email_not_sent   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_reference_report_email   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_email_patching_fails   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_email_patching_fails.mock_queue_email   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_email_changed_confirmation_sent_to_new_email   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_do_not_email_security   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_do_not_email_non_security   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_do_not_email_non_security_unsublink   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_email_prefix_config   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_send_donation_email   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_chat_missed_messages_list_unsubscribe_header   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py test_email_deleted_users_regression   100% 34 0 0   100% 0 0   100%
app/backend/src/tests/test_email.py (no function)   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_email_localization.py _all_email_variants   100% 7 0 0   100% 4 0   100%
app/backend/src/tests/test_email_localization.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_email_localization.py test_email_renders_in_english   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_email_localization.py (no function)   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py _get_events   100% 4 0 0   100% 2 0   100%
app/backend/src/tests/test_event_log.py test_log_event_authenticated_context   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_log_event_with_override_user_id   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_log_event_anonymous   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_log_event_complex_properties   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_log_event_empty_properties   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_log_event_multiple_events   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_signup_flow_creates_events   100% 31 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_login_creates_event   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_logout_creates_event   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_host_request_created_event   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_host_request_status_change_events   100% 34 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_host_request_rejected_event   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_host_request_cancelled_event   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_host_request_message_event   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_send_message_creates_event   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_create_group_chat_event   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_friendship_request_events   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_friendship_cancel_event   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_report_creates_event   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_search_creates_event   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_friend_reference_event   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_event_created_event   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_password_change_event   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py test_no_stale_events   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_event_log.py (no function)   100% 45 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_CreateEvent   100% 219 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_CreateEvent_incomplete_profile   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_ScheduleEvent   100% 38 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_cannot_overlap_occurrences_schedule   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_cannot_overlap_occurrences_update   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_UpdateEvent_single   100% 195 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_UpdateEvent_all   100% 43 0 0   100% 8 0   100%
app/backend/src/tests/test_events.py test_GetEvent   100% 105 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_CancelEvent   100% 57 0 0   100% 6 0   100%
app/backend/src/tests/test_events.py test_ListEventAttendees   100% 23 0 0   100% 2 0   100%
app/backend/src/tests/test_events.py test_ListEventSubscribers   100% 23 0 0   100% 2 0   100%
app/backend/src/tests/test_events.py test_ListEventOrganizers   100% 23 0 0   100% 2 0   100%
app/backend/src/tests/test_events.py test_TransferEvent   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_SetEventSubscription   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_SetEventAttendance   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_InviteEventOrganizer   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_ListEventOccurrences   100% 20 0 0   100% 2 0   100%
app/backend/src/tests/test_events.py test_ListMyEvents   100% 98 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_ListMyEvents.new_event   100% 3 0 0   100% 2 0   100%
app/backend/src/tests/test_events.py test_list_my_events_exclude_attending   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_list_my_events_exclude_attending.make_event   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_RemoveEventOrganizer   100% 47 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_ListEventAttendees_regression   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_event_threads   100% 39 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_can_overlap_other_events_schedule_regression   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_can_overlap_other_events_update_regression   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_list_past_events_regression   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_community_invite_requests   100% 47 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_update_event_should_notify_queues_job   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_event_photo_key   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_event_created_with_shadowed_visibility   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_shadowed_event_visible_to_creator_only   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_event_visible_after_approval   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_shadowed_event_hidden_from_list_for_non_creator   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_event_create_notification_deferred_until_approval   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_event_update_notification_has_moderation_state   96% 24 1 0   50% 2 1   92%
app/backend/src/tests/test_events.py test_event_cancel_notification_has_moderation_state   96% 24 1 0   50% 2 1   92%
app/backend/src/tests/test_events.py test_event_reminder_notification_has_moderation_state   96% 23 1 0   50% 2 1   92%
app/backend/src/tests/test_events.py test_event_reminder_not_sent_for_cancelled_event   100% 24 0 0   100% 2 0   100%
app/backend/src/tests/test_events.py test_event_reminder_not_sent_for_invisible_attendee   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_events.py test_ListEventOccurrences_does_not_leak_other_events   100% 28 0 0   100% 2 0   100%
app/backend/src/tests/test_events.py test_event_comment_notification_has_moderation_state   96% 26 1 0   50% 2 1   93%
app/backend/src/tests/test_events.py test_event_thread_reply_notification_has_moderation_state   93% 30 2 0   50% 4 2   88%
app/backend/src/tests/test_events.py (no function)   100% 61 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py _flag_eval_count   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_logged_in_user_is_bucketed_into_rollout   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_anonymous_user_excluded_from_rollout_gets_feature_default   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_anonymous_user_still_gets_global_force_on_flag   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_unknown_feature_returns_in_code_default   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_evaluating_an_experiment_flag_records_exactly_one_exposure   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_evaluate_feature_flag_servicer_returns_value   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_evaluate_feature_flag_servicer_unknown_leaves_value_unset   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py _get_usage   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_record_feature_usage_appends_a_row   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_record_feature_usage_appends_a_row_per_check   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_record_feature_usage_records_each_user_and_feature   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_record_feature_usage_none_value   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_global_evaluation_excluded_from_rollout_gets_feature_default   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_global_evaluation_gets_global_force_on_flag   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_global_evaluation_unknown_feature_returns_in_code_default   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_evaluation_increments_metric_with_source_and_value   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_unknown_feature_increments_metric_with_unknown_source   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py setup_isolation   100% 11 0 0   100% 2 0   100%
app/backend/src/tests/test_experimentation.py test_setup_writes_cache_and_records_fetch_time   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_setup_falls_back_to_disk_cache_when_fetch_fails   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_setup_raises_when_fetch_fails_and_no_cache   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_setup_raises_on_corrupt_cache   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_seconds_since_last_fetch_none_when_never_fetched   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_flags_value_returned   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_flags_missing_key_returns_in_code_default   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_flags_boolean_value   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_load_local_flags_from_file   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_load_local_flags_rejects_non_object   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py test_setup_in_local_file_mode_loads_file_and_skips_growthbook   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_experimentation.py (no function)   100% 48 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py create_upload   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_user_has_profile_gallery   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_GetGalleryEditInfo   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_GetGalleryEditInfo_verified_user   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_GetGalleryEditInfo_not_owner   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_GetGalleryEditInfo_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_GetGalleryEditInfo_with_photos   100% 9 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_GetGallery_as_owner   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_GetGallery_as_non_owner   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_GetGallery_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_success   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_with_caption   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_multiple_photos   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_not_owner   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_upload_not_owned   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_max_capacity   100% 10 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_duplicate_photo   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_AddPhotoToGallery_gallery_not_found   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_RemovePhotoFromGallery_success   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_RemovePhotoFromGallery_not_owner   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_RemovePhotoFromGallery_item_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_MovePhoto_to_first   100% 12 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_MovePhoto_to_middle   100% 12 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_MovePhoto_to_end   100% 12 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_MovePhoto_noop   100% 12 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_MovePhoto_not_owner   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_MovePhoto_item_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_MovePhoto_after_item_not_found   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_UpdatePhotoCaption_success   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_UpdatePhotoCaption_clear_caption   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_UpdatePhotoCaption_not_owner   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_UpdatePhotoCaption_item_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_remove_and_readd_photo   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_gallery_photo_ordering_preserved   100% 12 0 0   100% 4 0   100%
app/backend/src/tests/test_galleries.py test_database_constraints_upload_uniqueness   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_get_avatar_upload_returns_first_by_position   100% 22 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_get_avatar_upload_no_photos   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_has_avatar_photo_expression_with_photos   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_has_avatar_photo_expression_no_photos   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_galleries.py test_avatar_url_via_api_reflects_first_photo   100% 22 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_avatar_changes_after_reordering   100% 17 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_avatar_with_negative_positions   100% 22 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py test_avatar_with_fractional_positions   100% 22 0 0   100% 2 0   100%
app/backend/src/tests/test_galleries.py (no function)   100% 55 0 0   100% 0 0   100%
app/backend/src/tests/test_gis.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_gis.py TestGIS.test_GetUsers   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_gis.py TestGIS.test_GetClusteredUsers   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_gis.py (no function)   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py TestGroups.test_GetGroup   100% 121 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py TestGroups.test_ListAdmins   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py TestGroups.test_ListMembers   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py TestGroups.test_ListDiscussions   100% 14 0 0   100% 4 0   100%
app/backend/src/tests/test_groups.py TestGroups.test_ListUserGroups   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py TestGroups.test_ListOtherUserGroups   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py TestGroups.test_ListEvents   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py test_JoinGroup_and_LeaveGroup   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py test_LeaveGroup_regression   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_groups.py (no function)   100% 27 0 0   100% 0 0   100%
app/backend/src/tests/test_i18n_locales.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_i18n_locales.py test_translations_loaded   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_i18n_locales.py test_to_supported_locale   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_i18n_locales.py test_all_supported_locales_have_babel_locales   100% 2 0 0   100% 2 0   100%
app/backend/src/tests/test_i18n_locales.py test_fallback_chain   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_i18n_locales.py (no function)   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_lookup   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_substitution   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_placeholder_with_spacing   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_localized   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_fallback   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_mutual_fallback   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_plural_suffixes   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_plural_suffix_fallback   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_plural_no_count   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_missing_babel_locale   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_load_simple_json   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_load_nested_json   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_fallback_locale   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_fallback_on_empty_string   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_missing_locale   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_missing_string   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_missing_plural_form   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_extra_substitution   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_missing_substitution   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_missing_substitution_fallback   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_escaping   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py test_full_string_key   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_i18next.py (no function)   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py interceptor_dummy_api   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py _get_histogram_labels_value   100% 6 0 0   100% 2 0   100%
app/backend/src/tests/test_interceptors.py _get_setup_errors_value   100% 6 0 0   100% 2 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_ok   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_ok.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_all_ignored   100% 9 0 0   100% 2 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_all_ignored.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_assertion   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_assertion.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_div0   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_div0.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_raise   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_raise.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_raise_custom   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_logging_interceptor_raise_custom.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_ok_open   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_ok_open.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py _get_db_query_count_histogram   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py _get_api_call_count   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_perf_accounting   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_perf_accounting.TestRpc   100% 4 0 0   100% 2 0   100%
app/backend/src/tests/test_interceptors.py _get_histogram_count   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_phase_histograms   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_phase_histograms.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_perf_accounting_orm_write   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_perf_accounting_orm_write.TestRpc   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_sensitive   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_sensitive.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_sensitive_ping   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_exception   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_exception.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_setup_phase_exception_observed   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_setup_phase_exception_observed.TestRpc   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_abort   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_abort.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py cookie_auth   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py api_auth   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_auth_interceptor   100% 105 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_auth_cookies   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_tracing_interceptor_auth_api_key   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_auth_levels   100% 35 0 0   100% 4 0   100%
app/backend/src/tests/test_interceptors.py test_auth_levels.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_auth_levels.gen_args   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_session_cookie   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_authorization_header   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_both_cookie_and_authorization   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_neither_cookie_nor_authorization   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_all_optional_headers   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_bytes_ip_address   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_bytes_user_agent   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_malformed_authorization   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_find_auth_level_with_valid_service   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_find_auth_level_with_nonexistent_service   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_find_auth_level_with_unknown_auth_level   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_validate_auth_level_with_unknown   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_validate_auth_level_with_open   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_validate_auth_level_with_jailed   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_validate_auth_level_with_secure   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_validate_auth_level_with_editor   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_validate_auth_level_with_admin   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_open_service_without_auth   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_open_service_with_auth   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_secure_service_without_auth   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_secure_service_with_normal_auth   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_secure_service_with_jailed_user   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_jailed_service_with_jailed_user   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_jailed_service_without_auth   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_editor_service_without_editor   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_editor_service_with_editor   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_admin_service_without_superuser   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_admin_service_with_superuser   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_check_auth_admin_service_without_auth   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_sofa_cookie_valid   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_sofa_cookie_missing   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_sofa_cookie_no_cookies   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_sofa_cookie_invalid_base64   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_sofa_cookie_invalid_encryption   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_sofa_cookie_invalid_proto   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_generate_sofa_cookie   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_with_sofa_cookie   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_parse_headers_without_sofa_cookie   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_logged_new   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_logged_new.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_logged_existing   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_logged_existing.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_logged_invalid_generates_new   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_logged_invalid_generates_new.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_with_authenticated_user   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_persists_on_exception   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py test_sofa_cookie_persists_on_exception.TestRpc   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_interceptors.py (no function)   100% 98 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_jail_basic   100% 19 0 0   100% 4 0   100%
app/backend/src/tests/test_jail.py test_JailInfo   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_AcceptTOS   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_TOS_increase   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_SetLocation   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_MarkUserNeedsLocationUpdate   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_AcceptCommunityGuidelines   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_modnotes   100% 49 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py test_modnotes_no_notify   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_jail.py (no function)   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py test_localize_language_name   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py test_localize_region_name   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py test_localize_date   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py test_localize_time   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py test_localize_datetime   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py test_localize_timezone   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py test_localize_list   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_localize.py (no function)   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_markup.py test_markdown_to_html   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_markup.py test_markdown_to_html.to_para   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_markup.py test_markdown_to_plaintext   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_markup.py test_html_to_plaintext   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_markup.py (no function)   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_media.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_media.py test_media_upload   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_media.py (no function)   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py _populate   80% 5 1 0   75% 4 1   78%
app/backend/src/tests/test_metrics.py _sample_values   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py test_users_per_community_gauge   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py test_active_users_by_recency_gauge   100% 12 0 0   100% 6 0   100%
app/backend/src/tests/test_metrics.py _add_activity   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py _platform_metrics   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py _gauge_value   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py test_active_users_by_platform   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py test_active_users_by_platform_excludes_invisible_users   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py test_active_users_by_platform_counts_user_once_per_platform   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py test_active_users_by_platform_excludes_old_activity   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py test_active_users_mobile_fraction_gauge   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_metrics.py (no function)   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_model_constraints.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_model_constraints.py test_node_constraints   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_model_constraints.py test_page_constraints   94% 63 4 0   100% 0 0   94%
app/backend/src/tests/test_model_constraints.py test_activeness_probes_cant_have_multiple   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_model_constraints.py _add_friend_relationship   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_model_constraints.py test_friend_relationship_unique_active_pair   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_model_constraints.py (no function)   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_models.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_models.py test_user_age   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_models.py test_user_display_joined   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_models.py test_user_display_last_active   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_models.py (no function)   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py create_test_host_request_with_moderation   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_create_moderation   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_add_to_moderation_queue   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_moderate_content   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_resolve_queue_item   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_approve_content_via_api   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_create_host_request_creates_moderation_state   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_host_request_no_notification_before_approval   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_shadowed_notification_not_in_list_notifications   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_notification_visible_after_approval   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_shadowed_host_request_visible_to_author_only   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_unlisted_host_request_not_in_lists   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_approved_host_request_in_lists_and_notifications   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_hidden_host_request_invisible_to_all   100% 32 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_multiple_host_requests_listing_visibility   100% 28 0 0   100% 4 0   100%
app/backend/src/tests/test_moderation.py test_moderation_log_tracking   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_moderation_queue_workflow   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_empty   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_with_items   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_filter_by_trigger   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_filter_created_before   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_filter_created_after   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_filter_created_before_and_after   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_filter_unresolved   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_filter_by_author   100% 34 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_ordering   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_pagination_newest_first   100% 32 0 0   100% 6 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationLog   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationLog_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationState   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationState_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationState_unspecified_type   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_approve   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_hide   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_shadow   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_flag   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_flag_requires_trigger   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py _open_queue_item_id   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_set_priority   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_unflag   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_unflag_requires_queue_item   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_approve_without_clear_flags_leaves_flag_open   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ModerateContent_flag_supersede   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_GetModerationQueue_filter_by_priority   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_group_chat_created_with_moderation_state   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_group_chat_GetModerationState   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_group_chat_moderation_hide   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_group_chat_moderation_shadow   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_auto_approve_moderation_queue_disabled_when_zero   100% 27 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_auto_approve_moderation_queue_approves_old_items   100% 47 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_auto_approve_does_not_approve_recent_items   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_auto_approve_does_not_approve_already_approved   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_auto_approve_does_not_approve_moderator_shadowed_items   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_auto_approve_skips_shadowed_user_authored_items   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_auto_approve_preserves_other_open_flags   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_host_request_message_notifications_suppressed_before_approval   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_host_request_status_notifications_suppressed_before_approval   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_host_request_notifications_sent_after_approval   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_group_chat_message_notifications_suppressed_before_approval   100% 28 0 0   100% 6 0   100%
app/backend/src/tests/test_moderation.py test_event_moderation_state_content   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py _get_moderation_state   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_host_request   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_group_chat   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_event_occurrence   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_friend_request   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_round_trip   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_resolves_queue_items   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_noop_when_matches   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_unspecified_rejected   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_non_admin_rejected   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_writes_admin_action   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_only_touches_target   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_user_not_found   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_from_visibility_filter   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_from_visibility_multi   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_from_visibility_empty_is_any   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_SetUserContentVisibility_from_visibility_unspecified_rejected   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ListModerationStates_empty   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ListModerationStates_returns_states_chronologically   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ListModerationStates_filter_by_author   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py test_ListModerationStates_pagination   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_moderation.py (no function)   100% 103 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py _FakeContext.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py _FakeContext.get_boolean_value   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_native_updates.py _FakeContext.get_string_value   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_native_updates.py _FakeContext.get_integer_value   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_native_updates.py _FakeContext.get_float_value   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py _FakeContext.get_object_value   0% 1 1 0   100% 0 0   0%
app/backend/src/tests/test_native_updates.py _days_ago   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py _decide   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py _ts   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_client_info_from_full_proto   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_client_info_embedded_launch_source   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_client_info_defaults_when_request_empty   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_no_timestamps_means_no_update   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_fresh_binary_no_update   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_binary_between_warn_and_block_is_store_warn   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_binary_past_block_is_store_block   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_ota_between_warn_and_block_is_ota_warn   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_ota_past_block_is_ota_block   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_ota_clock_ignored_when_not_running_ota   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_binary_warn_but_ota_block_resolves_to_ota_block   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_store_precedence_when_severities_tie   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_binary_block_beats_ota_warn   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_warn_days_drive_warn_threshold   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_block_days_drive_block_threshold   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_zero_block_disables_clock   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_banned_bundle_on_ota_launch_forces_block   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py test_banned_ignored_when_not_an_ota_launch   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_native_updates.py (no function)   100% 37 0 0   100% 0 0   100%
app/backend/src/tests/test_notification_settings.py test_all_notifications_appear_in_settings   100% 13 0 0   100% 10 0   100%
app/backend/src/tests/test_notification_settings.py test_all_notifications_have_descriptions   100% 2 0 0   100% 2 0   100%
app/backend/src/tests/test_notification_settings.py test_topic_action_unsubscribe_text_iff_unsubscribable   100% 5 0 0   100% 4 0   100%
app/backend/src/tests/test_notification_settings.py test_topic_key_unsubscribe_text_iff_unsubscribable   100% 5 0 0   100% 4 0   100%
app/backend/src/tests/test_notification_settings.py (no function)   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SetNotificationSettings_preferences_respected_editable   100% 12 0 0   100% 2 0   100%
app/backend/src/tests/test_notifications.py test_SetNotificationSettings_preferences_not_editable   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_unsubscribe   93% 30 2 0   79% 14 3   89%
app/backend/src/tests/test_notifications.py test_unsubscribe_do_not_email   97% 32 1 0   83% 6 1   95%
app/backend/src/tests/test_notifications.py test_get_do_not_email   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_set_do_not_email   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_list_notifications   100% 37 0 0   83% 6 1   98%
app/backend/src/tests/test_notifications.py test_notifications_seen   100% 41 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_unseen_notification_count_excludes_ums_hidden   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_GetVapidPublicKey   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_RegisterPushNotificationSubscription   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_RegisterPushNotificationSubscription_invalid_endpoint   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SendTestPushNotification   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SendBlogPostNotification   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_get_topic_actions_by_delivery_type   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_event_reminder_email_sent   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_RegisterMobilePushNotificationSubscription   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_RegisterMobilePushNotificationSubscription_android   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_RegisterMobilePushNotificationSubscription_no_device_type   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_RegisterMobilePushNotificationSubscription_re_enable   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_RegisterMobilePushNotificationSubscription_already_exists   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SendTestMobilePushNotification   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_get_expo_push_receipts   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_get_expo_push_receipts_empty   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_check_expo_push_receipts_success   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_check_expo_push_receipts_device_not_registered   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_check_expo_push_receipts_not_found   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_check_expo_push_receipts_skips_already_checked   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SendDevPushNotification_success   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SendDevPushNotification_minimal   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SendDevPushNotification_disabled   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_SendDevPushNotification_push_notifications_disabled   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_check_expo_push_receipts_skips_too_recent   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_check_expo_push_receipts_batch   100% 22 0 0   100% 4 0   100%
app/backend/src/tests/test_notifications.py test_DebugRedeliverPushNotification_success   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_DebugRedeliverPushNotification_not_found   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_DebugRedeliverPushNotification_wrong_user   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_DebugRedeliverPushNotification_disabled   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_DebugRedeliverPushNotification_push_notifications_disabled   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_email_delivery   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_push_delivery   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_digest_delivery   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_banned_user_no_email   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_deleted_user_no_regular_email   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_deleted_user_receives_account_deletion_email   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_do_not_email_respected   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_critical_bypasses_do_not_email   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_duplicate_delivery_skipped   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_deferred_when_content_not_visible   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_delivered_when_content_visible   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_notification_serializes_shadowed_actor   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_notifications.py test_handle_notification_multiple_delivery_types   100% 21 0 0   83% 6 1   96%
app/backend/src/tests/test_notifications.py (no function)   100% 85 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_create_place_errors   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_create_guide_errors   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_create_page_place   100% 23 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_create_page_guide   100% 42 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_get_page   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_update_page   100% 96 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_owner_not_moderator   100% 39 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_update_page_errors   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_page_transfer   100% 122 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_page_photo   100% 29 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_list_user_places   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_list_other_user_places   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_list_user_guides   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py test_list_other_user_guides   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_pages.py (no function)   100% 27 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_generate_postal_verification_code   100% 7 0 0   100% 4 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_disabled   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_confirm_disabled   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_happy_path   100% 42 0 0   100% 2 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_wrong_code   100% 21 0 0   100% 4 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_code_expiry   100% 18 0 0   100% 2 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_rate_limit   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_already_in_progress   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_cancel   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_can_cancel_after_postcard_sent   100% 19 0 0   100% 2 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_list_attempts   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_address_validation   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_postcard_send_failure   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_code_case_insensitive   100% 17 0 0   100% 2 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_attempt_not_found   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_postal_verification_other_user_attempt   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py test_has_postal_verification_helper   100% 21 0 0   100% 2 0   100%
app/backend/src/tests/test_postal_verification.py test_generate_postcard_images   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_postal_verification.py (no function)   100% 38 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py test_get_postcard_front_image_returns_png   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py test_send_postcard_success   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py test_send_postcard_builds_recipient_correctly   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py test_send_postcard_excludes_none_optional_fields   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py test_send_postcard_auth_failure   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py test_send_postcard_order_failure   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_postcard_service.py (no function)   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py fake_agent   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py _enable   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py test_disabled_does_nothing   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py test_enables_with_flag_driven_params   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py test_idempotent_when_unchanged   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py test_rate_change_restarts_agent   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py test_mode_change_restarts_agent   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py test_disable_after_running_shuts_down   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py test_sample_rate_is_clamped   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_profiling.py (no function)   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetPublicMapLayer   100% 23 0 0   100% 4 0   100%
app/backend/src/tests/test_public.py test_GetDonationStats_empty   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetDonationStats_with_donations   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetDonationStats_excludes_merch   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetDonationStats_excludes_previous_years   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetDonationStats_uses_flags   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetVolunteers_mixed_current_and_past   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetVolunteers_custom_sort_key   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetVolunteers_excludes_hidden   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetVolunteers_link_types   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetVolunteers_board_member_flag   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetSignupPageInfo   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetSignupPageInfo_excludes_invisible_users   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetPublicUser_not_found   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetPublicUser_invisible_user   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetPublicUser_limited_visibility   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetPublicUser_most_visibility   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py test_GetPublicUser_full_visibility   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public.py (no function)   100% 37 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py _valid_request_text   75% 4 1 0   50% 2 1   67%
app/backend/src/tests/test_public_trips.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py _make_node   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py _make_node_admin   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py _create_trip_directly   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_incomplete_profile   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_community_not_found   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_not_enabled   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_allows_region_and_narrower   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_in_past_uses_node_timezone   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_date_errors   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_overlap   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_closed_trip_allows_new_overlap   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_get_public_trip   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_get_public_trip_not_found   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_filters_closed_and_past   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_hides_invisible_user   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_pagination   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_self_sees_all   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_other_filters_inactive_and_past   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_invisible_user   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_close   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_reopen   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_cant_reopen_past_trip   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_close_past_trip_allowed   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_description_only   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_dates   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_not_owner   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_in_past   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_date_validation   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_create_public_trip_description_too_short   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_update_public_trip_description_too_short   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_same_gender_only_create_and_retrieve   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_same_gender_only_visibility_list_and_get   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_same_gender_only_moderator_bypass   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_same_gender_only_owner_always_sees_own_trips   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_same_gender_only_update   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_ascending_order   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_status_filter   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_status_filter_ignored_for_others   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_offers_count_owner   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py test_list_public_trips_by_user_offers_count_not_set_for_others   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_public_trips.py (no function)   100% 60 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py create_host_request   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py create_host_request_by_date   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py create_host_reference   100% 23 0 0   100% 6 0   100%
app/backend/src/tests/test_references.py create_friend_reference   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_ListPagination   100% 66 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_ListReference_banned_deleted_users   100% 27 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_WriteFriendReference   100% 33 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_WriteFriendReference_with_empty_text   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_WriteFriendReference_with_private_text   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_WriteFriendReference_requires_friendship   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_host_request_states_references   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_WriteHostRequestReference   100% 45 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_WriteHostRequestReference_private_text   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_GetHostRequestReferenceStatus   100% 51 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_AvailableWriteReferences_and_ListPendingReferencesToWrite   100% 124 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_regression_disappearing_refs   100% 82 0 0   100% 2 0   100%
app/backend/src/tests/test_references.py test_WriteFriendReference_creates_shadowed_moderation_state   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py test_reference_hidden_via_ums_disappears_from_listings   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_references.py (no function)   100% 37 0 0   100% 0 0   100%
app/backend/src/tests/test_reporting.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_reporting.py test_reporting   100% 19 0 0   100% 0 0   100%
app/backend/src/tests/test_reporting.py (no function)   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py valid_request_text   80% 5 1 0   50% 2 1   71%
app/backend/src/tests/test_requests.py test_create_request   100% 63 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_host_request_rejects_date_past_in_host_timezone   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_host_request_date_valid_when_host_behind_requester   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_incomplete_profile   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_excessive_requests_are_reported   100% 25 0 0   100% 4 0   100%
app/backend/src/tests/test_requests.py add_message   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_GetHostRequest   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_ListHostRequests   100% 41 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_ListHostRequests_pagination_regression   100% 42 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_ListHostRequests_sort_by_from_date   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_ListHostRequests_sort_by_from_date_pagination   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_ListHostRequests_active_filter   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_ListHostRequests_active_filter_excludes_past   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_ListHostRequests_status_in_filter   100% 31 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_RespondHostRequests   100% 55 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_get_host_request_messages   100% 37 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_SendHostRequestMessage   100% 39 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_get_updates   100% 46 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_archive_host_request   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_mark_last_seen   100% 42 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_mark_last_seen_clears_notifications   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_mark_last_seen_clears_notifications.unseen_notification_count   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_response_rate   100% 92 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_request_notifications   100% 47 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_quick_decline   98% 43 1 0   67% 6 2   94%
app/backend/src/tests/test_requests.py test_host_req_feedback   100% 45 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py _make_trip_node_admin   100% 8 0 0   50% 2 1   90%
app/backend/src/tests/test_requests.py _create_public_trip   100% 10 0 0   50% 2 1   92%
app/backend/src/tests/test_requests.py test_create_request_with_public_trip   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_with_public_trip_dates_out_of_range   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_with_public_trip_user_mismatch   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_with_closed_public_trip   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_with_nonexistent_public_trip   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_without_public_trip_id_unchanged   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_same_gender_only_wrong_gender_rejected   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_same_gender_only_same_gender_allowed   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_same_gender_only_moderator_bypass   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py test_create_request_duplicate_offer_rejected   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_requests.py (no function)   100% 62 0 0   100% 0 0   100%
app/backend/src/tests/test_resources.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_resources.py test_GetTermsOfService   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_resources.py test_GetCommunityGuidelines   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_resources.py test_GetRegions   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_resources.py test_GetLanguages   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_resources.py test_GetBadges   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_resources.py (no function)   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_none_input   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_empty_message   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_with_no_sensitive_fields   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_with_sensitive_field   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_with_nested_message_non_repeated   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_with_empty_nested_message   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_with_empty_repeated_field   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_with_repeated_messages   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_deeply_nested_messages   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_multiple_nested_messages_with_sensitive_fields   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_preserves_original   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_message_with_non_message_type_fields   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py TestSanitizedBytes.test_complex_nested_structure   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_sanitized_bytes.py (no function)   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_Search   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_UserSearch   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_regression_search_in_area   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_search_in_rectangle   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_filter_complete_profile   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_filter_meetup_status   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_filter_language   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_filter_strong_verification   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_regression_search_only_with_references   100% 20 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_search_exactly_user_ids   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py sample_event_data   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py create_event   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py create_event._create_event   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py sample_community   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_EventSearch_no_filters   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_event_search_by_query   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_event_search_by_time   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_event_search_by_circle   100% 12 0 0   100% 4 0   100%
app/backend/src/tests/test_search.py test_event_search_by_rectangle   100% 12 0 0   100% 4 0   100%
app/backend/src/tests/test_search.py test_event_search_pagination   100% 22 0 0   100% 2 0   100%
app/backend/src/tests/test_search.py test_event_search_pagination_with_page_number   100% 21 0 0   100% 2 0   100%
app/backend/src/tests/test_search.py test_event_search_online_status   100% 12 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_event_search_filter_subscription_attendance_organizing_my_communities   100% 32 0 0   100% 2 0   100%
app/backend/src/tests/test_search.py test_event_search_exclude_attending   100% 27 0 0   100% 2 0   100%
app/backend/src/tests/test_search.py test_regression_search_multiple_pages   100% 11 0 0   100% 2 0   100%
app/backend/src/tests/test_search.py test_regression_search_no_results   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_filter_same_gender_only   100% 59 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py test_user_filter_same_gender_only_with_other_filters   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_search.py (no function)   100% 48 0 0   100% 0 0   100%
app/backend/src/tests/test_slack.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_slack.py test_send_slack_message_disabled   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_slack.py test_send_slack_message_enabled   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_slack.py (no function)   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_smtp.py test_verbatim_attachment_headers   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_smtp.py test_embed_html_relative_images   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_smtp.py (no function)   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py _emulate_iris_callback   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py do_and_check_sv   98% 53 1 0   88% 8 1   97%
app/backend/src/tests/test_strong_verification.py monkeypatch_sv_config   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_happy_path   100% 107 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_delete_data   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_expiry   100% 30 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_regression   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_regression2   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_disabled   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_delete_data_cant_reverify   100% 39 0 0   100% 2 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_duplicate_other_user   100% 37 0 0   100% 2 0   100%
app/backend/src/tests/test_strong_verification.py test_strong_verification_non_passport   100% 17 0 0   100% 2 0   100%
app/backend/src/tests/test_strong_verification.py (no function)   100% 38 0 0   100% 0 0   100%
app/backend/src/tests/test_templating.py test_html_escaping   100% 5 0 0   100% 0 0   100%
app/backend/src/tests/test_templating.py (no function)   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_threads_basic   100% 35 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_threads_errors   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py pagination_test   100% 9 0 0   100% 4 0   100%
app/backend/src/tests/test_threads.py test_threads_pagination   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py _make_thread_and_comment   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_comment_creates_moderation_state   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_reply_creates_moderation_state   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_shadowed_comment_visible_to_author_only   100% 10 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_shadowed_reply_visible_to_author_only   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py _approve   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_comment_by_invisible_user_hidden   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_reply_by_invisible_user_hidden   100% 24 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_admin_can_approve_comment   100% 16 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_admin_can_hide_comment   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_total_num_responses_excludes_shadowed   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_total_num_responses_includes_own_shadowed   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_edit_comment_creates_version_record   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_delete_comment_creates_version_record   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_edit_reply_creates_version_record   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_delete_reply_creates_version_record   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py test_edit_comment_multiple_edits_creates_multiple_version_records   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_threads.py (no function)   100% 36 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py _add_upload   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_unused   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_profile_gallery   100% 22 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_event   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_page   100% 21 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_community_page   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_multiple   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_for_keys_batch   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_get_upload_uses_for_keys_empty   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_upload_uses.py test_upload_uses_covers_all_foreign_keys   100% 6 0 0   100% 6 0   100%
app/backend/src/tests/test_upload_uses.py (no function)   100% 26 0 0   100% 0 0   100%
app/backend/src/tests/test_utils.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_utils.py test_page_token_time_python   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_utils.py test_page_token_time_db   100% 8 0 0   100% 0 0   100%
app/backend/src/tests/test_utils.py test_http_date_with_datetime   100% 3 0 0   100% 0 0   100%
app/backend/src/tests/test_utils.py test_http_date_without_datetime   100% 4 0 0   100% 0 0   100%
app/backend/src/tests/test_utils.py test_wrap_coordinate   100% 4 0 0   100% 2 0   100%
app/backend/src/tests/test_utils.py test_to_timezone   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_utils.py (no function)   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py _   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_ChangePhone   100% 38 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_ChangePhone.deny_operator   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_ChangePhone.succeed   100% 2 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_ChangePhone_ratelimit   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_ChangePhone_ratelimit.succeed   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_VerifyPhone   100% 18 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_VerifyPhone_antibrute   100% 8 0 0   75% 4 1   92%
app/backend/src/tests/test_verification.py test_phone_uniqueness   100% 28 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_phone_uniqueness.succeed   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_send_sms   100% 17 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_ChangePhone_sms_disabled   100% 7 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py test_sms_verification_no_donation   100% 6 0 0   100% 0 0   100%
app/backend/src/tests/test_verification.py (no function)   100% 25 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py _FakeContext.__init__   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py _FakeContext.is_logged_in   100% 1 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py test_is_visible_property   100% 11 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py test_select_dot_where_users_visible   100% 9 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py test_select_dot_where_users_column_visible   100% 15 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py test_shadowed_user_hidden_from_others_visible_to_self   100% 14 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py test_shadowed_user_column_visible_with_self_exception   100% 13 0 0   100% 0 0   100%
app/backend/src/tests/test_visible_users.py (no function)   100% 16 0 0   100% 0 0   100%
Total     96% 35782 1322 89   80% 4138 597   95%

No items found using the specified filter.