test.rs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. use solana_program::hash::Hash;
  2. use solana_program_test::{processor, BanksClient, ProgramTest};
  3. use solana_sdk::{
  4. program_pack::Pack, signature::Keypair, signer::Signer, transaction::Transaction,
  5. };
  6. use steel::*;
  7. use steel_api::prelude::*;
  8. async fn setup() -> (BanksClient, Keypair, Hash) {
  9. let mut program_test = ProgramTest::new(
  10. "steel_program",
  11. steel_api::ID,
  12. processor!(steel_program::process_instruction),
  13. );
  14. program_test.add_program("token_metadata", mpl_token_metadata::ID, None);
  15. program_test.prefer_bpf(true);
  16. program_test.start().await
  17. }
  18. #[tokio::test]
  19. async fn run_test() {
  20. // Setup test
  21. let (mut banks, payer, blockhash) = setup().await;
  22. //SPL TOKEN
  23. let token_mint_keypair = Keypair::new();
  24. let name = string_to_bytes::<32>("Solana Gold").unwrap();
  25. let symbol = string_to_bytes::<8>("GOLDSOL").unwrap();
  26. let uri = string_to_bytes::<128>("https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json").unwrap();
  27. let decimals = 9;
  28. // Submit create transaction for spl_token.
  29. let ix = create_token(
  30. payer.pubkey(),
  31. token_mint_keypair.pubkey(),
  32. name,
  33. symbol,
  34. uri,
  35. decimals,
  36. );
  37. let tx = Transaction::new_signed_with_payer(
  38. &[ix],
  39. Some(&payer.pubkey()),
  40. &[&payer, &token_mint_keypair],
  41. blockhash,
  42. );
  43. let res = banks.process_transaction(tx).await;
  44. assert!(res.is_ok());
  45. // Check token mint account data
  46. let mint_account_data = banks
  47. .get_account(token_mint_keypair.pubkey())
  48. .await
  49. .unwrap()
  50. .unwrap()
  51. .data;
  52. let deserialized_mint_data = spl_token::state::Mint::unpack(&mint_account_data).unwrap();
  53. assert!(deserialized_mint_data.is_initialized);
  54. assert_eq!(deserialized_mint_data.decimals, decimals);
  55. assert_eq!(
  56. deserialized_mint_data.mint_authority.unwrap(),
  57. payer.pubkey()
  58. );
  59. // Check token metadata account data
  60. let metadata_account_data = banks
  61. .get_account(metadata_pda(token_mint_keypair.pubkey()).0)
  62. .await
  63. .unwrap()
  64. .unwrap()
  65. .data;
  66. let deserialized_metadata_data =
  67. mpl_token_metadata::accounts::Metadata::from_bytes(&metadata_account_data).unwrap();
  68. assert_eq!(deserialized_metadata_data.update_authority, payer.pubkey());
  69. assert_eq!(deserialized_metadata_data.mint, token_mint_keypair.pubkey());
  70. assert_eq!(
  71. deserialized_metadata_data.name.trim_end_matches('\0'),
  72. "Solana Gold"
  73. );
  74. assert_eq!(
  75. deserialized_metadata_data.symbol.trim_end_matches('\0'),
  76. "GOLDSOL"
  77. );
  78. assert_eq!(deserialized_metadata_data.uri.trim_end_matches('\0'), "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json" );
  79. //NFT
  80. let nft_mint_keypair = Keypair::new();
  81. let name = string_to_bytes::<32>("Homer NFT").unwrap();
  82. let symbol = string_to_bytes::<8>("HOMR").unwrap();
  83. let uri = string_to_bytes::<128>("https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json").unwrap();
  84. let decimals = 0;
  85. //Submit create transaction for nft
  86. let ix = create_token(
  87. payer.pubkey(),
  88. nft_mint_keypair.pubkey(),
  89. name,
  90. symbol,
  91. uri,
  92. decimals,
  93. );
  94. let tx = Transaction::new_signed_with_payer(
  95. &[ix],
  96. Some(&payer.pubkey()),
  97. &[&payer, &nft_mint_keypair],
  98. blockhash,
  99. );
  100. let res = banks.process_transaction(tx).await;
  101. assert!(res.is_ok());
  102. //Check nft mint account data
  103. let mint_account_data = banks
  104. .get_account(nft_mint_keypair.pubkey())
  105. .await
  106. .unwrap()
  107. .unwrap()
  108. .data;
  109. let deserialized_mint_data = spl_token::state::Mint::unpack(&mint_account_data).unwrap();
  110. assert!(deserialized_mint_data.is_initialized);
  111. assert_eq!(deserialized_mint_data.decimals, decimals);
  112. assert_eq!(
  113. deserialized_mint_data.mint_authority.unwrap(),
  114. payer.pubkey()
  115. );
  116. //Check nft metadata account data
  117. let metadata_account_data = banks
  118. .get_account(metadata_pda(nft_mint_keypair.pubkey()).0)
  119. .await
  120. .unwrap()
  121. .unwrap()
  122. .data;
  123. let deserialized_metadata_data =
  124. mpl_token_metadata::accounts::Metadata::from_bytes(&metadata_account_data).unwrap();
  125. assert_eq!(deserialized_metadata_data.update_authority, payer.pubkey());
  126. assert_eq!(deserialized_metadata_data.mint, nft_mint_keypair.pubkey());
  127. assert_eq!(
  128. deserialized_metadata_data.name.trim_end_matches('\0'),
  129. "Homer NFT"
  130. );
  131. assert_eq!(
  132. deserialized_metadata_data.symbol.trim_end_matches('\0'),
  133. "HOMR"
  134. );
  135. assert_eq!(deserialized_metadata_data.uri.trim_end_matches('\0'), "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json" );
  136. }