git.delta.rocks / unique-network / refs/commits / 944d507c1d0c

difftreelog

NFTPAR-164. Schema version

str-mv2020-12-17parent: #f46510a.patch.diff
in: master

4 files changed

modifiednode/Cargo.tomldiffbeforeafterboth
--- a/node/Cargo.toml
+++ b/node/Cargo.toml
@@ -23,6 +23,7 @@
 [dependencies]
 futures = '0.3.4'
 log = '0.4.8'
+flexi_logger = "0.15.7"
 parking_lot = '0.10.0'
 structopt = '0.3.8'
 jsonrpc-core = '15.0.0'
modifiednode/src/chain_spec.rsdiffbeforeafterboth
--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -167,7 +167,8 @@
                     description: vec![],
                     token_prefix: vec![],
                     mint_mode: false,
-                    offchain_schema: vec![],
+					offchain_schema: vec![],
+					schema_version: SchemaVersion::default(),
                     sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
                     unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
                     const_on_chain_schema: vec![],
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -1,3 +1,5 @@
+#![recursion_limit = "1024"]
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 #[cfg(feature = "std")]
@@ -54,7 +56,6 @@
 
 pub type CollectionId = u32;
 pub type TokenId = u32;
-
 pub type DecimalPoints = u8;
 
 #[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
@@ -97,6 +98,18 @@
     }
 }
 
