Coverage report: 79%

Files Functions Classes

coverage.py v7.15.4, created at 2026-08-26 02:32 +0800

File function   statements missing excluded   coverage
src/lexigram/notification/__init__.py (no function)   22 0 0   100%
src/lexigram/notification/admin/__init__.py (no function)   5 0 0   100%
src/lexigram/notification/admin/contributor.py NotificationAdminContributor.__init__   1 0 0   100%
src/lexigram/notification/admin/contributor.py NotificationAdminContributor.on_admin_boot   2 0 0   100%
src/lexigram/notification/admin/contributor.py NotificationAdminContributor.get_routes   1 0 0   100%
src/lexigram/notification/admin/contributor.py NotificationAdminContributor.get_navigation_items   1 0 0   100%
src/lexigram/notification/admin/contributor.py NotificationAdminContributor.get_health_definitions   1 0 0   100%
src/lexigram/notification/admin/contributor.py NotificationAdminContributor.get_management_pages   1 0 0   100%
src/lexigram/notification/admin/contributor.py NotificationAdminContributor.render_health_check   9 9 0   0%
src/lexigram/notification/admin/contributor.py (no function)   26 0 4   100%
src/lexigram/notification/admin/handlers/inbox.py _user_id   11 7 0   36%
src/lexigram/notification/admin/handlers/inbox.py _message_to_dict   1 0 0   100%
src/lexigram/notification/admin/handlers/inbox.py InboxHandlers.__init__   1 0 0   100%
src/lexigram/notification/admin/handlers/inbox.py InboxHandlers._resolve_service   13 11 0   15%
src/lexigram/notification/admin/handlers/inbox.py InboxHandlers.get_inbox   12 2 0   83%
src/lexigram/notification/admin/handlers/inbox.py InboxHandlers.mark_read   7 0 0   100%
src/lexigram/notification/admin/handlers/inbox.py InboxHandlers.mark_all_read   6 1 0   83%
src/lexigram/notification/admin/handlers/inbox.py InboxHandlers.health   4 2 0   50%
src/lexigram/notification/admin/handlers/inbox.py (no function)   16 0 0   100%
src/lexigram/notification/admin/pages/inbox.py _query_int   5 2 0   60%
src/lexigram/notification/admin/pages/inbox.py NotificationsInboxPage.__init__   1 0 0   100%
src/lexigram/notification/admin/pages/inbox.py NotificationsInboxPage.handle   24 5 0   79%
src/lexigram/notification/admin/pages/inbox.py (no function)   13 0 0   100%
src/lexigram/notification/backends/__init__.py (no function)   6 0 0   100%
src/lexigram/notification/backends/push/__init__.py (no function)   5 0 0   100%
src/lexigram/notification/backends/push/apns.py APNsPush.__init__   6 0 0   100%
src/lexigram/notification/backends/push/apns.py APNsPush._load_private_key   5 5 0   0%
src/lexigram/notification/backends/push/apns.py APNsPush._make_jwt   5 5 0   0%
src/lexigram/notification/backends/push/apns.py APNsPush._send_to_token   31 31 0   0%
src/lexigram/notification/backends/push/apns.py APNsPush.send   3 3 0   0%
src/lexigram/notification/backends/push/apns.py APNsPush.send_batch   2 2 0   0%
src/lexigram/notification/backends/push/apns.py APNsPush.health_check   9 9 0   0%
src/lexigram/notification/backends/push/apns.py (no function)   22 0 2   100%
src/lexigram/notification/backends/push/fcm.py FCMPush.__init__   2 0 0   100%
src/lexigram/notification/backends/push/fcm.py FCMPush.send   30 5 0   83%
src/lexigram/notification/backends/push/fcm.py FCMPush.send_batch   2 0 0   100%
src/lexigram/notification/backends/push/fcm.py FCMPush.health_check   8 0 0   100%
src/lexigram/notification/backends/push/fcm.py (no function)   18 0 2   100%
src/lexigram/notification/backends/push/web_push.py WebPushChannel.__init__   4 4 0   0%
src/lexigram/notification/backends/push/web_push.py WebPushChannel.send   30 30 0   0%
src/lexigram/notification/backends/push/web_push.py WebPushChannel.send_batch   2 2 0   0%
src/lexigram/notification/backends/push/web_push.py WebPushChannel.health_check   10 10 0   0%
src/lexigram/notification/backends/push/web_push.py (no function)   24 4 2   83%
src/lexigram/notification/backends/slack/__init__.py (no function)   3 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py _escape_mrkdwn   1 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotificationError.__init__   2 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackMessage.__init__   4 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier.__init__   6 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier._mode   1 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier.send   3 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier.send_text   1 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier.health_check   3 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier._send_webhook   16 2 0   88%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier._health_webhook   8 0 0   100%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier._send_bot   21 2 0   90%
src/lexigram/notification/backends/slack/slack_notifier.py SlackNotifier._health_bot   12 2 0   83%
src/lexigram/notification/backends/slack/slack_notifier.py (no function)   30 0 0   100%
src/lexigram/notification/backends/sms/__init__.py (no function)   3 0 0   100%
src/lexigram/notification/backends/sms/twilio.py TwilioSMS.__init__   4 0 0   100%
src/lexigram/notification/backends/sms/twilio.py TwilioSMS._get_auth_header   3 0 0   100%
src/lexigram/notification/backends/sms/twilio.py TwilioSMS.send   16 0 0   100%
src/lexigram/notification/backends/sms/twilio.py TwilioSMS.health_check   9 0 0   100%
src/lexigram/notification/backends/sms/twilio.py (no function)   18 0 2   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppNotificationError.__init__   2 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppMetaNotificationError.__init__   3 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend.__init__   9 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend.send   3 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend.health_check   3 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend._twilio_auth_header   2 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend._whatsapp_number   3 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend._send_twilio   17 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend._health_twilio   9 0 0   100%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend._send_meta   22 2 0   91%
src/lexigram/notification/backends/sms/whatsapp.py WhatsAppBackend._health_meta   12 2 0   83%
src/lexigram/notification/backends/sms/whatsapp.py (no function)   31 0 2   100%
src/lexigram/notification/cli/__init__.py (no function)   0 0 0   100%
src/lexigram/notification/cli/checks.py check_notification_channels   1 1 0   0%
src/lexigram/notification/cli/checks.py (no function)   3 3 2   0%
src/lexigram/notification/cli/commands.py create_notify_app   16 16 0   0%
src/lexigram/notification/cli/commands.py create_notify_app.list_channels   1 1 0   0%
src/lexigram/notification/cli/commands.py create_notify_app.test_email   1 1 0   0%
src/lexigram/notification/cli/commands.py create_notify_app.test_push   1 1 0   0%
src/lexigram/notification/cli/commands.py create_notify_app.list_inbox   1 1 0   0%
src/lexigram/notification/cli/commands.py (no function)   3 3 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.contributor_id   1 1 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.get_generators   1 1 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.get_commands   1 1 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.get_health_checks   1 1 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.get_doctor_checks   1 1 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.get_shell_context   1 1 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.get_hooks   1 1 0   0%
src/lexigram/notification/cli/contributor.py NotificationCliContributor.get_schema_setup   1 1 0   0%
src/lexigram/notification/cli/contributor.py (no function)   16 16 0   0%
src/lexigram/notification/cli/doctor.py check_smtp_config   3 3 0   0%
src/lexigram/notification/cli/doctor.py check_push_credentials   5 5 0   0%
src/lexigram/notification/cli/doctor.py (no function)   4 4 0   0%
src/lexigram/notification/cli/generators/__init__.py (no function)   0 0 0   100%
src/lexigram/notification/cli/generators/template.py NotificationTemplateGenerator.generate   1 1 0   0%
src/lexigram/notification/cli/generators/template.py (no function)   6 6 0   0%
src/lexigram/notification/cli/schema_setup.py ensure_inbox_messages   7 0 0   100%
src/lexigram/notification/cli/schema_setup.py (no function)   5 0 0   100%
src/lexigram/notification/config/__init__.py (no function)   13 0 0   100%
src/lexigram/notification/config/inbox.py (no function)   15 0 0   100%
src/lexigram/notification/config/mailer.py SMTPDriverConfig._coerce_password   3 1 0   67%
src/lexigram/notification/config/mailer.py SendGridDriverConfig._coerce_api_key   3 1 0   67%
src/lexigram/notification/config/mailer.py MailerConfig.from_named   1 0 0   100%
src/lexigram/notification/config/mailer.py (no function)   46 0 0   100%
src/lexigram/notification/config/push.py FCMDriverConfig._coerce_server_key   3 1 0   67%
src/lexigram/notification/config/push.py APNsDriverConfig._coerce_apns_auth_key   3 1 0   67%
src/lexigram/notification/config/push.py WebPushDriverConfig._coerce_vapid_private_key   3 3 0   0%
src/lexigram/notification/config/push.py (no function)   42 0 0   100%
src/lexigram/notification/config/sms.py TwilioDriverConfig._coerce_auth_token   3 1 0   67%
src/lexigram/notification/config/sms.py (no function)   22 0 0   100%
src/lexigram/notification/config/top_level.py NotificationConfig.from_named_sms   1 1 0   0%
src/lexigram/notification/config/top_level.py NotificationConfig.from_named_push   1 1 0   0%
src/lexigram/notification/config/top_level.py (no function)   19 0 0   100%
src/lexigram/notification/constants.py (no function)   23 2 0   91%
src/lexigram/notification/decorators.py (no function)   2 2 0   0%
src/lexigram/notification/delivery/__init__.py (no function)   4 0 0   100%
src/lexigram/notification/delivery/exceptions.py PermanentDeliveryFailure.__init__   2 0 0   100%
src/lexigram/notification/delivery/exceptions.py (no function)   6 0 0   100%
src/lexigram/notification/delivery/retry.py RetryingMailer.__init__   4 0 0   100%
src/lexigram/notification/delivery/retry.py RetryingMailer.send   16 0 0   100%
src/lexigram/notification/delivery/retry.py (no function)   10 0 2   100%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.__init__   2 0 0   100%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.record_attempt   1 1 0   0%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.create_pending   3 0 0   100%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.mark_delivered   3 0 0   100%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.get_retry_count   2 2 0   0%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.increment_retry   6 1 0   83%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.schedule_retry   3 0 0   100%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.mark_failed   4 4 0   0%
src/lexigram/notification/delivery/stores.py MemoryDeliveryStore.due_deliveries   3 0 0   100%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.__init__   2 2 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore._ensure_table   4 4 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore._row_to_state   1 1 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.record_attempt   1 1 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.create_pending   4 4 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.mark_delivered   3 3 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.get_retry_count   4 4 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.increment_retry   4 4 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.schedule_retry   2 2 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.mark_failed   1 1 0   0%
src/lexigram/notification/delivery/stores.py SqlDeliveryStore.due_deliveries   16 16 0   0%
src/lexigram/notification/delivery/stores.py (no function)   33 0 0   100%
src/lexigram/notification/delivery/worker.py flush_retries   27 11 0   59%
src/lexigram/notification/delivery/worker.py (no function)   9 0 0   100%
src/lexigram/notification/di/__init__.py (no function)   5 0 0   100%
src/lexigram/notification/di/inbox_provider.py InboxProvider.__init__   3 0 0   100%
src/lexigram/notification/di/inbox_provider.py InboxProvider.register   11 0 0   100%
src/lexigram/notification/di/inbox_provider.py InboxProvider.register._database_store_factory   2 0 0   100%
src/lexigram/notification/di/inbox_provider.py InboxProvider.boot   4 0 0   100%
src/lexigram/notification/di/inbox_provider.py InboxProvider.shutdown   1 0 0   100%
src/lexigram/notification/di/inbox_provider.py InboxProvider.health_check   4 0 0   100%
src/lexigram/notification/di/inbox_provider.py (no function)   17 0 2   100%
src/lexigram/notification/di/mailer_provider.py MailerProvider.__init__   3 0 0   100%
src/lexigram/notification/di/mailer_provider.py MailerProvider.from_config   1 1 0   0%
src/lexigram/notification/di/mailer_provider.py MailerProvider._create_mailer   18 5 0   72%
src/lexigram/notification/di/mailer_provider.py MailerProvider.register   14 0 0   100%
src/lexigram/notification/di/mailer_provider.py MailerProvider.boot   0 0 0   100%
src/lexigram/notification/di/mailer_provider.py MailerProvider.shutdown   1 0 0   100%
src/lexigram/notification/di/mailer_provider.py MailerProvider.health_check   17 14 0   18%
src/lexigram/notification/di/mailer_provider.py (no function)   20 0 2   100%
src/lexigram/notification/di/provider.py NotificationProvider.__init__   5 0 0   100%
src/lexigram/notification/di/provider.py NotificationProvider.from_config   1 1 0   0%
src/lexigram/notification/di/provider.py NotificationProvider._create_sms   7 2 0   71%
src/lexigram/notification/di/provider.py NotificationProvider._create_push   17 8 0   53%
src/lexigram/notification/di/provider.py NotificationProvider.register   17 0 0   100%
src/lexigram/notification/di/provider.py NotificationProvider.boot   7 7 0   0%
src/lexigram/notification/di/provider.py NotificationProvider.shutdown   4 4 0   0%
src/lexigram/notification/di/provider.py NotificationProvider.health_check   17 4 0   76%
src/lexigram/notification/di/provider.py (no function)   40 8 2   80%
src/lexigram/notification/events.py (no function)   32 0 0   100%
src/lexigram/notification/exceptions.py TwilioNotificationError.__init__   2 0 0   100%
src/lexigram/notification/exceptions.py FCMNotificationError.__init__   2 0 0   100%
src/lexigram/notification/exceptions.py APNsNotificationError.__init__   2 2 0   0%
src/lexigram/notification/exceptions.py WebPushNotificationError.__init__   3 3 0   0%
src/lexigram/notification/exceptions.py SMTPMailerError.__init__   2 0 0   100%
src/lexigram/notification/exceptions.py SendGridMailerError.__init__   2 0 0   100%
src/lexigram/notification/exceptions.py (no function)   30 0 0   100%
src/lexigram/notification/hooks.py (no function)   29 0 0   100%
src/lexigram/notification/inbox/__init__.py (no function)   5 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.__init__   2 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore._ensure_table   5 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.save   3 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.get   5 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.list_for_user   5 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.mark_read   3 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.mark_all_read   3 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.delete   3 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.count_unread   5 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.clear_all   6 6 0   0%
src/lexigram/notification/inbox/database.py DatabaseInboxStore.health_check   5 0 0   100%
src/lexigram/notification/inbox/database.py DatabaseInboxStore._row_to_message   9 1 0   89%
src/lexigram/notification/inbox/database.py (no function)   26 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.__init__   1 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.save   2 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.get   1 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.list_for_user   3 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.mark_read   4 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.mark_all_read   5 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.delete   4 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.count_unread   1 0 0   100%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.clear_all   5 5 0   0%
src/lexigram/notification/inbox/memory.py InMemoryInboxStore.health_check   2 0 0   100%
src/lexigram/notification/inbox/memory.py (no function)   19 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.__init__   1 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.send   5 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.get_inbox   1 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.get_message   1 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.mark_read   1 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.mark_all_read   1 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.delete   1 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.count_unread   1 0 0   100%
src/lexigram/notification/inbox/service.py InboxService.clear_all   3 3 0   0%
src/lexigram/notification/inbox/service.py (no function)   18 0 2   100%
src/lexigram/notification/mailer/__init__.py (no function)   7 0 0   100%
src/lexigram/notification/mailer/console_mailer.py ConsoleMailer.__init__   1 0 0   100%
src/lexigram/notification/mailer/console_mailer.py ConsoleMailer.send   3 3 0   0%
src/lexigram/notification/mailer/console_mailer.py ConsoleMailer.health_check   1 1 0   0%
src/lexigram/notification/mailer/console_mailer.py (no function)   13 0 2   100%
src/lexigram/notification/mailer/mailable.py Mailable.to_message   0 0 0   100%
src/lexigram/notification/mailer/mailable.py escape_html   1 0 0   100%
src/lexigram/notification/mailer/mailable.py (no function)   9 0 0   100%
src/lexigram/notification/mailer/module.py MailerModule.configure   2 0 0   100%
src/lexigram/notification/mailer/module.py MailerModule.stub   6 0 0   100%
src/lexigram/notification/mailer/module.py (no function)   11 0 3   100%
src/lexigram/notification/mailer/retrying_mailer.py RetryingMailer.__init__   4 0 0   100%
src/lexigram/notification/mailer/retrying_mailer.py RetryingMailer.send   26 0 0   100%
src/lexigram/notification/mailer/retrying_mailer.py (no function)   13 0 4   100%
src/lexigram/notification/mailer/sendgrid_mailer.py SendGridMailer.__init__   5 0 0   100%
src/lexigram/notification/mailer/sendgrid_mailer.py SendGridMailer._build_payload   18 4 0   78%
src/lexigram/notification/mailer/sendgrid_mailer.py SendGridMailer.send   15 0 0   100%
src/lexigram/notification/mailer/sendgrid_mailer.py SendGridMailer.health_check   8 2 0   75%
src/lexigram/notification/mailer/sendgrid_mailer.py (no function)   16 0 2   100%
src/lexigram/notification/mailer/smtp_mailer.py SMTPMailer.__init__   9 0 0   100%
src/lexigram/notification/mailer/smtp_mailer.py SMTPMailer._build_mime   15 3 0   80%
src/lexigram/notification/mailer/smtp_mailer.py SMTPMailer._send_sync   10 1 0   90%
src/lexigram/notification/mailer/smtp_mailer.py SMTPMailer.send   11 0 0   100%
src/lexigram/notification/mailer/smtp_mailer.py SMTPMailer.health_check   7 2 0   71%
src/lexigram/notification/mailer/smtp_mailer.py SMTPMailer.health_check._check   2 0 0   100%
src/lexigram/notification/mailer/smtp_mailer.py (no function)   23 0 2   100%
src/lexigram/notification/module.py NotificationModule.configure   2 0 0   100%
src/lexigram/notification/module.py NotificationModule.stub   3 0 0   100%
src/lexigram/notification/module.py (no function)   11 0 3   100%
src/lexigram/notification/protocols.py (no function)   5 0 0   100%
src/lexigram/notification/push/__init__.py (no function)   3 3 0   0%
src/lexigram/notification/push/events.py (no function)   13 13 0   0%
src/lexigram/notification/types.py (no function)   28 0 0   100%
Total     1958 410 42   79%

No items found using the specified filter.