git.delta.rocks / unique-network / refs/commits / a1bffc717b20

difftreelog

Fix unit test building

Greg Zaitsev2021-11-23parent: #76d8b56.patch.diff
in: master

8 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5097,6 +5097,7 @@
  "frame-system-rpc-runtime-api",
  "hex-literal",
  "nft-data-structs",
+ "orml-vesting",
  "pallet-aura",
  "pallet-balances",
  "pallet-common",
@@ -5120,7 +5121,6 @@
  "pallet-transaction-payment-rpc-runtime-api",
  "pallet-treasury",
  "pallet-unq-scheduler",
- "pallet-vesting",
  "pallet-xcm",
  "parachain-info",
  "parity-scale-codec",
@@ -5308,6 +5308,21 @@
 ]
 
 [[package]]
+name = "orml-vesting"
+version = "0.4.1-dev"
+source = "git+https://github.com/UniqueNetwork/open-runtime-module-library#d69f226e332ae29b7b33d53d2f06f309d2986ea0"
+dependencies = [
+ "frame-support",
+ "frame-system",
+ "parity-scale-codec",
+ "scale-info",
+ "serde",
+ "sp-io",
+ "sp-runtime",
+ "sp-std",
+]
+
+[[package]]
 name = "owning_ref"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -273,8 +273,8 @@
 		TotalCollectionsLimitExceeded,
 		/// variable_data exceeded data limit.
 		TokenVariableDataLimitExceeded,
-		/// Exceeded max admin amount
-		CollectionAdminAmountExceeded,
+		/// Exceeded max admin count
+		CollectionAdminCountExceeded,
 
 		/// Collection settings not allowing items transferring
 		TransferNotAllowed,
@@ -479,10 +479,10 @@
 		if admin {
 			let amount = amount
 				.checked_add(1)
-				.ok_or(<Error<T>>::CollectionAdminAmountExceeded)?;
+				.ok_or(<Error<T>>::CollectionAdminCountExceeded)?;
 			ensure!(
 				amount <= Self::collection_admins_limit(),
-				<Error<T>>::CollectionAdminAmountExceeded,
+				<Error<T>>::CollectionAdminCountExceeded,
 			);
 
 			// =========
modifiedpallets/fungible/src/common.rsdiffbeforeafterboth
--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -182,7 +182,7 @@
 		_token: TokenId,
 		_data: Vec<u8>,
 	) -> DispatchResultWithPostInfo {
-		fail!(<Error<T>>::FungibleItemsHaveData)
+		fail!(<Error<T>>::FungibleItemsDontHaveData)
 	}
 
 	fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId> {
modifiedpallets/fungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -35,7 +35,7 @@
 		/// Not default id passed as TokenId argument
 		FungibleItemsHaveNoId,
 		/// Tried to set data for fungible item
-		FungibleItemsHaveData,
+		FungibleItemsDontHaveData,
 	}
 
 	#[pallet::config]
@@ -44,15 +44,15 @@
 	}
 
 	#[pallet::pallet]
-	#[pallet::generate_store(pub(super) trait Store)]
+	#[pallet::generate_store(pub trait Store)]
 	pub struct Pallet<T>(_);
 
 	#[pallet::storage]
-	pub(super) type TotalSupply<T: Config> =
+	pub type TotalSupply<T: Config> =
 		StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u128, QueryKind = ValueQuery>;
 
 	#[pallet::storage]
-	pub(super) type Balance<T: Config> = StorageNMap<
+	pub type Balance<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			Key<Blake2_128Concat, T::CrossAccountId>,
@@ -62,7 +62,7 @@
 	>;
 
 	#[pallet::storage]
