emailit 2.0.3

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

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

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

    Mock::given(method("POST"))
        .and(path("/v2/audiences"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "aud_123",
            "object": "audience",
            "name": "Newsletter",
            "token": "tok_abc"
        })))
        .mount(&server)
        .await;

    let result = client
        .audiences
        .create(CreateAudienceParams::new("Newsletter"))
        .await
        .unwrap();

    assert_eq!(result.id.unwrap(), "aud_123");
    assert_eq!(result.token.unwrap(), "tok_abc");
}

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

    Mock::given(method("GET"))
        .and(path("/v2/audiences/aud_123"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "aud_123",
            "object": "audience",
            "name": "Newsletter"
        })))
        .mount(&server)
        .await;

    let result = client.audiences.get("aud_123").await.unwrap();
    assert_eq!(result.name.unwrap(), "Newsletter");
}

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

    Mock::given(method("POST"))
        .and(path("/v2/audiences/aud_123"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "aud_123",
            "object": "audience",
            "name": "Updated Newsletter"
        })))
        .mount(&server)
        .await;

    let result = client
        .audiences
        .update(
            "aud_123",
            UpdateAudienceParams {
                name: "Updated Newsletter".into(),
            },
        )
        .await
        .unwrap();

    assert_eq!(result.name.unwrap(), "Updated Newsletter");
}

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

    Mock::given(method("GET"))
        .and(path("/v2/audiences"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "data": [
                {"id": "aud_1", "object": "audience", "name": "List A"},
                {"id": "aud_2", "object": "audience", "name": "List B"}
            ]
        })))
        .mount(&server)
        .await;

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

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

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

    let result = client.audiences.delete("aud_123").await.unwrap();
    assert_eq!(result.deleted, Some(true));
}

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

    Mock::given(method("GET"))
        .and(path("/v2/audiences/aud_notfound"))
        .respond_with(ResponseTemplate::new(404).set_body_json(json!({
            "error": "Not Found"
        })))
        .mount(&server)
        .await;

    let err = client.audiences.get("aud_notfound").await.unwrap_err();
    assert!(err.is_invalid_request());
}