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