-	pub(super) type Allowance<T: Config> = StorageNMap<
+	pub type Allowance<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			Key<Blake2_128, T::CrossAccountId>,
modifiedpallets/nft/src/mock.rsdiffbeforeafterboth
--- a/pallets/nft/src/mock.rs
+++ b/pallets/nft/src/mock.rs
@@ -124,25 +124,35 @@
 #[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, TypeInfo)]
 pub struct TestCrossAccountId(u64, sp_core::H160);
 impl CrossAccountId<u64> for TestCrossAccountId {
+	fn as_sub(&self) -> &u64 {
+		&self.0
+	}
+	fn as_eth(&self) -> &sp_core::H160 {
+		&self.1
+	}
 	fn from_sub(sub: u64) -> Self {
 		let mut eth = [0; 20];
 		eth[12..20].copy_from_slice(&sub.to_be_bytes());
 		Self(sub, sp_core::H160(eth))
 	}
-	fn as_sub(&self) -> &u64 {
-		&self.0
-	}
 	fn from_eth(eth: sp_core::H160) -> Self {
 		let mut sub_raw = [0; 8];
 		sub_raw.copy_from_slice(&eth.0[0..8]);
 		let sub = u64::from_be_bytes(sub_raw);
 		Self(sub, eth)
 	}
-	fn as_eth(&self) -> &sp_core::H160 {
-		&self.1
+	fn conv_eq(&self, other: &Self) -> bool {
+		self.as_sub() == other.as_sub()
+	}
+}
+
+impl Default for TestCrossAccountId {
+	fn default() -> Self {
+		Self::from_sub(0)
 	}
 }
 
+
 pub struct TestEtheremTransactionSender;
 impl pallet_ethereum::EthereumTransactionSender for TestEtheremTransactionSender {
 	fn submit_logs_transaction(
@@ -157,6 +167,27 @@
 	type EthereumTransactionSender = TestEtheremTransactionSender;
 }
 
+impl pallet_common::Config for Test {
+	type Event = ();
+	type EvmBackwardsAddressMapping = TestEvmBackwardsAddressMapping;
+	type EvmAddressMapping = TestEvmAddressMapping;
+	type CrossAccountId = TestCrossAccountId;
+
+	type Currency = Balances;
+	type CollectionCreationPrice = CollectionCreationPrice;
+	type TreasuryAccountId = TreasuryAccountId;
+}
+
+impl pallet_fungible::Config for Test {
+	type WeightInfo = ();
+}
+impl pallet_refungible::Config for Test {
+	type WeightInfo = ();
+}
+impl pallet_nonfungible::Config for Test {
+	type WeightInfo = ();
+}
+
 impl pallet_template::Config for Test {
 	type WeightInfo = ();
 }
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, CreateItemData};5use nft_data_structs::{6	CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7	MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use sp_std::convert::TryInto;1112fn default_nft_data() -> CreateNftData {13	CreateNftData {14		const_data: vec![1, 2, 3].try_into().unwrap(),15		variable_data: vec![3, 2, 1].try_into().unwrap(),16	}17}1819fn default_fungible_data() -> CreateFungibleData {20	CreateFungibleData { value: 5 }21}2223fn default_re_fungible_data() -> CreateReFungibleData {24	CreateReFungibleData {25		const_data: vec![1, 2, 3].try_into().unwrap(),26		variable_data: vec![3, 2, 1].try_into().unwrap(),27		pieces: 1023,28	}29}3031fn create_test_collection_for_owner(32	mode: &CollectionMode,33	owner: u64,34	id: CollectionId,35) -> CollectionId {36	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();37	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();38	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3940	let origin1 = Origin::signed(owner);41	assert_ok!(TemplateModule::create_collection(42		origin1,43		col_name1,44		col_desc1,45		token_prefix1,46		mode.clone()47	));4849	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();50	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();51	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();52	assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);53	assert_eq!(54		TemplateModule::collection_id(id).unwrap().name,55		saved_col_name56	);57	assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);58	assert_eq!(59		TemplateModule::collection_id(id).unwrap().description,60		saved_description61	);62	assert_eq!(63		TemplateModule::collection_id(id).unwrap().token_prefix,64		saved_prefix65	);66	id67}6869fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {70	create_test_collection_for_owner(&mode, 1, id)71}7273fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {74	let origin1 = Origin::signed(1);75	assert_ok!(TemplateModule::create_item(76		origin1,77		collection_id,78		account(1),79		data.clone()80	));81}8283fn account(sub: u64) -> TestCrossAccountId {84	TestCrossAccountId::from_sub(sub)85}8687// Use cases tests region88// #region8990#[test]91fn set_version_schema() {92	new_test_ext().execute_with(|| {93		let origin1 = Origin::signed(1);94		let collection_id = create_test_collection(&CollectionMode::NFT, 1);9596		assert_ok!(TemplateModule::set_schema_version(97			origin1,98			collection_id,99			SchemaVersion::Unique100		));101		assert_eq!(102			TemplateModule::collection_id(collection_id)103				.unwrap()104				.schema_version,105			SchemaVersion::Unique106		);107	});108}109110#[test]111fn create_fungible_collection_fails_with_large_decimal_numbers() {112	new_test_ext().execute_with(|| {113		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();114		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();115		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();116117		let origin1 = Origin::signed(1);118		assert_noop!(119			TemplateModule::create_collection(120				origin1,121				col_name1,122				col_desc1,123				token_prefix1,124				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)125			),126			Error::<Test>::CollectionDecimalPointLimitExceeded127		);128	});129}130131#[test]132fn create_nft_item() {133	new_test_ext().execute_with(|| {134		let collection_id = create_test_collection(&CollectionMode::NFT, 1);135136		let data = default_nft_data();137		create_test_item(collection_id, &data.clone().into());138		let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();139		assert_eq!(item.const_data, data.const_data.into_inner());140		assert_eq!(item.variable_data, data.variable_data.into_inner());141	});142}143144// Use cases tests region145// #region146#[test]147fn create_nft_multiple_items() {148	new_test_ext().execute_with(|| {149		create_test_collection(&CollectionMode::NFT, 1);150151		let origin1 = Origin::signed(1);152153		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];154155		assert_ok!(TemplateModule::create_multiple_items(156			origin1,157			1,158			account(1),159			items_data160				.clone()161				.into_iter()162				.map(|d| { d.into() })163				.collect()164		));165		for (index, data) in items_data.into_iter().enumerate() {166			let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();167			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());168			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());169		}170	});171}172173#[test]174fn create_refungible_item() {175	new_test_ext().execute_with(|| {176		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);177178		let data = default_re_fungible_data();179		create_test_item(collection_id, &data.clone().into());180		let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();181		let balance = TemplateModule::balance(collection_id, 1, account(1));182		assert_eq!(item.const_data, data.const_data.into_inner());183		assert_eq!(item.variable_data, data.variable_data.into_inner());184		assert_eq!(balance, 1023);185	});186}187188#[test]189fn create_multiple_refungible_items() {190	new_test_ext().execute_with(|| {191		create_test_collection(&CollectionMode::ReFungible, 1);192193		let origin1 = Origin::signed(1);194195		let items_data = vec![196			default_re_fungible_data(),197			default_re_fungible_data(),198			default_re_fungible_data(),199		];200201		assert_ok!(TemplateModule::create_multiple_items(202			origin1,203			1,204			account(1),205			items_data206				.clone()207				.into_iter()208				.map(|d| { d.into() })209				.collect()210		));211		for (index, data) in items_data.into_iter().enumerate() {212			let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();213			let balance = TemplateModule::balance(1, 1, account(1));214			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());215			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());216			assert_eq!(balance, 1023);217		}218	});219}220221#[test]222fn create_fungible_item() {223	new_test_ext().execute_with(|| {224		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);225226		let data = default_fungible_data();227		create_test_item(collection_id, &data.into());228229		assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);230	});231}232233//#[test]234// fn create_multiple_fungible_items() {235//     new_test_ext().execute_with(|| {236//         default_limits();237238//         create_test_collection(&CollectionMode::Fungible(3), 1);239240//         let origin1 = Origin::signed(1);241242//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];243244//         assert_ok!(TemplateModule::create_multiple_items(245//             origin1.clone(),246//             1,247//             1,248//             items_data.clone().into_iter().map(|d| { d.into() }).collect()249//         ));250251//         for (index, _) in items_data.iter().enumerate() {252//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);253//         }254//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);255//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);256//     });257// }258259#[test]260fn transfer_fungible_item() {261	new_test_ext().execute_with(|| {262		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);263264		let origin1 = Origin::signed(1);265		let origin2 = Origin::signed(2);266267		let data = default_fungible_data();268		create_test_item(collection_id, &data.into());269270		assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);271		assert_eq!(TemplateModule::balance_count(1, 1), 5);272273		// change owner scenario274		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));275		assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);276		assert_eq!(TemplateModule::balance_count(1, 1), 0);277		assert_eq!(TemplateModule::balance_count(1, 2), 5);278279		// split item scenario280		assert_ok!(TemplateModule::transfer(281			origin2.clone(),282			account(3),283			1,284			1,285			3286		));287		assert_eq!(TemplateModule::balance_count(1, 2), 2);288		assert_eq!(TemplateModule::balance_count(1, 3), 3);289290		// split item and new owner has account scenario291		assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));292		assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);293		assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);294		assert_eq!(TemplateModule::balance_count(1, 2), 1);295		assert_eq!(TemplateModule::balance_count(1, 3), 4);296	});297}298299#[test]300fn transfer_refungible_item() {301	new_test_ext().execute_with(|| {302		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);303304		let data = default_re_fungible_data();305		create_test_item(collection_id, &data.clone().into());306307		let origin1 = Origin::signed(1);308		let origin2 = Origin::signed(2);309		{310			let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();311			let balance = TemplateModule::balance(collection_id, 1, account(1));312			assert_eq!(item.const_data, data.const_data.into_inner());313			assert_eq!(item.variable_data, data.variable_data.into_inner());314			assert_eq!(balance, 1023);315		}316		assert_eq!(TemplateModule::balance_count(1, 1), 1023);317		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);318319		// change owner scenario320		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));321322		let balance2 = TemplateModule::balance(collection_id, 1, account(2));323		assert_eq!(balance2, 1023);324		assert_eq!(TemplateModule::balance_count(1, 1), 0);325		assert_eq!(TemplateModule::balance_count(1, 2), 1023);326		// assert_eq!(TemplateModule::address_tokens(1, 1), []);327		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);328329		// split item scenario330		assert_ok!(TemplateModule::transfer(331			origin2.clone(),332			account(3),333			1,334			1,335			500336		));337		{338			let item = TemplateModule::refungible_item_id(1, 1).unwrap();339			let balance2 = TemplateModule::balance(collection_id, 1, account(2));340			let balance3 = TemplateModule::balance(collection_id, 1, account(3));341			assert_eq!(balance2, 523);342			assert_eq!(balance3, 500);343		}344		assert_eq!(TemplateModule::balance_count(1, 2), 523);345		assert_eq!(TemplateModule::balance_count(1, 3), 500);346		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);348349		// split item and new owner has account scenario350		assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));351		{352			let item = TemplateModule::refungible_item_id(1, 1).unwrap();353			let balance2 = TemplateModule::balance(collection_id, 1, account(2));354			let balance3 = TemplateModule::balance(collection_id, 1, account(3));355			assert_eq!(balance2, 323);356			assert_eq!(balance3, 700);357		}358		assert_eq!(TemplateModule::balance_count(1, 2), 323);359		assert_eq!(TemplateModule::balance_count(1, 3), 700);360		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);361		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);362	});363}364365#[test]366fn transfer_nft_item() {367	new_test_ext().execute_with(|| {368		let collection_id = create_test_collection(&CollectionMode::NFT, 1);369370		let data = default_nft_data();371		create_test_item(collection_id, &data.into());372		assert_eq!(TemplateModule::balance_count(1, 1), 1);373		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);374375		let origin1 = Origin::signed(1);376		// default scenario377		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));378		assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));379		assert_eq!(TemplateModule::balance_count(1, 1), 0);380		assert_eq!(TemplateModule::balance_count(1, 2), 1);381		// assert_eq!(TemplateModule::address_tokens(1, 1), []);382		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);383	});384}385386#[test]387fn nft_approve_and_transfer_from() {388	new_test_ext().execute_with(|| {389		let collection_id = create_test_collection(&CollectionMode::NFT, 1);390391		let data = default_nft_data();392		create_test_item(collection_id, &data.into());393394		let origin1 = Origin::signed(1);395		let origin2 = Origin::signed(2);396397		assert_eq!(TemplateModule::balance_count(1, 1), 1);398		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);399400		// neg transfer401		assert_noop!(402			TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),403			Error::<Test>::NoPermission404		);405406		// do approve407		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));408		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);409		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);410411		assert_ok!(TemplateModule::transfer_from(412			origin2,413			account(1),414			account(3),415			1,416			1,417			1418		));419		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);420	});421}422423#[test]424fn nft_approve_and_transfer_from_allow_list() {425	new_test_ext().execute_with(|| {426		let collection_id = create_test_collection(&CollectionMode::NFT, 1);427428		let origin1 = Origin::signed(1);429		let origin2 = Origin::signed(2);430431		let data = default_nft_data();432		create_test_item(collection_id, &data.clone().into());433434		assert_eq!(435			&TemplateModule::nft_item_id(1, 1).unwrap().const_data,436			&data.const_data.into_inner()437		);438		assert_eq!(TemplateModule::balance_count(1, 1), 1);439		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);440441		assert_ok!(TemplateModule::set_mint_permission(442			origin1.clone(),443			1,444			true445		));446		assert_ok!(TemplateModule::set_public_access_mode(447			origin1.clone(),448			1,449			AccessMode::AllowList450		));451		assert_ok!(TemplateModule::add_to_allow_list(452			origin1.clone(),453			1,454			account(1)455		));456		assert_ok!(TemplateModule::add_to_allow_list(457			origin1.clone(),458			1,459			account(2)460		));461		assert_ok!(TemplateModule::add_to_allow_list(462			origin1.clone(),463			1,464			account(3)465		));466467		// do approve468		assert_ok!(TemplateModule::approve(469			origin1.clone(),470			account(2),471			1,472			1,473			5474		));475		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);476		assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));477		assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);478479		assert_ok!(TemplateModule::transfer_from(480			origin2,481			account(1),482			account(3),483			1,484			1,485			1486		));487		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);488	});489}490491#[test]492fn refungible_approve_and_transfer_from() {493	new_test_ext().execute_with(|| {494		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);495496		let origin1 = Origin::signed(1);497		let origin2 = Origin::signed(2);498499		let data = default_re_fungible_data();500		create_test_item(collection_id, &data.into());501502		assert_eq!(TemplateModule::balance_count(1, 1), 1023);503		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);504505		assert_ok!(TemplateModule::set_mint_permission(506			origin1.clone(),507			1,508			true509		));510		assert_ok!(TemplateModule::set_public_access_mode(511			origin1.clone(),512			1,513			AccessMode::AllowList514		));515		assert_ok!(TemplateModule::add_to_allow_list(516			origin1.clone(),517			1,518			account(1)519		));520		assert_ok!(TemplateModule::add_to_allow_list(521			origin1.clone(),522			1,523			account(2)524		));525		assert_ok!(TemplateModule::add_to_allow_list(526			origin1.clone(),527			1,528			account(3)529		));530531		// do approve532		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));533		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);534535		assert_ok!(TemplateModule::transfer_from(536			origin2,537			account(1),538			account(3),539			1,540			1,541			100542		));543		assert_eq!(TemplateModule::balance_count(1, 1), 923);544		assert_eq!(TemplateModule::balance_count(1, 3), 100);545		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);546		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);547548		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);549	});550}551552#[test]553fn fungible_approve_and_transfer_from() {554	new_test_ext().execute_with(|| {555		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);556557		let data = default_fungible_data();558		create_test_item(collection_id, &data.into());559560		let origin1 = Origin::signed(1);561		let origin2 = Origin::signed(2);562563		assert_eq!(TemplateModule::balance_count(1, 1), 5);564565		assert_ok!(TemplateModule::set_mint_permission(566			origin1.clone(),567			1,568			true569		));570		assert_ok!(TemplateModule::set_public_access_mode(571			origin1.clone(),572			1,573			AccessMode::AllowList574		));575		assert_ok!(TemplateModule::add_to_allow_list(576			origin1.clone(),577			1,578			account(1)579		));580		assert_ok!(TemplateModule::add_to_allow_list(581			origin1.clone(),582			1,583			account(2)584		));585		assert_ok!(TemplateModule::add_to_allow_list(586			origin1.clone(),587			1,588			account(3)589		));590591		// do approve592		assert_ok!(TemplateModule::approve(593			origin1.clone(),594			account(2),595			1,596			1,597			5598		));599		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);600		assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));601		assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);602		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);603604		assert_ok!(TemplateModule::transfer_from(605			origin2.clone(),606			account(1),607			account(3),608			1,609			1,610			4611		));612		assert_eq!(TemplateModule::balance_count(1, 1), 1);613		assert_eq!(TemplateModule::balance_count(1, 3), 4);614615		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);616617		assert_noop!(618			TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),619			Error::<Test>::NoPermission620		);621	});622}623624#[test]625fn change_collection_owner() {626	new_test_ext().execute_with(|| {627		let collection_id = create_test_collection(&CollectionMode::NFT, 1);628629		let origin1 = Origin::signed(1);630		assert_ok!(TemplateModule::change_collection_owner(631			origin1,632			collection_id,633			2634		));635		assert_eq!(636			TemplateModule::collection_id(collection_id).unwrap().owner,637			2638		);639	});640}641642#[test]643fn destroy_collection() {644	new_test_ext().execute_with(|| {645		let collection_id = create_test_collection(&CollectionMode::NFT, 1);646647		let origin1 = Origin::signed(1);648		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));649	});650}651652#[test]653fn burn_nft_item() {654	new_test_ext().execute_with(|| {655		let collection_id = create_test_collection(&CollectionMode::NFT, 1);656657		let origin1 = Origin::signed(1);658		assert_ok!(TemplateModule::add_collection_admin(659			origin1.clone(),660			collection_id,661			account(2)662		));663664		let data = default_nft_data();665		create_test_item(collection_id, &data.into());666667		// check balance (collection with id = 1, user id = 1)668		assert_eq!(TemplateModule::balance_count(1, 1), 1);669670		// burn item671		assert_ok!(TemplateModule::burn_item(672			origin1.clone(),673			collection_id,674			1,675			1676		));677		assert_noop!(678			TemplateModule::burn_item(origin1, collection_id, 1, 1),679			Error::<Test>::TokenNotFound680		);681682		assert_eq!(TemplateModule::balance_count(1, 1), 0);683	});684}685686#[test]687fn burn_fungible_item() {688	new_test_ext().execute_with(|| {689		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);690691		let origin1 = Origin::signed(1);692		assert_ok!(TemplateModule::add_collection_admin(693			origin1.clone(),694			collection_id,695			account(2)696		));697698		let data = default_fungible_data();699		create_test_item(collection_id, &data.into());700701		// check balance (collection with id = 1, user id = 1)702		assert_eq!(TemplateModule::balance_count(1, 1), 5);703704		// burn item705		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));706		assert_noop!(707			TemplateModule::burn_item(origin1, 1, 1, 5),708			Error::<Test>::TokenValueNotEnough709		);710711		assert_eq!(TemplateModule::balance_count(1, 1), 0);712	});713}714715#[test]716fn burn_refungible_item() {717	new_test_ext().execute_with(|| {718		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);719		let origin1 = Origin::signed(1);720721		assert_ok!(TemplateModule::set_mint_permission(722			origin1.clone(),723			collection_id,724			true725		));726		assert_ok!(TemplateModule::set_public_access_mode(727			origin1.clone(),728			collection_id,729			AccessMode::AllowList730		));731		assert_ok!(TemplateModule::add_to_allow_list(732			origin1.clone(),733			1,734			account(1)735		));736737		assert_ok!(TemplateModule::add_collection_admin(738			origin1.clone(),739			1,740			account(2)741		));742743		let data = default_re_fungible_data();744		create_test_item(collection_id, &data.into());745746		// check balance (collection with id = 1, user id = 2)747		assert_eq!(TemplateModule::balance_count(1, 1), 1023);748749		// burn item750		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));751		assert_noop!(752			TemplateModule::burn_item(origin1, 1, 1, 1023),753			Error::<Test>::TokenNotFound754		);755756		assert_eq!(TemplateModule::balance_count(1, 1), 0);757	});758}759760#[test]761fn add_collection_admin() {762	new_test_ext().execute_with(|| {763		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);764		create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);765		create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);766767		let origin1 = Origin::signed(1);768769		// collection admin770		assert_ok!(TemplateModule::add_collection_admin(771			origin1.clone(),772			collection1_id,773			account(2)774		));775		assert_ok!(TemplateModule::add_collection_admin(776			origin1,777			collection1_id,778			account(3)779		));780781		assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);782		assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);783	});784}785786#[test]787fn remove_collection_admin() {788	new_test_ext().execute_with(|| {789		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);790		create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);791		create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);792793		let origin1 = Origin::signed(1);794		let origin2 = Origin::signed(2);795796		// collection admin797		assert_ok!(TemplateModule::add_collection_admin(798			origin1.clone(),799			collection1_id,800			account(2)801		));802		assert_ok!(TemplateModule::add_collection_admin(803			origin1,804			collection1_id,805			account(3)806		));807808		assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);809		assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);810811		// remove admin812		assert_ok!(TemplateModule::remove_collection_admin(813			origin2,814			1,815			account(3)816		));817		assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);818	});819}820821#[test]822fn balance_of() {823	new_test_ext().execute_with(|| {824		let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);825		let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);826		let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);827828		// check balance before829		assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);830		assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);831		assert_eq!(832			TemplateModule::balance_count(re_fungible_collection_id, 1),833			0834		);835836		let nft_data = default_nft_data();837		create_test_item(nft_collection_id, &nft_data.into());838839		let fungible_data = default_fungible_data();840		create_test_item(fungible_collection_id, &fungible_data.into());841842		let re_fungible_data = default_re_fungible_data();843		create_test_item(re_fungible_collection_id, &re_fungible_data.into());844845		// check balance (collection with id = 1, user id = 1)846		assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);847		assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);848		assert_eq!(849			TemplateModule::balance_count(re_fungible_collection_id, 1),850			1023851		);852		assert_eq!(853			TemplateModule::nft_item_id(nft_collection_id, 1)854				.unwrap()855				.owner,856			account(1)857		);858		assert_eq!(859			TemplateModule::fungible_item_id(fungible_collection_id, 1).value,860			5861		);862		assert_eq!(863			TemplateModule::refungible_item_id(re_fungible_collection_id, 1)864				.unwrap()865				.owner[0]866				.owner,867			account(1)868		);869	});870}871872#[test]873fn approve() {874	new_test_ext().execute_with(|| {875		let collection_id = create_test_collection(&CollectionMode::NFT, 1);876877		let data = default_nft_data();878		create_test_item(collection_id, &data.into());879880		let origin1 = Origin::signed(1);881882		// approve883		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));884		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);885	});886}887888#[test]889fn transfer_from() {890	new_test_ext().execute_with(|| {891		let collection_id = create_test_collection(&CollectionMode::NFT, 1);892		let origin1 = Origin::signed(1);893		let origin2 = Origin::signed(2);894895		let data = default_nft_data();896		create_test_item(collection_id, &data.into());897898		// approve899		assert_ok!(TemplateModule::approve(900			origin1.clone(),901			account(2),902			1,903			1,904			1905		));906		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);907908		assert_ok!(TemplateModule::set_mint_permission(909			origin1.clone(),910			1,911			true912		));913		assert_ok!(TemplateModule::set_public_access_mode(914			origin1.clone(),915			1,916			AccessMode::AllowList917		));918		assert_ok!(TemplateModule::add_to_allow_list(919			origin1.clone(),920			1,921			account(1)922		));923		assert_ok!(TemplateModule::add_to_allow_list(924			origin1.clone(),925			1,926			account(2)927		));928		assert_ok!(TemplateModule::add_to_allow_list(origin1, 1, account(3)));929930		assert_ok!(TemplateModule::transfer_from(931			origin2,932			account(1),933			account(2),934			1,935			1,936			1937		));938939		// after transfer940		assert_eq!(TemplateModule::balance_count(1, 1), 0);941		assert_eq!(TemplateModule::balance_count(1, 2), 1);942	});943}944945// #endregion946947// Coverage tests region948// #region949950#[test]951fn owner_can_add_address_to_allow_list() {952	new_test_ext().execute_with(|| {953		let collection_id = create_test_collection(&CollectionMode::NFT, 1);954955		let origin1 = Origin::signed(1);956		assert_ok!(TemplateModule::add_to_allow_list(957			origin1,958			collection_id,959			account(2)960		));961		assert!(TemplateModule::allow_list(collection_id, 2));962	});963}964965#[test]966fn admin_can_add_address_to_allow_list() {967	new_test_ext().execute_with(|| {968		let collection_id = create_test_collection(&CollectionMode::NFT, 1);969		let origin1 = Origin::signed(1);970		let origin2 = Origin::signed(2);971972		assert_ok!(TemplateModule::add_collection_admin(973			origin1,974			collection_id,975			account(2)976		));977		assert_ok!(TemplateModule::add_to_allow_list(978			origin2,979			collection_id,980			account(3)981		));982		assert!(TemplateModule::allow_list(collection_id, 3));983	});984}985986#[test]987fn nonprivileged_user_cannot_add_address_to_allow_list() {988	new_test_ext().execute_with(|| {989		let collection_id = create_test_collection(&CollectionMode::NFT, 1);990991		let origin2 = Origin::signed(2);992		assert_noop!(993			TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),994			Error::<Test>::NoPermission995		);996	});997}998999#[test]1000fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1001	new_test_ext().execute_with(|| {1002		let origin1 = Origin::signed(1);10031004		assert_noop!(1005			TemplateModule::add_to_allow_list(origin1, 1, account(2)),1006			Error::<Test>::CollectionNotFound1007		);1008	});1009}10101011#[test]1012fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1013	new_test_ext().execute_with(|| {1014		let collection_id = create_test_collection(&CollectionMode::NFT, 1);10151016		let origin1 = Origin::signed(1);1017		assert_ok!(TemplateModule::destroy_collection(1018			origin1.clone(),1019			collection_id1020		));1021		assert_noop!(1022			TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1023			Error::<Test>::CollectionNotFound1024		);1025	});1026}10271028// If address is already added to allow list, nothing happens1029#[test]1030fn address_is_already_added_to_allow_list() {1031	new_test_ext().execute_with(|| {1032		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1033		let origin1 = Origin::signed(1);10341035		assert_ok!(TemplateModule::add_to_allow_list(1036			origin1.clone(),1037			collection_id,1038			account(2)1039		));1040		assert_ok!(TemplateModule::add_to_allow_list(1041			origin1,1042			collection_id,1043			account(2)1044		));1045		assert!(TemplateModule::allow_list(collection_id, 2));1046	});1047}10481049#[test]1050fn owner_can_remove_address_from_allow_list() {1051	new_test_ext().execute_with(|| {1052		let collection_id = create_test_collection(&CollectionMode::NFT, 1);10531054		let origin1 = Origin::signed(1);1055		assert_ok!(TemplateModule::add_to_allow_list(1056			origin1.clone(),1057			collection_id,1058			account(2)1059		));1060		assert_ok!(TemplateModule::remove_from_allow_list(1061			origin1,1062			collection_id,1063			account(2)1064		));1065		assert!(!TemplateModule::allow_list(collection_id, 2));1066	});1067}10681069#[test]1070fn admin_can_remove_address_from_allow_list() {1071	new_test_ext().execute_with(|| {1072		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1073		let origin1 = Origin::signed(1);1074		let origin2 = Origin::signed(2);10751076		assert_ok!(TemplateModule::add_collection_admin(1077			origin1.clone(),1078			collection_id,1079			account(2)1080		));10811082		assert_ok!(TemplateModule::add_to_allow_list(1083			origin1,1084			collection_id,1085			account(3)1086		));1087		assert_ok!(TemplateModule::remove_from_allow_list(1088			origin2,1089			collection_id,1090			account(3)1091		));1092		assert!(!TemplateModule::allow_list(collection_id, 3));1093	});1094}10951096#[test]1097fn nonprivileged_user_cannot_remove_address_from_allow_list() {1098	new_test_ext().execute_with(|| {1099		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1100		let origin1 = Origin::signed(1);1101		let origin2 = Origin::signed(2);11021103		assert_ok!(TemplateModule::add_to_allow_list(1104			origin1,1105			collection_id,1106			account(2)1107		));1108		assert_noop!(1109			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1110			Error::<Test>::NoPermission1111		);1112		assert!(TemplateModule::allow_list(collection_id, 2));1113	});1114}11151116#[test]1117fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1118	new_test_ext().execute_with(|| {1119		let origin1 = Origin::signed(1);11201121		assert_noop!(1122			TemplateModule::remove_from_allow_list(origin1, 1, account(2)),1123			Error::<Test>::CollectionNotFound1124		);1125	});1126}11271128#[test]1129fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1130	new_test_ext().execute_with(|| {1131		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1132		let origin1 = Origin::signed(1);1133		let origin2 = Origin::signed(2);11341135		assert_ok!(TemplateModule::add_to_allow_list(1136			origin1.clone(),1137			collection_id,1138			account(2)1139		));1140		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1141		assert_noop!(1142			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1143			Error::<Test>::CollectionNotFound1144		);1145		assert!(!TemplateModule::allow_list(collection_id, 2));1146	});1147}11481149// If address is already removed from allow list, nothing happens1150#[test]1151fn address_is_already_removed_from_allow_list() {1152	new_test_ext().execute_with(|| {1153		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1154		let origin1 = Origin::signed(1);11551156		assert_ok!(TemplateModule::add_to_allow_list(1157			origin1.clone(),1158			collection_id,1159			account(2)1160		));1161		assert_ok!(TemplateModule::remove_from_allow_list(1162			origin1.clone(),1163			collection_id,1164			account(2)1165		));1166		assert_ok!(TemplateModule::remove_from_allow_list(1167			origin1,1168			collection_id,1169			account(2)1170		));1171		assert!(!TemplateModule::allow_list(collection_id, 2));1172	});1173}11741175// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1176#[test]1177fn allow_list_test_1() {1178	new_test_ext().execute_with(|| {1179		let collection_id = create_test_collection(&CollectionMode::NFT, 1);11801181		let origin1 = Origin::signed(1);11821183		let data = default_nft_data();1184		create_test_item(collection_id, &data.into());11851186		assert_ok!(TemplateModule::set_public_access_mode(1187			origin1.clone(),1188			collection_id,1189			AccessMode::AllowList1190		));1191		assert_ok!(TemplateModule::add_to_allow_list(1192			origin1.clone(),1193			collection_id,1194			account(2)1195		));11961197		assert_noop!(1198			TemplateModule::transfer(origin1, account(3), 1, 1, 1),1199			Error::<Test>::AddresNotInAllowList1200		);1201	});1202}12031204#[test]1205fn allow_list_test_2() {1206	new_test_ext().execute_with(|| {1207		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1208		let origin1 = Origin::signed(1);12091210		let data = default_nft_data();1211		create_test_item(collection_id, &data.into());12121213		assert_ok!(TemplateModule::set_public_access_mode(1214			origin1.clone(),1215			collection_id,1216			AccessMode::AllowList1217		));1218		assert_ok!(TemplateModule::add_to_allow_list(1219			origin1.clone(),1220			1,1221			account(1)1222		));1223		assert_ok!(TemplateModule::add_to_allow_list(1224			origin1.clone(),1225			1,1226			account(2)1227		));12281229		// do approve1230		assert_ok!(TemplateModule::approve(1231			origin1.clone(),1232			account(1),1233			1,1234			1,1235			11236		));1237		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);12381239		assert_ok!(TemplateModule::remove_from_allow_list(1240			origin1.clone(),1241			1,1242			account(1)1243		));12441245		assert_noop!(1246			TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1247			Error::<Test>::AddresNotInAllowList1248		);1249	});1250}12511252// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1253#[test]1254fn allow_list_test_3() {1255	new_test_ext().execute_with(|| {1256		let collection_id = create_test_collection(&CollectionMode::NFT, 1);12571258		let origin1 = Origin::signed(1);12591260		let data = default_nft_data();1261		create_test_item(collection_id, &data.into());12621263		assert_ok!(TemplateModule::set_public_access_mode(1264			origin1.clone(),1265			collection_id,1266			AccessMode::AllowList1267		));1268		assert_ok!(TemplateModule::add_to_allow_list(1269			origin1.clone(),1270			1,1271			account(1)1272		));12731274		assert_noop!(1275			TemplateModule::transfer(origin1, account(3), 1, 1, 1),1276			Error::<Test>::AddresNotInAllowList1277		);1278	});1279}12801281#[test]1282fn allow_list_test_4() {1283	new_test_ext().execute_with(|| {1284		let collection_id = create_test_collection(&CollectionMode::NFT, 1);12851286		let origin1 = Origin::signed(1);12871288		let data = default_nft_data();1289		create_test_item(collection_id, &data.into());12901291		assert_ok!(TemplateModule::set_public_access_mode(1292			origin1.clone(),1293			collection_id,1294			AccessMode::AllowList1295		));1296		assert_ok!(TemplateModule::add_to_allow_list(1297			origin1.clone(),1298			collection_id,1299			account(1)1300		));1301		assert_ok!(TemplateModule::add_to_allow_list(1302			origin1.clone(),1303			collection_id,1304			account(2)1305		));13061307		// do approve1308		assert_ok!(TemplateModule::approve(1309			origin1.clone(),1310			account(1),1311			1,1312			1,1313			11314		));1315		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13161317		assert_ok!(TemplateModule::remove_from_allow_list(1318			origin1.clone(),1319			collection_id,1320			account(2)1321		));13221323		assert_noop!(1324			TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1325			Error::<Test>::AddresNotInAllowList1326		);1327	});1328}13291330// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1331#[test]1332fn allow_list_test_5() {1333	new_test_ext().execute_with(|| {1334		let collection_id = create_test_collection(&CollectionMode::NFT, 1);13351336		let origin1 = Origin::signed(1);13371338		let data = default_nft_data();1339		create_test_item(collection_id, &data.into());13401341		assert_ok!(TemplateModule::set_public_access_mode(1342			origin1.clone(),1343			collection_id,1344			AccessMode::AllowList1345		));1346		assert_noop!(1347			TemplateModule::burn_item(origin1.clone(), 1, 1, 5),1348			Error::<Test>::AddresNotInAllowList1349		);1350	});1351}13521353// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1354#[test]1355fn allow_list_test_6() {1356	new_test_ext().execute_with(|| {1357		let collection_id = create_test_collection(&CollectionMode::NFT, 1);13581359		let origin1 = Origin::signed(1);13601361		let data = default_nft_data();1362		create_test_item(collection_id, &data.into());13631364		assert_ok!(TemplateModule::set_public_access_mode(1365			origin1.clone(),1366			collection_id,1367			AccessMode::AllowList1368		));13691370		// do approve1371		assert_noop!(1372			TemplateModule::approve(origin1, account(1), 1, 1, 5),1373			Error::<Test>::AddresNotInAllowList1374		);1375	});1376}13771378// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1379//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1380#[test]1381fn allow_list_test_7() {1382	new_test_ext().execute_with(|| {1383		let collection_id = create_test_collection(&CollectionMode::NFT, 1);13841385		let data = default_nft_data();1386		create_test_item(collection_id, &data.into());13871388		let origin1 = Origin::signed(1);13891390		assert_ok!(TemplateModule::set_public_access_mode(1391			origin1.clone(),1392			collection_id,1393			AccessMode::AllowList1394		));1395		assert_ok!(TemplateModule::add_to_allow_list(1396			origin1.clone(),1397			collection_id,1398			account(1)1399		));1400		assert_ok!(TemplateModule::add_to_allow_list(1401			origin1.clone(),1402			collection_id,1403			account(2)1404		));14051406		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1407	});1408}14091410#[test]1411fn allow_list_test_8() {1412	new_test_ext().execute_with(|| {1413		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14141415		let data = default_nft_data();1416		create_test_item(collection_id, &data.into());14171418		let origin1 = Origin::signed(1);14191420		assert_ok!(TemplateModule::set_public_access_mode(1421			origin1.clone(),1422			collection_id,1423			AccessMode::AllowList1424		));1425		assert_ok!(TemplateModule::add_to_allow_list(1426			origin1.clone(),1427			collection_id,1428			account(1)1429		));1430		assert_ok!(TemplateModule::add_to_allow_list(1431			origin1.clone(),1432			collection_id,1433			account(2)1434		));14351436		// do approve1437		assert_ok!(TemplateModule::approve(1438			origin1.clone(),1439			account(1),1440			1,1441			1,1442			51443		));1444		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);14451446		assert_ok!(TemplateModule::transfer_from(1447			origin1,1448			account(1),1449			account(2),1450			1,1451			1,1452			11453		));1454	});1455}14561457// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1458#[test]1459fn allow_list_test_9() {1460	new_test_ext().execute_with(|| {1461		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1462		let origin1 = Origin::signed(1);14631464		assert_ok!(TemplateModule::set_public_access_mode(1465			origin1.clone(),1466			collection_id,1467			AccessMode::AllowList1468		));1469		assert_ok!(TemplateModule::set_mint_permission(1470			origin1,1471			collection_id,1472			false1473		));14741475		let data = default_nft_data();1476		create_test_item(collection_id, &data.into());1477	});1478}14791480// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1481#[test]1482fn allow_list_test_10() {1483	new_test_ext().execute_with(|| {1484		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14851486		let origin1 = Origin::signed(1);1487		let origin2 = Origin::signed(2);14881489		assert_ok!(TemplateModule::set_public_access_mode(1490			origin1.clone(),1491			collection_id,1492			AccessMode::AllowList1493		));1494		assert_ok!(TemplateModule::set_mint_permission(1495			origin1.clone(),1496			collection_id,1497			false1498		));14991500		assert_ok!(TemplateModule::add_collection_admin(1501			origin1,1502			collection_id,1503			account(2)1504		));15051506		assert_ok!(TemplateModule::create_item(1507			origin2,1508			collection_id,1509			account(2),1510			default_nft_data().into()1511		));1512	});1513}15141515// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.1516#[test]1517fn allow_list_test_11() {1518	new_test_ext().execute_with(|| {1519		let collection_id = create_test_collection(&CollectionMode::NFT, 1);15201521		let origin1 = Origin::signed(1);1522		let origin2 = Origin::signed(2);15231524		assert_ok!(TemplateModule::set_public_access_mode(1525			origin1.clone(),1526			collection_id,1527			AccessMode::AllowList1528		));1529		assert_ok!(TemplateModule::set_mint_permission(1530			origin1.clone(),1531			collection_id,1532			false1533		));1534		assert_ok!(TemplateModule::add_to_allow_list(1535			origin1,1536			collection_id,1537			account(2)1538		));15391540		assert_noop!(1541			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1542			Error::<Test>::PublicMintingNotAllowed1543		);1544	});1545}15461547// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.1548#[test]1549fn allow_list_test_12() {1550	new_test_ext().execute_with(|| {1551		let collection_id = create_test_collection(&CollectionMode::NFT, 1);15521553		let origin1 = Origin::signed(1);1554		let origin2 = Origin::signed(2);15551556		assert_ok!(TemplateModule::set_public_access_mode(1557			origin1.clone(),1558			collection_id,1559			AccessMode::AllowList1560		));1561		assert_ok!(TemplateModule::set_mint_permission(1562			origin1,1563			collection_id,1564			false1565		));15661567		assert_noop!(1568			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1569			Error::<Test>::PublicMintingNotAllowed1570		);1571	});1572}15731574// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1575#[test]1576fn allow_list_test_13() {1577	new_test_ext().execute_with(|| {1578		let collection_id = create_test_collection(&CollectionMode::NFT, 1);15791580		let origin1 = Origin::signed(1);15811582		assert_ok!(TemplateModule::set_public_access_mode(1583			origin1.clone(),1584			collection_id,1585			AccessMode::AllowList1586		));1587		assert_ok!(TemplateModule::set_mint_permission(1588			origin1,1589			collection_id,1590			true1591		));15921593		let data = default_nft_data();1594		create_test_item(collection_id, &data.into());1595	});1596}15971598// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1599#[test]1600fn allow_list_test_14() {1601	new_test_ext().execute_with(|| {1602		let collection_id = create_test_collection(&CollectionMode::NFT, 1);16031604		let origin1 = Origin::signed(1);1605		let origin2 = Origin::signed(2);16061607		assert_ok!(TemplateModule::set_public_access_mode(1608			origin1.clone(),1609			collection_id,1610			AccessMode::AllowList1611		));1612		assert_ok!(TemplateModule::set_mint_permission(1613			origin1.clone(),1614			collection_id,1615			true1616		));16171618		assert_ok!(TemplateModule::add_collection_admin(1619			origin1,1620			collection_id,1621			account(2)1622		));16231624		assert_ok!(TemplateModule::create_item(1625			origin2,1626			1,1627			account(2),1628			default_nft_data().into()1629		));1630	});1631}16321633// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.1634#[test]1635fn allow_list_test_15() {1636	new_test_ext().execute_with(|| {1637		let collection_id = create_test_collection(&CollectionMode::NFT, 1);16381639		let origin1 = Origin::signed(1);1640		let origin2 = Origin::signed(2);16411642		assert_ok!(TemplateModule::set_public_access_mode(1643			origin1.clone(),1644			collection_id,1645			AccessMode::AllowList1646		));1647		assert_ok!(TemplateModule::set_mint_permission(1648			origin1,1649			collection_id,1650			true1651		));16521653		assert_noop!(1654			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1655			Error::<Test>::AddresNotInAllowList1656		);1657	});1658}16591660// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.1661#[test]1662fn allow_list_test_16() {1663	new_test_ext().execute_with(|| {1664		let collection_id = create_test_collection(&CollectionMode::NFT, 1);16651666		let origin1 = Origin::signed(1);1667		let origin2 = Origin::signed(2);16681669		assert_ok!(TemplateModule::set_public_access_mode(1670			origin1.clone(),1671			collection_id,1672			AccessMode::AllowList1673		));1674		assert_ok!(TemplateModule::set_mint_permission(1675			origin1.clone(),1676			collection_id,1677			true1678		));1679		assert_ok!(TemplateModule::add_to_allow_list(1680			origin1,1681			collection_id,1682			account(2)1683		));16841685		assert_ok!(TemplateModule::create_item(1686			origin2,1687			1,1688			account(2),1689			default_nft_data().into()1690		));1691	});1692}16931694// Total number of collections. Positive test1695#[test]1696fn total_number_collections_bound() {1697	new_test_ext().execute_with(|| {1698		create_test_collection(&CollectionMode::NFT, 1);1699	});1700}17011702// Total number of collections. Negotive test1703#[test]1704fn total_number_collections_bound_neg() {1705	new_test_ext().execute_with(|| {1706		let origin1 = Origin::signed(1);17071708		for i in 0..COLLECTION_NUMBER_LIMIT {1709			create_test_collection(&CollectionMode::NFT, i + 1);1710		}17111712		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1713		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1714		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17151716		// 11-th collection in chain. Expects error1717		assert_noop!(1718			TemplateModule::create_collection(1719				origin1,1720				col_name1,1721				col_desc1,1722				token_prefix1,1723				CollectionMode::NFT1724			),1725			Error::<Test>::TotalCollectionsLimitExceeded1726		);1727	});1728}17291730// Owned tokens by a single address. Positive test1731#[test]1732fn owned_tokens_bound() {1733	new_test_ext().execute_with(|| {1734		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17351736		let data = default_nft_data();1737		create_test_item(collection_id, &data.clone().into());1738		create_test_item(collection_id, &data.into());1739	});1740}17411742// Owned tokens by a single address. Negotive test1743#[test]1744fn owned_tokens_bound_neg() {1745	new_test_ext().execute_with(|| {1746		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748		let origin1 = Origin::signed(1);17491750		for _ in 0..ACCOUNT_TOKEN_OWNERSHIP_LIMIT {1751			let data = default_nft_data();1752			create_test_item(collection_id, &data.clone().into());1753		}17541755		let data = default_nft_data();1756		assert_noop!(1757			TemplateModule::create_item(origin1, 1, account(1), data.into()),1758			Error::<Test>::AccountTokenLimitExceeded1759		);1760	});1761}17621763// Number of collection admins. Positive test1764#[test]1765fn collection_admins_bound() {1766	new_test_ext().execute_with(|| {1767		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17681769		let origin1 = Origin::signed(1);17701771		assert_ok!(TemplateModule::add_collection_admin(1772			origin1.clone(),1773			collection_id,1774			account(2)1775		));1776		assert_ok!(TemplateModule::add_collection_admin(1777			origin1,1778			collection_id,1779			account(3)1780		));1781	});1782}17831784// Number of collection admins. Negotive test1785#[test]1786fn collection_admins_bound_neg() {1787	new_test_ext().execute_with(|| {1788		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17891790		let origin1 = Origin::signed(1);17911792		for i in 0..COLLECTION_ADMINS_LIMIT {1793			assert_ok!(TemplateModule::add_collection_admin(1794				origin1.clone(),1795				collection_id,1796				account(2 + i)1797			));1798		}1799		assert_noop!(1800			TemplateModule::add_collection_admin(1801				origin1,1802				collection_id,1803				account(3 + COLLECTION_ADMINS_LIMIT)1804			),1805			Error::<Test>::CollectionAdminsLimitExceeded1806		);1807	});1808}1809// #endregion18101811#[test]1812fn set_const_on_chain_schema() {1813	new_test_ext().execute_with(|| {1814		let collection_id = create_test_collection(&CollectionMode::NFT, 1);18151816		let origin1 = Origin::signed(1);1817		assert_ok!(TemplateModule::set_const_on_chain_schema(1818			origin1,1819			collection_id,1820			b"test const on chain schema".to_vec()1821		));18221823		assert_eq!(1824			TemplateModule::collection_id(collection_id)1825				.unwrap()1826				.const_on_chain_schema,1827			b"test const on chain schema".to_vec()1828		);1829		assert_eq!(1830			TemplateModule::collection_id(collection_id)1831				.unwrap()1832				.variable_on_chain_schema,1833			b"".to_vec()1834		);1835	});1836}18371838#[test]1839fn set_variable_on_chain_schema() {1840	new_test_ext().execute_with(|| {1841		let collection_id = create_test_collection(&CollectionMode::NFT, 1);18421843		let origin1 = Origin::signed(1);1844		assert_ok!(TemplateModule::set_variable_on_chain_schema(1845			origin1,1846			collection_id,1847			b"test variable on chain schema".to_vec()1848		));18491850		assert_eq!(1851			TemplateModule::collection_id(collection_id)1852				.unwrap()1853				.const_on_chain_schema,1854			b"".to_vec()1855		);1856		assert_eq!(1857			TemplateModule::collection_id(collection_id)1858				.unwrap()1859				.variable_on_chain_schema,1860			b"test variable on chain schema".to_vec()1861		);1862	});1863}18641865#[test]1866fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1867	new_test_ext().execute_with(|| {1868		let collection_id = create_test_collection(&CollectionMode::NFT, 1);18691870		let origin1 = Origin::signed(1);18711872		let data = default_nft_data();1873		create_test_item(1, &data.into());18741875		let variable_data = b"test data".to_vec();1876		assert_ok!(TemplateModule::set_variable_meta_data(1877			origin1,1878			collection_id,1879			1,1880			variable_data.clone()1881		));18821883		assert_eq!(1884			TemplateModule::nft_item_id(collection_id, 1)1885				.unwrap()1886				.variable_data,1887			variable_data1888		);1889	});1890}18911892#[test]1893fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1894	new_test_ext().execute_with(|| {1895		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);18961897		let origin1 = Origin::signed(1);18981899		let data = default_re_fungible_data();1900		create_test_item(1, &data.into());19011902		let variable_data = b"test data".to_vec();1903		assert_ok!(TemplateModule::set_variable_meta_data(1904			origin1,1905			collection_id,1906			1,1907			variable_data.clone()1908		));19091910		assert_eq!(1911			TemplateModule::refungible_item_id(collection_id, 1)1912				.unwrap()1913				.variable_data,1914			variable_data1915		);1916	});1917}19181919#[test]1920fn set_variable_meta_data_on_fungible_token_fails() {1921	new_test_ext().execute_with(|| {1922		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19231924		let origin1 = Origin::signed(1);19251926		let data = default_fungible_data();1927		create_test_item(1, &data.into());19281929		let variable_data = b"test data".to_vec();1930		assert_noop!(1931			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1932			Error::<Test>::CantStoreMetadataInFungibleTokens1933		);1934	});1935}19361937#[test]1938fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1939	new_test_ext().execute_with(|| {1940		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19411942		let origin1 = Origin::signed(1);19431944		let data = default_nft_data();1945		create_test_item(1, &data.into());19461947		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1948		assert_noop!(1949			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1950			Error::<Test>::TokenVariableDataLimitExceeded1951		);1952	});1953}19541955#[test]1956fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1957	new_test_ext().execute_with(|| {1958		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19591960		let origin1 = Origin::signed(1);19611962		let data = default_re_fungible_data();1963		create_test_item(1, &data.into());19641965		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1966		assert_noop!(1967			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1968			Error::<Test>::TokenVariableDataLimitExceeded1969		);1970	});1971}19721973#[test]1974fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {1975	new_test_ext().execute_with(|| {1976		//default_limits();19771978		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19791980		let origin1 = Origin::signed(1);19811982		let data = default_nft_data();1983		create_test_item(1, &data.into());19841985		assert_ok!(TemplateModule::set_meta_update_permission_flag(1986			origin1.clone(),1987			collection_id,1988			MetaUpdatePermission::ItemOwner,1989		));19901991		let variable_data = b"ten chars.".to_vec();1992		assert_ok!(TemplateModule::set_variable_meta_data(1993			origin1,1994			collection_id,1995			1,1996			variable_data.clone()1997		));19981999		assert_eq!(2000			TemplateModule::nft_item_id(collection_id, 1)2001				.unwrap()2002				.variable_data,2003			variable_data2004		);2005	});2006}20072008#[test]2009fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2010	new_test_ext().execute_with(|| {2011		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);20122013		let origin1 = Origin::signed(1);20142015		assert_ok!(TemplateModule::set_mint_permission(2016			origin1.clone(),2017			collection_id,2018			true2019		));2020		assert_ok!(TemplateModule::add_to_allow_list(2021			origin1.clone(),2022			collection_id,2023			account(1)2024		));20252026		let data = default_nft_data();2027		create_test_item(1, &data.into());20282029		assert_ok!(TemplateModule::set_meta_update_permission_flag(2030			origin1.clone(),2031			collection_id,2032			MetaUpdatePermission::ItemOwner,2033		));20342035		let variable_data = b"1234567890123".to_vec();2036		assert_noop!(2037			TemplateModule::set_variable_meta_data(2038				origin1,2039				collection_id,2040				1,2041				variable_data.clone()2042			),2043			Error::<Test>::TokenVariableDataLimitExceeded2044		);2045	})2046}20472048#[test]2049fn collection_transfer_flag_works() {2050	new_test_ext().execute_with(|| {2051		let origin1 = Origin::signed(1);20522053		let collection_id = create_test_collection(&CollectionMode::NFT, 1);2054		assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));20552056		let data = default_nft_data();2057		create_test_item(collection_id, &data.into());2058		assert_eq!(TemplateModule::balance_count(1, 1), 1);2059		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);20602061		let origin1 = Origin::signed(1);20622063		// default scenario2064		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));2065		assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));2066		assert_eq!(TemplateModule::balance_count(1, 1), 0);2067		assert_eq!(TemplateModule::balance_count(1, 2), 1);20682069		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);2070	});2071}20722073#[test]2074fn set_variable_meta_data_on_nft_with_admin_flag() {2075	new_test_ext().execute_with(|| {2076		// default_limits();20772078		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);20792080		let origin1 = Origin::signed(1);2081		let origin2 = Origin::signed(2);20822083		assert_ok!(TemplateModule::set_mint_permission(2084			origin2.clone(),2085			collection_id,2086			true2087		));2088		assert_ok!(TemplateModule::add_to_allow_list(2089			origin2.clone(),2090			collection_id,2091			account(1)2092		));20932094		assert_ok!(TemplateModule::add_collection_admin(2095			origin2.clone(),2096			collection_id,2097			account(1)2098		));20992100		let data = default_nft_data();2101		create_test_item(1, &data.into());21022103		assert_ok!(TemplateModule::set_meta_update_permission_flag(2104			origin2.clone(),2105			collection_id,2106			MetaUpdatePermission::Admin,2107		));21082109		let variable_data = b"test.".to_vec();2110		assert_ok!(TemplateModule::set_variable_meta_data(2111			origin1,2112			collection_id,2113			1,2114			variable_data.clone()2115		));21162117		assert_eq!(2118			TemplateModule::nft_item_id(collection_id, 1)2119				.unwrap()2120				.variable_data,2121			variable_data2122		);2123	});2124}21252126#[test]2127fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2128	new_test_ext().execute_with(|| {2129		// default_limits();21302131		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21322133		let origin1 = Origin::signed(1);2134		let origin2 = Origin::signed(2);21352136		assert_ok!(TemplateModule::set_mint_permission(2137			origin2.clone(),2138			collection_id,2139			true2140		));2141		assert_ok!(TemplateModule::add_to_allow_list(2142			origin2.clone(),2143			collection_id,2144			account(1)2145		));21462147		let data = default_nft_data();2148		create_test_item(1, &data.into());21492150		assert_ok!(TemplateModule::set_meta_update_permission_flag(2151			origin2.clone(),2152			collection_id,2153			MetaUpdatePermission::Admin,2154		));21552156		let variable_data = b"test.".to_vec();2157		assert_noop!(2158			TemplateModule::set_variable_meta_data(2159				origin1,2160				collection_id,2161				1,2162				variable_data.clone()2163			),2164			Error::<Test>::NoPermission2165		);2166	});2167}21682169#[test]2170fn set_variable_meta_flag_after_freeze() {2171	new_test_ext().execute_with(|| {2172		// default_limits();21732174		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21752176		let origin2 = Origin::signed(2);21772178		assert_ok!(TemplateModule::set_meta_update_permission_flag(2179			origin2.clone(),2180			collection_id,2181			MetaUpdatePermission::None,2182		));2183		assert_noop!(2184			TemplateModule::set_meta_update_permission_flag(2185				origin2.clone(),2186				collection_id,2187				MetaUpdatePermission::Admin2188			),2189			Error::<Test>::MetadataFlagFrozen2190		);2191	});2192}21932194#[test]2195fn set_variable_meta_data_on_nft_with_none_flag_neg() {2196	new_test_ext().execute_with(|| {2197		// default_limits();21982199		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);2200		let origin1 = Origin::signed(1);22012202		let data = default_nft_data();2203		create_test_item(1, &data.into());22042205		assert_ok!(TemplateModule::set_meta_update_permission_flag(2206			origin1.clone(),2207			collection_id,2208			MetaUpdatePermission::None,2209		));22102211		let variable_data = b"test.".to_vec();2212		assert_noop!(2213			TemplateModule::set_variable_meta_data(2214				origin1.clone(),2215				collection_id,2216				1,2217				variable_data.clone()2218			),2219			Error::<Test>::MetadataUpdateDenied2220		);2221	});2222}22232224#[test]2225fn collection_transfer_flag_works_neg() {2226	new_test_ext().execute_with(|| {2227		let origin1 = Origin::signed(1);22282229		let collection_id = create_test_collection(&CollectionMode::NFT, 1);2230		assert_ok!(TemplateModule::set_transfers_enabled_flag(2231			origin1, 1, false2232		));22332234		let data = default_nft_data();2235		create_test_item(collection_id, &data.into());2236		assert_eq!(TemplateModule::balance_count(1, 1), 1);2237		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);22382239		let origin1 = Origin::signed(1);22402241		// default scenario2242		assert_noop!(2243			TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2244			Error::<Test>::TransferNotAllowed2245		);2246		assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2247		assert_eq!(TemplateModule::balance_count(1, 1), 1);2248		assert_eq!(TemplateModule::balance_count(1, 2), 0);22492250		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2251	});2252}
after · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use nft_data_structs::{6	COLLECTION_NUMBER_LIMIT, Collection, CollectionId, CreateItemData, CreateFungibleData, 7	CreateNftData, CreateReFungibleData, ExistenceRequirement, MAX_COLLECTION_DESCRIPTION_LENGTH, 8	MAX_COLLECTION_NAME_LENGTH, MAX_DECIMAL_POINTS, MAX_TOKEN_PREFIX_LENGTH, COLLECTION_ADMINS_LIMIT, 9	MetaUpdatePermission, Pays, PostDispatchInfo, TokenId, Weight, WithdrawReasons,10};1112use frame_support::{assert_noop, assert_ok};13use sp_std::convert::TryInto;1415fn default_nft_data() -> CreateNftData {16	CreateNftData {17		const_data: vec![1, 2, 3].try_into().unwrap(),18		variable_data: vec![3, 2, 1].try_into().unwrap(),19	}20}2122fn default_fungible_data() -> CreateFungibleData {23	CreateFungibleData { value: 5 }24}2526fn default_re_fungible_data() -> CreateReFungibleData {27	CreateReFungibleData {28		const_data: vec![1, 2, 3].try_into().unwrap(),29		variable_data: vec![3, 2, 1].try_into().unwrap(),30		pieces: 1023,31	}32}3334fn create_test_collection_for_owner(35	mode: &CollectionMode,36	owner: u64,37	id: CollectionId,38) -> 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,46		col_name1,47		col_desc1,48		token_prefix1,49		mode.clone()50	));5152	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();53	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();54	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();55	assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);56	assert_eq!(57		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,58		saved_col_name59	);60	assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);61	assert_eq!(62		<pallet_common::CollectionById<Test>>::get(id).unwrap().description,63		saved_description64	);65	assert_eq!(66		<pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,67		saved_prefix68	);69	id70}7172fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {73	create_test_collection_for_owner(&mode, 1, id)74}7576fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {77	let origin1 = Origin::signed(1);78	assert_ok!(TemplateModule::create_item(79		origin1,80		collection_id,81		account(1),82		data.clone()83	));84}8586fn account(sub: u64) -> TestCrossAccountId {87	TestCrossAccountId::from_sub(sub)88}8990// Use cases tests region91// #region9293#[test]94fn set_version_schema() {95	new_test_ext().execute_with(|| {96		let origin1 = Origin::signed(1);97		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9899		assert_ok!(TemplateModule::set_schema_version(100			origin1,101			collection_id,102			SchemaVersion::Unique103		));104		assert_eq!(105			<pallet_common::CollectionById<Test>>::get(collection_id)106				.unwrap()107				.schema_version,108			SchemaVersion::Unique109		);110	});111}112113#[test]114fn create_fungible_collection_fails_with_large_decimal_numbers() {115	new_test_ext().execute_with(|| {116		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();117		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();118		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();119120		let origin1 = Origin::signed(1);121		assert_noop!(122			TemplateModule::create_collection(123				origin1,124				col_name1,125				col_desc1,126				token_prefix1,127				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)128			),129			Error::<Test>::CollectionDecimalPointLimitExceeded130		);131	});132}133134#[test]135fn create_nft_item() {136	new_test_ext().execute_with(|| {137		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));138139		let data = default_nft_data();140		create_test_item(collection_id, &data.clone().into());141142		let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();143		assert_eq!(item.const_data, data.const_data.into_inner());144		assert_eq!(item.variable_data, data.variable_data.into_inner());145	});146}147148// Use cases tests region149// #region150#[test]151fn create_nft_multiple_items() {152	new_test_ext().execute_with(|| {153		create_test_collection(&CollectionMode::NFT, CollectionId(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,161			CollectionId(1),162			account(1),163			items_data164				.clone()165				.into_iter()166				.map(|d| { d.into() })167				.collect()168		));169		for (index, data) in items_data.into_iter().enumerate() {170			let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();171			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());172			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());173		}174	});175}176177#[test]178fn create_refungible_item() {179	new_test_ext().execute_with(|| {180		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));181182		let data = default_re_fungible_data();183		create_test_item(collection_id, &data.clone().into());184		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));185		let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));186		assert_eq!(item.const_data, data.const_data.into_inner());187		assert_eq!(item.variable_data, data.variable_data.into_inner());188		assert_eq!(balance, 1023);189	});190}191192#[test]193fn create_multiple_refungible_items() {194	new_test_ext().execute_with(|| {195		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));196197		let origin1 = Origin::signed(1);198199		let items_data = vec![200			default_re_fungible_data(),201			default_re_fungible_data(),202			default_re_fungible_data(),203		];204205		assert_ok!(TemplateModule::create_multiple_items(206			origin1,207			CollectionId(1),208			account(1),209			items_data210				.clone()211				.into_iter()212				.map(|d| { d.into() })213				.collect()214		));215		for (index, data) in items_data.into_iter().enumerate() {216			let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();217			let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));218			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());219			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());220			assert_eq!(balance, 1023);221		}222	});223}224225#[test]226fn create_fungible_item() {227	new_test_ext().execute_with(|| {228		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));229230		let data = default_fungible_data();231		create_test_item(collection_id, &data.into());232233		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);234	});235}236237//#[test]238// fn create_multiple_fungible_items() {239//     new_test_ext().execute_with(|| {240//         default_limits();241242//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));243244//         let origin1 = Origin::signed(1);245246//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];247248//         assert_ok!(TemplateModule::create_multiple_items(249//             origin1.clone(),250//             1,251//             1,252//             items_data.clone().into_iter().map(|d| { d.into() }).collect()253//         ));254255//         for (index, _) in items_data.iter().enumerate() {256//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);257//         }258//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);259//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);260//     });261// }262263#[test]264fn transfer_fungible_item() {265	new_test_ext().execute_with(|| {266		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));267268		let origin1 = Origin::signed(1);269		let origin2 = Origin::signed(2);270271		let data = default_fungible_data();272		create_test_item(collection_id, &data.into());273274		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);275276		// change owner scenario277		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 5));278		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);279280		// split item scenario281		assert_ok!(TemplateModule::transfer(282			origin2.clone(),283			account(3),284			CollectionId(1),285			TokenId(1),286			3287		));288289		// split item and new owner has account scenario290		assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 1));291		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);292		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);293	});294}295296#[test]297fn transfer_refungible_item() {298	new_test_ext().execute_with(|| {299		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));300301		let data = default_re_fungible_data();302		create_test_item(collection_id, &data.clone().into());303304		let origin1 = Origin::signed(1);305		let origin2 = Origin::signed(2);306		{307			let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));308			let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));309			assert_eq!(item.const_data, data.const_data.into_inner());310			assert_eq!(item.variable_data, data.variable_data.into_inner());311			assert_eq!(balance, 1023);312		}313		314		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);315		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);316317		// change owner scenario318		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));319320		let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));321		assert_eq!(balance2, 1023);322		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);323		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1023);324		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);325		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);326327		// split item scenario328		assert_ok!(TemplateModule::transfer(329			origin2.clone(),330			account(3),331			CollectionId(1),332			TokenId(1),333			500334		));335		{336			let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId(1)));337			let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));338			let balance3 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3)));339			assert_eq!(balance2, 523);340			assert_eq!(balance3, 500);341		}342		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 523);343		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 500);344		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);345		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);346347		// split item and new owner has account scenario348		assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));349		{350			let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId(1)));351			let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));352			let balance3 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3)));353			assert_eq!(balance2, 323);354			assert_eq!(balance3, 700);355		}356		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 323);357		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 700);358		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);359		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);360	});361}362363#[test]364fn transfer_nft_item() {365	new_test_ext().execute_with(|| {366		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));367368		let data = default_nft_data();369		create_test_item(collection_id, &data.into());370		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);371		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);372373374		let origin1 = Origin::signed(1);375		// default scenario376		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1000));377		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);378		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);379		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);380		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);381	});382}383384#[test]385fn nft_approve_and_transfer_from() {386	new_test_ext().execute_with(|| {387		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));388389		let data = default_nft_data();390		create_test_item(collection_id, &data.into());391392		let origin1 = Origin::signed(1);393		let origin2 = Origin::signed(2);394395		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);396		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);397398		// neg transfer399		assert_noop!(400			TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1),401			CommonError::<Test>::NoPermission402		);403404		// do approve405		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 5));406		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));407408		assert_ok!(TemplateModule::transfer_from(409			origin2,410			account(1),411			account(3),412			CollectionId(1),413			TokenId(1),414			1415		));416		assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());417	});418}419420#[test]421fn nft_approve_and_transfer_from_allow_list() {422	new_test_ext().execute_with(|| {423		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));424425		let origin1 = Origin::signed(1);426		let origin2 = Origin::signed(2);427428		let data = default_nft_data();429		create_test_item(collection_id, &data.clone().into());430431		assert_eq!(432			&<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,433			&data.const_data.into_inner()434		);435		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);436		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);437438		assert_ok!(TemplateModule::set_mint_permission(439			origin1.clone(),440			CollectionId(1),441			true442		));443		assert_ok!(TemplateModule::set_public_access_mode(444			origin1.clone(),445			CollectionId(1),446			AccessMode::AllowList447		));448		assert_ok!(TemplateModule::add_to_allow_list(449			origin1.clone(),450			CollectionId(1),451			account(1)452		));453		assert_ok!(TemplateModule::add_to_allow_list(454			origin1.clone(),455			CollectionId(1),456			account(2)457		));458		assert_ok!(TemplateModule::add_to_allow_list(459			origin1.clone(),460			CollectionId(1),461			account(3)462		));463464		// do approve465		assert_ok!(TemplateModule::approve(466			origin1.clone(),467			account(2),468			CollectionId(1),469			TokenId(1),470			5471		));472		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));473		assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(1), 5));474		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(3));475476		assert_ok!(TemplateModule::transfer_from(477			origin2,478			account(1),479			account(3),480			CollectionId(1),481			TokenId(1),482			1483		));484		assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());485	});486}487488#[test]489fn refungible_approve_and_transfer_from() {490	new_test_ext().execute_with(|| {491		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));492493		let origin1 = Origin::signed(1);494		let origin2 = Origin::signed(2);495496		let data = default_re_fungible_data();497		create_test_item(collection_id, &data.into());498499		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);500		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);501502		assert_ok!(TemplateModule::set_mint_permission(503			origin1.clone(),504			CollectionId(1),505			true506		));507		assert_ok!(TemplateModule::set_public_access_mode(508			origin1.clone(),509			CollectionId(1),510			AccessMode::AllowList511		));512		assert_ok!(TemplateModule::add_to_allow_list(513			origin1.clone(),514			CollectionId(1),515			account(1)516		));517		assert_ok!(TemplateModule::add_to_allow_list(518			origin1.clone(),519			CollectionId(1),520			account(2)521		));522		assert_ok!(TemplateModule::add_to_allow_list(523			origin1.clone(),524			CollectionId(1),525			account(3)526		));527528		// do approve529		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));530		assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);531532		assert_ok!(TemplateModule::transfer_from(533			origin2,534			account(1),535			account(3),536			CollectionId(1),537			TokenId(1),538			100539		));540		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 923);541		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 100);542		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);543		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(3))), true);544		assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);545	});546}547548#[test]549fn fungible_approve_and_transfer_from() {550	new_test_ext().execute_with(|| {551		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));552553		let data = default_fungible_data();554		create_test_item(collection_id, &data.into());555556		let origin1 = Origin::signed(1);557		let origin2 = Origin::signed(2);558559		assert_ok!(TemplateModule::set_mint_permission(560			origin1.clone(),561			CollectionId(1),562			true563		));564		assert_ok!(TemplateModule::set_public_access_mode(565			origin1.clone(),566			CollectionId(1),567			AccessMode::AllowList568		));569		assert_ok!(TemplateModule::add_to_allow_list(570			origin1.clone(),571			CollectionId(1),572			account(1)573		));574		assert_ok!(TemplateModule::add_to_allow_list(575			origin1.clone(),576			CollectionId(1),577			account(2)578		));579		assert_ok!(TemplateModule::add_to_allow_list(580			origin1.clone(),581			CollectionId(1),582			account(3)583		));584585		// do approve586		assert_ok!(TemplateModule::approve(587			origin1.clone(),588			account(2),589			CollectionId(1),590			TokenId(1),591			5592		));593		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);594		assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(1), 5));595		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);596		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);597598		assert_ok!(TemplateModule::transfer_from(599			origin2.clone(),600			account(1),601			account(3),602			CollectionId(1),603			TokenId(1),604			4605		));606607		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);608609		assert_noop!(610			TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(1), 4),611			CommonError::<Test>::NoPermission612		);613	});614}615616#[test]617fn change_collection_owner() {618	new_test_ext().execute_with(|| {619		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));620621		let origin1 = Origin::signed(1);622		assert_ok!(TemplateModule::change_collection_owner(623			origin1,624			collection_id,625			2626		));627		assert_eq!(628			<pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,629			2630		);631	});632}633634#[test]635fn destroy_collection() {636	new_test_ext().execute_with(|| {637		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));638639		let origin1 = Origin::signed(1);640		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));641	});642}643644#[test]645fn burn_nft_item() {646	new_test_ext().execute_with(|| {647		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));648649		let origin1 = Origin::signed(1);650		assert_ok!(TemplateModule::add_collection_admin(651			origin1.clone(),652			collection_id,653			account(2)654		));655656		let data = default_nft_data();657		create_test_item(collection_id, &data.into());658659		// check balance (collection with id = 1, user id = 1)660		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);661662		// burn item663		assert_ok!(TemplateModule::burn_item(664			origin1.clone(),665			collection_id,666			TokenId(1),667			1668		));669		assert_noop!(670			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1),671			CommonError::<Test>::TokenNotFound672		);673674		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);675	});676}677678#[test]679fn burn_fungible_item() {680	new_test_ext().execute_with(|| {681		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));682683		let origin1 = Origin::signed(1);684		assert_ok!(TemplateModule::add_collection_admin(685			origin1.clone(),686			collection_id,687			account(2)688		));689690		let data = default_fungible_data();691		create_test_item(collection_id, &data.into());692693		// check balance (collection with id = 1, user id = 1)694		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);695696		// burn item697		assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 5));698		assert_noop!(699			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5),700			CommonError::<Test>::TokenValueNotEnough701		);702703		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);704	});705}706707#[test]708fn burn_refungible_item() {709	new_test_ext().execute_with(|| {710		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));711		let origin1 = Origin::signed(1);712713		assert_ok!(TemplateModule::set_mint_permission(714			origin1.clone(),715			collection_id,716			true717		));718		assert_ok!(TemplateModule::set_public_access_mode(719			origin1.clone(),720			collection_id,721			AccessMode::AllowList722		));723		assert_ok!(TemplateModule::add_to_allow_list(724			origin1.clone(),725			collection_id,726			account(1)727		));728729		assert_ok!(TemplateModule::add_collection_admin(730			origin1.clone(),731			collection_id,732			account(2)733		));734735		let data = default_re_fungible_data();736		create_test_item(collection_id, &data.into());737738		// check balance (collection with id = 1, user id = 2)739		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);740		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);741742		// burn item743		assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));744		assert_noop!(745			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023),746			CommonError::<Test>::TokenNotFound747		);748749		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);750	});751}752753#[test]754fn add_collection_admin() {755	new_test_ext().execute_with(|| {756		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));757		create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(2));758		create_test_collection_for_owner(&CollectionMode::NFT, 3, CollectionId(3));759760		let origin1 = Origin::signed(1);761762		// collection admin763		assert_ok!(TemplateModule::add_collection_admin(764			origin1.clone(),765			collection1_id,766			account(2)767		));768		assert_ok!(TemplateModule::add_collection_admin(769			origin1,770			collection1_id,771			account(3)772		));773774		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))));775		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));776		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));777	});778}779780#[test]781fn remove_collection_admin() {782	new_test_ext().execute_with(|| {783		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));784		create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(2));785		create_test_collection_for_owner(&CollectionMode::NFT, 3, CollectionId(3));786787		let origin1 = Origin::signed(1);788		let origin2 = Origin::signed(2);789790		// collection admin791		assert_ok!(TemplateModule::add_collection_admin(792			origin1.clone(),793			collection1_id,794			account(2)795		));796		assert_ok!(TemplateModule::add_collection_admin(797			origin1,798			collection1_id,799			account(3)800		));801802		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));803		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));804805		// remove admin806		assert_ok!(TemplateModule::remove_collection_admin(807			origin2,808			CollectionId(1),809			account(3)810		));811		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));812		assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))), false);813	});814}815816#[test]817fn balance_of() {818	new_test_ext().execute_with(|| {819		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));820		let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));821		let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));822823		// check balance before824		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);825		assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);826		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);827828		let nft_data = default_nft_data();829		create_test_item(nft_collection_id, &nft_data.into());830831		let fungible_data = default_fungible_data();832		create_test_item(fungible_collection_id, &fungible_data.into());833834		let re_fungible_data = default_re_fungible_data();835		create_test_item(re_fungible_collection_id, &re_fungible_data.into());836837		// check balance (collection with id = 1, user id = 1)838		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);839		assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);840		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1023);841842		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);843		assert_eq!(<pallet_refungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);844	});845}846847#[test]848fn approve() {849	new_test_ext().execute_with(|| {850		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));851852		let data = default_nft_data();853		create_test_item(collection_id, &data.into());854855		let origin1 = Origin::signed(1);856857		// approve858		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));859		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));860	});861}862863#[test]864fn transfer_from() {865	new_test_ext().execute_with(|| {866		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));867		let origin1 = Origin::signed(1);868		let origin2 = Origin::signed(2);869870		let data = default_nft_data();871		create_test_item(collection_id, &data.into());872873		// approve874		assert_ok!(TemplateModule::approve(875			origin1.clone(),876			account(2),877			CollectionId(1),878			TokenId(1),879			1880		));881		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));882883		assert_ok!(TemplateModule::set_mint_permission(884			origin1.clone(),885			CollectionId(1),886			true887		));888		assert_ok!(TemplateModule::set_public_access_mode(889			origin1.clone(),890			CollectionId(1),891			AccessMode::AllowList892		));893		assert_ok!(TemplateModule::add_to_allow_list(894			origin1.clone(),895			CollectionId(1),896			account(1)897		));898		assert_ok!(TemplateModule::add_to_allow_list(899			origin1.clone(),900			CollectionId(1),901			account(2)902		));903		assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));904905		assert_ok!(TemplateModule::transfer_from(906			origin2,907			account(1),908			account(2),909			CollectionId(1),910			TokenId(1),911			1912		));913914		// after transfer915		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);916		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);917	});918}919920// #endregion921922// Coverage tests region923// #region924925#[test]926fn owner_can_add_address_to_allow_list() {927	new_test_ext().execute_with(|| {928		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));929930		let origin1 = Origin::signed(1);931		assert_ok!(TemplateModule::add_to_allow_list(932			origin1,933			collection_id,934			account(2)935		));936		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));937	});938}939940#[test]941fn admin_can_add_address_to_allow_list() {942	new_test_ext().execute_with(|| {943		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));944		let origin1 = Origin::signed(1);945		let origin2 = Origin::signed(2);946947		assert_ok!(TemplateModule::add_collection_admin(948			origin1,949			collection_id,950			account(2)951		));952		assert_ok!(TemplateModule::add_to_allow_list(953			origin2,954			collection_id,955			account(3)956		));957		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));958	});959}960961#[test]962fn nonprivileged_user_cannot_add_address_to_allow_list() {963	new_test_ext().execute_with(|| {964		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));965966		let origin2 = Origin::signed(2);967		assert_noop!(968			TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),969			CommonError::<Test>::NoPermission970		);971	});972}973974#[test]975fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {976	new_test_ext().execute_with(|| {977		let origin1 = Origin::signed(1);978979		assert_noop!(980			TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),981			CommonError::<Test>::CollectionNotFound982		);983	});984}985986#[test]987fn nobody_can_add_address_to_allow_list_of_deleted_collection() {988	new_test_ext().execute_with(|| {989		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));990991		let origin1 = Origin::signed(1);992		assert_ok!(TemplateModule::destroy_collection(993			origin1.clone(),994			collection_id995		));996		assert_noop!(997			TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),998			CommonError::<Test>::CollectionNotFound999		);1000	});1001}10021003// If address is already added to allow list, nothing happens1004#[test]1005fn address_is_already_added_to_allow_list() {1006	new_test_ext().execute_with(|| {1007		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1008		let origin1 = Origin::signed(1);10091010		assert_ok!(TemplateModule::add_to_allow_list(1011			origin1.clone(),1012			collection_id,1013			account(2)1014		));1015		assert_ok!(TemplateModule::add_to_allow_list(1016			origin1,1017			collection_id,1018			account(2)1019		));1020		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1021	});1022}10231024#[test]1025fn owner_can_remove_address_from_allow_list() {1026	new_test_ext().execute_with(|| {1027		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10281029		let origin1 = Origin::signed(1);1030		assert_ok!(TemplateModule::add_to_allow_list(1031			origin1.clone(),1032			collection_id,1033			account(2)1034		));1035		assert_ok!(TemplateModule::remove_from_allow_list(1036			origin1,1037			collection_id,1038			account(2)1039		));1040		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1041	});1042}10431044#[test]1045fn admin_can_remove_address_from_allow_list() {1046	new_test_ext().execute_with(|| {1047		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1048		let origin1 = Origin::signed(1);1049		let origin2 = Origin::signed(2);10501051		assert_ok!(TemplateModule::add_collection_admin(1052			origin1.clone(),1053			collection_id,1054			account(2)1055		));10561057		assert_ok!(TemplateModule::add_to_allow_list(1058			origin1,1059			collection_id,1060			account(3)1061		));1062		assert_ok!(TemplateModule::remove_from_allow_list(1063			origin2,1064			collection_id,1065			account(3)1066		));1067		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1068	});1069}10701071#[test]1072fn nonprivileged_user_cannot_remove_address_from_allow_list() {1073	new_test_ext().execute_with(|| {1074		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1075		let origin1 = Origin::signed(1);1076		let origin2 = Origin::signed(2);10771078		assert_ok!(TemplateModule::add_to_allow_list(1079			origin1,1080			collection_id,1081			account(2)1082		));1083		assert_noop!(1084			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1085			CommonError::<Test>::NoPermission1086		);1087		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1088	});1089}10901091#[test]1092fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1093	new_test_ext().execute_with(|| {1094		let origin1 = Origin::signed(1);10951096		assert_noop!(1097			TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1098			CommonError::<Test>::CollectionNotFound1099		);1100	});1101}11021103#[test]1104fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1105	new_test_ext().execute_with(|| {1106		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1107		let origin1 = Origin::signed(1);1108		let origin2 = Origin::signed(2);11091110		assert_ok!(TemplateModule::add_to_allow_list(1111			origin1.clone(),1112			collection_id,1113			account(2)1114		));1115		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1116		assert_noop!(1117			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1118			CommonError::<Test>::CollectionNotFound1119		);1120		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1121	});1122}11231124// If address is already removed from allow list, nothing happens1125#[test]1126fn address_is_already_removed_from_allow_list() {1127	new_test_ext().execute_with(|| {1128		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1129		let origin1 = Origin::signed(1);11301131		assert_ok!(TemplateModule::add_to_allow_list(1132			origin1.clone(),1133			collection_id,1134			account(2)1135		));1136		assert_ok!(TemplateModule::remove_from_allow_list(1137			origin1.clone(),1138			collection_id,1139			account(2)1140		));1141		assert_ok!(TemplateModule::remove_from_allow_list(1142			origin1,1143			collection_id,1144			account(2)1145		));1146		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1147	});1148}11491150// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1151#[test]1152fn allow_list_test_1() {1153	new_test_ext().execute_with(|| {1154		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));11551156		let origin1 = Origin::signed(1);11571158		let data = default_nft_data();1159		create_test_item(collection_id, &data.into());11601161		assert_ok!(TemplateModule::set_public_access_mode(1162			origin1.clone(),1163			collection_id,1164			AccessMode::AllowList1165		));1166		assert_ok!(TemplateModule::add_to_allow_list(1167			origin1.clone(),1168			collection_id,1169			account(2)1170		));11711172		assert_noop!(1173			TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1),1174			CommonError::<Test>::AddressNotInAllowlist1175		);1176	});1177}11781179#[test]1180fn allow_list_test_2() {1181	new_test_ext().execute_with(|| {1182		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1183		let origin1 = Origin::signed(1);11841185		let data = default_nft_data();1186		create_test_item(collection_id, &data.into());11871188		assert_ok!(TemplateModule::set_public_access_mode(1189			origin1.clone(),1190			collection_id,1191			AccessMode::AllowList1192		));1193		assert_ok!(TemplateModule::add_to_allow_list(1194			origin1.clone(),1195			collection_id,1196			account(1)1197		));1198		assert_ok!(TemplateModule::add_to_allow_list(1199			origin1.clone(),1200			collection_id,1201			account(2)1202		));12031204		// do approve1205		assert_ok!(TemplateModule::approve(1206			origin1.clone(),1207			account(1),1208			collection_id,1209			TokenId(1),1210			11211		));1212		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12131214		assert_ok!(TemplateModule::remove_from_allow_list(1215			origin1.clone(),1216			collection_id,1217			account(1)1218		));12191220		assert_noop!(1221			TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1),1222			CommonError::<Test>::AddressNotInAllowlist1223		);1224	});1225}12261227// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1228#[test]1229fn allow_list_test_3() {1230	new_test_ext().execute_with(|| {1231		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12321233		let origin1 = Origin::signed(1);12341235		let data = default_nft_data();1236		create_test_item(collection_id, &data.into());12371238		assert_ok!(TemplateModule::set_public_access_mode(1239			origin1.clone(),1240			collection_id,1241			AccessMode::AllowList1242		));1243		assert_ok!(TemplateModule::add_to_allow_list(1244			origin1.clone(),1245			collection_id,1246			account(1)1247		));12481249		assert_noop!(1250			TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1),1251			CommonError::<Test>::AddressNotInAllowlist1252		);1253	});1254}12551256#[test]1257fn allow_list_test_4() {1258	new_test_ext().execute_with(|| {1259		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12601261		let origin1 = Origin::signed(1);12621263		let data = default_nft_data();1264		create_test_item(collection_id, &data.into());12651266		assert_ok!(TemplateModule::set_public_access_mode(1267			origin1.clone(),1268			collection_id,1269			AccessMode::AllowList1270		));1271		assert_ok!(TemplateModule::add_to_allow_list(1272			origin1.clone(),1273			collection_id,1274			account(1)1275		));1276		assert_ok!(TemplateModule::add_to_allow_list(1277			origin1.clone(),1278			collection_id,1279			account(2)1280		));12811282		// do approve1283		assert_ok!(TemplateModule::approve(1284			origin1.clone(),1285			account(1),1286			collection_id,1287			TokenId(1),1288			11289		));1290		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12911292		assert_ok!(TemplateModule::remove_from_allow_list(1293			origin1.clone(),1294			collection_id,1295			account(2)1296		));12971298		assert_noop!(1299			TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1),1300			CommonError::<Test>::AddressNotInAllowlist1301		);1302	});1303}13041305// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1306#[test]1307fn allow_list_test_5() {1308	new_test_ext().execute_with(|| {1309		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13101311		let origin1 = Origin::signed(1);13121313		let data = default_nft_data();1314		create_test_item(collection_id, &data.into());13151316		assert_ok!(TemplateModule::set_public_access_mode(1317			origin1.clone(),1318			collection_id,1319			AccessMode::AllowList1320		));1321		assert_noop!(1322			TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 5),1323			CommonError::<Test>::AddressNotInAllowlist1324		);1325	});1326}13271328// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1329#[test]1330fn allow_list_test_6() {1331	new_test_ext().execute_with(|| {1332		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13331334		let origin1 = Origin::signed(1);13351336		let data = default_nft_data();1337		create_test_item(collection_id, &data.into());13381339		assert_ok!(TemplateModule::set_public_access_mode(1340			origin1.clone(),1341			collection_id,1342			AccessMode::AllowList1343		));13441345		// do approve1346		assert_noop!(1347			TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 5),1348			CommonError::<Test>::AddressNotInAllowlist1349		);1350	});1351}13521353// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1354//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1355#[test]1356fn allow_list_test_7() {1357	new_test_ext().execute_with(|| {1358		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13591360		let data = default_nft_data();1361		create_test_item(collection_id, &data.into());13621363		let origin1 = Origin::signed(1);13641365		assert_ok!(TemplateModule::set_public_access_mode(1366			origin1.clone(),1367			collection_id,1368			AccessMode::AllowList1369		));1370		assert_ok!(TemplateModule::add_to_allow_list(1371			origin1.clone(),1372			collection_id,1373			account(1)1374		));1375		assert_ok!(TemplateModule::add_to_allow_list(1376			origin1.clone(),1377			collection_id,1378			account(2)1379		));13801381		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1382	});1383}13841385#[test]1386fn allow_list_test_8() {1387	new_test_ext().execute_with(|| {1388		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13891390		let data = default_nft_data();1391		create_test_item(collection_id, &data.into());13921393		let origin1 = Origin::signed(1);13941395		assert_ok!(TemplateModule::set_public_access_mode(1396			origin1.clone(),1397			collection_id,1398			AccessMode::AllowList1399		));1400		assert_ok!(TemplateModule::add_to_allow_list(1401			origin1.clone(),1402			collection_id,1403			account(1)1404		));1405		assert_ok!(TemplateModule::add_to_allow_list(1406			origin1.clone(),1407			collection_id,1408			account(2)1409		));14101411		// do approve1412		assert_ok!(TemplateModule::approve(1413			origin1.clone(),1414			account(1),1415			CollectionId(1), 1416			TokenId(1),1417			51418		));1419		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));14201421		assert_ok!(TemplateModule::transfer_from(1422			origin1,1423			account(1),1424			account(2),1425			CollectionId(1), 1426			TokenId(1),1427			11428		));1429	});1430}14311432// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1433#[test]1434fn allow_list_test_9() {1435	new_test_ext().execute_with(|| {1436		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1437		let origin1 = Origin::signed(1);14381439		assert_ok!(TemplateModule::set_public_access_mode(1440			origin1.clone(),1441			collection_id,1442			AccessMode::AllowList1443		));1444		assert_ok!(TemplateModule::set_mint_permission(1445			origin1,1446			collection_id,1447			false1448		));14491450		let data = default_nft_data();1451		create_test_item(collection_id, &data.into());1452	});1453}14541455// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1456#[test]1457fn allow_list_test_10() {1458	new_test_ext().execute_with(|| {1459		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14601461		let origin1 = Origin::signed(1);1462		let origin2 = Origin::signed(2);14631464		assert_ok!(TemplateModule::set_public_access_mode(1465			origin1.clone(),1466			collection_id,1467			AccessMode::AllowList1468		));1469		assert_ok!(TemplateModule::set_mint_permission(1470			origin1.clone(),1471			collection_id,1472			false1473		));14741475		assert_ok!(TemplateModule::add_collection_admin(1476			origin1,1477			collection_id,1478			account(2)1479		));14801481		assert_ok!(TemplateModule::create_item(1482			origin2,1483			collection_id,1484			account(2),1485			default_nft_data().into()1486		));1487	});1488}14891490// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.1491#[test]1492fn allow_list_test_11() {1493	new_test_ext().execute_with(|| {1494		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14951496		let origin1 = Origin::signed(1);1497		let origin2 = Origin::signed(2);14981499		assert_ok!(TemplateModule::set_public_access_mode(1500			origin1.clone(),1501			collection_id,1502			AccessMode::AllowList1503		));1504		assert_ok!(TemplateModule::set_mint_permission(1505			origin1.clone(),1506			collection_id,1507			false1508		));1509		assert_ok!(TemplateModule::add_to_allow_list(1510			origin1,1511			collection_id,1512			account(2)1513		));15141515		assert_noop!(1516			TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()),1517			CommonError::<Test>::PublicMintingNotAllowed1518		);1519	});1520}15211522// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.1523#[test]1524fn allow_list_test_12() {1525	new_test_ext().execute_with(|| {1526		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15271528		let origin1 = Origin::signed(1);1529		let origin2 = Origin::signed(2);15301531		assert_ok!(TemplateModule::set_public_access_mode(1532			origin1.clone(),1533			collection_id,1534			AccessMode::AllowList1535		));1536		assert_ok!(TemplateModule::set_mint_permission(1537			origin1,1538			collection_id,1539			false1540		));15411542		assert_noop!(1543			TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()),1544			CommonError::<Test>::PublicMintingNotAllowed1545		);1546	});1547}15481549// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1550#[test]1551fn allow_list_test_13() {1552	new_test_ext().execute_with(|| {1553		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15541555		let origin1 = Origin::signed(1);15561557		assert_ok!(TemplateModule::set_public_access_mode(1558			origin1.clone(),1559			collection_id,1560			AccessMode::AllowList1561		));1562		assert_ok!(TemplateModule::set_mint_permission(1563			origin1,1564			collection_id,1565			true1566		));15671568		let data = default_nft_data();1569		create_test_item(collection_id, &data.into());1570	});1571}15721573// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1574#[test]1575fn allow_list_test_14() {1576	new_test_ext().execute_with(|| {1577		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15781579		let origin1 = Origin::signed(1);1580		let origin2 = Origin::signed(2);15811582		assert_ok!(TemplateModule::set_public_access_mode(1583			origin1.clone(),1584			collection_id,1585			AccessMode::AllowList1586		));1587		assert_ok!(TemplateModule::set_mint_permission(1588			origin1.clone(),1589			collection_id,1590			true1591		));15921593		assert_ok!(TemplateModule::add_collection_admin(1594			origin1,1595			collection_id,1596			account(2)1597		));15981599		assert_ok!(TemplateModule::create_item(1600			origin2,1601			collection_id,1602			account(2),1603			default_nft_data().into()1604		));1605	});1606}16071608// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.1609#[test]1610fn allow_list_test_15() {1611	new_test_ext().execute_with(|| {1612		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16131614		let origin1 = Origin::signed(1);1615		let origin2 = Origin::signed(2);16161617		assert_ok!(TemplateModule::set_public_access_mode(1618			origin1.clone(),1619			collection_id,1620			AccessMode::AllowList1621		));1622		assert_ok!(TemplateModule::set_mint_permission(1623			origin1,1624			collection_id,1625			true1626		));16271628		assert_noop!(1629			TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()),1630			CommonError::<Test>::AddressNotInAllowlist1631		);1632	});1633}16341635// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.1636#[test]1637fn allow_list_test_16() {1638	new_test_ext().execute_with(|| {1639		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16401641		let origin1 = Origin::signed(1);1642		let origin2 = Origin::signed(2);16431644		assert_ok!(TemplateModule::set_public_access_mode(1645			origin1.clone(),1646			collection_id,1647			AccessMode::AllowList1648		));1649		assert_ok!(TemplateModule::set_mint_permission(1650			origin1.clone(),1651			collection_id,1652			true1653		));1654		assert_ok!(TemplateModule::add_to_allow_list(1655			origin1,1656			collection_id,1657			account(2)1658		));16591660		assert_ok!(TemplateModule::create_item(1661			origin2,1662			collection_id,1663			account(2),1664			default_nft_data().into()1665		));1666	});1667}16681669// Total number of collections. Positive test1670#[test]1671fn total_number_collections_bound() {1672	new_test_ext().execute_with(|| {1673		create_test_collection(&CollectionMode::NFT, CollectionId(1));1674	});1675}16761677// Total number of collections. Negotive test1678#[test]1679fn total_number_collections_bound_neg() {1680	new_test_ext().execute_with(|| {1681		let origin1 = Origin::signed(1);16821683		for i in 0..COLLECTION_NUMBER_LIMIT {1684			create_test_collection(&CollectionMode::NFT, CollectionId(i + 1));1685		}16861687		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1688		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1689		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16901691		// 11-th collection in chain. Expects error1692		assert_noop!(1693			TemplateModule::create_collection(1694				origin1,1695				col_name1,1696				col_desc1,1697				token_prefix1,1698				CollectionMode::NFT1699			),1700			CommonError::<Test>::TotalCollectionsLimitExceeded1701		);1702	});1703}17041705// Owned tokens by a single address. Positive test1706#[test]1707fn owned_tokens_bound() {1708	new_test_ext().execute_with(|| {1709		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17101711		let data = default_nft_data();1712		create_test_item(collection_id, &data.clone().into());1713		create_test_item(collection_id, &data.into());1714	});1715}17161717// Owned tokens by a single address. Negotive test1718#[test]1719fn owned_tokens_bound_neg() {1720	new_test_ext().execute_with(|| {1721		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17221723		let origin1 = Origin::signed(1);17241725		for _ in 0..MAX_TOKEN_OWNERSHIP {1726			let data = default_nft_data();1727			create_test_item(collection_id, &data.clone().into());1728		}17291730		let data = default_nft_data();1731		assert_noop!(1732			TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()),1733			CommonError::<Test>::AccountTokenLimitExceeded1734		);1735	});1736}17371738// Number of collection admins. Positive test1739#[test]1740fn collection_admins_bound() {1741	new_test_ext().execute_with(|| {1742		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17431744		let origin1 = Origin::signed(1);17451746		assert_ok!(TemplateModule::add_collection_admin(1747			origin1.clone(),1748			collection_id,1749			account(2)1750		));1751		assert_ok!(TemplateModule::add_collection_admin(1752			origin1,1753			collection_id,1754			account(3)1755		));1756	});1757}17581759// Number of collection admins. Negotive test1760#[test]1761fn collection_admins_bound_neg() {1762	new_test_ext().execute_with(|| {1763		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17641765		let origin1 = Origin::signed(1);17661767		for i in 0..COLLECTION_ADMINS_LIMIT {1768			assert_ok!(TemplateModule::add_collection_admin(1769				origin1.clone(),1770				collection_id,1771				account((2 + i).into())1772			));1773		}1774		assert_noop!(1775			TemplateModule::add_collection_admin(1776				origin1,1777				collection_id,1778				account((3 + COLLECTION_ADMINS_LIMIT).into())1779			),1780			CommonError::<Test>::CollectionAdminCountExceeded1781		);1782	});1783}1784// #endregion17851786#[test]1787fn set_const_on_chain_schema() {1788	new_test_ext().execute_with(|| {1789		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17901791		let origin1 = Origin::signed(1);1792		assert_ok!(TemplateModule::set_const_on_chain_schema(1793			origin1,1794			collection_id,1795			b"test const on chain schema".to_vec()1796		));17971798		assert_eq!(1799			<pallet_common::CollectionById<Test>>::get(collection_id)1800				.unwrap()1801				.const_on_chain_schema,1802			b"test const on chain schema".to_vec()1803		);1804		assert_eq!(1805			<pallet_common::CollectionById<Test>>::get(collection_id)1806				.unwrap()1807				.variable_on_chain_schema,1808			b"".to_vec()1809		);1810	});1811}18121813#[test]1814fn set_variable_on_chain_schema() {1815	new_test_ext().execute_with(|| {1816		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18171818		let origin1 = Origin::signed(1);1819		assert_ok!(TemplateModule::set_variable_on_chain_schema(1820			origin1,1821			collection_id,1822			b"test variable on chain schema".to_vec()1823		));18241825		assert_eq!(1826			<pallet_common::CollectionById<Test>>::get(collection_id)1827				.unwrap()1828				.const_on_chain_schema,1829			b"".to_vec()1830		);1831		assert_eq!(1832			<pallet_common::CollectionById<Test>>::get(collection_id)1833				.unwrap()1834				.variable_on_chain_schema,1835			b"test variable on chain schema".to_vec()1836		);1837	});1838}18391840#[test]1841fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1842	new_test_ext().execute_with(|| {1843		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18441845		let origin1 = Origin::signed(1);18461847		let data = default_nft_data();1848		create_test_item(CollectionId(1), &data.into());18491850		let variable_data = b"test data".to_vec();1851		assert_ok!(TemplateModule::set_variable_meta_data(1852			origin1,1853			collection_id,1854			TokenId(1),1855			variable_data.clone()1856		));18571858		assert_eq!(1859			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1860				.unwrap()1861				.variable_data,1862			variable_data1863		);1864	});1865}18661867#[test]1868fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1869	new_test_ext().execute_with(|| {1870		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));18711872		let origin1 = Origin::signed(1);18731874		let data = default_re_fungible_data();1875		create_test_item(collection_id, &data.into());18761877		let variable_data = b"test data".to_vec();1878		assert_ok!(TemplateModule::set_variable_meta_data(1879			origin1,1880			collection_id,1881			TokenId(1),1882			variable_data.clone()1883		));18841885		assert_eq!(1886			<pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1887				.variable_data,1888			variable_data1889		);1890	});1891}18921893#[test]1894fn set_variable_meta_data_on_fungible_token_fails() {1895	new_test_ext().execute_with(|| {1896		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));18971898		let origin1 = Origin::signed(1);18991900		let data = default_fungible_data();1901		create_test_item(collection_id, &data.into());19021903		let variable_data = b"test data".to_vec();1904		assert_noop!(1905			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1906			<pallet_fungible::Error<Test>>::FungibleItemsDontHaveData1907		);1908	});1909}19101911#[test]1912fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1913	new_test_ext().execute_with(|| {1914		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19151916		let origin1 = Origin::signed(1);19171918		let data = default_nft_data();1919		create_test_item(collection_id, &data.into());19201921		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1922		assert_noop!(1923			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1924			CommonError::<Test>::TokenVariableDataLimitExceeded1925		);1926	});1927}19281929#[test]1930fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1931	new_test_ext().execute_with(|| {1932		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19331934		let origin1 = Origin::signed(1);19351936		let data = default_re_fungible_data();1937		create_test_item(collection_id, &data.into());19381939		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1940		assert_noop!(1941			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1942			CommonError::<Test>::TokenVariableDataLimitExceeded1943		);1944	});1945}19461947#[test]1948fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {1949	new_test_ext().execute_with(|| {1950		//default_limits();19511952		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19531954		let origin1 = Origin::signed(1);19551956		let data = default_nft_data();1957		create_test_item(collection_id, &data.into());19581959		assert_ok!(TemplateModule::set_meta_update_permission_flag(1960			origin1.clone(),1961			collection_id,1962			MetaUpdatePermission::ItemOwner,1963		));19641965		let variable_data = b"ten chars.".to_vec();1966		assert_ok!(TemplateModule::set_variable_meta_data(1967			origin1,1968			collection_id,1969			TokenId(1),1970			variable_data.clone()1971		));19721973		assert_eq!(1974			<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))1975				.unwrap()1976				.variable_data,1977			variable_data1978		);1979	});1980}19811982#[test]1983fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {1984	new_test_ext().execute_with(|| {1985		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));19861987		let origin1 = Origin::signed(1);19881989		assert_ok!(TemplateModule::set_mint_permission(1990			origin1.clone(),1991			collection_id,1992			true1993		));1994		assert_ok!(TemplateModule::add_to_allow_list(1995			origin1.clone(),1996			collection_id,1997			account(1)1998		));19992000		let data = default_nft_data();2001		create_test_item(collection_id, &data.into());20022003		assert_ok!(TemplateModule::set_meta_update_permission_flag(2004			origin1.clone(),2005			collection_id,2006			MetaUpdatePermission::ItemOwner,2007		));20082009		let variable_data = b"1234567890123".to_vec();2010		assert_noop!(2011			TemplateModule::set_variable_meta_data(2012				origin1,2013				collection_id,2014				TokenId(1),2015				variable_data.clone()2016			),2017			CommonError::<Test>::TokenVariableDataLimitExceeded2018		);2019	})2020}20212022#[test]2023fn collection_transfer_flag_works() {2024	new_test_ext().execute_with(|| {2025		let origin1 = Origin::signed(1);20262027		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2028		assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));20292030		let data = default_nft_data();2031		create_test_item(collection_id, &data.into());2032		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2033		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);20342035		let origin1 = Origin::signed(1);20362037		// default scenario2038		assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1000));2039		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2040		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2041		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2042		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2043	});2044}20452046#[test]2047fn set_variable_meta_data_on_nft_with_admin_flag() {2048	new_test_ext().execute_with(|| {2049		// default_limits();20502051		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));20522053		let origin1 = Origin::signed(1);2054		let origin2 = Origin::signed(2);20552056		assert_ok!(TemplateModule::set_mint_permission(2057			origin2.clone(),2058			collection_id,2059			true2060		));2061		assert_ok!(TemplateModule::add_to_allow_list(2062			origin2.clone(),2063			collection_id,2064			account(1)2065		));20662067		assert_ok!(TemplateModule::add_collection_admin(2068			origin2.clone(),2069			collection_id,2070			account(1)2071		));20722073		let data = default_nft_data();2074		create_test_item(collection_id, &data.into());20752076		assert_ok!(TemplateModule::set_meta_update_permission_flag(2077			origin2.clone(),2078			collection_id,2079			MetaUpdatePermission::Admin,2080		));20812082		let variable_data = b"test.".to_vec();2083		assert_ok!(TemplateModule::set_variable_meta_data(2084			origin1,2085			collection_id,2086			TokenId(1),2087			variable_data.clone()2088		));20892090		assert_eq!(2091			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2092				.unwrap()2093				.variable_data,2094			variable_data2095		);2096	});2097}20982099#[test]2100fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2101	new_test_ext().execute_with(|| {2102		// default_limits();21032104		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21052106		let origin1 = Origin::signed(1);2107		let origin2 = Origin::signed(2);21082109		assert_ok!(TemplateModule::set_mint_permission(2110			origin2.clone(),2111			collection_id,2112			true2113		));2114		assert_ok!(TemplateModule::add_to_allow_list(2115			origin2.clone(),2116			collection_id,2117			account(1)2118		));21192120		let data = default_nft_data();2121		create_test_item(collection_id, &data.into());21222123		assert_ok!(TemplateModule::set_meta_update_permission_flag(2124			origin2.clone(),2125			collection_id,2126			MetaUpdatePermission::Admin,2127		));21282129		let variable_data = b"test.".to_vec();2130		assert_noop!(2131			TemplateModule::set_variable_meta_data(2132				origin1,2133				collection_id,2134				TokenId(1),2135				variable_data.clone()2136			),2137			CommonError::<Test>::NoPermission2138		);2139	});2140}21412142#[test]2143fn set_variable_meta_flag_after_freeze() {2144	new_test_ext().execute_with(|| {2145		// default_limits();21462147		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21482149		let origin2 = Origin::signed(2);21502151		assert_ok!(TemplateModule::set_meta_update_permission_flag(2152			origin2.clone(),2153			collection_id,2154			MetaUpdatePermission::None,2155		));2156		assert_noop!(2157			TemplateModule::set_meta_update_permission_flag(2158				origin2.clone(),2159				collection_id,2160				MetaUpdatePermission::Admin2161			),2162			CommonError::<Test>::MetadataFlagFrozen2163		);2164	});2165}21662167#[test]2168fn set_variable_meta_data_on_nft_with_none_flag_neg() {2169	new_test_ext().execute_with(|| {2170		// default_limits();21712172		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2173		let origin1 = Origin::signed(1);21742175		let data = default_nft_data();2176		create_test_item(collection_id, &data.into());21772178		assert_ok!(TemplateModule::set_meta_update_permission_flag(2179			origin1.clone(),2180			collection_id,2181			MetaUpdatePermission::None,2182		));21832184		let variable_data = b"test.".to_vec();2185		assert_noop!(2186			TemplateModule::set_variable_meta_data(2187				origin1.clone(),2188				collection_id,2189				TokenId(1),2190				variable_data.clone()2191			),2192			CommonError::<Test>::NoPermission2193		);2194	});2195}21962197#[test]2198fn collection_transfer_flag_works_neg() {2199	new_test_ext().execute_with(|| {2200		let origin1 = Origin::signed(1);22012202		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2203		assert_ok!(TemplateModule::set_transfers_enabled_flag(2204			origin1, collection_id, false2205		));22062207		let data = default_nft_data();2208		create_test_item(collection_id, &data.into());2209		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2210		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);22112212		let origin1 = Origin::signed(1);22132214		// default scenario2215		assert_noop!(2216			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1000),2217			CommonError::<Test>::TransferNotAllowed2218		);2219		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2220		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2221		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2222		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2223	});2224}
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -58,18 +58,18 @@
 	}
 
 	#[pallet::pallet]
