use crate::checks::draft::testkit::{client, findings_for, server, trace};
const COMPLETIONS: &str = "capabilities.completions-declared";
const LOGGING: &str = "capabilities.logging-declared";
fn discovered(capabilities: &str) -> Vec<String> {
vec![
client(
0,
r#"{"jsonrpc":"2.0","id":90,"method":"server/discover","params":{"_meta":{}}}"#,
),
server(
1,
&format!(
r#"{{"jsonrpc":"2.0","id":90,"result":{{"resultType":"complete","ttlMs":0,"capabilities":{capabilities}}}}}"#
),
),
]
}
fn served(seq: u64, method: &str) -> Vec<String> {
vec![
client(
seq,
&format!(
r#"{{"jsonrpc":"2.0","id":{seq},"method":"{method}","params":{{"_meta":{{}}}}}}"#
),
),
server(
seq + 1,
&format!(r#"{{"jsonrpc":"2.0","id":{seq},"result":{{"resultType":"complete"}}}}"#),
),
]
}
fn logged(seq: u64) -> String {
server(
seq,
r#"{"jsonrpc":"2.0","method":"notifications/message","params":{"level":"info","data":"x"}}"#,
)
}
#[test]
fn a_session_that_never_probed_is_not_judged() {
let session = trace(&served(0, "tools/call"));
for check in [COMPLETIONS, LOGGING] {
assert!(
findings_for(check, &session).is_empty(),
"{check} judged a session with no discovery"
);
}
}
#[test]
fn a_capability_set_false_or_null_is_not_declared() {
for declaration in [r#"{"logging":false}"#, r#"{"logging":null}"#] {
let mut lines = discovered(declaration);
lines.push(logged(2));
assert_eq!(
findings_for(LOGGING, &trace(&lines)).len(),
1,
"declaration {declaration}"
);
}
}
#[test]
fn logging_is_judged_by_the_notification_it_emits() {
let mut undeclared = discovered("{}");
undeclared.push(logged(2));
assert_eq!(findings_for(LOGGING, &trace(&undeclared)).len(), 1);
let mut declared = discovered(r#"{"logging":{}}"#);
declared.push(logged(2));
assert!(findings_for(LOGGING, &trace(&declared)).is_empty());
}