use assert_matches::assert_matches;
use hedera::{
AnyTransaction,
Status,
TopicInfoQuery,
TopicMessageSubmitTransaction,
};
use crate::common::{
setup_nonfree,
TestEnvironment,
};
use crate::resources;
use crate::topic::Topic;
#[tokio::test]
async fn basic() -> anyhow::Result<()> {
let Some(TestEnvironment { config: _, client }) = setup_nonfree() else {
return Ok(());
};
let topic = Topic::create(&client).await?;
TopicMessageSubmitTransaction::new()
.topic_id(topic.id)
.message("Hello, from HCS!")
.execute(&client)
.await?
.get_receipt(&client)
.await?;
let info = TopicInfoQuery::new().topic_id(topic.id).execute(&client).await?;
assert_eq!(info.topic_id, topic.id);
assert_eq!(info.sequence_number, 1);
topic.delete(&client).await?;
Ok(())
}
#[tokio::test]
async fn large_message() -> anyhow::Result<()> {
let Some(TestEnvironment { config: _, client }) = setup_nonfree() else {
return Ok(());
};
let topic = Topic::create(&client).await?;
let responses = TopicMessageSubmitTransaction::new()
.topic_id(topic.id)
.max_chunks(15)
.message(resources::BIG_CONTENTS)
.execute_all(&client)
.await?;
for response in responses {
response.get_receipt(&client).await?;
}
let info = TopicInfoQuery::new().topic_id(topic.id).execute(&client).await?;
assert_eq!(info.topic_id, topic.id);
assert_eq!(info.sequence_number, 14);
topic.delete(&client).await?;
Ok(())
}
#[tokio::test]
async fn missing_topic_id_fails() -> anyhow::Result<()> {
let Some(TestEnvironment { config: _, client }) = setup_nonfree() else {
return Ok(());
};
let res = TopicMessageSubmitTransaction::new()
.max_chunks(15)
.message(resources::BIG_CONTENTS)
.execute(&client)
.await;
assert_matches!(
res,
Err(hedera::Error::TransactionPreCheckStatus { status: Status::InvalidTopicId, .. })
);
Ok(())
}
#[tokio::test]
async fn missing_message_fails() -> anyhow::Result<()> {
let Some(TestEnvironment { config: _, client }) = setup_nonfree() else {
return Ok(());
};
let topic = Topic::create(&client).await?;
let res = TopicMessageSubmitTransaction::new().topic_id(topic.id).execute(&client).await;
assert_matches!(
res,
Err(hedera::Error::TransactionPreCheckStatus { status: Status::InvalidTopicMessage, .. })
);
topic.delete(&client).await?;
Ok(())
}
#[tokio::test]
async fn decode_hex_regression_test() -> anyhow::Result<()> {
let transaction_bytes = hex_literal::hex!(
"2ac2010a580a130a0b08d38f8f880610a09be91512041899e11c120218041880\
c2d72f22020878da01330a0418a5a12012103030303030303136323736333737\
31351a190a130a0b08d38f8f880610a09be91512041899e11c1001180112660a\
640a20603edaec5d1c974c92cb5bee7b011310c3b84b13dc048424cd6ef146d6\
a0d4a41a40b6a08f310ee29923e5868aac074468b2bde05da95a806e2f4a4f45\
2177f129ca0abae7831e595b5beaa1c947e2cb71201642bab33fece5184b0454\
7afc40850a"
);
let transaction = AnyTransaction::from_bytes(&transaction_bytes)?;
let _id = transaction.get_transaction_id().unwrap();
Ok(())
}