-	#[pallet::generate_store(pub(super) trait Store)]
+	#[pallet::generate_store(pub trait Store)]
 	pub struct Pallet<T>(_);
 
 	#[pallet::storage]
-	pub(super) type TokensMinted<T: Config> =
+	pub type TokensMinted<T: Config> =
 		StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
 	#[pallet::storage]
-	pub(super) type TokensBurnt<T: Config> =
+	pub type TokensBurnt<T: Config> =
 		StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
 
 	#[pallet::storage]
-	pub(super) type TokenData<T: Config> = StorageNMap<
+	pub type TokenData<T: Config> = StorageNMap<
 		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
 		Value = ItemData<T>,
 		QueryKind = OptionQuery,
@@ -77,7 +77,7 @@
 
 	/// Used to enumerate tokens owned by account
 	#[pallet::storage]
-	pub(super) type Owned<T: Config> = StorageNMap<
+	pub type Owned<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			Key<Blake2_128Concat, T::CrossAccountId>,
@@ -88,7 +88,7 @@
 	>;
 
 	#[pallet::storage]
-	pub(super) type AccountBalance<T: Config> = StorageNMap<
+	pub type AccountBalance<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			Key<Blake2_128Concat, T::CrossAccountId>,
@@ -98,7 +98,7 @@
 	>;
 
 	#[pallet::storage]
