use solana_program_test::*;
use anchor_spl::token::{ID, self};
use anchor_spl::token::Mint as SplMint;
mod permissions {
use anchor_lang::{system_program, ToAccountMetas, InstructionData, Key};
use anchor_spl::token::spl_token;
use libreplex_metadata::{GroupInput, CreateMetadataInput, Asset, accounts::CreateMetadata};
use solana_program::{pubkey::Pubkey, instruction::Instruction, program::invoke_signed, system_instruction, rent::Rent, sysvar::Sysvar};
use solana_sdk::{signature::Keypair, signer::Signer, transaction::Transaction};
use super::*;
#[tokio::test]
async fn create_metadata_delegated() {
let program = ProgramTest::new("libreplex_metadata", libreplex_metadata::ID,
processor!(libreplex_metadata::entry));
let mut context = program.start_with_context().await;
let collection_authority = context.payer.pubkey();
let mint = Keypair::new();
let rent = context.banks_client.get_rent().await.unwrap();
let allocate_ix = system_instruction::create_account(
&context.payer.pubkey(),
&mint.pubkey(),
rent.minimum_balance(SplMint::LEN),
SplMint::LEN as u64,
&ID,
);
let initialize_ix = spl_token::instruction::initialize_mint2(
&spl_token::id(),
&mint.pubkey(),
&context.payer.pubkey(),
Some(&context.payer.pubkey()),
0,
).unwrap();
let create_account_tx = Transaction::new_signed_with_payer(
&[allocate_ix, initialize_ix],
Some(&context.payer.pubkey()),
&[&context.payer, &mint],
context.last_blockhash
);
context.banks_client.process_transaction(create_account_tx).await.unwrap();
let metadata = Pubkey::find_program_address(
&[b"metadata", mint.pubkey().as_ref()],
&libreplex_metadata::ID,
)
.0;
let create_metadata_accounts = CreateMetadata {
signer: collection_authority,
payer: collection_authority,
authority: collection_authority,
metadata: metadata.key(),
mint: mint.pubkey(),
invoked_migrator_program: None,
system_program: system_program::ID,
}
.to_account_metas(None);
let create_metadata = libreplex_metadata::instruction::CreateMetadata {
metadata_input: CreateMetadataInput {
name: "COOLIO COLLECTION".to_string(),
asset: Asset::Json {
url: "https://collection-url.com".to_owned()
},
update_authority: collection_authority,
symbol: "COOL".to_string(),
description: Some("coolio description".to_string()),
extension: libreplex_metadata::MetadataExtension::None
},
};
let create_metadata = Instruction {
data: create_metadata.data(),
program_id: libreplex_metadata::ID,
accounts: create_metadata_accounts,
};
let transaction = Transaction::new_signed_with_payer(
&[create_metadata],
Some(&collection_authority),
&[&context.payer],
context.last_blockhash,
);
context
.banks_client
.process_transaction(transaction)
.await
.unwrap();
}
}