use github_copilot_sdk::SessionId;
use super::support::{wait_for_condition, with_e2e_context};
#[tokio::test]
async fn should_delete_session_by_id() {
with_e2e_context("client_api", "should_delete_session_by_id", |ctx| {
Box::pin(async move {
ctx.set_default_copilot_user();
let client = ctx.start_client().await;
let session = client
.create_session(ctx.approve_all_session_config())
.await
.expect("create session");
let session_id = session.id().clone();
session.send_and_wait("Say OK.").await.expect("send");
session.disconnect().await.expect("disconnect session");
client
.delete_session(&session_id)
.await
.expect("delete session");
let metadata = client
.get_session_metadata(&session_id)
.await
.expect("get metadata");
assert!(metadata.is_none());
client.stop().await.expect("stop client");
})
})
.await;
}
#[tokio::test]
async fn should_report_error_when_deleting_unknown_session_id() {
with_e2e_context(
"client_api",
"should_report_error_when_deleting_unknown_session_id",
|ctx| {
Box::pin(async move {
let client = ctx.start_client().await;
let unknown = SessionId::new("00000000-0000-0000-0000-000000000000");
client
.delete_session(&unknown)
.await
.expect("delete unknown session is idempotent");
let metadata = client
.get_session_metadata(&unknown)
.await
.expect("get unknown metadata");
assert!(metadata.is_none());
client.stop().await.expect("stop client");
})
},
)
.await;
}
#[tokio::test]
async fn should_get_null_last_session_id_before_any_sessions_exist() {
with_e2e_context(
"client_api",
"should_get_null_last_session_id_before_any_sessions_exist",
|ctx| {
Box::pin(async move {
let client = ctx.start_client().await;
let last_id = client.get_last_session_id().await.expect("get last id");
assert!(last_id.is_none());
client.stop().await.expect("stop client");
})
},
)
.await;
}
#[tokio::test]
async fn should_track_last_session_id_after_session_created() {
with_e2e_context(
"client_api",
"should_track_last_session_id_after_session_created",
|ctx| {
Box::pin(async move {
ctx.set_default_copilot_user();
let client = ctx.start_client().await;
let session = client
.create_session(ctx.approve_all_session_config())
.await
.expect("create session");
let session_id = session.id().clone();
session.send_and_wait("Say OK.").await.expect("send");
session.disconnect().await.expect("disconnect session");
wait_for_condition("last session id to update", || {
let client = client.clone();
let session_id = session_id.clone();
async move {
client
.get_last_session_id()
.await
.is_ok_and(|id| id.as_ref() == Some(&session_id))
}
})
.await;
assert_eq!(
client.get_last_session_id().await.expect("get last id"),
Some(session_id)
);
client.stop().await.expect("stop client");
})
},
)
.await;
}
#[tokio::test]
async fn should_get_null_foreground_session_id_in_headless_mode() {
with_e2e_context(
"client_api",
"should_get_null_foreground_session_id_in_headless_mode",
|ctx| {
Box::pin(async move {
let client = ctx.start_client().await;
let foreground = client
.get_foreground_session_id()
.await
.expect("get foreground");
assert!(foreground.is_none());
client.stop().await.expect("stop client");
})
},
)
.await;
}
#[tokio::test]
async fn should_report_error_when_setting_foreground_session_in_headless_mode() {
with_e2e_context(
"client_api",
"should_report_error_when_setting_foreground_session_in_headless_mode",
|ctx| {
Box::pin(async move {
ctx.set_default_copilot_user();
let client = ctx.start_client().await;
let session = client
.create_session(ctx.approve_all_session_config())
.await
.expect("create session");
client
.set_foreground_session_id(session.id())
.await
.expect("set foreground is ignored in headless mode");
assert!(
client
.get_foreground_session_id()
.await
.expect("get foreground")
.is_none()
);
session.disconnect().await.expect("disconnect session");
client.stop().await.expect("stop client");
})
},
)
.await;
}