From 3c697f5fb1b8dbad46eac8fa299ed7cebfb36159 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Tue, 9 Dec 2025 15:13:21 -0500 Subject: Factor push message publication out to its own helper component. The `Publisher` component handles the details of web push delivery. Callers must provide the subscription set, the current signer, and the message, while the publisher handles encoding and communication with web push endpoints. To facilitate testing, `Publisher` implements `Publish`, which is a new trait with the same interface. Components that might publish web push messages should rely on the trait where possible. The test suite now constructs an app with a dummy `Publish` impl, which captures push messages for examination. Note that the testing implementation of `Publish` is hand-crafted, and presently only acts to record the arguments it receives. The other alternative was to use a mocking library, such as `mockit`, and while I've used that approach before, I'm not super comfortable with the complexity in this situation. I think we can maintain a more reasonable testing `Publish` impl by hand, at least for now, and we can revisit that decision later if need be. Tests for the `ping` endpoint have been migrated to this endpoint. --- src/event/handlers/stream/test/vapid.rs | 6 +++--- src/event/mod.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/event') diff --git a/src/event/handlers/stream/test/vapid.rs b/src/event/handlers/stream/test/vapid.rs index dbc3929..4d7f2dd 100644 --- a/src/event/handlers/stream/test/vapid.rs +++ b/src/event/handlers/stream/test/vapid.rs @@ -7,7 +7,7 @@ use crate::test::{fixtures, fixtures::future::Expect as _}; #[tokio::test] async fn live_vapid_key_changes() { // Set up the context - let app = fixtures::scratch_app().await; + let app = fixtures::scratch_app_without_vapid().await; let resume_point = fixtures::boot::resume_point(&app).await; // Subscribe to events @@ -42,7 +42,7 @@ async fn live_vapid_key_changes() { #[tokio::test] async fn stored_vapid_key_changes() { // Set up the context - let app = fixtures::scratch_app().await; + let app = fixtures::scratch_app_without_vapid().await; let resume_point = fixtures::boot::resume_point(&app).await; // Rotate the VAPID key @@ -77,7 +77,7 @@ async fn stored_vapid_key_changes() { #[tokio::test] async fn no_past_vapid_key_changes() { // Set up the context - let app = fixtures::scratch_app().await; + let app = fixtures::scratch_app_without_vapid().await; // Rotate the VAPID key diff --git a/src/event/mod.rs b/src/event/mod.rs index 83b0ce7..cb7c969 100644 --- a/src/event/mod.rs +++ b/src/event/mod.rs @@ -29,7 +29,7 @@ pub enum Event { // above - though heartbeat events contain only a type field and none of the other event gubbins. // They don't have to participate in sequence numbering, aren't generated from stored data, and // generally Are Weird. -#[derive(serde::Serialize)] +#[derive(Eq, PartialEq, serde::Serialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum Heartbeat { Heartbeat, -- cgit v1.2.3