From 022b609c4ed19addbf8cd2c89c9461698a5c9b6b Mon Sep 17 00:00:00 2001 From: Ovidiu Stinga Date: Mon, 21 Aug 2023 21:34:33 +0300 Subject: [PATCH] migrate forwarder tests to new syntax --- .../tests/forwarder_legacy_whitebox_test.rs | 85 -------------- .../tests/forwarder_whitebox_test.rs | 110 ++++++++++++++++++ 2 files changed, 110 insertions(+), 85 deletions(-) delete mode 100644 contracts/feature-tests/composability/forwarder/tests/forwarder_legacy_whitebox_test.rs create mode 100644 contracts/feature-tests/composability/forwarder/tests/forwarder_whitebox_test.rs diff --git a/contracts/feature-tests/composability/forwarder/tests/forwarder_legacy_whitebox_test.rs b/contracts/feature-tests/composability/forwarder/tests/forwarder_legacy_whitebox_test.rs deleted file mode 100644 index cfa0952d69..0000000000 --- a/contracts/feature-tests/composability/forwarder/tests/forwarder_legacy_whitebox_test.rs +++ /dev/null @@ -1,85 +0,0 @@ -#![allow(deprecated)] // TODO: migrate tests - -use forwarder::nft::{Color, ForwarderNftModule}; -use multiversx_sc::{contract_base::ContractBase, types::EsdtLocalRole}; -use multiversx_sc_scenario::{ - managed_address, managed_biguint, managed_token_id, rust_biguint, - testing_framework::BlockchainStateWrapper, -}; - -static NFT_TOKEN_ID: &[u8] = b"COOL-123456"; - -#[test] -fn nft_update_attributes_and_send_test() { - let mut b_mock = BlockchainStateWrapper::new(); - let rust_zero = rust_biguint!(0); - - let user = b_mock.create_user_account(&rust_zero); - let forw_wrapper = - b_mock.create_sc_account(&rust_zero, None, forwarder::contract_obj, "forwarder path"); - - b_mock.set_esdt_local_roles( - forw_wrapper.address_ref(), - NFT_TOKEN_ID, - &[EsdtLocalRole::NftCreate, EsdtLocalRole::NftUpdateAttributes], - ); - - let original_attributes = Color { r: 0, g: 0, b: 0 }; - b_mock - .execute_tx(&user, &forw_wrapper, &rust_zero, |sc| { - sc.nft_create_compact( - managed_token_id!(NFT_TOKEN_ID), - managed_biguint!(1), - original_attributes, - ); - - sc.send().direct_esdt( - &managed_address!(&user), - &managed_token_id!(NFT_TOKEN_ID), - 1, - &managed_biguint!(1), - ); - }) - .assert_ok(); - - b_mock.check_nft_balance( - &user, - NFT_TOKEN_ID, - 1, - &rust_biguint!(1), - Some(&original_attributes), - ); - - let new_attributes = Color { - r: 255, - g: 255, - b: 255, - }; - b_mock - .execute_esdt_transfer( - &user, - &forw_wrapper, - NFT_TOKEN_ID, - 1, - &rust_biguint!(1), - |sc| { - sc.nft_update_attributes(managed_token_id!(NFT_TOKEN_ID), 1, new_attributes); - - sc.send().direct_esdt( - &managed_address!(&user), - &managed_token_id!(NFT_TOKEN_ID), - 1, - &managed_biguint!(1), - ); - }, - ) - .assert_ok(); - - b_mock.check_nft_balance( - &user, - NFT_TOKEN_ID, - 1, - &rust_biguint!(1), - Some(&new_attributes), - ); -} diff --git a/contracts/feature-tests/composability/forwarder/tests/forwarder_whitebox_test.rs b/contracts/feature-tests/composability/forwarder/tests/forwarder_whitebox_test.rs new file mode 100644 index 0000000000..c226733195 --- /dev/null +++ b/contracts/feature-tests/composability/forwarder/tests/forwarder_whitebox_test.rs @@ -0,0 +1,110 @@ +use forwarder::nft::{Color, ForwarderNftModule}; +use multiversx_sc::{contract_base::ContractBase, types::Address}; +use multiversx_sc_scenario::{ + managed_address, managed_biguint, managed_token_id, rust_biguint, + scenario_model::{Account, AddressValue, ScCallStep, SetStateStep}, + ScenarioWorld, WhiteboxContract, +}; + +const USER_ADDRESS_EXPR: &str = "address:user"; +const FORWARDER_ADDRESS_EXPR: &str = "sc:forwarder"; +const FORWARDER_PATH_EXPR: &str = "file:output/forwarder.wasm"; + +const NFT_TOKEN_ID_EXPR: &str = "str:COOL-123456"; +const NFT_TOKEN_ID: &[u8] = b"COOL-123456"; + +fn world() -> ScenarioWorld { + let mut blockchain = ScenarioWorld::new(); + blockchain.set_current_dir_from_workspace("contracts/composability/forwarder"); + + blockchain.register_contract(FORWARDER_PATH_EXPR, forwarder::ContractBuilder); + blockchain +} + +#[test] +fn test_nft_update_attributes_and_send() { + let mut world = world(); + + let forwarder_code = world.code_expression(FORWARDER_PATH_EXPR); + let mut roles = Vec::new(); + roles.push(String::from("ESDTRoleNFTCreate")); + roles.push(String::from("ESDTRoleNFTUpdateAttributes")); + + world.set_state_step( + SetStateStep::new() + .put_account(USER_ADDRESS_EXPR, Account::new().nonce(1)) + .put_account( + FORWARDER_ADDRESS_EXPR, + Account::new() + .nonce(1) + .code(forwarder_code.clone()) + .esdt_roles(NFT_TOKEN_ID_EXPR, roles), + ), + ); + + let forwarder_whitebox = WhiteboxContract::new(FORWARDER_ADDRESS_EXPR, forwarder::contract_obj); + + let original_attributes = Color { r: 0, g: 0, b: 0 }; + + world.whitebox_call( + &forwarder_whitebox, + ScCallStep::new().from(USER_ADDRESS_EXPR), + |sc| { + sc.nft_create_compact( + managed_token_id!(NFT_TOKEN_ID), + managed_biguint!(1), + original_attributes, + ); + + sc.send().direct_esdt( + &managed_address!(&address_expr_to_address(USER_ADDRESS_EXPR)), + &managed_token_id!(NFT_TOKEN_ID), + 1, + &managed_biguint!(1), + ); + }, + ); + + // TODO: implement esdt_nft_balance check + // world.check_state_step( + // CheckStateStep::new().put_account( + // USER_ADDRESS_EXPR, + // CheckAccount::new().esdt_nft_balance(token_id_expr, nonce_expr, balance_expr, opt_attributes_expr) + // ), + // ); + + let new_attributes = Color { + r: 255, + g: 255, + b: 255, + }; + + world.whitebox_call( + &forwarder_whitebox, + ScCallStep::new() + .from(USER_ADDRESS_EXPR) + .esdt_transfer(NFT_TOKEN_ID, 1, rust_biguint!(1)), + |sc| { + sc.nft_update_attributes(managed_token_id!(NFT_TOKEN_ID), 1, new_attributes); + + sc.send().direct_esdt( + &managed_address!(&address_expr_to_address(USER_ADDRESS_EXPR)), + &managed_token_id!(NFT_TOKEN_ID), + 1, + &managed_biguint!(1), + ); + }, + ); + + // TODO: implement esdt_nft_balance check + // world.check_state_step( + // CheckStateStep::new().put_account( + // USER_ADDRESS_EXPR, + // CheckAccount::new().esdt_nft_balance(token_id_expr, nonce_expr, balance_expr, opt_attributes_expr) + // ), + // ); +} + +fn address_expr_to_address(address_expr: &str) -> Address { + AddressValue::from(address_expr).to_address() +}