+#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub enum SchemaVersion {
+    ImageURL,
+    Unique,
+}
+impl Default for SchemaVersion {
+    fn default() -> Self {
+        Self::ImageURL
+    }
+}
+
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub struct Ownership<AccountId> {
@@ -116,6 +129,7 @@
     pub token_prefix: Vec<u8>, // 16 include null escape char
     pub mint_mode: bool,
     pub offchain_schema: Vec<u8>,
+    pub schema_version: SchemaVersion,
     pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender
     pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship
     pub limits: CollectionLimits, // Collection private restrictions 
@@ -258,7 +272,7 @@
 pub enum CreateItemData {
     NFT(CreateNftData),
     Fungible(CreateFungibleData),
-    ReFungible(CreateReFungibleData)
+    ReFungible(CreateReFungibleData),
 }
 
 impl CreateItemData {
@@ -570,6 +584,7 @@
                 decimal_points: decimal_points,
                 token_prefix: prefix,
                 offchain_schema: Vec::new(),
+                schema_version: SchemaVersion::ImageURL,
                 sponsor: T::AccountId::default(),
                 unconfirmed_sponsor: T::AccountId::default(),
                 variable_on_chain_schema: Vec::new(),
@@ -1200,7 +1215,6 @@
             Ok(())
         }
 
-        ///
         #[weight = 0]
         pub fn safe_transfer_from(origin, collection_id: CollectionId, item_id: TokenId, new_owner: T::AccountId) -> DispatchResult {
 
@@ -1259,7 +1273,35 @@
 
             Ok(())
         }
-        
+ 
+        /// Set schema standard
+        /// ImageURL
+        /// Unique
+        /// 
+        /// # Permissions
+        /// 
+        /// * Collection Owner
+        /// * Collection Admin
+        /// 
+        /// # Arguments
+        /// 
+        /// * collection_id.
+        /// 
+        /// * schema: SchemaVersion: enum
+        #[weight = 0]
+        pub fn set_schema_version(
+            origin,
+            collection_id: CollectionId,
+            version: SchemaVersion
+        ) -> DispatchResult {
+            let sender = ensure_signed(origin)?;
+            Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
+            let mut target_collection = <Collection<T>>::get(collection_id);
+            target_collection.schema_version = version;
+            <Collection<T>>::insert(collection_id, target_collection);
+
+            Ok(())
+        }
 
         /// Set off-chain data schema.
         /// 
@@ -1458,7 +1500,7 @@
 impl<T: Trait> Module<T> {
 
     fn is_correct_transfer(collection_id: CollectionId, collection: &CollectionType<T::AccountId>, recipient: &T::AccountId) -> DispatchResult {
-        
+
         // check token limit and account token limit
         let account_items: u32 = <AddressTokens<T>>::get(collection_id, recipient).len() as u32;
         ensure!(collection.limits.account_token_ownership_limit > account_items,  Error::<T>::AccountTokenLimitExceeded);
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5    Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6    CollectionId, TokenId, MAX_DECIMAL_POINTS};7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11    1012}1314fn default_limits() {15    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16            collection_numbers_limit: default_collection_numbers_limit(),17            account_token_ownership_limit: 10,18            collections_admins_limit: 5,19            custom_data_limit: 2048,20            nft_sponsor_transfer_timeout: 15,21            fungible_sponsor_transfer_timeout: 15,22            refungible_sponsor_transfer_timeout: 15,          23        }));24}2526fn default_nft_data() -> CreateNftData {27    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31    CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243    let origin1 = Origin::signed(owner);44    assert_ok!(TemplateModule::create_collection(45            origin1.clone(),46            col_name1.clone(),47            col_desc1.clone(),48            token_prefix1.clone(),49            mode.clone()50        ));5152    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55    assert_eq!(TemplateModule::collection(id).owner, owner);56    assert_eq!(TemplateModule::collection(id).name, saved_col_name);57    assert_eq!(TemplateModule::collection(id).mode, *mode);58    assert_eq!(TemplateModule::collection(id).description, saved_description);59    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60    id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64    create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68    let origin1 = Origin::signed(1);69    assert_ok!(TemplateModule::create_item(70            origin1.clone(),71            collection_id,72            1,73            data.clone()74        ));7576}7778// Use cases tests region79// #region80#[test]81fn create_fungible_collection_fails_with_large_decimal_numbers() {82    new_test_ext().execute_with(|| {83        default_limits();8485        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();86        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();87        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();8889        let origin1 = Origin::signed(1);90        assert_noop!(TemplateModule::create_collection(91            origin1,92            col_name1,93            col_desc1,94            token_prefix1,95            CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)96        ), Error::<Test>::CollectionDecimalPointLimitExceeded);97    });    98}99100#[test]101fn create_re_fungible_collection_fails_with_large_decimal_numbers() {102    new_test_ext().execute_with(|| {103        default_limits();104105        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();106        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();107        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();108109        let origin1 = Origin::signed(1);110        assert_noop!(TemplateModule::create_collection(111            origin1,112            col_name1,113            col_desc1,114            token_prefix1,115            CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)116        ), Error::<Test>::CollectionDecimalPointLimitExceeded);117    });118}119120#[test]121fn create_nft_item() {122    new_test_ext().execute_with(|| {123        default_limits();124        let collection_id = create_test_collection(&CollectionMode::NFT, 1);125        126        let data = default_nft_data();127        create_test_item(collection_id, &data.clone().into());128        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);129        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);130    });131}132133// Use cases tests region134// #region135#[test]136fn create_nft_multiple_items() {137    new_test_ext().execute_with(|| {138        default_limits();139        140        create_test_collection(&CollectionMode::NFT, 1);141142        let origin1 = Origin::signed(1);143144        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];145146        assert_ok!(TemplateModule::create_multiple_items(147            origin1.clone(),148            1,149            1,150            items_data.clone().into_iter().map(|d| { d.into() }).collect()151        ));152        for (index, data) in items_data.iter().enumerate() {153            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);154            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);155        }156    });157}158159#[test]160fn create_refungible_item() {161    new_test_ext().execute_with(|| {162        default_limits();163        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);164165        let data = default_re_fungible_data();166        create_test_item(collection_id, &data.clone().into());167        assert_eq!(168            TemplateModule::refungible_item_id(collection_id, 1).const_data,169            data.const_data170        );171        assert_eq!(172            TemplateModule::refungible_item_id(collection_id, 1).variable_data,173            data.variable_data174        );175        assert_eq!(176            TemplateModule::refungible_item_id(collection_id, 1).owner[0],177            Ownership {178                owner: 1,179                fraction: 1000180            }181        );182    });183}184185#[test]186fn create_multiple_refungible_items() {187    new_test_ext().execute_with(|| {188        default_limits();189        190        create_test_collection(&CollectionMode::ReFungible(3), 1);191192        let origin1 = Origin::signed(1);193194        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];195196        assert_ok!(TemplateModule::create_multiple_items(197            origin1.clone(),198            1,199            1,200            items_data.clone().into_iter().map(|d| { d.into() }).collect()201        ));202        for (index, data) in items_data.iter().enumerate() {203204            let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);205            assert_eq!(item.const_data.to_vec(), data.const_data);206            assert_eq!(item.variable_data.to_vec(), data.variable_data);207            assert_eq!(208                item.owner[0],209                Ownership {210                    owner: 1,211                    fraction: 1000212                }213            );214        }215    });216}217218#[test]219fn create_fungible_item() {220    new_test_ext().execute_with(|| {221        default_limits();222        223        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);224225        let data = default_fungible_data();226        create_test_item(collection_id, &data.into());227228        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);229    });230}231232#[test]233fn create_multiple_fungible_items() {234    new_test_ext().execute_with(|| {235        default_limits();236237        create_test_collection(&CollectionMode::Fungible(3), 1);238239        let origin1 = Origin::signed(1);240241        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];242243        assert_ok!(TemplateModule::create_multiple_items(244            origin1.clone(),245            1,246            1,247            items_data.clone().into_iter().map(|d| { d.into() }).collect()248        ));249        250        for (index, _) in items_data.iter().enumerate() {251            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);252        }253        assert_eq!(TemplateModule::balance_count(1, 1), 3000);254        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);255    });256}257258#[test]259fn transfer_fungible_item() {260    new_test_ext().execute_with(|| {261        default_limits();262        263        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);264265        let origin1 = Origin::signed(1);266        let origin2 = Origin::signed(2);267268        let data = default_fungible_data();269        create_test_item(collection_id, &data.into());270271        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);272        assert_eq!(TemplateModule::balance_count(1, 1), 1000);273        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);274275        // change owner scenario276        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));277        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);278        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);279        assert_eq!(TemplateModule::balance_count(1, 1), 0);280        assert_eq!(TemplateModule::balance_count(1, 2), 1000);281        // assert_eq!(TemplateModule::address_tokens(1, 1), []);282        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);283284        // split item scenario285        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));286        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);287        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);288        assert_eq!(TemplateModule::balance_count(1, 2), 500);289        assert_eq!(TemplateModule::balance_count(1, 3), 500);290        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);291        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);292293        // split item and new owner has account scenario294        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));295        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);296        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);297        assert_eq!(TemplateModule::balance_count(1, 2), 300);298        assert_eq!(TemplateModule::balance_count(1, 3), 700);299        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);300        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);301    });302}303304#[test]305fn transfer_refungible_item() {306    new_test_ext().execute_with(|| {307        default_limits();308        309        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);310311        let data = default_re_fungible_data();312        create_test_item(collection_id, &data.clone().into());313314        let origin1 = Origin::signed(1);315        let origin2 = Origin::signed(2);316        assert_eq!(317            TemplateModule::refungible_item_id(collection_id, 1).const_data,318            data.const_data319        );320        assert_eq!(321            TemplateModule::refungible_item_id(collection_id, 1).variable_data,322            data.variable_data323        );324        assert_eq!(325            TemplateModule::refungible_item_id(collection_id, 1).owner[0],326            Ownership {327                owner: 1,328                fraction: 1000329            }330        );331        assert_eq!(TemplateModule::balance_count(1, 1), 1000);332        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);333334        // change owner scenario335        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));336        assert_eq!(337            TemplateModule::refungible_item_id(1, 1).owner[0],338            Ownership {339                owner: 2,340                fraction: 1000341            }342        );343        assert_eq!(TemplateModule::balance_count(1, 1), 0);344        assert_eq!(TemplateModule::balance_count(1, 2), 1000);345        // assert_eq!(TemplateModule::address_tokens(1, 1), []);346        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347348        // split item scenario349        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));350        assert_eq!(351            TemplateModule::refungible_item_id(1, 1).owner[0],352            Ownership {353                owner: 2,354                fraction: 500355            }356        );357        assert_eq!(358            TemplateModule::refungible_item_id(1, 1).owner[1],359            Ownership {360                owner: 3,361                fraction: 500362            }363        );364        assert_eq!(TemplateModule::balance_count(1, 2), 500);365        assert_eq!(TemplateModule::balance_count(1, 3), 500);366        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);367        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);368369        // split item and new owner has account scenario370        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));371        assert_eq!(372            TemplateModule::refungible_item_id(1, 1).owner[0],373            Ownership {374                owner: 2,375                fraction: 300376            }377        );378        assert_eq!(379            TemplateModule::refungible_item_id(1, 1).owner[1],380            Ownership {381                owner: 3,382                fraction: 700383            }384        );385        assert_eq!(TemplateModule::balance_count(1, 2), 300);386        assert_eq!(TemplateModule::balance_count(1, 3), 700);387        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);388        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);389    });390}391392#[test]393fn transfer_nft_item() {394    new_test_ext().execute_with(|| {395        default_limits();396        397        let collection_id = create_test_collection(&CollectionMode::NFT, 1);398399        let data = default_nft_data();400        create_test_item(collection_id, &data.into());401        assert_eq!(TemplateModule::balance_count(1, 1), 1);402        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);403404        let origin1 = Origin::signed(1);405        // default scenario406        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));407        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);408        assert_eq!(TemplateModule::balance_count(1, 1), 0);409        assert_eq!(TemplateModule::balance_count(1, 2), 1);410        // assert_eq!(TemplateModule::address_tokens(1, 1), []);411        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);412    });413}414415#[test]416fn nft_approve_and_transfer_from() {417    new_test_ext().execute_with(|| {418        default_limits();419        420        let collection_id = create_test_collection(&CollectionMode::NFT, 1);421422        let data = default_nft_data();423        create_test_item(collection_id, &data.into());424425        let origin1 = Origin::signed(1);426        let origin2 = Origin::signed(2);427428        assert_eq!(TemplateModule::balance_count(1, 1), 1);429        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);430431        // neg transfer432        assert_noop!(TemplateModule::transfer_from(433            origin2.clone(),434            1,435            2,436            1,437            1,438            1), Error::<Test>::NoPermission);439440        // do approve441        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));442        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);443        assert_eq!(444            TemplateModule::approved(1, (1, 1))[0],445            ApprovePermissions {446                approved: 2,447                amount: 100000000448            }449        );450451        assert_ok!(TemplateModule::transfer_from(452            origin2.clone(),453            1,454            2,455            1,456            1,457            1458        ));459        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);460    });461}462463#[test]464fn nft_approve_and_transfer_from_white_list() {465    new_test_ext().execute_with(|| {466        default_limits();467        468        let collection_id = create_test_collection(&CollectionMode::NFT, 1);469470        let origin1 = Origin::signed(1);471        let origin2 = Origin::signed(2);472473        let data = default_nft_data();474        create_test_item(collection_id, &data.clone().into());475476        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);477        assert_eq!(TemplateModule::balance_count(1, 1), 1);478        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480        assert_ok!(TemplateModule::set_mint_permission(481            origin1.clone(),482            1,483            true484        ));485        assert_ok!(TemplateModule::set_public_access_mode(486            origin1.clone(),487            1,488            AccessMode::WhiteList489        ));490        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));491        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));492        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));493494        // do approve495        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));496        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);497        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));498        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);499        assert_eq!(500            TemplateModule::approved(1, (1, 1))[0],501            ApprovePermissions {502                approved: 2,503                amount: 100000000504            }505        );506507        assert_ok!(TemplateModule::transfer_from(508            origin2.clone(),509            1,510            3,511            1,512            1,513            1514        ));515        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);516    });517}518519#[test]520fn refungible_approve_and_transfer_from() {521    new_test_ext().execute_with(|| {522        default_limits();523        524        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);525        526        let origin1 = Origin::signed(1);527        let origin2 = Origin::signed(2);528529        let data = default_re_fungible_data();530        create_test_item(collection_id, &data.into());531532        assert_eq!(TemplateModule::balance_count(1, 1), 1000);533        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);534535        assert_ok!(TemplateModule::set_mint_permission(536            origin1.clone(),537            1,538            true539        ));540        assert_ok!(TemplateModule::set_public_access_mode(541            origin1.clone(),542            1,543            AccessMode::WhiteList544        ));545        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));546        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));547        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));548549        // do approve550        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));551        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);552        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));553        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);554        assert_eq!(555            TemplateModule::approved(1, (1, 1))[0],556            ApprovePermissions {557                approved: 2,558                amount: 100000000559            }560        );561562        assert_ok!(TemplateModule::transfer_from(563            origin2.clone(),564            1,565            3,566            1,567            1,568            100569        ));570        assert_eq!(TemplateModule::balance_count(1, 1), 900);571        assert_eq!(TemplateModule::balance_count(1, 3), 100);572        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);573        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);574575        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);576        assert_eq!(577            TemplateModule::approved(1, (1, 1))[0],578            ApprovePermissions {579                approved: 3,580                amount: 100000000581            }582        );583    });584}585586#[test]587fn fungible_approve_and_transfer_from() {588    new_test_ext().execute_with(|| {589        default_limits();590        591        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);592        593        let data = default_fungible_data();594        create_test_item(collection_id, &data.into());595596        let origin1 = Origin::signed(1);597        let origin2 = Origin::signed(2);598599        assert_eq!(TemplateModule::balance_count(1, 1), 1000);600        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);601602        assert_ok!(TemplateModule::set_mint_permission(603            origin1.clone(),604            1,605            true606        ));607        assert_ok!(TemplateModule::set_public_access_mode(608            origin1.clone(),609            1,610            AccessMode::WhiteList611        ));612        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));613        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));614        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));615616        // do approve617        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));618        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);619        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));620        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);621        assert_eq!(622            TemplateModule::approved(1, (1, 1))[0],623            ApprovePermissions {624                approved: 2,625                amount: 100000000626            }627        );628629        assert_ok!(TemplateModule::transfer_from(630            origin2.clone(),631            1,632            3,633            1,634            1,635            100636        ));637        assert_eq!(TemplateModule::balance_count(1, 1), 900);638        assert_eq!(TemplateModule::balance_count(1, 3), 100);639        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);640        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);641642        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);643        assert_eq!(644            TemplateModule::approved(1, (1, 1))[0],645            ApprovePermissions {646                approved: 3,647                amount: 100000000648            }649        );650651        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));652        assert_ok!(TemplateModule::transfer_from(653            origin2.clone(),654            1,655            3,656            1,657            1,658            900659        ));660        assert_eq!(TemplateModule::balance_count(1, 1), 0);661        assert_eq!(TemplateModule::balance_count(1, 3), 1000);662        // assert_eq!(TemplateModule::address_tokens(1, 1), []);663        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);664665        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);666    });667}668669#[test]670fn change_collection_owner() {671    new_test_ext().execute_with(|| {672        default_limits();673        674        let collection_id = create_test_collection(&CollectionMode::NFT, 1);675        676        let origin1 = Origin::signed(1);677        assert_ok!(TemplateModule::change_collection_owner(678            origin1.clone(),679            collection_id,680            2681        ));682        assert_eq!(TemplateModule::collection(collection_id).owner, 2);683    });684}685686#[test]687fn destroy_collection() {688    new_test_ext().execute_with(|| {689        default_limits();690        691        let collection_id = create_test_collection(&CollectionMode::NFT, 1);692        693        let origin1 = Origin::signed(1);694        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));695    });696}697698#[test]699fn burn_nft_item() {700    new_test_ext().execute_with(|| {701        default_limits();702        703        let collection_id = create_test_collection(&CollectionMode::NFT, 1);704705        let origin1 = Origin::signed(1);706        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));707        708        let data = default_nft_data();709        create_test_item(collection_id, &data.into());710711        // check balance (collection with id = 1, user id = 1)712        assert_eq!(TemplateModule::balance_count(1, 1), 1);713714        // burn item715        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));716        assert_noop!(717            TemplateModule::burn_item(origin1.clone(), 1, 1),718            Error::<Test>::TokenNotFound719        );720721        assert_eq!(TemplateModule::balance_count(1, 1), 0);722    });723}724725#[test]726fn burn_fungible_item() {727    new_test_ext().execute_with(|| {728        default_limits();729        730        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);731        732        let origin1 = Origin::signed(1);733        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));734        735        let data = default_fungible_data();736        create_test_item(collection_id, &data.into());737738        // check balance (collection with id = 1, user id = 1)739        assert_eq!(TemplateModule::balance_count(1, 1), 1000);740741        // burn item742        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));743        assert_noop!(744            TemplateModule::burn_item(origin1.clone(), 1, 1),745            Error::<Test>::TokenNotFound746        );747748        assert_eq!(TemplateModule::balance_count(1, 1), 0);749    });750}751752#[test]753fn burn_refungible_item() {754    new_test_ext().execute_with(|| {755        default_limits();756        757        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);758        let origin1 = Origin::signed(1);759760        assert_ok!(TemplateModule::set_mint_permission(761            origin1.clone(),762            collection_id,763            true764        ));765        assert_ok!(TemplateModule::set_public_access_mode(766            origin1.clone(),767            collection_id,768            AccessMode::WhiteList769        ));770        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));771772        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));773        774        let data = default_re_fungible_data();775        create_test_item(collection_id, &data.into());776777        // check balance (collection with id = 1, user id = 2)778        assert_eq!(TemplateModule::balance_count(1, 1), 1000);779780        // burn item781        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));782        assert_noop!(783            TemplateModule::burn_item(origin1.clone(), 1, 1),784            Error::<Test>::TokenNotFound785        );786787        assert_eq!(TemplateModule::balance_count(1, 1), 0);788    });789}790791#[test]792fn add_collection_admin() {793    new_test_ext().execute_with(|| {794        default_limits();795        796        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);797        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);798        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);799        800        let origin1 = Origin::signed(1);801802        // collection admin803        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));804        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));805806        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);807        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);808    });809}810811#[test]812fn remove_collection_admin() {813    new_test_ext().execute_with(|| {814        default_limits();815        816        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);817        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);818        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);819820        let origin1 = Origin::signed(1);821        let origin2 = Origin::signed(2);822823        // collection admin824        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));825        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));826827        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);828        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);829830        // remove admin831        assert_ok!(TemplateModule::remove_collection_admin(832            origin2.clone(),833            1,834            3835        ));836        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);837    });838}839840#[test]841fn balance_of() {842    new_test_ext().execute_with(|| {843        default_limits();844        845        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);846        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);847        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);848        849        // check balance before850        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);851        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);852        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);853854        let nft_data = default_nft_data();855        create_test_item(nft_collection_id, &nft_data.into());856        857        let fungible_data = default_fungible_data();858        create_test_item(fungible_collection_id, &fungible_data.into());859        860        let re_fungible_data = default_re_fungible_data();861        create_test_item(re_fungible_collection_id, &re_fungible_data.into());862863        // check balance (collection with id = 1, user id = 1)864        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);865        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);866        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);867        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);868        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);869        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);870    });871}872873#[test]874fn approve() {875    new_test_ext().execute_with(|| {876        default_limits();877        878        let collection_id = create_test_collection(&CollectionMode::NFT, 1);879        880        let data = default_nft_data();881        create_test_item(collection_id, &data.into());882883        let origin1 = Origin::signed(1);884        885        // approve886        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));887        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);888    });889}890891#[test]892fn transfer_from() {893    new_test_ext().execute_with(|| {894        default_limits();895        896        let collection_id = create_test_collection(&CollectionMode::NFT, 1);897        let origin1 = Origin::signed(1);898        let origin2 = Origin::signed(2);899900        let data = default_nft_data();901        create_test_item(collection_id, &data.into());902903        // approve904        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));905        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);906907        assert_ok!(TemplateModule::set_mint_permission(908            origin1.clone(),909            1,910            true911        ));912        assert_ok!(TemplateModule::set_public_access_mode(913            origin1.clone(),914            1,915            AccessMode::WhiteList916        ));917        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));918        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));919        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));920921        assert_ok!(TemplateModule::transfer_from(922            origin2.clone(),923            1,924            2,925            1,926            1,927            1928        ));929930        // after transfer931        assert_eq!(TemplateModule::balance_count(1, 1), 0);932        assert_eq!(TemplateModule::balance_count(1, 2), 1);933    });934}935936// #endregion937938// Coverage tests region939// #region940941#[test]942fn owner_can_add_address_to_white_list() {943    new_test_ext().execute_with(|| {944        default_limits();945        946        let collection_id = create_test_collection(&CollectionMode::NFT, 1);947948        let origin1 = Origin::signed(1);949        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));950        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);951    });952}953954#[test]955fn admin_can_add_address_to_white_list() {956    new_test_ext().execute_with(|| {957        default_limits();958        959        let collection_id = create_test_collection(&CollectionMode::NFT, 1);960        let origin1 = Origin::signed(1);961        let origin2 = Origin::signed(2);962963        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));964        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));965        assert_eq!(TemplateModule::white_list(collection_id)[0], 3);966    });967}968969#[test]970fn nonprivileged_user_cannot_add_address_to_white_list() {971    new_test_ext().execute_with(|| {972        default_limits();973        974        let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976        let origin2 = Origin::signed(2);977        assert_noop!(978            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),979            Error::<Test>::NoPermission980        );981    });982}983984#[test]985fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {986    new_test_ext().execute_with(|| {987        default_limits();988989        let origin1 = Origin::signed(1);990991        assert_noop!(992            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),993            Error::<Test>::CollectionNotFound994        );995    });996}997998#[test]999fn nobody_can_add_address_to_white_list_of_deleted_collection() {1000    new_test_ext().execute_with(|| {1001        default_limits();1002        1003        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10041005        let origin1 = Origin::signed(1);1006        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1007        assert_noop!(1008            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1009            Error::<Test>::CollectionNotFound1010        );1011    });1012}10131014// If address is already added to white list, nothing happens1015#[test]1016fn address_is_already_added_to_white_list() {1017    new_test_ext().execute_with(|| {1018        default_limits();1019        1020        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1021        let origin1 = Origin::signed(1);1022        1023        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1024        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1025        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1026        assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1027    });1028}10291030#[test]1031fn owner_can_remove_address_from_white_list() {1032    new_test_ext().execute_with(|| {1033        default_limits();1034        1035        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10361037        let origin1 = Origin::signed(1);1038        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1039        assert_ok!(TemplateModule::remove_from_white_list(1040            origin1.clone(),1041            collection_id,1042            21043        ));1044        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1045    });1046}10471048#[test]1049fn admin_can_remove_address_from_white_list() {1050    new_test_ext().execute_with(|| {1051        default_limits();1052        1053        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1054        let origin1 = Origin::signed(1);1055        let origin2 = Origin::signed(2);10561057        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10581059        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1060        assert_ok!(TemplateModule::remove_from_white_list(1061            origin2.clone(),1062            collection_id,1063            31064        ));1065        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1066    });1067}10681069#[test]1070fn nonprivileged_user_cannot_remove_address_from_white_list() {1071    new_test_ext().execute_with(|| {1072        default_limits();1073        1074        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1075        let origin1 = Origin::signed(1);1076        let origin2 = Origin::signed(2);10771078        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1079        assert_noop!(1080            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1081            Error::<Test>::NoPermission1082        );1083        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1084    });1085}10861087#[test]1088fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1089    new_test_ext().execute_with(|| {1090        default_limits();1091        let origin1 = Origin::signed(1);10921093        assert_noop!(1094            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1095            Error::<Test>::CollectionNotFound1096        );1097    });1098}10991100#[test]1101fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1102    new_test_ext().execute_with(|| {1103        default_limits();1104        1105        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1106        let origin1 = Origin::signed(1);1107        let origin2 = Origin::signed(2);11081109        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1110        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1111        assert_noop!(1112            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1113            Error::<Test>::CollectionNotFound1114        );1115        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1116    });1117}11181119// If address is already removed from white list, nothing happens1120#[test]1121fn address_is_already_removed_from_white_list() {1122    new_test_ext().execute_with(|| {1123        default_limits();1124        1125        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1126        let origin1 = Origin::signed(1);11271128        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1129        assert_ok!(TemplateModule::remove_from_white_list(1130            origin1.clone(),1131            collection_id,1132            21133        ));1134        assert_ok!(TemplateModule::remove_from_white_list(1135            origin1.clone(),1136            collection_id,1137            21138        ));1139        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1140    });1141}11421143// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1144#[test]1145fn white_list_test_1() {1146    new_test_ext().execute_with(|| {1147        default_limits();1148        1149        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11501151        let origin1 = Origin::signed(1);1152        1153        let data = default_nft_data();1154        create_test_item(collection_id, &data.into());11551156        assert_ok!(TemplateModule::set_public_access_mode(1157            origin1.clone(),1158            collection_id,1159            AccessMode::WhiteList1160        ));1161        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11621163        assert_noop!(1164            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1165            Error::<Test>::AddresNotInWhiteList1166        );1167    });1168}11691170#[test]1171fn white_list_test_2() {1172    new_test_ext().execute_with(|| {1173        default_limits();1174        1175        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1176        let origin1 = Origin::signed(1);1177        1178        let data = default_nft_data();1179        create_test_item(collection_id, &data.into());11801181        assert_ok!(TemplateModule::set_public_access_mode(1182            origin1.clone(),1183            collection_id,1184            AccessMode::WhiteList1185        ));1186        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1187        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11881189        // do approve1190        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1191        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11921193        assert_ok!(TemplateModule::remove_from_white_list(1194            origin1.clone(),1195            1,1196            11197        ));11981199        assert_noop!(1200            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1201            Error::<Test>::AddresNotInWhiteList1202        );1203    });1204}12051206// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1207#[test]1208fn white_list_test_3() {1209    new_test_ext().execute_with(|| {1210        default_limits();1211        1212        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12131214        let origin1 = Origin::signed(1);1215        1216        let data = default_nft_data();1217        create_test_item(collection_id, &data.into());12181219        assert_ok!(TemplateModule::set_public_access_mode(1220            origin1.clone(),1221            collection_id,1222            AccessMode::WhiteList1223        ));1224        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12251226        assert_noop!(1227            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1228            Error::<Test>::AddresNotInWhiteList1229        );1230    });1231}12321233#[test]1234fn white_list_test_4() {1235    new_test_ext().execute_with(|| {1236        default_limits();1237        1238        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12391240        let origin1 = Origin::signed(1);12411242        let data = default_nft_data();1243        create_test_item(collection_id, &data.into());12441245        assert_ok!(TemplateModule::set_public_access_mode(1246            origin1.clone(),1247            collection_id,1248            AccessMode::WhiteList1249        ));1250        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1251        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12521253        // do approve1254        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1255        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12561257        assert_ok!(TemplateModule::remove_from_white_list(1258            origin1.clone(),1259            collection_id,1260            21261        ));12621263        assert_noop!(1264            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1265            Error::<Test>::AddresNotInWhiteList1266        );1267    });1268}12691270// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1271#[test]1272fn white_list_test_5() {1273    new_test_ext().execute_with(|| {1274        default_limits();1275        1276        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12771278        let origin1 = Origin::signed(1);12791280        let data = default_nft_data();1281        create_test_item(collection_id, &data.into());12821283        assert_ok!(TemplateModule::set_public_access_mode(1284            origin1.clone(),1285            collection_id,1286            AccessMode::WhiteList1287        ));1288        assert_noop!(1289            TemplateModule::burn_item(origin1.clone(), 1, 1),1290            Error::<Test>::AddresNotInWhiteList1291        );1292    });1293}12941295// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1296#[test]1297fn white_list_test_6() {1298    new_test_ext().execute_with(|| {1299        default_limits();1300        1301        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13021303        let origin1 = Origin::signed(1);1304        assert_ok!(TemplateModule::set_public_access_mode(1305            origin1.clone(),1306            collection_id,1307            AccessMode::WhiteList1308        ));13091310        // do approve1311        assert_noop!(1312            TemplateModule::approve(origin1.clone(), 1, 1, 1),1313            Error::<Test>::AddresNotInWhiteList1314        );1315    });1316}13171318// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1319//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1320#[test]1321fn white_list_test_7() {1322    new_test_ext().execute_with(|| {1323        default_limits();1324        1325        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13261327        let data = default_nft_data();1328        create_test_item(collection_id, &data.into());1329        1330        let origin1 = Origin::signed(1);13311332        assert_ok!(TemplateModule::set_public_access_mode(1333            origin1.clone(),1334            collection_id,1335            AccessMode::WhiteList1336        ));1337        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1338        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13391340        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1341    });1342}13431344#[test]1345fn white_list_test_8() {1346    new_test_ext().execute_with(|| {1347        default_limits();1348        1349        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13501351        let data = default_nft_data();1352        create_test_item(collection_id, &data.into());1353        1354        let origin1 = Origin::signed(1);13551356        assert_ok!(TemplateModule::set_public_access_mode(1357            origin1.clone(),1358            collection_id,1359            AccessMode::WhiteList1360        ));1361        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1362        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13631364        // do approve1365        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1366        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13671368        assert_ok!(TemplateModule::transfer_from(1369            origin1.clone(),1370            1,1371            2,1372            1,1373            1,1374            11375        ));1376    });1377}13781379// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1380#[test]1381fn white_list_test_9() {1382    new_test_ext().execute_with(|| {1383        default_limits();1384        1385        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1386        let origin1 = Origin::signed(1);13871388        assert_ok!(TemplateModule::set_public_access_mode(1389            origin1.clone(),1390            collection_id,1391            AccessMode::WhiteList1392        ));1393        assert_ok!(TemplateModule::set_mint_permission(1394            origin1.clone(),1395            collection_id,1396            false1397        ));13981399        let data = default_nft_data();1400        create_test_item(collection_id, &data.into());1401    });1402}14031404// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1405#[test]1406fn white_list_test_10() {1407    new_test_ext().execute_with(|| {1408        default_limits();1409        1410        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14111412        let origin1 = Origin::signed(1);1413        let origin2 = Origin::signed(2);14141415        assert_ok!(TemplateModule::set_public_access_mode(1416            origin1.clone(),1417            collection_id,1418            AccessMode::WhiteList1419        ));1420        assert_ok!(TemplateModule::set_mint_permission(1421            origin1.clone(),1422            collection_id,1423            false1424        ));14251426        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14271428        assert_ok!(TemplateModule::create_item(1429            origin2.clone(),1430            collection_id,1431            2,1432            default_nft_data().into()1433        ));1434    });1435}14361437// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1438#[test]1439fn white_list_test_11() {1440    new_test_ext().execute_with(|| {1441        default_limits();1442        1443        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14441445        let origin1 = Origin::signed(1);1446        let origin2 = Origin::signed(2);14471448        assert_ok!(TemplateModule::set_public_access_mode(1449            origin1.clone(),1450            collection_id,1451            AccessMode::WhiteList1452        ));1453        assert_ok!(TemplateModule::set_mint_permission(1454            origin1.clone(),1455            collection_id,1456            false1457        ));1458        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14591460        assert_noop!(1461            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1462            Error::<Test>::PublicMintingNotAllowed1463        );1464    });1465}14661467// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1468#[test]1469fn white_list_test_12() {1470    new_test_ext().execute_with(|| {1471        default_limits();1472        1473        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14741475        let origin1 = Origin::signed(1);1476        let origin2 = Origin::signed(2);14771478        assert_ok!(TemplateModule::set_public_access_mode(1479            origin1.clone(),1480            collection_id,1481            AccessMode::WhiteList1482        ));1483        assert_ok!(TemplateModule::set_mint_permission(1484            origin1.clone(),1485            collection_id,1486            false1487        ));14881489        assert_noop!(1490            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1491            Error::<Test>::PublicMintingNotAllowed1492        );1493    });1494}14951496// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1497#[test]1498fn white_list_test_13() {1499    new_test_ext().execute_with(|| {1500        default_limits();1501        1502        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15031504        let origin1 = Origin::signed(1);15051506        assert_ok!(TemplateModule::set_public_access_mode(1507            origin1.clone(),1508            collection_id,1509            AccessMode::WhiteList1510        ));1511        assert_ok!(TemplateModule::set_mint_permission(1512            origin1.clone(),1513            collection_id,1514            true1515        ));15161517        let data = default_nft_data();1518        create_test_item(collection_id, &data.into());1519    });1520}15211522// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1523#[test]1524fn white_list_test_14() {1525    new_test_ext().execute_with(|| {1526        default_limits();1527        1528        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15291530        let origin1 = Origin::signed(1);1531        let origin2 = Origin::signed(2);15321533        assert_ok!(TemplateModule::set_public_access_mode(1534            origin1.clone(),1535            collection_id,1536            AccessMode::WhiteList1537        ));1538        assert_ok!(TemplateModule::set_mint_permission(1539            origin1.clone(),1540            collection_id,1541            true1542        ));15431544        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15451546        assert_ok!(TemplateModule::create_item(1547            origin2.clone(),1548            1,1549            2,1550            default_nft_data().into()1551        ));1552    });1553}15541555// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1556#[test]1557fn white_list_test_15() {1558    new_test_ext().execute_with(|| {1559        default_limits();1560        1561        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15621563        let origin1 = Origin::signed(1);1564        let origin2 = Origin::signed(2);15651566        assert_ok!(TemplateModule::set_public_access_mode(1567            origin1.clone(),1568            collection_id,1569            AccessMode::WhiteList1570        ));1571        assert_ok!(TemplateModule::set_mint_permission(1572            origin1.clone(),1573            collection_id,1574            true1575        ));15761577        assert_noop!(1578            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1579            Error::<Test>::AddresNotInWhiteList1580        );1581    });1582}15831584// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1585#[test]1586fn white_list_test_16() {1587    new_test_ext().execute_with(|| {1588        default_limits();1589        1590        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15911592        let origin1 = Origin::signed(1);1593        let origin2 = Origin::signed(2);15941595        assert_ok!(TemplateModule::set_public_access_mode(1596            origin1.clone(),1597            collection_id,1598            AccessMode::WhiteList1599        ));1600        assert_ok!(TemplateModule::set_mint_permission(1601            origin1.clone(),1602            collection_id,1603            true1604        ));1605        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16061607        assert_ok!(TemplateModule::create_item(1608            origin2.clone(),1609            1,1610            2,1611            default_nft_data().into()1612        ));1613    });1614}16151616// Total number of collections. Positive test1617#[test]1618fn total_number_collections_bound() {1619    new_test_ext().execute_with(|| {1620        default_limits();1621        1622        create_test_collection(&CollectionMode::NFT, 1);1623    });1624}16251626// Total number of collections. Negotive test1627#[test]1628fn total_number_collections_bound_neg() {1629    new_test_ext().execute_with(|| {1630        default_limits();16311632        let origin1 = Origin::signed(1);16331634        for i in 0..default_collection_numbers_limit() {1635            create_test_collection(&CollectionMode::NFT, i + 1);1636        }16371638        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1639        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1640        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16411642        // 11-th collection in chain. Expects error1643        assert_noop!(TemplateModule::create_collection(1644            origin1.clone(),1645            col_name1.clone(),1646            col_desc1.clone(),1647            token_prefix1.clone(),1648            CollectionMode::NFT1649        ), Error::<Test>::TotalCollectionsLimitExceeded);1650    });1651}16521653// Owned tokens by a single address. Positive test1654#[test]1655fn owned_tokens_bound() {1656    new_test_ext().execute_with(|| {1657        default_limits();1658        1659        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16601661        let data = default_nft_data();1662        create_test_item(collection_id, &data.clone().into());1663        create_test_item(collection_id, &data.into());1664    });1665}16661667// Owned tokens by a single address. Negotive test1668#[test]1669fn owned_tokens_bound_neg() {1670    new_test_ext().execute_with(|| {1671        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1672            collection_numbers_limit: 10,1673            account_token_ownership_limit: 1,1674            collections_admins_limit: 5,1675            custom_data_limit: 2048,1676            nft_sponsor_transfer_timeout: 15,1677            fungible_sponsor_transfer_timeout: 15,1678            refungible_sponsor_transfer_timeout: 15,          1679        }));1680        1681        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16821683        let origin1 = Origin::signed(1);1684        let data = default_nft_data();1685        create_test_item(collection_id, &data.clone().into());16861687        assert_noop!(TemplateModule::create_item(1688            origin1.clone(),1689            1,1690            1,1691            data.into()1692        ),  Error::<Test>::AddressOwnershipLimitExceeded);1693    });1694}16951696// Number of collection admins. Positive test1697#[test]1698fn collection_admins_bound() {1699    new_test_ext().execute_with(|| {1700        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1701            collection_numbers_limit: 10,1702            account_token_ownership_limit: 10,1703            collections_admins_limit: 2,1704            custom_data_limit: 2048,1705            nft_sponsor_transfer_timeout: 15,1706            fungible_sponsor_transfer_timeout: 15,1707            refungible_sponsor_transfer_timeout: 15,          1708        }));1709        1710        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17111712        let origin1 = Origin::signed(1);1713        1714        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1715        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1716    });1717}17181719// Number of collection admins. Negotive test1720#[test]1721fn collection_admins_bound_neg() {1722    new_test_ext().execute_with(|| {1723        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1724            collection_numbers_limit: 10,1725            account_token_ownership_limit: 1,1726            collections_admins_limit: 1,1727            custom_data_limit: 2048,1728            nft_sponsor_transfer_timeout: 15,1729            fungible_sponsor_transfer_timeout: 15,1730            refungible_sponsor_transfer_timeout: 15,          1731        }));1732        1733        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17341735        let origin1 = Origin::signed(1);17361737        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1738        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1739    });1740}17411742// NFT custom data size. Negative test const_data.1743#[test]1744fn custom_data_size_nft_const_data_bound_neg() {1745    new_test_ext().execute_with(|| {1746        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1747            collection_numbers_limit: 10,1748            account_token_ownership_limit: 10,1749            collections_admins_limit: 5,1750            custom_data_limit: 2,1751            nft_sponsor_transfer_timeout: 15,1752            fungible_sponsor_transfer_timeout: 15,1753            refungible_sponsor_transfer_timeout: 15,          1754        }));1755        1756        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17571758        let origin1 = Origin::signed(1);1759        let too_big_const_data = CreateItemData::NFT(CreateNftData{1760            const_data: vec![1, 2, 3, 4],1761            variable_data: vec![]1762        });17631764        assert_noop!(TemplateModule::create_item(1765            origin1.clone(),1766            collection_id,1767            1,1768            too_big_const_data1769        ), Error::<Test>::TokenConstDataLimitExceeded);1770    });1771}17721773// NFT custom data size. Negative test variable_data.1774#[test]1775fn custom_data_size_nft_variable_data_bound_neg() {1776    new_test_ext().execute_with(|| {1777        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1778            collection_numbers_limit: 10,1779            account_token_ownership_limit: 10,1780            collections_admins_limit: 5,1781            custom_data_limit: 2,1782            nft_sponsor_transfer_timeout: 15,1783            fungible_sponsor_transfer_timeout: 15,1784            refungible_sponsor_transfer_timeout: 15,          1785        }));17861787        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17881789        let origin1 = Origin::signed(1);1790        let too_big_const_data = CreateItemData::NFT(CreateNftData{1791            const_data: vec![],1792            variable_data: vec![1, 2, 3, 4]1793        });17941795        assert_noop!(TemplateModule::create_item(1796            origin1.clone(),1797            collection_id,1798            1,1799            too_big_const_data1800        ), Error::<Test>::TokenVariableDataLimitExceeded);1801    });1802}18031804// Re fungible custom data size. Negative test const_data.1805#[test]1806fn custom_data_size_re_fungible_const_data_bound_neg() {1807    new_test_ext().execute_with(|| {1808        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1809            collection_numbers_limit: 10,1810            account_token_ownership_limit: 10,1811            collections_admins_limit: 5,1812            custom_data_limit: 2,1813            nft_sponsor_transfer_timeout: 15,1814            fungible_sponsor_transfer_timeout: 15,1815            refungible_sponsor_transfer_timeout: 15,          1816        }));18171818        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18191820        let origin1 = Origin::signed(1);1821        let too_big_const_data = CreateItemData::NFT(CreateNftData{1822            const_data: vec![1, 2, 3, 4],1823            variable_data: vec![]1824        });18251826        assert_noop!(TemplateModule::create_item(1827            origin1.clone(),1828            collection_id,1829            1,1830            too_big_const_data1831        ), Error::<Test>::TokenConstDataLimitExceeded);1832    });1833}18341835// Re fungible custom data size. Negative test variable_data.1836#[test]1837fn custom_data_size_re_fungible_variable_data_bound_neg() {1838    new_test_ext().execute_with(|| {1839        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1840            collection_numbers_limit: 10,1841            account_token_ownership_limit: 10,1842            collections_admins_limit: 5,1843            custom_data_limit: 2,1844            nft_sponsor_transfer_timeout: 15,1845            fungible_sponsor_transfer_timeout: 15,1846            refungible_sponsor_transfer_timeout: 15,          1847        }));18481849        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18501851        let origin1 = Origin::signed(1);1852        let too_big_const_data = CreateItemData::NFT(CreateNftData{1853            const_data: vec![],1854            variable_data: vec![1, 2, 3, 4]1855        });18561857        assert_noop!(TemplateModule::create_item(1858            origin1.clone(),1859            collection_id,1860            1,1861            too_big_const_data1862        ), Error::<Test>::TokenVariableDataLimitExceeded);1863    });1864}1865// #endregion18661867#[test]1868fn set_const_on_chain_schema() {1869    new_test_ext().execute_with(|| {1870        default_limits();18711872        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18731874        let origin1 = Origin::signed(1);1875        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18761877        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1878        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1879    });1880}18811882#[test]1883fn set_variable_on_chain_schema() {1884    new_test_ext().execute_with(|| {1885        default_limits();1886        1887        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18881889        let origin1 = Origin::signed(1);1890        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18911892        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1893        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1894    });1895}18961897#[test]1898fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1899    new_test_ext().execute_with(|| {1900        default_limits();19011902        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19031904        let origin1 = Origin::signed(1);1905        1906        let data = default_nft_data();1907        create_test_item(1, &data.into());1908        1909        let variable_data = b"test set_variable_meta_data method.".to_vec();1910        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19111912        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1913    });1914}19151916#[test]1917fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1918    new_test_ext().execute_with(|| {1919        default_limits();19201921        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19221923        let origin1 = Origin::signed(1);19241925        let data = default_re_fungible_data();1926        create_test_item(1, &data.into());19271928        let variable_data = b"test set_variable_meta_data method.".to_vec();1929        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19301931        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1932    });1933}193419351936#[test]1937fn set_variable_meta_data_on_fungible_token_fails() {1938    new_test_ext().execute_with(|| {1939        default_limits();19401941        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19421943        let origin1 = Origin::signed(1);19441945        let data = default_fungible_data();1946        create_test_item(1, &data.into());19471948        let variable_data = b"test set_variable_meta_data method.".to_vec();1949        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1950    });1951}19521953#[test]1954fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1955    new_test_ext().execute_with(|| {1956        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1957            collection_numbers_limit: default_collection_numbers_limit(),1958            account_token_ownership_limit: 10,1959            collections_admins_limit: 5,1960            custom_data_limit: 10,1961            nft_sponsor_transfer_timeout: 15,1962            fungible_sponsor_transfer_timeout: 15,1963            refungible_sponsor_transfer_timeout: 15,          1964        }));19651966        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19671968        let origin1 = Origin::signed(1);19691970        let data = default_nft_data();1971        create_test_item(1, &data.into());19721973        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1974        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1975    });1976}19771978#[test]1979fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1980    new_test_ext().execute_with(|| {1981        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1982            collection_numbers_limit: default_collection_numbers_limit(),1983            account_token_ownership_limit: 10,1984            collections_admins_limit: 5,1985            custom_data_limit: 10,1986            nft_sponsor_transfer_timeout: 15,1987            fungible_sponsor_transfer_timeout: 15,1988            refungible_sponsor_transfer_timeout: 15,          1989        }));199019911992        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19931994        let origin1 = Origin::signed(1);19951996        let data = default_re_fungible_data();1997        create_test_item(1, &data.into());19981999        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2000        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2001    });2002}
after · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5    Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6    CollectionId, TokenId, MAX_DECIMAL_POINTS};7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11    1012}1314fn default_limits() {15    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16            collection_numbers_limit: default_collection_numbers_limit(),17            account_token_ownership_limit: 10,18            collections_admins_limit: 5,19            custom_data_limit: 2048,20            nft_sponsor_transfer_timeout: 15,21            fungible_sponsor_transfer_timeout: 15,22            refungible_sponsor_transfer_timeout: 15,          23        }));24}2526fn default_nft_data() -> CreateNftData {27    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31    CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243    let origin1 = Origin::signed(owner);44    assert_ok!(TemplateModule::create_collection(45            origin1.clone(),46            col_name1.clone(),47            col_desc1.clone(),48            token_prefix1.clone(),49            mode.clone()50        ));5152    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55    assert_eq!(TemplateModule::collection(id).owner, owner);56    assert_eq!(TemplateModule::collection(id).name, saved_col_name);57    assert_eq!(TemplateModule::collection(id).mode, *mode);58    assert_eq!(TemplateModule::collection(id).description, saved_description);59    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60    id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64    create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68    let origin1 = Origin::signed(1);69    assert_ok!(TemplateModule::create_item(70            origin1.clone(),71            collection_id,72            1,73            data.clone()74        ));7576}7778// Use cases tests region79// #region8081#[test]82fn set_version_schema() {83    new_test_ext().execute_with(|| {84        default_limits();85        let origin1 = Origin::signed(1);86        let collection_id = create_test_collection(&CollectionMode::NFT, 1);87        88        assert_ok!(TemplateModule::set_schema_version(origin1, collection_id, SchemaVersion::Unique));89        assert_eq!(TemplateModule::collection(collection_id).schema_version, SchemaVersion::Unique);90    });91}9293#[test]94fn create_fungible_collection_fails_with_large_decimal_numbers() {95    new_test_ext().execute_with(|| {96        default_limits();9798        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();99        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();100        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();101102        let origin1 = Origin::signed(1);103        assert_noop!(TemplateModule::create_collection(104            origin1,105            col_name1,106            col_desc1,107            token_prefix1,108            CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)109        ), Error::<Test>::CollectionDecimalPointLimitExceeded);110    });    111}112113#[test]114fn create_re_fungible_collection_fails_with_large_decimal_numbers() {115    new_test_ext().execute_with(|| {116        default_limits();117118        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();119        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();120        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();121122        let origin1 = Origin::signed(1);123        assert_noop!(TemplateModule::create_collection(124            origin1,125            col_name1,126            col_desc1,127            token_prefix1,128            CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)129        ), Error::<Test>::CollectionDecimalPointLimitExceeded);130    });131}132133#[test]134fn create_nft_item() {135    new_test_ext().execute_with(|| {136        default_limits();137        let collection_id = create_test_collection(&CollectionMode::NFT, 1);138        139        let data = default_nft_data();140        create_test_item(collection_id, &data.clone().into());141        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);142        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);143    });144}145146// Use cases tests region147// #region148#[test]149fn create_nft_multiple_items() {150    new_test_ext().execute_with(|| {151        default_limits();152        153        create_test_collection(&CollectionMode::NFT, 1);154155        let origin1 = Origin::signed(1);156157        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];158159        assert_ok!(TemplateModule::create_multiple_items(160            origin1.clone(),161            1,162            1,163            items_data.clone().into_iter().map(|d| { d.into() }).collect()164        ));165        for (index, data) in items_data.iter().enumerate() {166            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);167            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);168        }169    });170}171172#[test]173fn create_refungible_item() {174    new_test_ext().execute_with(|| {175        default_limits();176        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);177178        let data = default_re_fungible_data();179        create_test_item(collection_id, &data.clone().into());180        assert_eq!(181            TemplateModule::refungible_item_id(collection_id, 1).const_data,182            data.const_data183        );184        assert_eq!(185            TemplateModule::refungible_item_id(collection_id, 1).variable_data,186            data.variable_data187        );188        assert_eq!(189            TemplateModule::refungible_item_id(collection_id, 1).owner[0],190            Ownership {191                owner: 1,192                fraction: 1000193            }194        );195    });196}197198#[test]199fn create_multiple_refungible_items() {200    new_test_ext().execute_with(|| {201        default_limits();202        203        create_test_collection(&CollectionMode::ReFungible(3), 1);204205        let origin1 = Origin::signed(1);206207        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];208209        assert_ok!(TemplateModule::create_multiple_items(210            origin1.clone(),211            1,212            1,213            items_data.clone().into_iter().map(|d| { d.into() }).collect()214        ));215        for (index, data) in items_data.iter().enumerate() {216217            let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);218            assert_eq!(item.const_data.to_vec(), data.const_data);219            assert_eq!(item.variable_data.to_vec(), data.variable_data);220            assert_eq!(221                item.owner[0],222                Ownership {223                    owner: 1,224                    fraction: 1000225                }226            );227        }228    });229}230231#[test]232fn create_fungible_item() {233    new_test_ext().execute_with(|| {234        default_limits();235        236        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);237238        let data = default_fungible_data();239        create_test_item(collection_id, &data.into());240241        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);242    });243}244245#[test]246fn create_multiple_fungible_items() {247    new_test_ext().execute_with(|| {248        default_limits();249250        create_test_collection(&CollectionMode::Fungible(3), 1);251252        let origin1 = Origin::signed(1);253254        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];255256        assert_ok!(TemplateModule::create_multiple_items(257            origin1.clone(),258            1,259            1,260            items_data.clone().into_iter().map(|d| { d.into() }).collect()261        ));262        263        for (index, _) in items_data.iter().enumerate() {264            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);265        }266        assert_eq!(TemplateModule::balance_count(1, 1), 3000);267        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);268    });269}270271#[test]272fn transfer_fungible_item() {273    new_test_ext().execute_with(|| {274        default_limits();275        276        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);277278        let origin1 = Origin::signed(1);279        let origin2 = Origin::signed(2);280281        let data = default_fungible_data();282        create_test_item(collection_id, &data.into());283284        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);285        assert_eq!(TemplateModule::balance_count(1, 1), 1000);286        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);287288        // change owner scenario289        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));290        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);291        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);292        assert_eq!(TemplateModule::balance_count(1, 1), 0);293        assert_eq!(TemplateModule::balance_count(1, 2), 1000);294        // assert_eq!(TemplateModule::address_tokens(1, 1), []);295        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);296297        // split item scenario298        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));299        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);300        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);301        assert_eq!(TemplateModule::balance_count(1, 2), 500);302        assert_eq!(TemplateModule::balance_count(1, 3), 500);303        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);304        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);305306        // split item and new owner has account scenario307        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));308        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);309        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);310        assert_eq!(TemplateModule::balance_count(1, 2), 300);311        assert_eq!(TemplateModule::balance_count(1, 3), 700);312        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);313        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);314    });315}316317#[test]318fn transfer_refungible_item() {319    new_test_ext().execute_with(|| {320        default_limits();321        322        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);323324        let data = default_re_fungible_data();325        create_test_item(collection_id, &data.clone().into());326327        let origin1 = Origin::signed(1);328        let origin2 = Origin::signed(2);329        assert_eq!(330            TemplateModule::refungible_item_id(collection_id, 1).const_data,331            data.const_data332        );333        assert_eq!(334            TemplateModule::refungible_item_id(collection_id, 1).variable_data,335            data.variable_data336        );337        assert_eq!(338            TemplateModule::refungible_item_id(collection_id, 1).owner[0],339            Ownership {340                owner: 1,341                fraction: 1000342            }343        );344        assert_eq!(TemplateModule::balance_count(1, 1), 1000);345        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);346347        // change owner scenario348        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));349        assert_eq!(350            TemplateModule::refungible_item_id(1, 1).owner[0],351            Ownership {352                owner: 2,353                fraction: 1000354            }355        );356        assert_eq!(TemplateModule::balance_count(1, 1), 0);357        assert_eq!(TemplateModule::balance_count(1, 2), 1000);358        // assert_eq!(TemplateModule::address_tokens(1, 1), []);359        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);360361        // split item scenario362        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));363        assert_eq!(364            TemplateModule::refungible_item_id(1, 1).owner[0],365            Ownership {366                owner: 2,367                fraction: 500368            }369        );370        assert_eq!(371            TemplateModule::refungible_item_id(1, 1).owner[1],372            Ownership {373                owner: 3,374                fraction: 500375            }376        );377        assert_eq!(TemplateModule::balance_count(1, 2), 500);378        assert_eq!(TemplateModule::balance_count(1, 3), 500);379        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);380        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);381382        // split item and new owner has account scenario383        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));384        assert_eq!(385            TemplateModule::refungible_item_id(1, 1).owner[0],386            Ownership {387                owner: 2,388                fraction: 300389            }390        );391        assert_eq!(392            TemplateModule::refungible_item_id(1, 1).owner[1],393            Ownership {394                owner: 3,395                fraction: 700396            }397        );398        assert_eq!(TemplateModule::balance_count(1, 2), 300);399        assert_eq!(TemplateModule::balance_count(1, 3), 700);400        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);401        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);402    });403}404405#[test]406fn transfer_nft_item() {407    new_test_ext().execute_with(|| {408        default_limits();409        410        let collection_id = create_test_collection(&CollectionMode::NFT, 1);411412        let data = default_nft_data();413        create_test_item(collection_id, &data.into());414        assert_eq!(TemplateModule::balance_count(1, 1), 1);415        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);416417        let origin1 = Origin::signed(1);418        // default scenario419        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));420        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);421        assert_eq!(TemplateModule::balance_count(1, 1), 0);422        assert_eq!(TemplateModule::balance_count(1, 2), 1);423        // assert_eq!(TemplateModule::address_tokens(1, 1), []);424        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);425    });426}427428#[test]429fn nft_approve_and_transfer_from() {430    new_test_ext().execute_with(|| {431        default_limits();432        433        let collection_id = create_test_collection(&CollectionMode::NFT, 1);434435        let data = default_nft_data();436        create_test_item(collection_id, &data.into());437438        let origin1 = Origin::signed(1);439        let origin2 = Origin::signed(2);440441        assert_eq!(TemplateModule::balance_count(1, 1), 1);442        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);443444        // neg transfer445        assert_noop!(TemplateModule::transfer_from(446            origin2.clone(),447            1,448            2,449            1,450            1,451            1), Error::<Test>::NoPermission);452453        // do approve454        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));455        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);456        assert_eq!(457            TemplateModule::approved(1, (1, 1))[0],458            ApprovePermissions {459                approved: 2,460                amount: 100000000461            }462        );463464        assert_ok!(TemplateModule::transfer_from(465            origin2.clone(),466            1,467            2,468            1,469            1,470            1471        ));472        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);473    });474}475476#[test]477fn nft_approve_and_transfer_from_white_list() {478    new_test_ext().execute_with(|| {479        default_limits();480        481        let collection_id = create_test_collection(&CollectionMode::NFT, 1);482483        let origin1 = Origin::signed(1);484        let origin2 = Origin::signed(2);485486        let data = default_nft_data();487        create_test_item(collection_id, &data.clone().into());488489        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);490        assert_eq!(TemplateModule::balance_count(1, 1), 1);491        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);492493        assert_ok!(TemplateModule::set_mint_permission(494            origin1.clone(),495            1,496            true497        ));498        assert_ok!(TemplateModule::set_public_access_mode(499            origin1.clone(),500            1,501            AccessMode::WhiteList502        ));503        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));504        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));505        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));506507        // do approve508        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));509        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);510        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));511        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);512        assert_eq!(513            TemplateModule::approved(1, (1, 1))[0],514            ApprovePermissions {515                approved: 2,516                amount: 100000000517            }518        );519520        assert_ok!(TemplateModule::transfer_from(521            origin2.clone(),522            1,523            3,524            1,525            1,526            1527        ));528        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);529    });530}531532#[test]533fn refungible_approve_and_transfer_from() {534    new_test_ext().execute_with(|| {535        default_limits();536        537        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);538        539        let origin1 = Origin::signed(1);540        let origin2 = Origin::signed(2);541542        let data = default_re_fungible_data();543        create_test_item(collection_id, &data.into());544545        assert_eq!(TemplateModule::balance_count(1, 1), 1000);546        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);547548        assert_ok!(TemplateModule::set_mint_permission(549            origin1.clone(),550            1,551            true552        ));553        assert_ok!(TemplateModule::set_public_access_mode(554            origin1.clone(),555            1,556            AccessMode::WhiteList557        ));558        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));559        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));560        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));561562        // do approve563        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));564        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);565        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));566        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);567        assert_eq!(568            TemplateModule::approved(1, (1, 1))[0],569            ApprovePermissions {570                approved: 2,571                amount: 100000000572            }573        );574575        assert_ok!(TemplateModule::transfer_from(576            origin2.clone(),577            1,578            3,579            1,580            1,581            100582        ));583        assert_eq!(TemplateModule::balance_count(1, 1), 900);584        assert_eq!(TemplateModule::balance_count(1, 3), 100);585        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);586        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);587588        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);589        assert_eq!(590            TemplateModule::approved(1, (1, 1))[0],591            ApprovePermissions {592                approved: 3,593                amount: 100000000594            }595        );596    });597}598599#[test]600fn fungible_approve_and_transfer_from() {601    new_test_ext().execute_with(|| {602        default_limits();603        604        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);605        606        let data = default_fungible_data();607        create_test_item(collection_id, &data.into());608609        let origin1 = Origin::signed(1);610        let origin2 = Origin::signed(2);611612        assert_eq!(TemplateModule::balance_count(1, 1), 1000);613        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);614615        assert_ok!(TemplateModule::set_mint_permission(616            origin1.clone(),617            1,618            true619        ));620        assert_ok!(TemplateModule::set_public_access_mode(621            origin1.clone(),622            1,623            AccessMode::WhiteList624        ));625        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));626        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));627        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));628629        // do approve630        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));631        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);632        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));633        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);634        assert_eq!(635            TemplateModule::approved(1, (1, 1))[0],636            ApprovePermissions {637                approved: 2,638                amount: 100000000639            }640        );641642        assert_ok!(TemplateModule::transfer_from(643            origin2.clone(),644            1,645            3,646            1,647            1,648            100649        ));650        assert_eq!(TemplateModule::balance_count(1, 1), 900);651        assert_eq!(TemplateModule::balance_count(1, 3), 100);652        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);653        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);654655        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);656        assert_eq!(657            TemplateModule::approved(1, (1, 1))[0],658            ApprovePermissions {659                approved: 3,660                amount: 100000000661            }662        );663664        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));665        assert_ok!(TemplateModule::transfer_from(666            origin2.clone(),667            1,668            3,669            1,670            1,671            900672        ));673        assert_eq!(TemplateModule::balance_count(1, 1), 0);674        assert_eq!(TemplateModule::balance_count(1, 3), 1000);675        // assert_eq!(TemplateModule::address_tokens(1, 1), []);676        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);677678        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);679    });680}681682#[test]683fn change_collection_owner() {684    new_test_ext().execute_with(|| {685        default_limits();686        687        let collection_id = create_test_collection(&CollectionMode::NFT, 1);688        689        let origin1 = Origin::signed(1);690        assert_ok!(TemplateModule::change_collection_owner(691            origin1.clone(),692            collection_id,693            2694        ));695        assert_eq!(TemplateModule::collection(collection_id).owner, 2);696    });697}698699#[test]700fn destroy_collection() {701    new_test_ext().execute_with(|| {702        default_limits();703        704        let collection_id = create_test_collection(&CollectionMode::NFT, 1);705        706        let origin1 = Origin::signed(1);707        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));708    });709}710711#[test]712fn burn_nft_item() {713    new_test_ext().execute_with(|| {714        default_limits();715        716        let collection_id = create_test_collection(&CollectionMode::NFT, 1);717718        let origin1 = Origin::signed(1);719        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));720        721        let data = default_nft_data();722        create_test_item(collection_id, &data.into());723724        // check balance (collection with id = 1, user id = 1)725        assert_eq!(TemplateModule::balance_count(1, 1), 1);726727        // burn item728        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));729        assert_noop!(730            TemplateModule::burn_item(origin1.clone(), 1, 1),731            Error::<Test>::TokenNotFound732        );733734        assert_eq!(TemplateModule::balance_count(1, 1), 0);735    });736}737738#[test]739fn burn_fungible_item() {740    new_test_ext().execute_with(|| {741        default_limits();742        743        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);744        745        let origin1 = Origin::signed(1);746        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));747        748        let data = default_fungible_data();749        create_test_item(collection_id, &data.into());750751        // check balance (collection with id = 1, user id = 1)752        assert_eq!(TemplateModule::balance_count(1, 1), 1000);753754        // burn item755        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));756        assert_noop!(757            TemplateModule::burn_item(origin1.clone(), 1, 1),758            Error::<Test>::TokenNotFound759        );760761        assert_eq!(TemplateModule::balance_count(1, 1), 0);762    });763}764765#[test]766fn burn_refungible_item() {767    new_test_ext().execute_with(|| {768        default_limits();769        770        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);771        let origin1 = Origin::signed(1);772773        assert_ok!(TemplateModule::set_mint_permission(774            origin1.clone(),775            collection_id,776            true777        ));778        assert_ok!(TemplateModule::set_public_access_mode(779            origin1.clone(),780            collection_id,781            AccessMode::WhiteList782        ));783        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));784785        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));786        787        let data = default_re_fungible_data();788        create_test_item(collection_id, &data.into());789790        // check balance (collection with id = 1, user id = 2)791        assert_eq!(TemplateModule::balance_count(1, 1), 1000);792793        // burn item794        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));795        assert_noop!(796            TemplateModule::burn_item(origin1.clone(), 1, 1),797            Error::<Test>::TokenNotFound798        );799800        assert_eq!(TemplateModule::balance_count(1, 1), 0);801    });802}803804#[test]805fn add_collection_admin() {806    new_test_ext().execute_with(|| {807        default_limits();808        809        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);810        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);811        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);812        813        let origin1 = Origin::signed(1);814815        // collection admin816        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));817        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));818819        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);820        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);821    });822}823824#[test]825fn remove_collection_admin() {826    new_test_ext().execute_with(|| {827        default_limits();828        829        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);830        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);831        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);832833        let origin1 = Origin::signed(1);834        let origin2 = Origin::signed(2);835836        // collection admin837        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));838        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));839840        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);841        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);842843        // remove admin844        assert_ok!(TemplateModule::remove_collection_admin(845            origin2.clone(),846            1,847            3848        ));849        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);850    });851}852853#[test]854fn balance_of() {855    new_test_ext().execute_with(|| {856        default_limits();857        858        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);859        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);860        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);861        862        // check balance before863        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);864        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);865        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);866867        let nft_data = default_nft_data();868        create_test_item(nft_collection_id, &nft_data.into());869        870        let fungible_data = default_fungible_data();871        create_test_item(fungible_collection_id, &fungible_data.into());872        873        let re_fungible_data = default_re_fungible_data();874        create_test_item(re_fungible_collection_id, &re_fungible_data.into());875876        // check balance (collection with id = 1, user id = 1)877        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);878        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);879        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);880        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);881        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);882        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);883    });884}885886#[test]887fn approve() {888    new_test_ext().execute_with(|| {889        default_limits();890        891        let collection_id = create_test_collection(&CollectionMode::NFT, 1);892        893        let data = default_nft_data();894        create_test_item(collection_id, &data.into());895896        let origin1 = Origin::signed(1);897        898        // approve899        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));900        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);901    });902}903904#[test]905fn transfer_from() {906    new_test_ext().execute_with(|| {907        default_limits();908        909        let collection_id = create_test_collection(&CollectionMode::NFT, 1);910        let origin1 = Origin::signed(1);911        let origin2 = Origin::signed(2);912913        let data = default_nft_data();914        create_test_item(collection_id, &data.into());915916        // approve917        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));918        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);919920        assert_ok!(TemplateModule::set_mint_permission(921            origin1.clone(),922            1,923            true924        ));925        assert_ok!(TemplateModule::set_public_access_mode(926            origin1.clone(),927            1,928            AccessMode::WhiteList929        ));930        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));931        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));932        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));933934        assert_ok!(TemplateModule::transfer_from(935            origin2.clone(),936            1,937            2,938            1,939            1,940            1941        ));942943        // after transfer944        assert_eq!(TemplateModule::balance_count(1, 1), 0);945        assert_eq!(TemplateModule::balance_count(1, 2), 1);946    });947}948949// #endregion950951// Coverage tests region952// #region953954#[test]955fn owner_can_add_address_to_white_list() {956    new_test_ext().execute_with(|| {957        default_limits();958        959        let collection_id = create_test_collection(&CollectionMode::NFT, 1);960961        let origin1 = Origin::signed(1);962        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));963        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);964    });965}966967#[test]968fn admin_can_add_address_to_white_list() {969    new_test_ext().execute_with(|| {970        default_limits();971        972        let collection_id = create_test_collection(&CollectionMode::NFT, 1);973        let origin1 = Origin::signed(1);974        let origin2 = Origin::signed(2);975976        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));977        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));978        assert_eq!(TemplateModule::white_list(collection_id)[0], 3);979    });980}981982#[test]983fn nonprivileged_user_cannot_add_address_to_white_list() {984    new_test_ext().execute_with(|| {985        default_limits();986        987        let collection_id = create_test_collection(&CollectionMode::NFT, 1);988989        let origin2 = Origin::signed(2);990        assert_noop!(991            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),992            Error::<Test>::NoPermission993        );994    });995}996997#[test]998fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {999    new_test_ext().execute_with(|| {1000        default_limits();10011002        let origin1 = Origin::signed(1);10031004        assert_noop!(1005            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1006            Error::<Test>::CollectionNotFound1007        );1008    });1009}10101011#[test]1012fn nobody_can_add_address_to_white_list_of_deleted_collection() {1013    new_test_ext().execute_with(|| {1014        default_limits();1015        1016        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10171018        let origin1 = Origin::signed(1);1019        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1020        assert_noop!(1021            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1022            Error::<Test>::CollectionNotFound1023        );1024    });1025}10261027// If address is already added to white list, nothing happens1028#[test]1029fn address_is_already_added_to_white_list() {1030    new_test_ext().execute_with(|| {1031        default_limits();1032        1033        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1034        let origin1 = Origin::signed(1);1035        1036        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1037        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1038        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1039        assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1040    });1041}10421043#[test]1044fn owner_can_remove_address_from_white_list() {1045    new_test_ext().execute_with(|| {1046        default_limits();1047        1048        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10491050        let origin1 = Origin::signed(1);1051        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1052        assert_ok!(TemplateModule::remove_from_white_list(1053            origin1.clone(),1054            collection_id,1055            21056        ));1057        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1058    });1059}10601061#[test]1062fn admin_can_remove_address_from_white_list() {1063    new_test_ext().execute_with(|| {1064        default_limits();1065        1066        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1067        let origin1 = Origin::signed(1);1068        let origin2 = Origin::signed(2);10691070        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10711072        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1073        assert_ok!(TemplateModule::remove_from_white_list(1074            origin2.clone(),1075            collection_id,1076            31077        ));1078        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1079    });1080}10811082#[test]1083fn nonprivileged_user_cannot_remove_address_from_white_list() {1084    new_test_ext().execute_with(|| {1085        default_limits();1086        1087        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1088        let origin1 = Origin::signed(1);1089        let origin2 = Origin::signed(2);10901091        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1092        assert_noop!(1093            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1094            Error::<Test>::NoPermission1095        );1096        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1097    });1098}10991100#[test]1101fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1102    new_test_ext().execute_with(|| {1103        default_limits();1104        let origin1 = Origin::signed(1);11051106        assert_noop!(1107            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1108            Error::<Test>::CollectionNotFound1109        );1110    });1111}11121113#[test]1114fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1115    new_test_ext().execute_with(|| {1116        default_limits();1117        1118        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1119        let origin1 = Origin::signed(1);1120        let origin2 = Origin::signed(2);11211122        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1123        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1124        assert_noop!(1125            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1126            Error::<Test>::CollectionNotFound1127        );1128        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1129    });1130}11311132// If address is already removed from white list, nothing happens1133#[test]1134fn address_is_already_removed_from_white_list() {1135    new_test_ext().execute_with(|| {1136        default_limits();1137        1138        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1139        let origin1 = Origin::signed(1);11401141        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1142        assert_ok!(TemplateModule::remove_from_white_list(1143            origin1.clone(),1144            collection_id,1145            21146        ));1147        assert_ok!(TemplateModule::remove_from_white_list(1148            origin1.clone(),1149            collection_id,1150            21151        ));1152        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1153    });1154}11551156// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1157#[test]1158fn white_list_test_1() {1159    new_test_ext().execute_with(|| {1160        default_limits();1161        1162        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11631164        let origin1 = Origin::signed(1);1165        1166        let data = default_nft_data();1167        create_test_item(collection_id, &data.into());11681169        assert_ok!(TemplateModule::set_public_access_mode(1170            origin1.clone(),1171            collection_id,1172            AccessMode::WhiteList1173        ));1174        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11751176        assert_noop!(1177            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1178            Error::<Test>::AddresNotInWhiteList1179        );1180    });1181}11821183#[test]1184fn white_list_test_2() {1185    new_test_ext().execute_with(|| {1186        default_limits();1187        1188        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1189        let origin1 = Origin::signed(1);1190        1191        let data = default_nft_data();1192        create_test_item(collection_id, &data.into());11931194        assert_ok!(TemplateModule::set_public_access_mode(1195            origin1.clone(),1196            collection_id,1197            AccessMode::WhiteList1198        ));1199        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1200        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));12011202        // do approve1203        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1204        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12051206        assert_ok!(TemplateModule::remove_from_white_list(1207            origin1.clone(),1208            1,1209            11210        ));12111212        assert_noop!(1213            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1214            Error::<Test>::AddresNotInWhiteList1215        );1216    });1217}12181219// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1220#[test]1221fn white_list_test_3() {1222    new_test_ext().execute_with(|| {1223        default_limits();1224        1225        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12261227        let origin1 = Origin::signed(1);1228        1229        let data = default_nft_data();1230        create_test_item(collection_id, &data.into());12311232        assert_ok!(TemplateModule::set_public_access_mode(1233            origin1.clone(),1234            collection_id,1235            AccessMode::WhiteList1236        ));1237        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12381239        assert_noop!(1240            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1241            Error::<Test>::AddresNotInWhiteList1242        );1243    });1244}12451246#[test]1247fn white_list_test_4() {1248    new_test_ext().execute_with(|| {1249        default_limits();1250        1251        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12521253        let origin1 = Origin::signed(1);12541255        let data = default_nft_data();1256        create_test_item(collection_id, &data.into());12571258        assert_ok!(TemplateModule::set_public_access_mode(1259            origin1.clone(),1260            collection_id,1261            AccessMode::WhiteList1262        ));1263        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1264        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12651266        // do approve1267        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1268        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12691270        assert_ok!(TemplateModule::remove_from_white_list(1271            origin1.clone(),1272            collection_id,1273            21274        ));12751276        assert_noop!(1277            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1278            Error::<Test>::AddresNotInWhiteList1279        );1280    });1281}12821283// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1284#[test]1285fn white_list_test_5() {1286    new_test_ext().execute_with(|| {1287        default_limits();1288        1289        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12901291        let origin1 = Origin::signed(1);12921293        let data = default_nft_data();1294        create_test_item(collection_id, &data.into());12951296        assert_ok!(TemplateModule::set_public_access_mode(1297            origin1.clone(),1298            collection_id,1299            AccessMode::WhiteList1300        ));1301        assert_noop!(1302            TemplateModule::burn_item(origin1.clone(), 1, 1),1303            Error::<Test>::AddresNotInWhiteList1304        );1305    });1306}13071308// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1309#[test]1310fn white_list_test_6() {1311    new_test_ext().execute_with(|| {1312        default_limits();1313        1314        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13151316        let origin1 = Origin::signed(1);1317        assert_ok!(TemplateModule::set_public_access_mode(1318            origin1.clone(),1319            collection_id,1320            AccessMode::WhiteList1321        ));13221323        // do approve1324        assert_noop!(1325            TemplateModule::approve(origin1.clone(), 1, 1, 1),1326            Error::<Test>::AddresNotInWhiteList1327        );1328    });1329}13301331// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1332//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1333#[test]1334fn white_list_test_7() {1335    new_test_ext().execute_with(|| {1336        default_limits();1337        1338        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13391340        let data = default_nft_data();1341        create_test_item(collection_id, &data.into());1342        1343        let origin1 = Origin::signed(1);13441345        assert_ok!(TemplateModule::set_public_access_mode(1346            origin1.clone(),1347            collection_id,1348            AccessMode::WhiteList1349        ));1350        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1351        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13521353        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1354    });1355}13561357#[test]1358fn white_list_test_8() {1359    new_test_ext().execute_with(|| {1360        default_limits();1361        1362        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13631364        let data = default_nft_data();1365        create_test_item(collection_id, &data.into());1366        1367        let origin1 = Origin::signed(1);13681369        assert_ok!(TemplateModule::set_public_access_mode(1370            origin1.clone(),1371            collection_id,1372            AccessMode::WhiteList1373        ));1374        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1375        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13761377        // do approve1378        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1379        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13801381        assert_ok!(TemplateModule::transfer_from(1382            origin1.clone(),1383            1,1384            2,1385            1,1386            1,1387            11388        ));1389    });1390}13911392// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1393#[test]1394fn white_list_test_9() {1395    new_test_ext().execute_with(|| {1396        default_limits();1397        1398        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1399        let origin1 = Origin::signed(1);14001401        assert_ok!(TemplateModule::set_public_access_mode(1402            origin1.clone(),1403            collection_id,1404            AccessMode::WhiteList1405        ));1406        assert_ok!(TemplateModule::set_mint_permission(1407            origin1.clone(),1408            collection_id,1409            false1410        ));14111412        let data = default_nft_data();1413        create_test_item(collection_id, &data.into());1414    });1415}14161417// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1418#[test]1419fn white_list_test_10() {1420    new_test_ext().execute_with(|| {1421        default_limits();1422        1423        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14241425        let origin1 = Origin::signed(1);1426        let origin2 = Origin::signed(2);14271428        assert_ok!(TemplateModule::set_public_access_mode(1429            origin1.clone(),1430            collection_id,1431            AccessMode::WhiteList1432        ));1433        assert_ok!(TemplateModule::set_mint_permission(1434            origin1.clone(),1435            collection_id,1436            false1437        ));14381439        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14401441        assert_ok!(TemplateModule::create_item(1442            origin2.clone(),1443            collection_id,1444            2,1445            default_nft_data().into()1446        ));1447    });1448}14491450// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1451#[test]1452fn white_list_test_11() {1453    new_test_ext().execute_with(|| {1454        default_limits();1455        1456        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14571458        let origin1 = Origin::signed(1);1459        let origin2 = Origin::signed(2);14601461        assert_ok!(TemplateModule::set_public_access_mode(1462            origin1.clone(),1463            collection_id,1464            AccessMode::WhiteList1465        ));1466        assert_ok!(TemplateModule::set_mint_permission(1467            origin1.clone(),1468            collection_id,1469            false1470        ));1471        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14721473        assert_noop!(1474            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1475            Error::<Test>::PublicMintingNotAllowed1476        );1477    });1478}14791480// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1481#[test]1482fn white_list_test_12() {1483    new_test_ext().execute_with(|| {1484        default_limits();1485        1486        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14871488        let origin1 = Origin::signed(1);1489        let origin2 = Origin::signed(2);14901491        assert_ok!(TemplateModule::set_public_access_mode(1492            origin1.clone(),1493            collection_id,1494            AccessMode::WhiteList1495        ));1496        assert_ok!(TemplateModule::set_mint_permission(1497            origin1.clone(),1498            collection_id,1499            false1500        ));15011502        assert_noop!(1503            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1504            Error::<Test>::PublicMintingNotAllowed1505        );1506    });1507}15081509// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1510#[test]1511fn white_list_test_13() {1512    new_test_ext().execute_with(|| {1513        default_limits();1514        1515        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15161517        let origin1 = Origin::signed(1);15181519        assert_ok!(TemplateModule::set_public_access_mode(1520            origin1.clone(),1521            collection_id,1522            AccessMode::WhiteList1523        ));1524        assert_ok!(TemplateModule::set_mint_permission(1525            origin1.clone(),1526            collection_id,1527            true1528        ));15291530        let data = default_nft_data();1531        create_test_item(collection_id, &data.into());1532    });1533}15341535// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1536#[test]1537fn white_list_test_14() {1538    new_test_ext().execute_with(|| {1539        default_limits();1540        1541        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15421543        let origin1 = Origin::signed(1);1544        let origin2 = Origin::signed(2);15451546        assert_ok!(TemplateModule::set_public_access_mode(1547            origin1.clone(),1548            collection_id,1549            AccessMode::WhiteList1550        ));1551        assert_ok!(TemplateModule::set_mint_permission(1552            origin1.clone(),1553            collection_id,1554            true1555        ));15561557        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15581559        assert_ok!(TemplateModule::create_item(1560            origin2.clone(),1561            1,1562            2,1563            default_nft_data().into()1564        ));1565    });1566}15671568// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1569#[test]1570fn white_list_test_15() {1571    new_test_ext().execute_with(|| {1572        default_limits();1573        1574        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15751576        let origin1 = Origin::signed(1);1577        let origin2 = Origin::signed(2);15781579        assert_ok!(TemplateModule::set_public_access_mode(1580            origin1.clone(),1581            collection_id,1582            AccessMode::WhiteList1583        ));1584        assert_ok!(TemplateModule::set_mint_permission(1585            origin1.clone(),1586            collection_id,1587            true1588        ));15891590        assert_noop!(1591            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1592            Error::<Test>::AddresNotInWhiteList1593        );1594    });1595}15961597// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1598#[test]1599fn white_list_test_16() {1600    new_test_ext().execute_with(|| {1601        default_limits();1602        1603        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16041605        let origin1 = Origin::signed(1);1606        let origin2 = Origin::signed(2);16071608        assert_ok!(TemplateModule::set_public_access_mode(1609            origin1.clone(),1610            collection_id,1611            AccessMode::WhiteList1612        ));1613        assert_ok!(TemplateModule::set_mint_permission(1614            origin1.clone(),1615            collection_id,1616            true1617        ));1618        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16191620        assert_ok!(TemplateModule::create_item(1621            origin2.clone(),1622            1,1623            2,1624            default_nft_data().into()1625        ));1626    });1627}16281629// Total number of collections. Positive test1630#[test]1631fn total_number_collections_bound() {1632    new_test_ext().execute_with(|| {1633        default_limits();1634        1635        create_test_collection(&CollectionMode::NFT, 1);1636    });1637}16381639// Total number of collections. Negotive test1640#[test]1641fn total_number_collections_bound_neg() {1642    new_test_ext().execute_with(|| {1643        default_limits();16441645        let origin1 = Origin::signed(1);16461647        for i in 0..default_collection_numbers_limit() {1648            create_test_collection(&CollectionMode::NFT, i + 1);1649        }16501651        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1652        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1653        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16541655        // 11-th collection in chain. Expects error1656        assert_noop!(TemplateModule::create_collection(1657            origin1.clone(),1658            col_name1.clone(),1659            col_desc1.clone(),1660            token_prefix1.clone(),1661            CollectionMode::NFT1662        ), Error::<Test>::TotalCollectionsLimitExceeded);1663    });1664}16651666// Owned tokens by a single address. Positive test1667#[test]1668fn owned_tokens_bound() {1669    new_test_ext().execute_with(|| {1670        default_limits();1671        1672        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16731674        let data = default_nft_data();1675        create_test_item(collection_id, &data.clone().into());1676        create_test_item(collection_id, &data.into());1677    });1678}16791680// Owned tokens by a single address. Negotive test1681#[test]1682fn owned_tokens_bound_neg() {1683    new_test_ext().execute_with(|| {1684        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1685            collection_numbers_limit: 10,1686            account_token_ownership_limit: 1,1687            collections_admins_limit: 5,1688            custom_data_limit: 2048,1689            nft_sponsor_transfer_timeout: 15,1690            fungible_sponsor_transfer_timeout: 15,1691            refungible_sponsor_transfer_timeout: 15,          1692        }));1693        1694        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16951696        let origin1 = Origin::signed(1);1697        let data = default_nft_data();1698        create_test_item(collection_id, &data.clone().into());16991700        assert_noop!(TemplateModule::create_item(1701            origin1.clone(),1702            1,1703            1,1704            data.into()1705        ),  Error::<Test>::AddressOwnershipLimitExceeded);1706    });1707}17081709// Number of collection admins. Positive test1710#[test]1711fn collection_admins_bound() {1712    new_test_ext().execute_with(|| {1713        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1714            collection_numbers_limit: 10,1715            account_token_ownership_limit: 10,1716            collections_admins_limit: 2,1717            custom_data_limit: 2048,1718            nft_sponsor_transfer_timeout: 15,1719            fungible_sponsor_transfer_timeout: 15,1720            refungible_sponsor_transfer_timeout: 15,          1721        }));1722        1723        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17241725        let origin1 = Origin::signed(1);1726        1727        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1728        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1729    });1730}17311732// Number of collection admins. Negotive test1733#[test]1734fn collection_admins_bound_neg() {1735    new_test_ext().execute_with(|| {1736        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1737            collection_numbers_limit: 10,1738            account_token_ownership_limit: 1,1739            collections_admins_limit: 1,1740            custom_data_limit: 2048,1741            nft_sponsor_transfer_timeout: 15,1742            fungible_sponsor_transfer_timeout: 15,1743            refungible_sponsor_transfer_timeout: 15,          1744        }));1745        1746        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748        let origin1 = Origin::signed(1);17491750        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1751        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1752    });1753}17541755// NFT custom data size. Negative test const_data.1756#[test]1757fn custom_data_size_nft_const_data_bound_neg() {1758    new_test_ext().execute_with(|| {1759        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1760            collection_numbers_limit: 10,1761            account_token_ownership_limit: 10,1762            collections_admins_limit: 5,1763            custom_data_limit: 2,1764            nft_sponsor_transfer_timeout: 15,1765            fungible_sponsor_transfer_timeout: 15,1766            refungible_sponsor_transfer_timeout: 15,          1767        }));1768        1769        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17701771        let origin1 = Origin::signed(1);1772        let too_big_const_data = CreateItemData::NFT(CreateNftData{1773            const_data: vec![1, 2, 3, 4],1774            variable_data: vec![]1775        });17761777        assert_noop!(TemplateModule::create_item(1778            origin1.clone(),1779            collection_id,1780            1,1781            too_big_const_data1782        ), Error::<Test>::TokenConstDataLimitExceeded);1783    });1784}17851786// NFT custom data size. Negative test variable_data.1787#[test]1788fn custom_data_size_nft_variable_data_bound_neg() {1789    new_test_ext().execute_with(|| {1790        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1791            collection_numbers_limit: 10,1792            account_token_ownership_limit: 10,1793            collections_admins_limit: 5,1794            custom_data_limit: 2,1795            nft_sponsor_transfer_timeout: 15,1796            fungible_sponsor_transfer_timeout: 15,1797            refungible_sponsor_transfer_timeout: 15,          1798        }));17991800        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18011802        let origin1 = Origin::signed(1);1803        let too_big_const_data = CreateItemData::NFT(CreateNftData{1804            const_data: vec![],1805            variable_data: vec![1, 2, 3, 4]1806        });18071808        assert_noop!(TemplateModule::create_item(1809            origin1.clone(),1810            collection_id,1811            1,1812            too_big_const_data1813        ), Error::<Test>::TokenVariableDataLimitExceeded);1814    });1815}18161817// Re fungible custom data size. Negative test const_data.1818#[test]1819fn custom_data_size_re_fungible_const_data_bound_neg() {1820    new_test_ext().execute_with(|| {1821        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1822            collection_numbers_limit: 10,1823            account_token_ownership_limit: 10,1824            collections_admins_limit: 5,1825            custom_data_limit: 2,1826            nft_sponsor_transfer_timeout: 15,1827            fungible_sponsor_transfer_timeout: 15,1828            refungible_sponsor_transfer_timeout: 15,          1829        }));18301831        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18321833        let origin1 = Origin::signed(1);1834        let too_big_const_data = CreateItemData::NFT(CreateNftData{1835            const_data: vec![1, 2, 3, 4],1836            variable_data: vec![]1837        });18381839        assert_noop!(TemplateModule::create_item(1840            origin1.clone(),1841            collection_id,1842            1,1843            too_big_const_data1844        ), Error::<Test>::TokenConstDataLimitExceeded);1845    });1846}18471848// Re fungible custom data size. Negative test variable_data.1849#[test]1850fn custom_data_size_re_fungible_variable_data_bound_neg() {1851    new_test_ext().execute_with(|| {1852        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1853            collection_numbers_limit: 10,1854            account_token_ownership_limit: 10,1855            collections_admins_limit: 5,1856            custom_data_limit: 2,1857            nft_sponsor_transfer_timeout: 15,1858            fungible_sponsor_transfer_timeout: 15,1859            refungible_sponsor_transfer_timeout: 15,          1860        }));18611862        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18631864        let origin1 = Origin::signed(1);1865        let too_big_const_data = CreateItemData::NFT(CreateNftData{1866            const_data: vec![],1867            variable_data: vec![1, 2, 3, 4]1868        });18691870        assert_noop!(TemplateModule::create_item(1871            origin1.clone(),1872            collection_id,1873            1,1874            too_big_const_data1875        ), Error::<Test>::TokenVariableDataLimitExceeded);1876    });1877}1878// #endregion18791880#[test]1881fn set_const_on_chain_schema() {1882    new_test_ext().execute_with(|| {1883        default_limits();18841885        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18861887        let origin1 = Origin::signed(1);1888        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18891890        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1891        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1892    });1893}18941895#[test]1896fn set_variable_on_chain_schema() {1897    new_test_ext().execute_with(|| {1898        default_limits();1899        1900        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19011902        let origin1 = Origin::signed(1);1903        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));19041905        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1906        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1907    });1908}19091910#[test]1911fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1912    new_test_ext().execute_with(|| {1913        default_limits();19141915        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19161917        let origin1 = Origin::signed(1);1918        1919        let data = default_nft_data();1920        create_test_item(1, &data.into());1921        1922        let variable_data = b"test set_variable_meta_data method.".to_vec();1923        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19241925        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1926    });1927}19281929#[test]1930fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1931    new_test_ext().execute_with(|| {1932        default_limits();19331934        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19351936        let origin1 = Origin::signed(1);19371938        let data = default_re_fungible_data();1939        create_test_item(1, &data.into());19401941        let variable_data = b"test set_variable_meta_data method.".to_vec();1942        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19431944        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1945    });1946}194719481949#[test]1950fn set_variable_meta_data_on_fungible_token_fails() {1951    new_test_ext().execute_with(|| {1952        default_limits();19531954        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19551956        let origin1 = Origin::signed(1);19571958        let data = default_fungible_data();1959        create_test_item(1, &data.into());19601961        let variable_data = b"test set_variable_meta_data method.".to_vec();1962        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1963    });1964}19651966#[test]1967fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1968    new_test_ext().execute_with(|| {1969        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1970            collection_numbers_limit: default_collection_numbers_limit(),1971            account_token_ownership_limit: 10,1972            collections_admins_limit: 5,1973            custom_data_limit: 10,1974            nft_sponsor_transfer_timeout: 15,1975            fungible_sponsor_transfer_timeout: 15,1976            refungible_sponsor_transfer_timeout: 15,          1977        }));19781979        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19801981        let origin1 = Origin::signed(1);19821983        let data = default_nft_data();1984        create_test_item(1, &data.into());19851986        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1987        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1988    });1989}19901991#[test]1992fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1993    new_test_ext().execute_with(|| {1994        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1995            collection_numbers_limit: default_collection_numbers_limit(),1996            account_token_ownership_limit: 10,1997            collections_admins_limit: 5,1998            custom_data_limit: 10,1999            nft_sponsor_transfer_timeout: 15,2000            fungible_sponsor_transfer_timeout: 15,2001            refungible_sponsor_transfer_timeout: 15,          2002        }));200320042005        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);20062007        let origin1 = Origin::signed(1);20082009        let data = default_re_fungible_data();2010        create_test_item(1, &data.into());20112012        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2013        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2014    });2015}