use crate::common::{self, Args, Result, TREASURY_SS58_ADDRESS, node::NodeExec};
use gsdk::{Api, gear};
const REWARD_PER_BLOCK: u128 = 300_000;
#[tokio::test]
async fn test_command_claim_works() -> Result<()> {
let node = common::create_messenger().await?;
let signer = Api::new(node.ws().as_str())
.await?
.signer("//Alice//stash", None)?;
let mailbox = signer
.api()
.mailbox(Some(common::alice_account_id()), 10)
.await?;
assert_eq!(mailbox.len(), 1, "Mailbox should have 1 message");
let id = hex::encode(mailbox[0].0.id());
let treasury_before = signer
.api()
.get_balance(TREASURY_SS58_ADDRESS)
.await
.unwrap_or(0);
let _ = node.run(Args::new("claim").message_id(id))?;
let mailbox = signer
.api()
.mailbox(Some(common::alice_account_id()), 10)
.await?;
assert!(mailbox.is_empty(), "Mailbox should be empty");
let treasury_after = signer
.api()
.get_balance(TREASURY_SS58_ADDRESS)
.await
.unwrap_or(0);
let treasury_gas_fee_share = signer
.api()
.constants()
.at(&gear::constants().gear_bank().treasury_gas_fee_share())
.map_err(gsdk::Error::from)?
.0;
let treasury_tx_fee_share = signer
.api()
.constants()
.at(&gear::constants().gear_bank().treasury_tx_fee_share())
.map_err(gsdk::Error::from)?
.0;
assert_eq!(treasury_gas_fee_share, treasury_tx_fee_share);
let treasury_fee_share = treasury_gas_fee_share;
assert!(
treasury_after >= treasury_before + treasury_fee_share * REWARD_PER_BLOCK,
"Treasury income mismatched"
);
Ok(())
}