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));
}