use std::sync::{Arc, Mutex}; use std::time::Duration; use github_copilot_sdk::github_telemetry::GitHubTelemetryNotification; use github_copilot_sdk::handler::ApproveAllHandler; use github_copilot_sdk::{Client, SessionConfig}; use super::support::{DEFAULT_TEST_TOKEN, with_e2e_context_no_snapshot}; #[tokio::test] async fn should_forward_github_telemetry_on_session_create() { with_e2e_context_no_snapshot(|ctx| { Box::pin(async move { ctx.set_default_copilot_user(); let notifications = Arc::new(Mutex::new(Vec::::new())); let collected = notifications.clone(); let client = Client::start(ctx.client_options().with_on_github_telemetry(move |n| { collected.lock().unwrap().push(n); })) .await .expect("start client"); let session = client .create_session( SessionConfig::default() .with_github_token(DEFAULT_TEST_TOKEN) .with_permission_handler(Arc::new(ApproveAllHandler)), ) .await .expect("create session"); let deadline = tokio::time::Instant::now() + Duration::from_secs(30); loop { if !notifications.lock().unwrap().is_empty() { break; } assert!( tokio::time::Instant::now() < deadline, "timed out waiting for github telemetry notification" ); tokio::time::sleep(Duration::from_millis(100)).await; } { let notifications = notifications.lock().unwrap(); assert!(!notifications.is_empty()); let first = notifications .first() .expect("github telemetry notification"); assert!(!first.session_id.is_empty()); let _: bool = first.restricted; assert!(!first.event.kind.is_empty()); } session.disconnect().await.expect("disconnect session"); client.stop().await.expect("stop client"); }) }) .await; }