sentry-contrib-native 0.3.1

Unofficial bindings to the Sentry Native SDK for Rust.
Documentation
#![warn(
    clippy::cargo,
    clippy::missing_docs_in_private_items,
    clippy::nursery,
    clippy::pedantic,
    missing_docs
)]

mod util;

use anyhow::Result;
use sentry::{Breadcrumb, Event, Options};
use sentry_contrib_native as sentry;
use serde_json::Value;

#[tokio::test(flavor = "multi_thread")]
#[allow(clippy::too_many_lines)]
async fn breadcrumb() -> Result<()> {
    util::events_success(
        Some(|options: &mut Options| options.set_max_breadcrumbs(4)),
        vec![
            (
                || {
                    Breadcrumb::new(None, Some("test message".into())).add();
                    Event::new().capture()
                },
                |event| {
                    assert_eq!("<unlabeled event>", event.title);
                    let breadcrumb = event
                        .entries
                        .get("breadcrumbs")
                        .and_then(|v| v.get("values"))
                        .and_then(Value::as_array)
                        .and_then(|v| v.get(0))
                        .and_then(Value::as_object)
                        .unwrap();
                    assert_eq!(
                        Some("default"),
                        breadcrumb.get("type").and_then(Value::as_str)
                    );
                    assert_eq!(
                        Some("test message"),
                        breadcrumb.get("message").and_then(Value::as_str)
                    );
                },
            ),
            (
                || {
                    Breadcrumb::new(Some("test type".into()), Some("test message".into())).add();
                    Event::new().capture()
                },
                |event| {
                    assert_eq!("<unlabeled event>", event.title);
                    let breadcrumb = event
                        .entries
                        .get("breadcrumbs")
                        .and_then(|v| v.get("values"))
                        .and_then(Value::as_array)
                        .and_then(|v| v.get(1))
                        .and_then(Value::as_object)
                        .unwrap();
                    assert_eq!(
                        Some("test type"),
                        breadcrumb.get("type").and_then(Value::as_str)
                    );
                    assert_eq!(
                        Some("test message"),
                        breadcrumb.get("message").and_then(Value::as_str)
                    );
                },
            ),
            (
                || {
                    let mut breadcrumb = Breadcrumb::new(None, None);
                    breadcrumb.insert("data", vec![("test data", "test data value")]);
                    breadcrumb.add();
                    Event::new().capture()
                },
                |event| {
                    assert_eq!("<unlabeled event>", event.title);
                    let breadcrumb = event
                        .entries
                        .get("breadcrumbs")
                        .and_then(|v| v.get("values"))
                        .and_then(Value::as_array)
                        .and_then(|v| v.get(2))
                        .and_then(Value::as_object)
                        .unwrap();
                    assert_eq!(
                        Some("default"),
                        breadcrumb.get("type").and_then(Value::as_str)
                    );
                    assert_eq!(None, breadcrumb.get("message").and_then(Value::as_str));
                    assert_eq!(
                        Some("test data value"),
                        breadcrumb
                            .get("data")
                            .and_then(Value::as_object)
                            .and_then(|v| v.get("test data"))
                            .and_then(Value::as_str)
                    );
                },
            ),
            (
                || {
                    Breadcrumb::new(None, Some("test message 1".into())).add();
                    Breadcrumb::new(None, Some("test message 2".into())).add();
                    Event::new().capture()
                },
                |event| {
                    assert_eq!("<unlabeled event>", event.title);
                    let breadcrumbs = event
                        .entries
                        .get("breadcrumbs")
                        .and_then(|v| v.get("values"))
                        .and_then(Value::as_array)
                        .unwrap();

                    assert_eq!(breadcrumbs.len(), 4);

                    let breadcrumb = breadcrumbs.get(3).and_then(Value::as_object).unwrap();
                    assert_eq!(
                        Some("default"),
                        breadcrumb.get("type").and_then(Value::as_str)
                    );
                    assert_eq!(
                        Some("test message 2"),
                        breadcrumb.get("message").and_then(Value::as_str)
                    );
                },
            ),
        ],
    )
    .await?;

    Ok(())
}