From 1db877d53c4ff45971c69fecc5165c352ec316c9 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 7 Jan 2026 15:39:48 +0000 Subject: test: add test_state_event_syncs_from_remote integration test Implements Phase 3 of the purgatory sync integration test plan. Key changes: - Add immediate sync triggering for sync-received events that go to purgatory (instead of default 3-minute delay for user-submitted events) - TestRelay now respects RUST_LOG environment variable for debugging - New test verifies end-to-end flow: state event syncs from source relay, enters purgatory, git data is fetched from source's clone URL, and event is released and served --- src/purgatory/mod.rs | 3 +++ src/sync/mod.rs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) (limited to 'src') diff --git a/src/purgatory/mod.rs b/src/purgatory/mod.rs index 7045923..894c941 100644 --- a/src/purgatory/mod.rs +++ b/src/purgatory/mod.rs @@ -189,6 +189,8 @@ impl Purgatory { /// /// Automatically enqueues the identifier for background sync with the default delay /// (3 minutes), giving time for a git push to arrive after the nostr event. + /// For sync-triggered events, the SyncManager calls `enqueue_sync_immediate` separately + /// to override this delay. /// /// # Arguments /// * `event` - The state event (kind 30618) to hold @@ -210,6 +212,7 @@ impl Purgatory { .push(entry); // Enqueue for background sync with default delay + // (SyncManager will call enqueue_sync_immediate for sync-triggered events) self.enqueue_sync_default(&identifier); } diff --git a/src/sync/mod.rs b/src/sync/mod.rs index b56b6b7..7d60ea4 100644 --- a/src/sync/mod.rs +++ b/src/sync/mod.rs @@ -1046,6 +1046,40 @@ impl SyncManager { } } + // For sync-triggered events that go to purgatory, trigger immediate sync + // (instead of the default 3-minute delay for user-submitted events) + if result == ProcessResult::Purgatory { + // State events (kind 30618) - extract identifier and trigger immediate sync + if event.kind.as_u16() == 30618 { + if let Some(identifier) = event.tags.iter().find_map(|tag| { + let tag_vec = tag.clone().to_vec(); + if tag_vec.len() >= 2 && tag_vec[0] == "d" { + Some(tag_vec[1].clone()) + } else { + None + } + }) { + tracing::debug!( + event_id = %event.id, + identifier = %identifier, + "Triggering immediate sync for synced state event in purgatory" + ); + write_policy.purgatory().enqueue_sync_immediate(&identifier); + } + } + // PR events (kind 1617/1618) - extract identifier from 'a' tag + else if event.kind.as_u16() == 1617 || event.kind.as_u16() == 1618 { + if let Some(identifier) = crate::git::sync::extract_identifier_from_pr_event(&event) { + tracing::debug!( + event_id = %event.id, + identifier = %identifier, + "Triggering immediate sync for synced PR event in purgatory" + ); + write_policy.purgatory().enqueue_sync_immediate(&identifier); + } + } + } + // Track pagination state for this subscription if result == ProcessResult::Saved || result == ProcessResult::Duplicate { let mut pending = pending_sync_index.write().await; -- cgit v1.2.3