emailit 2.0.3

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

use emailit::types::{CreateSubscriberParams, ListSubscribersParams, UpdateSubscriberParams};
use serde_json::json;
use wiremock::matchers::{method, path};
use wiremock::{Mock, ResponseTemplate};

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

    Mock::given(method("POST"))
        .and(path("/v2/audiences/aud_123/subscribers"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "sub_456",
            "object": "subscriber",
            "audience_id": "aud_123",
            "email": "user@example.com",
            "first_name": "John",
            "last_name": "Doe"
        })))
        .mount(&server)
        .await;

    let result = client
        .subscribers
        .create(
            "aud_123",
            CreateSubscriberParams::new("user@example.com")
                .with_first_name("John")
                .with_last_name("Doe"),
        )
        .await
        .unwrap();

    assert_eq!(result.id.unwrap(), "sub_456");
    assert_eq!(result.email.unwrap(), "user@example.com");
}

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

    Mock::given(method("GET"))
        .and(path("/v2/audiences/aud_123/subscribers/sub_456"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "sub_456",
            "object": "subscriber",
            "email": "user@example.com"
        })))
        .mount(&server)
        .await;

    let result = client.subscribers.get("aud_123", "sub_456").await.unwrap();
    assert_eq!(result.id.unwrap(), "sub_456");
}

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

    Mock::given(method("POST"))
        .and(path("/v2/audiences/aud_123/subscribers/sub_456"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "sub_456",
            "object": "subscriber",
            "first_name": "Jane"
        })))
        .mount(&server)
        .await;

    let result = client
        .subscribers
        .update(
            "aud_123",
            "sub_456",
            UpdateSubscriberParams {
                email: None,
                first_name: Some("Jane".into()),
                last_name: None,
                custom_fields: None,
                subscribed: None,
            },
        )
        .await
        .unwrap();

    assert_eq!(result.first_name.unwrap(), "Jane");
}

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

    Mock::given(method("GET"))
        .and(path("/v2/audiences/aud_123/subscribers"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "data": [
                {"id": "sub_1", "object": "subscriber"},
                {"id": "sub_2", "object": "subscriber"}
            ]
        })))
        .mount(&server)
        .await;

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

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

    Mock::given(method("GET"))
        .and(path("/v2/audiences/aud_123/subscribers"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "data": [{"id": "sub_1", "object": "subscriber"}],
            "page": 1,
            "total": 1
        })))
        .mount(&server)
        .await;

    let result = client
        .subscribers
        .list(
            "aud_123",
            Some(ListSubscribersParams {
                page: Some(1),
                limit: Some(10),
                subscribed: Some(true),
            }),
        )
        .await
        .unwrap();

    assert_eq!(result.data.len(), 1);
}

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

    Mock::given(method("DELETE"))
        .and(path("/v2/audiences/aud_123/subscribers/sub_456"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "sub_456",
            "object": "subscriber",
            "deleted": true
        })))
        .mount(&server)
        .await;

    let result = client
        .subscribers
        .delete("aud_123", "sub_456")
        .await
        .unwrap();

    assert_eq!(result.deleted, Some(true));
}