Add unit tests
This commit is contained in:
95
src/test/mod.rs
Normal file
95
src/test/mod.rs
Normal file
@ -0,0 +1,95 @@
|
||||
use poise::{
|
||||
serenity_prelude::{GuildId, UserId},
|
||||
CreateReply,
|
||||
};
|
||||
use serde_json::Value;
|
||||
use tokio::sync::Mutex;
|
||||
|
||||
use crate::{Data, Error};
|
||||
|
||||
pub(crate) struct TestData {
|
||||
pub(crate) replies: Vec<CreateReply>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
pub(crate) struct TestContext<'a> {
|
||||
pub(crate) data: &'a Data,
|
||||
pub(crate) cache: &'a MockCache,
|
||||
pub(crate) test_data: &'a Mutex<TestData>,
|
||||
pub(crate) shard_id: usize,
|
||||
}
|
||||
|
||||
pub(crate) struct MockUser {
|
||||
pub(crate) id: UserId,
|
||||
}
|
||||
|
||||
pub(crate) struct MockCache {}
|
||||
|
||||
impl<'a> TestContext<'a> {
|
||||
pub async fn say(&self, message: impl Into<String>) -> Result<(), Error> {
|
||||
self.test_data.lock().await.replies.push(CreateReply::default().content(message));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn send(&self, reply: CreateReply) -> Result<(), Error> {
|
||||
self.test_data.lock().await.replies.push(reply.clone());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn guild_id(&self) -> Option<GuildId> {
|
||||
Some(GuildId::new(1))
|
||||
}
|
||||
|
||||
pub async fn defer_ephemeral(&self) -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn author(&self) -> MockUser {
|
||||
MockUser { id: UserId::new(1) }
|
||||
}
|
||||
|
||||
pub fn data(&self) -> &Data {
|
||||
return &self.data;
|
||||
}
|
||||
|
||||
pub fn serenity_context(&self) -> &Self {
|
||||
return &self;
|
||||
}
|
||||
|
||||
pub async fn sent_content(&self) -> Vec<String> {
|
||||
let data = self.test_data.lock().await;
|
||||
|
||||
data.replies
|
||||
.iter()
|
||||
.map(|r| {
|
||||
let reply = r.clone();
|
||||
let content = reply.content.unwrap_or(String::new());
|
||||
let embed_content = reply
|
||||
.embeds
|
||||
.iter()
|
||||
.map(|e| {
|
||||
let map = serde_json::to_value(e).unwrap();
|
||||
let description =
|
||||
map.get("description").cloned().unwrap_or(Value::String(String::new()));
|
||||
return format!("{}", description.as_str().unwrap());
|
||||
})
|
||||
.collect::<Vec<String>>()
|
||||
.join("\n");
|
||||
|
||||
return if content.is_empty() {
|
||||
embed_content
|
||||
} else {
|
||||
format!("{}\n{}", content, embed_content)
|
||||
};
|
||||
})
|
||||
.collect::<Vec<String>>()
|
||||
}
|
||||
}
|
||||
|
||||
impl MockCache {
|
||||
pub fn shard_count(&self) -> usize {
|
||||
return 1;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user