Skip to content

Commit 132c954

Browse files
committed
fix: add tests, missing feature gates, small test issues
1 parent 2a9b911 commit 132c954

4 files changed

Lines changed: 64 additions & 9 deletions

File tree

crates/rmcp/src/transport/common/http_header.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ pub(crate) fn extract_scope_from_header(header: &str) -> Option<String> {
6565

6666
#[cfg(test)]
6767
mod tests {
68+
#[cfg(feature = "client-side-sse")]
6869
use super::*;
6970

71+
#[cfg(feature = "client-side-sse")]
7072
#[test]
7173
fn extract_scope_quoted() {
7274
let header = r#"Bearer error="insufficient_scope", scope="files:read files:write""#;
@@ -76,6 +78,7 @@ mod tests {
7678
);
7779
}
7880

81+
#[cfg(feature = "client-side-sse")]
7982
#[test]
8083
fn extract_scope_unquoted() {
8184
let header = r#"Bearer scope=read:data, error="insufficient_scope""#;
@@ -85,12 +88,14 @@ mod tests {
8588
);
8689
}
8790

91+
#[cfg(feature = "client-side-sse")]
8892
#[test]
8993
fn extract_scope_missing() {
9094
let header = r#"Bearer error="invalid_token""#;
9195
assert_eq!(extract_scope_from_header(header), None);
9296
}
9397

98+
#[cfg(feature = "client-side-sse")]
9499
#[test]
95100
fn extract_scope_empty_header() {
96101
assert_eq!(extract_scope_from_header("Bearer"), None);

crates/rmcp/src/transport/common/server_side_http.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ impl ServerSseMessage {
8181
}
8282
}
8383

84+
/// Wrap a JSON-RPC message without an event ID or retry hint.
85+
pub fn from_message(message: ServerJsonRpcMessage) -> Self {
86+
Self {
87+
event_id: None,
88+
message: Some(Arc::new(message)),
89+
retry: None,
90+
}
91+
}
92+
8493
/// Create a priming event that tells the client to reconnect after `retry`
8594
/// if the connection drops.
8695
/// See [SEP-1699](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1699).
@@ -191,3 +200,49 @@ where
191200
}
192201
}
193202
}
203+
204+
#[cfg(test)]
205+
mod tests {
206+
use super::*;
207+
use crate::model::{EmptyResult, JsonRpcResponse, JsonRpcVersion2_0, RequestId, ServerResult};
208+
209+
fn dummy_message() -> ServerJsonRpcMessage {
210+
ServerJsonRpcMessage::Response(JsonRpcResponse {
211+
jsonrpc: JsonRpcVersion2_0,
212+
id: RequestId::Number(1),
213+
result: ServerResult::EmptyResult(EmptyResult {}),
214+
})
215+
}
216+
217+
#[test]
218+
fn default_has_all_none() {
219+
let msg = ServerSseMessage::default();
220+
assert!(msg.event_id.is_none());
221+
assert!(msg.message.is_none());
222+
assert!(msg.retry.is_none());
223+
}
224+
225+
#[test]
226+
fn new_sets_event_id_and_message() {
227+
let msg = ServerSseMessage::new("42", dummy_message());
228+
assert_eq!(msg.event_id.as_deref(), Some("42"));
229+
assert!(msg.message.is_some());
230+
assert!(msg.retry.is_none());
231+
}
232+
233+
#[test]
234+
fn from_message_has_no_event_id() {
235+
let msg = ServerSseMessage::from_message(dummy_message());
236+
assert!(msg.event_id.is_none());
237+
assert!(msg.message.is_some());
238+
assert!(msg.retry.is_none());
239+
}
240+
241+
#[test]
242+
fn priming_sets_event_id_and_retry() {
243+
let msg = ServerSseMessage::priming("0", Duration::from_secs(5));
244+
assert_eq!(msg.event_id.as_deref(), Some("0"));
245+
assert!(msg.message.is_none());
246+
assert_eq!(msg.retry, Some(Duration::from_secs(5)));
247+
}
248+
}

crates/rmcp/src/transport/streamable_http_server/tower.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -679,11 +679,8 @@ where
679679
.initialize_session(&session_id, message)
680680
.await
681681
.map_err(internal_error_response("create stream"))?;
682-
let stream = futures::stream::once(async move {
683-
let mut msg = ServerSseMessage::default();
684-
msg.message = Some(Arc::new(response));
685-
msg
686-
});
682+
let stream =
683+
futures::stream::once(async move { ServerSseMessage::from_message(response) });
687684
// Prepend priming event if sse_retry configured
688685
let stream = if let Some(retry) = self.config.sse_retry {
689686
let priming = ServerSseMessage::priming("0", retry);
@@ -760,9 +757,7 @@ where
760757
// SSE mode (default): original behaviour preserved unchanged
761758
let stream = ReceiverStream::new(receiver).map(|message| {
762759
tracing::trace!(?message);
763-
let mut msg = ServerSseMessage::default();
764-
msg.message = Some(Arc::new(message));
765-
msg
760+
ServerSseMessage::from_message(message)
766761
});
767762
Ok(sse_stream_response(
768763
stream,

crates/rmcp/tests/test_inflight_response_drain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![cfg(not(feature = "local"))]
1+
#![cfg(all(feature = "client", feature = "server", not(feature = "local")))]
22
// cargo test --test test_inflight_response_drain --features "client server"
33

44
use std::{

0 commit comments

Comments
 (0)