-	pub(super) type Allowance<T: Config> = StorageNMap<
+	pub type Allowance<T: Config> = StorageNMap<
 		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
 		Value = T::CrossAccountId,
 		QueryKind = OptionQuery,
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -54,25 +54,25 @@
 	}
 
 	#[pallet::pallet]
-	#[pallet::generate_store(pub(super) trait Store)]
+	#[pallet::generate_store(pub trait Store)]
 	pub struct Pallet<T>(_);
 
 	#[pallet::storage]
-	pub(super) type TokensMinted<T: Config> =
+	pub type TokensMinted<T: Config> =
 		StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
 	#[pallet::storage]
-	pub(super) type TokensBurnt<T: Config> =
+	pub type TokensBurnt<T: Config> =
 		StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
 
 	#[pallet::storage]
-	pub(super) type TokenData<T: Config> = StorageNMap<
+	pub type TokenData<T: Config> = StorageNMap<
 		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
 		Value = ItemData,
 		QueryKind = ValueQuery,
 	>;
 
 	#[pallet::storage]
-	pub(super) type TotalSupply<T: Config> = StorageNMap<
+	pub type TotalSupply<T: Config> = StorageNMap<
 		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
 		Value = u128,
 		QueryKind = ValueQuery,
@@ -80,7 +80,7 @@
 
 	/// Used to enumerate tokens owned by account
 	#[pallet::storage]
-	pub(super) type Owned<T: Config> = StorageNMap<
+	pub type Owned<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			Key<Blake2_128Concat, T::CrossAccountId>,
@@ -91,7 +91,7 @@
 	>;
 
 	#[pallet::storage]
-	pub(super) type AccountBalance<T: Config> = StorageNMap<
+	pub type AccountBalance<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			// Owner
@@ -102,7 +102,7 @@
 	>;
 
 	#[pallet::storage]
-	pub(super) type Balance<T: Config> = StorageNMap<
+	pub type Balance<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			Key<Twox64Concat, TokenId>,
@@ -114,7 +114,7 @@
 	>;
 
 	#[pallet::storage]
-	pub(super) type Allowance<T: Config> = StorageNMap<
+	pub type Allowance<T: Config> = StorageNMap<
 		Key = (
 			Key<Twox64Concat, CollectionId>,
 			Key<Twox64Concat, TokenId>,