Coverage report: 94%

Files Functions Classes

coverage.py v7.13.4, created at 2026-02-09 13:58 +0000

      Statements   Branches   Total
File function   coverage statements missing excluded   coverage branches partial   coverage
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% 22 22 0   0% 10 0   0%
app / backend / src / app.py (no function)   0% 32 32 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 / config.py check_config   0% 21 21 0   0% 26 0   0%
app / backend / src / couchers / config.py make_config   79% 28 6 0   73% 22 4   76%
app / backend / src / couchers / config.py (no function)   100% 7 0 0   100% 0 0   100%
app / backend / src / couchers / constants.py (no function)   100% 46 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__   88% 16 2 0   75% 8 2   83%
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.get_localized_string   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   80% 5 1 0   50% 2 1   71%
app / backend / src / couchers / context.py CouchersContext.set_cookies   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.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.ui_language_preference   100% 1 0 0   100% 0 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_logged_out_context   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / context.py (no function)   100% 36 0 0   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% 1 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% 40 0 0   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 / dev.py print_dev_email   100% 4 0 0   100% 0 0   100%
app / backend / src / couchers / email / dev.py (no function)   100% 5 0 0   100% 0 0   100%
app / backend / src / couchers / email / queuing.py _queue_email   100% 4 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   100% 9 0 0   100% 0 0   100%
app / backend / src / couchers / email / queuing.py queue_system_email   100% 7 0 0   100% 0 0   100%
app / backend / src / couchers / email / queuing.py (no function)   100% 16 0 0   100% 0 0   100%
app / backend / src / couchers / email / smtp.py make_cid   100% 3 0 0   100% 0 0   100%
app / backend / src / couchers / email / smtp.py send_smtp_email   85% 34 5 0   64% 14 5   79%
app / backend / src / couchers / email / smtp.py (no function)   100% 12 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% 5 0 0   100% 0 0   100%
app / backend / src / couchers / experimentation.py setup_experimentation   0% 18 18 0   0% 4 0   0%
app / backend / src / couchers / experimentation.py _shutdown_experimentation   0% 6 6 0   0% 4 0   0%
app / backend / src / couchers / experimentation.py _check_initialized   50% 2 1 0   50% 2 1   50%
app / backend / src / couchers / experimentation.py _get_statsig_user   0% 3 3 0   0% 2 0   0%
app / backend / src / couchers / experimentation.py check_gate   50% 6 3 0   25% 4 1   40%
app / backend / src / couchers / experimentation.py get_experiment   0% 5 5 0   0% 2 0   0%
app / backend / src / couchers / experimentation.py get_dynamic_config   0% 5 5 0   0% 2 0   0%
app / backend / src / couchers / experimentation.py log_event   0% 4 4 0   0% 2 0   0%
app / backend / src / couchers / experimentation.py (no function)   100% 16 0 2   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% 7 0 0   100% 2 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% 10 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% 9 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   0% 18 18 0   0% 6 0   0%
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 / i18n / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
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.localize_string   100% 2 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / context.py LocalizationContext.localize_date   100% 3 0 0   100% 2 0   100%
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   100% 3 0 0   50% 2 1   80%
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% 21 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / i18next.py I18Next.add_language   80% 5 1 0   50% 2 1   71%
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 Language.load_json_dict   100% 2 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / i18next.py Language.load_json_dict.add_strings   86% 7 1 0   83% 6 1   85%
app / backend / src / couchers / i18n / i18next.py Language.add_string   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / i18next.py Language.find_string   100% 8 0 0   88% 8 1   94%
app / backend / src / couchers / i18n / i18next.py Language.localize   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 StringTemplate.can_render   100% 5 0 0   100% 6 0   100%
app / backend / src / couchers / i18n / i18next.py StringTemplate.render   88% 8 1 0   83% 6 1   86%
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 (no function)   100% 39 0 0   100% 0 0   100%
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 load_locales   94% 16 1 0   88% 8 1   92%
app / backend / src / couchers / i18n / locales.py (no function)   100% 8 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / localize.py get_main_i18next   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / localize.py localize_string   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / localize.py localize_date   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / localize.py localize_date_from_iso   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / localize.py localize_time   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / localize.py localize_datetime   100% 8 0 0   50% 4 2   83%
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% 19 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / plurals.py PluralRules.for_language   100% 3 0 0   100% 0 0   100%
app / backend / src / couchers / i18n / plurals.py PluralRules.ca   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.cs   0% 6 6 0   0% 4 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.de   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.en   100% 4 0 0   100% 2 0   100%
app / backend / src / couchers / i18n / plurals.py PluralRules.es   0% 6 6 0   0% 4 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.fr   0% 6 6 0   0% 4 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.he   0% 6 6 0   0% 4 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.hi   0% 4 4 0   0% 2 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.hu   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.it   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.ja   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.nl   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.pl   0% 6 6 0   0% 4 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.pt   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.ru   0% 6 6 0   0% 4 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.sv   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.tr   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.uk   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py PluralRules.zh   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / i18n / plurals.py (no function)   100% 52 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% 8 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 _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% 6 0 0   100% 2 0   100%
app / backend / src / couchers / interceptors.py _sanitized_bytes._sanitize_message   100% 11 0 0   100% 12 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   92% 25 2 0   67% 6 2   87%
app / backend / src / couchers / interceptors.py CouchersMiddlewareInterceptor.intercept_service.function_without_couchers_stuff   94% 35 2 0   79% 14 3   90%
app / backend / src / couchers / interceptors.py parse_headers   100% 13 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% 60 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% 13 0 0   100% 4 0   100%
app / backend / src / couchers / jobs / handlers.py send_message_notifications.format_title   100% 3 0 0   100% 2 0   100%
app / backend / src / couchers / jobs / handlers.py send_request_notifications   100% 15 0 0   100% 6 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   84% 19 3 0   75% 8 2   81%
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% 9 0 0   100% 4 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   85% 13 2 0   75% 4 1   82%
app / backend / src / couchers / jobs / handlers.py check_database_consistency   62% 48 18 0   47% 32 11   56%
app / backend / src / couchers / jobs / handlers.py auto_approve_moderation_queue   100% 12 0 0   100% 6 0   100%
app / backend / src / couchers / jobs / handlers.py (no function)   100% 63 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% 10 10 0   100% 0 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% 31 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% 6 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 _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 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 create_prometheus_server   100% 6 0 0   100% 0 0   100%
app / backend / src / couchers / metrics.py create_prometheus_server.app   100% 5 0 0   100% 2 0   100%
app / backend / src / couchers / metrics.py (no function)   100% 80 0 0   100% 0 0   100%
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)   83% 23 4 0   33% 6 2   72%
app / backend / src / couchers / models / __init__.py (no function)   100% 20 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 / 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% 114 0 2   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% 76 0 2   100% 0 0   100%
app / backend / src / couchers / models / discussions.py (no function)   100% 60 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% 122 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% 69 0 4   100% 0 0   100%
app / backend / src / couchers / models / logging.py (no function)   100% 39 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 (no function)   100% 61 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 / 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% 40 0 2   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% 243 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% 52 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_activeness_probe   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_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.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% 209 0 4   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 / notifications / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / background.py _send_email_notification   88% 33 4 0   79% 14 3   85%
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% 28 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / expo_api.py send_expo_push_notification   0% 17 17 0   0% 4 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 / notify.py notify   100% 6 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / notify.py (no function)   100% 10 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 generate_do_not_email   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / quick_links.py generate_unsub_topic_key   100% 1 0 0   100% 0 0   100%
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   67% 3 1 0   50% 2 1   60%
app / backend / src / couchers / notifications / quick_links.py respond_quick_link   61% 33 13 0   50% 14 3   57%
app / backend / src / couchers / notifications / quick_links.py (no function)   100% 25 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / render_email.py render_email_notification   86% 214 29 0   78% 130 16   83%
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 UserTemplateArgs.from_protobuf_user   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / render_email.py (no function)   100% 21 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / render_push.py render_push_notification   89% 110 12 0   90% 106 11   89%
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% 1 1 0   100% 0 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   0% 1 1 0   100% 0 0   0%
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% 4 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 _get_notifs_i18next   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / render_push.py (no function)   100% 76 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% 9 9 0   0% 6 0   0%
app / backend / src / couchers / notifications / send_raw_push_notification.py _send_expo   0% 20 20 0   0% 12 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% 29 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 check_settings   100% 13 0 0   100% 10 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% 18 0 0   100% 0 0   100%
app / backend / src / couchers / notifications / utils.py (no function)   100% 3 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 / 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% 11 0 0   100% 2 0   100%
app / backend / src / couchers / phone / sms.py (no function)   100% 13 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 / postcard_service.py send_postcard   0% 1 1 0   100% 0 0   0%
app / backend / src / couchers / postal / postcard_service.py (no function)   100% 6 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 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 copy_resources_to_database   81% 21 4 0   62% 8 1   76%
app / backend / src / couchers / resources.py (no function)   100% 33 0 0   100% 0 0   100%
app / backend / src / couchers / server.py create_main_server   100% 32 0 0   100% 0 0   100%
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% 36 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% 5 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% 27 0 0   100% 12 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% 12 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% 75 0 0   100% 0 0   100%
app / backend / src / couchers / servicers / admin.py _user_to_details   100% 1 0 0   100% 0 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 append_admin_note   100% 4 0 0   100% 2 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   0% 44 44 0   0% 38 0   0%
app / backend / src / couchers / servicers / admin.py Admin.ChangeUserGender   86% 7 1 0   50% 2 1   78%
app / backend / src / couchers / servicers / admin.py Admin.ChangeUserBirthdate   78% 9 2 0   50% 4 2   69%
app / backend / src / couchers / servicers / admin.py Admin.AddBadge   92% 12 1 0   88% 8 1   90%
app / backend / src / couchers / servicers / admin.py Admin.RemoveBadge   77% 13 3 0   62% 8 3   71%
app / backend / src / couchers / servicers / admin.py Admin.SetPassportSexGenderException   80% 5 1 0   50% 2 1   71%
app / backend / src / couchers / servicers / admin.py Admin.BanUser   83% 6 1 0   50% 2 1   75%
app / backend / src / couchers / servicers / admin.py Admin.UnbanUser   83% 6 1 0   50% 2 1   75%
app / backend / src / couchers / servicers / admin.py Admin.AddAdminNote   80% 5 1 0   50% 2 1   71%
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   88% 8 1 0   75% 4 1   83%
app / backend / src / couchers / servicers / admin.py Admin.MarkUserNeedsLocationUpdate   80% 5 1 0   50% 2 1   71%
app / backend / src / couchers / servicers / admin.py Admin.DeleteUser   80% 5 1 0   50% 2 1   71%
app / backend / src / couchers / servicers / admin.py Admin.RecoverDeletedUser   80% 5 1 0   50% 2 1   71%
app / backend / src / couchers / servicers / admin.py Admin.CreateApiKey   83% 6 1 0   50% 2 1   75%
app / backend / src / couchers / servicers / admin.py Admin.GetChats   92% 13 1 0   50% 2 1   87%
app / backend / src / couchers / servicers / admin.py Admin.GetChats.get_user_details   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   71% 7 2 0   50% 4 2   64%
app / backend / src / couchers / servicers / admin.py Admin.DeleteReference   80% 5 1 0   50% 2 1   71%
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.EditDiscussion   0% 8 8 0   0% 6 0   0%
app / backend / src / couchers / servicers / admin.py Admin.EditReply   0% 10 10 0   0% 6 0   0%
app / backend / src / couchers / servicers / admin.py Admin.AddUsersToModerationUserList   100% 18 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% 14 1 0   90% 10 1   92%
app / backend / src / couchers / servicers / admin.py Admin.CreateAccountDeletionLink   83% 6 1 0   50% 2 1   75%
app / backend / src / couchers / servicers / admin.py Admin.AccessStats   0% 12 12 0   0% 4 0   0%
app / backend / src / couchers / servicers / admin.py Admin.SetLastDonated   100% 7 0 0   100% 4 0   100%
app / backend / src / couchers / servicers / admin.py (no function)   100% 67 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   88% 17 2 0   75% 8 2   84%
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% 2 0 0   100% 0 0   100%
app / backend / src / couchers / servicers / api.py user_model_to_pb   97% 66 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% 66 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% 14 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   91% 119 11 0   81% 58 9   88%
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% 1 0 0   100% 0 0   100%
app / backend / src / couchers / servicers / auth.py Auth.AntiBot   0% 16 16 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% 47 0 0   100% 0 0   100%
app / backend / src / couchers / servicers / blocking.py is_not_visible   100% 6 0 0   100% 2 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 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.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 (no function)   100% 22 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.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   78% 9 2 0   50% 4 2   69%
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% 45 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% 13 0 0   100% 6 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% 5 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   71% 7 2 0   50% 4 2   64%
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   80% 25 5 0   58% 12 5   73%
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% 7 0 0   100% 2 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   87% 23 3 0   71% 14 4   81%
app / backend / src / couchers / servicers / discussions.py Discussions.GetDiscussion   75% 4 1 0   50% 2 1   67%
app / backend / src / couchers / servicers / discussions.py (no function)   100% 23 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   86% 14 2 0   62% 8 3   77%
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   100% 24 0 0   100% 6 0   100%
app / backend / src / couchers / servicers / donations.py (no function)   100% 25 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   100% 5 0 0   100% 0 0   100%
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% 21 0 0   100% 16 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 (no function)   100% 40 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% 17 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   87% 63 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   89% 18 2 0   75% 12 3   83%
app / backend / src / couchers / servicers / events.py Events.ListMyEvents   95% 38 2 0   93% 14 1   94%
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% 63 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% 22 0 0   100% 10 0   100%
app / backend / src / couchers / servicers / galleries.py Galleries.RemovePhotoFromGallery   92% 12 1 0   83% 6 1   89%
app / backend / src / couchers / servicers / galleries.py Galleries.MovePhoto   93% 28 2 0   83% 18 3   89%
app / backend / src / couchers / servicers / galleries.py Galleries.UpdatePhotoCaption   92% 12 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   86% 7 1 0   50% 2 1   78%
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 moderation_state_to_pb   94% 17 1 0   88% 8 1   92%
app / backend / src / couchers / servicers / moderation.py Moderation.GetModerationQueue   90% 39 4 0   83% 24 2   87%
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   100% 12 0 0   83% 6 1   94%
app / backend / src / couchers / servicers / moderation.py Moderation.ModerateContent   93% 30 2 0   83% 12 2   90%
app / backend / src / couchers / servicers / moderation.py Moderation.FlagContentForReview   92% 12 1 0   50% 2 1   86%
app / backend / src / couchers / servicers / moderation.py Moderation.UnflagContent   0% 16 16 0   0% 4 0   0%
app / backend / src / couchers / servicers / moderation.py (no function)   100% 31 0 2   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   88% 8 1 0   50% 2 1   80%
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   95% 19 1 0   75% 8 2   89%
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   90% 10 1 0   75% 4 1   86%
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% 30 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% 3 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% 36 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   94% 18 1 0   88% 8 1   92%
app / backend / src / couchers / servicers / references.py References.WriteHostRequestReference   100% 20 0 0   100% 2 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% 33 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% 42 0 0   100% 20 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   96% 27 1 0   93% 14 1   95%
app / backend / src / couchers / servicers / requests.py Requests.RespondHostRequest   93% 68 5 0   86% 36 5   90%
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% 22 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   64% 14 5 0   50% 10 3   58%
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% 44 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   93% 56 4 0   88% 34 2   91%
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   94% 18 1 0   90% 10 1   93%
app / backend / src / couchers / servicers / threads.py Threads.PostReply   100% 17 0 0   100% 6 0   100%
app / backend / src / couchers / servicers / threads.py (no function)   100% 27 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 users_visible   100% 2 0 0   100% 0 0   100%
app / backend / src / couchers / sql.py where_users_column_visible   100% 3 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% 6 0 0   50% 2 1   88%
app / backend / src / couchers / sql.py where_moderated_content_visible   100% 7 0 0   75% 4 1   91%
app / backend / src / couchers / sql.py moderation_state_column_visible   100% 5 0 0   100% 0 0   100%
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% 19 0 5   100% 0 0   100%
app / backend / src / couchers / tasks.py send_signup_email   100% 13 0 0   100% 4 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% 26 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py Jinja2Template.render   100% 3 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py _FilterContext.from_jinja   100% 2 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py _get_jinja_env   100% 12 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py _finalize   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py _format_default   77% 13 3 0   70% 10 3   74%
app / backend / src / couchers / templating.py _filter_multiline   86% 7 1 0   75% 4 1   82%
app / backend / src / couchers / templating.py _filter_quotelines   67% 3 1 0   50% 2 1   60%
app / backend / src / couchers / templating.py _filter_markdown   75% 4 1 0   50% 2 1   67%
app / backend / src / couchers / templating.py _filter_html   100% 1 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py _filter_date   100% 4 0 0   50% 2 1   83%
app / backend / src / couchers / templating.py _filter_time   100% 2 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py _filter_datetime   100% 2 0 0   100% 0 0   100%
app / backend / src / couchers / templating.py _filter_translate   100% 14 0 0   100% 6 0   100%
app / backend / src / couchers / templating.py _replace_html_tag_match   88% 8 1 0   75% 4 1   83%
app / backend / src / couchers / templating.py (no function)   100% 50 0 0   100% 0 0   100%
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% 11 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% 1 0 0   100% 0 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% 1 0 0   100% 0 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   100% 3 0 0   100% 0 0   100%
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 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% 63 0 6   100% 0 0   100%
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% 66 0 0   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 push_collector   100% 3 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% 39 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 mock_notification_email   100% 3 0 0   100% 0 0   100%
app / backend / src / tests / fixtures / misc.py email_fields   100% 2 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.push_to_user   100% 3 0 0   100% 2 0   100%
app / backend / src / tests / fixtures / misc.py PushCollector.count_for_user   100% 1 0 0   100% 0 0   100%
app / backend / src / tests / fixtures / misc.py PushCollector.pop_for_user   100% 5 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 (no function)   100% 32 0 0   100% 0 0   100%
app / backend / src / tests / fixtures / sessions.py _MockCouchersContext.headers   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% 3 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 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 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% 127 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / algorithms.py AlgorithmBase.__call__   0% 1 1 0   100% 0 0   0%
app / backend / src / tests / pytest_split / algorithms.py AlgorithmBase.__hash__   100% 1 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / algorithms.py AlgorithmBase.__eq__   67% 3 1 0   50% 2 1   60%
app / backend / src / tests / pytest_split / algorithms.py LeastDurationAlgorithm.__call__   100% 24 0 0   100% 8 0   100%
app / backend / src / tests / pytest_split / algorithms.py DurationBasedChunksAlgorithm.__call__   0% 15 15 0   0% 8 0   0%
app / backend / src / tests / pytest_split / algorithms.py _get_items_with_durations   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / algorithms.py _get_avg_duration_per_test   75% 4 1 0   50% 2 1   67%
app / backend / src / tests / pytest_split / algorithms.py _remove_irrelevant_durations   100% 3 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / algorithms.py Algorithms.names   100% 1 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / algorithms.py (no function)   100% 27 0 2   100% 0 0   100%
app / backend / src / tests / pytest_split / plugin.py pytest_addoption   100% 7 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / plugin.py pytest_cmdline_main   69% 13 4 0   60% 10 4   65%
app / backend / src / tests / pytest_split / plugin.py pytest_configure   100% 4 0 0   100% 4 0   100%
app / backend / src / tests / pytest_split / plugin.py Base.__init__   67% 9 3 0   50% 2 1   64%
app / backend / src / tests / pytest_split / plugin.py PytestSplitPlugin.__init__   50% 4 2 0   50% 2 1   50%
app / backend / src / tests / pytest_split / plugin.py PytestSplitPlugin.pytest_collection_modifyitems   100% 9 0 0   100% 0 0   100%
app / backend / src / tests / pytest_split / plugin.py PytestSplitCachePlugin.pytest_sessionfinish   0% 18 18 2   0% 12 0   0%
app / backend / src / tests / pytest_split / plugin.py (no function)   100% 21 0 5   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% 5 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% 9 0 0   100% 0 0   100%
app / backend / src / tests / test_account.py test_ChangePasswordV2_normal   100% 14 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% 10 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% 84 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% 53 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% 58 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_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% 21 0 0   100% 0 0   100%
app / backend / src / tests / test_admin.py test_ChangeUserBirthdate   100% 23 0 0   100% 0 0   100%
app / backend / src / tests / test_admin.py test_BanUser   100% 15 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_AddAdminNote   100% 19 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_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_CreateApiKey   100% 24 0 0   100% 0 0   100%
app / backend / src / tests / test_admin.py test_GetChats   100% 10 0 0   100% 0 0   100%
app / backend / src / tests / test_admin.py test_badges   100% 35 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   100% 15 0 0   100% 0 0   100%
app / backend / src / tests / test_admin.py test_GetUserReferences   100% 31 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_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% 19 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 (no function)   100% 40 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_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% 82 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_excessive_friend_requests_are_reported   100% 27 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_ListBadgeUsers_excludes_ghost_users   100% 18 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% 63 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 (no function)   100% 5 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% 82 0 0   100% 0 0   100%
app / backend / src / tests / test_auth.py _quick_signup   100% 29 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% 20 0 0   100% 0 0   100%
app / backend / src / tests / test_auth.py test_login_part_signed_up_not_verified_email   100% 18 0 0   100% 0 0   100%
app / backend / src / tests / test_auth.py test_banned_user   100% 8 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% 46 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% 30 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% 28 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 (no function)   100% 53 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% 35 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% 22 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_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% 31 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% 61 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% 89 0 0   100% 0 0   100%
app / backend / src / tests / test_blocking.py (no function)   100% 18 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% 7 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% 7 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 (no function)   100% 18 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% 20 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% 68 0 0   100% 2 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 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% 76 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% 22 0 0   100% 0 0   100%
app / backend / src / tests / test_conversations.py test_send_direct_message   100% 18 0 0   100% 0 0   100%
app / backend / src / tests / test_conversations.py test_excessive_chat_initiations_are_reported   100% 27 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_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% 55 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% 8 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% 7 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 (no function)   100% 33 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% 54 0 0   100% 0 0   100%
app / backend / src / tests / test_discussions.py test_discussion_notifications_regression   100% 39 0 0   100% 0 0   100%
app / backend / src / tests / test_discussions.py (no function)   100% 14 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_one_time_donation_flow   100% 38 0 0   100% 0 0   100%
app / backend / src / tests / test_donations.py test_recurring_donation_flow   100% 47 0 0   100% 0 0   100%
app / backend / src / tests / test_donations.py test_customer_portal_url   100% 16 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 fire_stripe_event   100% 6 0 0   100% 0 0   100%
app / backend / src / tests / test_donations.py (no function)   100% 25 0 0   100% 0 0   100%
app / backend / src / tests / test_dummy_data.py test_add_dummy_data   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_dummy_data.py (no function)   100% 4 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_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% 39 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% 11 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py test_report_email   100% 28 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py test_reference_report_email_not_sent   100% 8 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py test_reference_report_email   100% 24 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% 21 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py test_do_not_email_security   100% 22 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py test_do_not_email_non_security   100% 14 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py test_do_not_email_non_security_unsublink   100% 15 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py test_email_prefix_config   100% 22 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_email_deleted_users_regression   100% 34 0 0   100% 0 0   100%
app / backend / src / tests / test_email.py (no function)   100% 33 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% 30 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% 30 0 0   100% 0 0   100%
app / backend / src / tests / test_event_log.py test_friendship_cancel_event   100% 14 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% 10 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% 41 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% 237 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% 41 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% 214 0 0   100% 0 0   100%
app / backend / src / tests / test_events.py test_UpdateEvent_all   100% 44 0 0   100% 8 0   100%
app / backend / src / tests / test_events.py test_GetEvent   100% 115 0 0   100% 0 0   100%
app / backend / src / tests / test_events.py test_CancelEvent   100% 58 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% 15 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% 96 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_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% 31 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% 48 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% 13 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% 20 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_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% 25 1 0   50% 2 1   93%
app / backend / src / tests / test_events.py test_event_thread_reply_notification_has_moderation_state   97% 29 1 0   75% 4 1   94%
app / backend / src / tests / test_events.py (no function)   100% 57 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% 23 0 0   100% 2 0   100%
app / backend / src / tests / test_galleries.py test_get_avatar_upload_no_photos   100% 6 0 0   100% 0 0   100%
app / backend / src / tests / test_galleries.py test_has_avatar_photo_expression_with_photos   100% 12 0 0   100% 0 0   100%
app / backend / src / tests / test_galleries.py test_has_avatar_photo_expression_no_photos   100% 8 0 0   100% 0 0   100%
app / backend / src / tests / test_galleries.py test_avatar_url_via_api_reflects_first_photo   100% 24 0 0   100% 2 0   100%
app / backend / src / tests / test_galleries.py test_avatar_changes_after_reordering   100% 19 0 0   100% 2 0   100%
app / backend / src / tests / test_galleries.py test_avatar_with_negative_positions   100% 23 0 0   100% 2 0   100%
app / backend / src / tests / test_galleries.py test_avatar_with_fractional_positions   100% 23 0 0   100% 2 0   100%
app / backend / src / tests / test_galleries.py (no function)   100% 54 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.py _   100% 1 0 0   100% 0 0   100%
app / backend / src / tests / test_i18n.py test_translations_loaded   100% 5 0 0   100% 0 0   100%
app / backend / src / tests / test_i18n.py test_fallback_chain   100% 8 0 0   100% 0 0   100%
app / backend / src / tests / test_i18n.py (no function)   100% 6 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_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_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 (no function)   100% 21 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 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 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_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% 90 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% 20 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% 51 0 0   100% 0 0   100%
app / backend / src / tests / test_jail.py test_modnotes_no_notify   100% 21 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_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_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 (no function)   100% 13 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% 18 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_FlagContentForReview   100% 20 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% 28 0 0   100% 0 0   100%
app / backend / src / tests / test_moderation.py test_auto_approve_moderation_queue_approves_old_items   100% 42 0 0   100% 0 0   100%
app / backend / src / tests / test_moderation.py test_auto_approve_does_not_approve_recent_items   100% 25 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_host_request_message_notifications_suppressed_before_approval   100% 16 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% 30 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 (no function)   100% 70 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   94% 33 2 0   79% 14 3   89%
app / backend / src / tests / test_notifications.py test_unsubscribe_do_not_email   97% 34 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_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_SendTestPushNotification   100% 7 0 0   100% 0 0   100%
app / backend / src / tests / test_notifications.py test_SendBlogPostNotification   100% 30 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% 12 0 0   100% 0 0   100%
app / backend / src / tests / test_notifications.py test_get_expo_push_receipts_empty   100% 3 0 0   100% 0 0   100%
app / backend / src / tests / test_notifications.py test_check_expo_push_receipts_success   100% 27 0 0   100% 0 0   100%
app / backend / src / tests / test_notifications.py test_check_expo_push_receipts_device_not_registered   100% 27 0 0   100% 0 0   100%
app / backend / src / tests / test_notifications.py test_check_expo_push_receipts_not_found   100% 26 0 0   100% 0 0   100%
app / backend / src / tests / test_notifications.py test_check_expo_push_receipts_skips_already_checked   100% 17 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% 17 0 0   100% 0 0   100%
app / backend / src / tests / test_notifications.py test_check_expo_push_receipts_batch   100% 27 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 (no function)   100% 65 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 _monkeypatch_postal_verification_config   100% 3 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% 5 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_happy_path   100% 43 0 0   100% 2 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_wrong_code   100% 22 0 0   100% 4 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_code_expiry   100% 19 0 0   100% 2 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_rate_limit   100% 15 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_already_in_progress   100% 8 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_cancel   100% 11 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_can_cancel_after_postcard_sent   100% 20 0 0   100% 2 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_list_attempts   100% 18 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_address_validation   100% 12 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_postcard_send_failure   100% 14 0 0   100% 2 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_code_case_insensitive   100% 18 0 0   100% 2 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_attempt_not_found   100% 9 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_postal_verification_other_user_attempt   100% 14 0 0   100% 0 0   100%
app / backend / src / tests / test_postal_verification.py test_has_postal_verification_helper   100% 22 0 0   100% 2 0   100%
app / backend / src / tests / test_postal_verification.py (no function)   100% 36 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% 6 0 0   100% 0 0   100%
app / backend / src / tests / test_public.py test_GetDonationStats_with_donations   100% 11 0 0   100% 0 0   100%
app / backend / src / tests / test_public.py test_GetDonationStats_excludes_merch   100% 10 0 0   100% 0 0   100%
app / backend / src / tests / test_public.py test_GetDonationStats_excludes_previous_years   100% 14 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% 14 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% 36 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% 18 0 0   100% 6 0   100%
app / backend / src / tests / test_references.py create_friend_reference   100% 5 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% 32 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% 15 0 0   0% 2 2   88%
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% 16 0 0   0% 2 2   89%
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 (no function)   100% 36 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_request_incomplete_profile   100% 9 0 0   100% 0 0   100%
app / backend / src / tests / test_requests.py test_excessive_requests_are_reported   100% 29 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_active_filter   100% 14 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% 17 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_response_rate   100% 92 0 0   100% 0 0   100%
app / backend / src / tests / test_requests.py test_request_notifications   100% 48 0 0   100% 0 0   100%
app / backend / src / tests / test_requests.py test_quick_decline   98% 45 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 (no function)   100% 41 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% 6 0 0   100% 0 0   100%
app / backend / src / tests / test_resources.py test_GetLanguages   100% 6 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% 6 0 0   100% 0 0   100%
app / backend / src / tests / test_sanitized_bytes.py TestSanitizedBytes.test_message_with_nested_message_non_repeated   100% 7 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% 7 0 0   100% 0 0   100%
app / backend / src / tests / test_sanitized_bytes.py TestSanitizedBytes.test_message_preserves_original   100% 9 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% 14 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_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% 46 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% 8 0 0   100% 0 0   100%
app / backend / src / tests / test_strong_verification.py test_strong_verification_happy_path   100% 113 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% 6 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 _render_en_utc   100% 1 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_multiline   100% 6 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_quotelines   100% 3 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_html_escaping   100% 3 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_safe_html   100% 3 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_date_formatting   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py _greeting_i18next   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py _i18next_from_dict   0% 5 5 0   0% 2 0   0%
app / backend / src / tests / test_templating.py test_translate_no_substitutions   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_multiple_languages   100% 7 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_with_substitutions   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_substitution_escaping   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_substitution_safe_html   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_translation_tags   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_newlines_br   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_plain_strip_tags   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_plain_strip_links   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py test_translate_plain_strip_mailto   100% 4 0 0   100% 0 0   100%
app / backend / src / tests / test_templating.py (no function)   100% 26 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 (no function)   100% 16 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 (no function)   100% 16 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% 18 0 0   100% 0 0   100%
app / backend / src / tests / test_verification.py test_send_sms_disabled   100% 2 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 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 (no function)   100% 13 0 0   100% 0 0   100%
Total     96% 27636 1213 76   76% 3260 473   94%

No items found using the specified filter.