use std::sync::{Arc, Mutex};
use crate::protocol::Event;
use crate::types::Dsn;
use crate::{ClientOptions, Envelope, Hub, Transport};
lazy_static::lazy_static! {
static ref TEST_DSN: Dsn = "https://public@sentry.invalid/1".parse().unwrap();
}
pub struct TestTransport {
collected: Mutex<Vec<Envelope>>,
}
impl TestTransport {
#[allow(clippy::new_ret_no_self)]
pub fn new() -> Arc<TestTransport> {
Arc::new(TestTransport {
collected: Mutex::new(vec![]),
})
}
pub fn fetch_and_clear_events(&self) -> Vec<Event<'static>> {
self.fetch_and_clear_envelopes()
.into_iter()
.filter_map(|envelope| envelope.event().cloned())
.collect()
}
pub fn fetch_and_clear_envelopes(&self) -> Vec<Envelope> {
let mut guard = self.collected.lock().unwrap();
std::mem::replace(&mut *guard, vec![])
}
}
impl Transport for TestTransport {
fn send_envelope(&self, envelope: Envelope) {
self.collected.lock().unwrap().push(envelope);
}
}
pub fn with_captured_events<F: FnOnce()>(f: F) -> Vec<Event<'static>> {
with_captured_events_options(f, ClientOptions::default())
}
pub fn with_captured_events_options<F: FnOnce(), O: Into<ClientOptions>>(
f: F,
options: O,
) -> Vec<Event<'static>> {
with_captured_envelopes_options(f, options)
.into_iter()
.filter_map(|envelope| envelope.event().cloned())
.collect()
}
pub fn with_captured_envelopes<F: FnOnce()>(f: F) -> Vec<Envelope> {
with_captured_envelopes_options(f, ClientOptions::default())
}
pub fn with_captured_envelopes_options<F: FnOnce(), O: Into<ClientOptions>>(
f: F,
options: O,
) -> Vec<Envelope> {
let transport = TestTransport::new();
let mut options = options.into();
options.dsn = Some(options.dsn.unwrap_or_else(|| TEST_DSN.clone()));
options.transport = Some(Arc::new(transport.clone()));
Hub::run(
Arc::new(Hub::new(
Some(Arc::new(options.into())),
Arc::new(Default::default()),
)),
f,
);
transport.fetch_and_clear_envelopes()
}