emailit 2.0.3

The official Rust SDK for the Emailit Email API
Documentation
mod common;

use emailit::types::ListEventsParams;
use serde_json::json;
use wiremock::matchers::{method, path, query_param};
use wiremock::{Mock, ResponseTemplate};

#[tokio::test]
async fn test_list_events() {
    let (client, server) = common::setup().await;

    Mock::given(method("GET"))
        .and(path("/v2/events"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "data": [
                {"id": "evt_1", "object": "event", "type": "email.delivered"},
                {"id": "evt_2", "object": "event", "type": "email.bounced"}
            ]
        })))
        .mount(&server)
        .await;

    let result = client.events.list(None).await.unwrap();
    assert_eq!(result.data.len(), 2);
}

#[tokio::test]
async fn test_list_events_with_type_filter() {
    let (client, server) = common::setup().await;

    Mock::given(method("GET"))
        .and(path("/v2/events"))
        .and(query_param("type", "email.delivered"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "data": [
                {"id": "evt_1", "object": "event", "type": "email.delivered"}
            ]
        })))
        .mount(&server)
        .await;

    let result = client
        .events
        .list(Some(ListEventsParams {
            page: None,
            limit: None,
            event_type: Some("email.delivered".into()),
        }))
        .await
        .unwrap();

    assert_eq!(result.data.len(), 1);
    assert_eq!(
        result.data[0].event_type.as_deref(),
        Some("email.delivered")
    );
}

#[tokio::test]
async fn test_list_events_with_pagination() {
    let (client, server) = common::setup().await;

    Mock::given(method("GET"))
        .and(path("/v2/events"))
        .and(query_param("page", "2"))
        .and(query_param("limit", "5"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "data": [],
            "page": 2
        })))
        .mount(&server)
        .await;

    let result = client
        .events
        .list(Some(ListEventsParams {
            page: Some(2),
            limit: Some(5),
            event_type: None,
        }))
        .await
        .unwrap();

    assert!(result.data.is_empty());
}

#[tokio::test]
async fn test_get_event() {
    let (client, server) = common::setup().await;

    Mock::given(method("GET"))
        .and(path("/v2/events/evt_123"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "evt_123",
            "object": "event",
            "type": "email.delivered",
            "data": {"email_id": "em_456"},
            "created_at": "2026-01-01T00:00:00Z"
        })))
        .mount(&server)
        .await;

    let result = client.events.get("evt_123").await.unwrap();
    assert_eq!(result.id.unwrap(), "evt_123");
    assert_eq!(result.event_type.unwrap(), "email.delivered");
    assert!(result.data.is_some());
}