solana-program-library/associated-token-account/program-test/tests/spl_token_create.rs

114 lines
3.9 KiB
Rust

// Mark this test as BPF-only due to current `ProgramTest` limitations when CPIing into the system program
#![cfg(feature = "test-sbf")]
mod program_test;
use {
program_test::program_test,
solana_program::pubkey::Pubkey,
solana_program_test::*,
solana_sdk::{program_pack::Pack, signature::Signer, transaction::Transaction},
spl_associated_token_account::{
get_associated_token_address, instruction::create_associated_token_account,
},
spl_token::state::Account,
};
#[allow(deprecated)]
use spl_associated_token_account::create_associated_token_account as deprecated_create_associated_token_account;
#[tokio::test]
async fn success_create() {
let wallet_address = Pubkey::new_unique();
let token_mint_address = Pubkey::new_unique();
let associated_token_address =
get_associated_token_address(&wallet_address, &token_mint_address);
let (mut banks_client, payer, recent_blockhash) =
program_test(token_mint_address, true).start().await;
let rent = banks_client.get_rent().await.unwrap();
let expected_token_account_len = Account::LEN;
let expected_token_account_balance = rent.minimum_balance(expected_token_account_len);
// Associated account does not exist
assert_eq!(
banks_client
.get_account(associated_token_address)
.await
.expect("get_account"),
None,
);
let transaction = Transaction::new_signed_with_payer(
&[create_associated_token_account(
&payer.pubkey(),
&wallet_address,
&token_mint_address,
&spl_token::id(),
)],
Some(&payer.pubkey()),
&[&payer],
recent_blockhash,
);
banks_client.process_transaction(transaction).await.unwrap();
// Associated account now exists
let associated_account = banks_client
.get_account(associated_token_address)
.await
.expect("get_account")
.expect("associated_account not none");
assert_eq!(associated_account.data.len(), expected_token_account_len);
assert_eq!(associated_account.owner, spl_token::id());
assert_eq!(associated_account.lamports, expected_token_account_balance);
}
#[tokio::test]
async fn success_using_deprecated_instruction_creator() {
let wallet_address = Pubkey::new_unique();
let token_mint_address = Pubkey::new_unique();
let associated_token_address =
get_associated_token_address(&wallet_address, &token_mint_address);
let (mut banks_client, payer, recent_blockhash) =
program_test(token_mint_address, true).start().await;
let rent = banks_client.get_rent().await.unwrap();
let expected_token_account_len = Account::LEN;
let expected_token_account_balance = rent.minimum_balance(expected_token_account_len);
// Associated account does not exist
assert_eq!(
banks_client
.get_account(associated_token_address)
.await
.expect("get_account"),
None,
);
// Use legacy instruction creator
#[allow(deprecated)]
let create_associated_token_account_ix = deprecated_create_associated_token_account(
&payer.pubkey(),
&wallet_address,
&token_mint_address,
);
let transaction = Transaction::new_signed_with_payer(
&[create_associated_token_account_ix],
Some(&payer.pubkey()),
&[&payer],
recent_blockhash,
);
banks_client.process_transaction(transaction).await.unwrap();
// Associated account now exists
let associated_account = banks_client
.get_account(associated_token_address)
.await
.expect("get_account")
.expect("associated_account not none");
assert_eq!(associated_account.data.len(), expected_token_account_len);
assert_eq!(associated_account.owner, spl_token::id());
assert_eq!(associated_account.lamports, expected_token_account_balance);
}