use discord_hook::{AllowedMentions, Embed, WebhookClient, WebhookMessage};
fn webhook_url() -> Option<String> {
std::env::var("DISCORD_WEBHOOK_URL").ok()
}
macro_rules! require_url {
() => {
match webhook_url() {
Some(url) => url,
None => {
eprintln!("Skipping integration test — DISCORD_WEBHOOK_URL not set");
return;
}
}
};
}
#[tokio::test]
async fn sends_plain_text_message() {
let url = require_url!();
let client = WebhookClient::new(&url).unwrap();
let message = WebhookMessage::builder()
.username("hooksmith-test")
.content("[integration test] plain-text message")
.allowed_mentions(AllowedMentions::none())
.build()
.unwrap();
client.send(&message).await.unwrap();
}
#[tokio::test]
async fn sends_rich_embed() {
let url = require_url!();
let client = WebhookClient::new(&url).unwrap();
let embed = Embed::builder()
.title("[integration test] Rich embed")
.description("Sent by the `discord_hook` integration test suite.")
.color(0x5865F2)
.field("Test", "sends_rich_embed", true)
.build();
let message = WebhookMessage::builder()
.username("hooksmith-test")
.embed(embed)
.allowed_mentions(AllowedMentions::none())
.build()
.unwrap();
client.send(&message).await.unwrap();
}
#[tokio::test]
async fn send_to_thread_requires_valid_thread_id_format() {
let url = require_url!();
let client = WebhookClient::new(&url).unwrap();
let message = WebhookMessage::builder()
.username("hooksmith-test")
.content("[integration test] thread send (may 404 with dummy ID)")
.build()
.unwrap();
let _ = client.send_to_thread(&message, "000000000000000000").await;
}
#[tokio::test]
async fn client_is_clone_and_reusable() {
let url = require_url!();
let client = WebhookClient::new(&url).unwrap();
let client2 = client.clone();
let msg = WebhookMessage::builder()
.username("hooksmith-test")
.content("[integration test] sent from a cloned client")
.allowed_mentions(AllowedMentions::none())
.build()
.unwrap();
client2.send(&msg).await.unwrap();
}