fix(qconnect): force AskForQueueState resync on QueueTracksAddedFromAutoplay

105 carries only bare queue_item_ids (no track_id/context), unreconstructable
by the reducer; resync pulls the authoritative QueueState so autoplay-grown
tracks become visible. Matches the ShuffleModeSet/Reordered/Removed pattern.

cc
This commit is contained in:
vicrodh committed 2026-06-01 03:09:17 -06:00
1 parent a05e8abc25
commit 452f961977
1 file changed
+29
+29
View File
@@ -322,6 +322,7 @@ where
QueueEventType::SrvrCtrlShuffleModeSet
| QueueEventType::SrvrCtrlQueueTracksReordered
| QueueEventType::SrvrCtrlQueueTracksRemoved
| QueueEventType::SrvrCtrlQueueTracksAddedFromAutoplay
) {
should_trigger_resync = true;
}
@@ -1164,6 +1165,34 @@ mod tests {
);
}
#[tokio::test]
async fn autoplay_growth_triggers_queue_state_resync() {
let (app, sink, transport, _events_rx) = build_connected_app().await;
app.apply_server_event(QueueServerEvent {
event_type: QueueEventType::SrvrCtrlQueueTracksAddedFromAutoplay,
action_uuid: None,
queue_version: Some(QueueVersion::new(2, 0)),
payload: json!({ "queue_item_ids": [101, 102] }),
})
.await
.expect("apply autoplay-growth event");
let events = sink.snapshot().await;
assert!(
events
.iter()
.any(|event| matches!(event, QconnectAppEvent::QueueResyncTriggered)),
"autoplay growth must force an AskForQueueState resync"
);
let sent = transport.sent_messages().await;
assert!(
!sent.is_empty(),
"expected ask-for-state resync after autoplay growth"
);
}
#[tokio::test]
async fn late_queue_error_for_concurrency_canceled_action_is_ignored() {
let (app, sink, _, _events_rx) = build_connected_app().await;