git.delta.rocks / unique-network / refs/commits / 8a37f3ec9fdf

difftreelog

Fix formatting

Greg Zaitsev2021-11-24parent: #42222d0.patch.diff
in: master

3 files changed

modifiedpallets/inflation/src/lib.rsdiffbeforeafterboth
--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -46,8 +46,8 @@
 pub type BalanceOf<T> =
 	<<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
 
-// pub const YEAR: u32 = 5_259_600; // 6-second block 
-pub const YEAR: u32 = 2_629_800; // 12-second block 
+// pub const YEAR: u32 = 5_259_600; // 6-second block
+pub const YEAR: u32 = 2_629_800; // 12-second block
 pub const TOTAL_YEARS_UNTIL_FLAT: u32 = 9;
 pub const START_INFLATION_PERCENT: u32 = 10;
 pub const END_INFLATION_PERCENT: u32 = 4;
modifiedpallets/scheduler/src/lib.rsdiffbeforeafterboth
--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -738,9 +738,7 @@
 	use super::*;
 
 	use frame_support::{
-		ord_parameter_types, parameter_types,
-		traits::Contains,
-		weights::constants::RocksDbWeight,
+		ord_parameter_types, parameter_types, traits::Contains, weights::constants::RocksDbWeight,
 	};
 	use sp_core::H256;
 	use sp_runtime::{
modifiedpallets/unique/src/tests.rsdiffbeforeafterboth
before · pallets/unique/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use up_data_structs::{6	COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, 7	CreateNftData, CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, 8	MetaUpdatePermission, TokenId,9};10use frame_support::{assert_noop, assert_ok};11use sp_std::convert::TryInto;1213fn default_nft_data() -> CreateNftData {14	CreateNftData {15		const_data: vec![1, 2, 3].try_into().unwrap(),16		variable_data: vec![3, 2, 1].try_into().unwrap(),17	}18}1920fn default_fungible_data() -> CreateFungibleData {21	CreateFungibleData { value: 5 }22}2324fn default_re_fungible_data() -> CreateReFungibleData {25	CreateReFungibleData {26		const_data: vec![1, 2, 3].try_into().unwrap(),27		variable_data: vec![3, 2, 1].try_into().unwrap(),28		pieces: 1023,29	}30}3132fn create_test_collection_for_owner(33	mode: &CollectionMode,34	owner: u64,35	id: CollectionId,36) -> CollectionId {37	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();38	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();39	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4041	let origin1 = Origin::signed(owner);42	assert_ok!(TemplateModule::create_collection(43		origin1,44		col_name1,45		col_desc1,46		token_prefix1,47		mode.clone()48	));4950	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();51	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();52	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();53	assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);54	assert_eq!(55		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,56		saved_col_name57	);58	assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);59	assert_eq!(60		<pallet_common::CollectionById<Test>>::get(id).unwrap().description,61		saved_description62	);63	assert_eq!(64		<pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,65		saved_prefix66	);67	id68}6970fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {71	create_test_collection_for_owner(&mode, 1, id)72}7374fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {75	let origin1 = Origin::signed(1);76	assert_ok!(TemplateModule::create_item(77		origin1,78		collection_id,79		account(1),80		data.clone()81	));82}8384fn account(sub: u64) -> TestCrossAccountId {85	TestCrossAccountId::from_sub(sub)86}8788// Use cases tests region89// #region9091#[test]92fn set_version_schema() {93	new_test_ext().execute_with(|| {94		let origin1 = Origin::signed(1);95		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9697		assert_ok!(TemplateModule::set_schema_version(98			origin1,99			collection_id,100			SchemaVersion::Unique101		));102		assert_eq!(103			<pallet_common::CollectionById<Test>>::get(collection_id)104				.unwrap()105				.schema_version,106			SchemaVersion::Unique107		);108	});109}110111#[test]112fn create_fungible_collection_fails_with_large_decimal_numbers() {113	new_test_ext().execute_with(|| {114		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();115		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();116		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();117118		let origin1 = Origin::signed(1);119		assert_noop!(120			TemplateModule::create_collection(121				origin1,122				col_name1,123				col_desc1,124				token_prefix1,125				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)126			),127			Error::<Test>::CollectionDecimalPointLimitExceeded128		);129	});130}131132#[test]133fn create_nft_item() {134	new_test_ext().execute_with(|| {135		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));136137		let data = default_nft_data();138		create_test_item(collection_id, &data.clone().into());139140		let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();141		assert_eq!(item.const_data, data.const_data.into_inner());142		assert_eq!(item.variable_data, data.variable_data.into_inner());143	});144}145146// Use cases tests region147// #region148#[test]149fn create_nft_multiple_items() {150	new_test_ext().execute_with(|| {151		create_test_collection(&CollectionMode::NFT, CollectionId(1));152153		let origin1 = Origin::signed(1);154155		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];156157		assert_ok!(TemplateModule::create_multiple_items(158			origin1,159			CollectionId(1),160			account(1),161			items_data162				.clone()163				.into_iter()164				.map(|d| { d.into() })165				.collect()166		));167		for (index, data) in items_data.into_iter().enumerate() {168			let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();169			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());170			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());171		}172	});173}174175#[test]176fn create_refungible_item() {177	new_test_ext().execute_with(|| {178		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));179180		let data = default_re_fungible_data();181		create_test_item(collection_id, &data.clone().into());182		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));183		let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));184		assert_eq!(item.const_data, data.const_data.into_inner());185		assert_eq!(item.variable_data, data.variable_data.into_inner());186		assert_eq!(balance, 1023);187	});188}189190#[test]191fn create_multiple_refungible_items() {192	new_test_ext().execute_with(|| {193		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));194195		let origin1 = Origin::signed(1);196197		let items_data = vec![198			default_re_fungible_data(),199			default_re_fungible_data(),200			default_re_fungible_data(),201		];202203		assert_ok!(TemplateModule::create_multiple_items(204			origin1,205			CollectionId(1),206			account(1),207			items_data208				.clone()209				.into_iter()210				.map(|d| { d.into() })211				.collect()212		));213		for (index, data) in items_data.into_iter().enumerate() {214			let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32)));215			let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));216			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());217			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());218			assert_eq!(balance, 1023);219		}220	});221}222223#[test]224fn create_fungible_item() {225	new_test_ext().execute_with(|| {226		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));227228		let data = default_fungible_data();229		create_test_item(collection_id, &data.into());230231		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);232	});233}234235//#[test]236// fn create_multiple_fungible_items() {237//     new_test_ext().execute_with(|| {238//         default_limits();239240//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));241242//         let origin1 = Origin::signed(1);243244//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];245246//         assert_ok!(TemplateModule::create_multiple_items(247//             origin1.clone(),248//             1,249//             1,250//             items_data.clone().into_iter().map(|d| { d.into() }).collect()251//         ));252253//         for (index, _) in items_data.iter().enumerate() {254//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);255//         }256//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);257//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);258//     });259// }260261#[test]262fn transfer_fungible_item() {263	new_test_ext().execute_with(|| {264		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));265266		let origin1 = Origin::signed(1);267		let origin2 = Origin::signed(2);268269		let data = default_fungible_data();270		create_test_item(collection_id, &data.into());271272		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);273274		// change owner scenario275		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(0), 5));276		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);277278		// split item scenario279		assert_ok!(TemplateModule::transfer(280			origin2.clone(),281			account(3),282			CollectionId(1),283			TokenId(0),284			3285		));286287		// split item and new owner has account scenario288		assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(0), 1));289		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);290		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);291	});292}293294#[test]295fn transfer_refungible_item() {296	new_test_ext().execute_with(|| {297		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));298299		// Create RFT 1 in 1023 pieces for account 1300		let data = default_re_fungible_data();301		create_test_item(collection_id, &data.clone().into());302		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));303		assert_eq!(item.const_data, data.const_data.into_inner());304		assert_eq!(item.variable_data, data.variable_data.into_inner());305		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);306		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);307		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);308309		// Account 1 transfers all 1023 pieces of RFT 1 to account 2310		let origin1 = Origin::signed(1);311		let origin2 = Origin::signed(2);312		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));313		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 1023);314		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);315		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);316		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);317		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);318319		// Account 2 transfers 500 pieces of RFT 1 to account 3320		assert_ok!(TemplateModule::transfer(321			origin2.clone(),322			account(3),323			CollectionId(1),324			TokenId(1),325			500326		));327		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 523);328		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 500);329		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);330		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);331		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);332		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);333334		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance335		assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));336		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 323);337		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 700);338		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);339		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);340		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);341		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);342	});343}344345#[test]346fn transfer_nft_item() {347	new_test_ext().execute_with(|| {348		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));349350		let data = default_nft_data();351		create_test_item(collection_id, &data.into());352		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);353		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);354355356		let origin1 = Origin::signed(1);357		// default scenario358		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));359		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);360		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);361		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);362		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);363	});364}365366#[test]367fn transfer_nft_item_wrong_value() {368	new_test_ext().execute_with(|| {369		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));370371		let data = default_nft_data();372		create_test_item(collection_id, &data.into());373		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);374		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);375376		let origin1 = Origin::signed(1);377378		assert_noop!(379			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2).map_err(|e| e.error),380			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount381		);382	});383}384385#[test]386fn transfer_nft_item_zero_value() {387	new_test_ext().execute_with(|| {388		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));389390		let data = default_nft_data();391		create_test_item(collection_id, &data.into());392		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);393		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);394395		let origin1 = Origin::signed(1);396397		// Transferring 0 amount works on NFT...398		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 0));399		// ... and results in no transfer400		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);401		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);402	});403}404405#[test]406fn nft_approve_and_transfer_from() {407	new_test_ext().execute_with(|| {408		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));409410		let data = default_nft_data();411		create_test_item(collection_id, &data.into());412413		let origin1 = Origin::signed(1);414		let origin2 = Origin::signed(2);415416		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);417		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);418419		// neg transfer_from420		assert_noop!(421			TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),422			CommonError::<Test>::TokenValueNotEnough423		);424425		// do approve426		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));427		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));428429		assert_ok!(TemplateModule::transfer_from(430			origin2,431			account(1),432			account(3),433			CollectionId(1),434			TokenId(1),435			1436		));437		assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());438	});439}440441#[test]442fn nft_approve_and_transfer_from_allow_list() {443	new_test_ext().execute_with(|| {444		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));445446		let origin1 = Origin::signed(1);447		let origin2 = Origin::signed(2);448449		// Create NFT 1 for account 1450		let data = default_nft_data();451		create_test_item(collection_id, &data.clone().into());452		assert_eq!(453			&<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,454			&data.const_data.into_inner()455		);456		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);457		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);458459		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list460		assert_ok!(TemplateModule::set_mint_permission(461			origin1.clone(),462			CollectionId(1),463			true464		));465		assert_ok!(TemplateModule::set_public_access_mode(466			origin1.clone(),467			CollectionId(1),468			AccessMode::AllowList469		));470		assert_ok!(TemplateModule::add_to_allow_list(471			origin1.clone(),472			CollectionId(1),473			account(1)474		));475		assert_ok!(TemplateModule::add_to_allow_list(476			origin1.clone(),477			CollectionId(1),478			account(2)479		));480		assert_ok!(TemplateModule::add_to_allow_list(481			origin1.clone(),482			CollectionId(1),483			account(3)484		));485486		// Account 1 approves account 2 for NFT 1 487		assert_ok!(TemplateModule::approve(488			origin1.clone(),489			account(2),490			CollectionId(1),491			TokenId(1),492			1493		));494		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));495496		// Account 2 transfers NFT 1 from account 1 to account 3497		assert_ok!(TemplateModule::transfer_from(498			origin2,499			account(1),500			account(3),501			CollectionId(1),502			TokenId(1),503			1504		));505		assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());506	});507}508509#[test]510fn refungible_approve_and_transfer_from() {511	new_test_ext().execute_with(|| {512		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));513514		let origin1 = Origin::signed(1);515		let origin2 = Origin::signed(2);516517		// Create RFT 1 in 1023 pieces for account 1518		let data = default_re_fungible_data();519		create_test_item(collection_id, &data.into());520521		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);522		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);523		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);524525		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list526		assert_ok!(TemplateModule::set_mint_permission(527			origin1.clone(),528			CollectionId(1),529			true530		));531		assert_ok!(TemplateModule::set_public_access_mode(532			origin1.clone(),533			CollectionId(1),534			AccessMode::AllowList535		));536		assert_ok!(TemplateModule::add_to_allow_list(537			origin1.clone(),538			CollectionId(1),539			account(1)540		));541		assert_ok!(TemplateModule::add_to_allow_list(542			origin1.clone(),543			CollectionId(1),544			account(2)545		));546		assert_ok!(TemplateModule::add_to_allow_list(547			origin1.clone(),548			CollectionId(1),549			account(3)550		));551552		// Account 1 approves account 2 for 1023 pieces of RFT 1553		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));554		assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);555556		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3557		assert_ok!(TemplateModule::transfer_from(558			origin2,559			account(1),560			account(3),561			CollectionId(1),562			TokenId(1),563			100564		));565		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);566		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);567		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 923);568		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 100);569		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);570		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);571		assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);572	});573}574575#[test]576fn fungible_approve_and_transfer_from() {577	new_test_ext().execute_with(|| {578		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));579580		let data = default_fungible_data();581		create_test_item(collection_id, &data.into());582583		let origin1 = Origin::signed(1);584		let origin2 = Origin::signed(2);585586		assert_ok!(TemplateModule::set_mint_permission(587			origin1.clone(),588			CollectionId(1),589			true590		));591		assert_ok!(TemplateModule::set_public_access_mode(592			origin1.clone(),593			CollectionId(1),594			AccessMode::AllowList595		));596		assert_ok!(TemplateModule::add_to_allow_list(597			origin1.clone(),598			CollectionId(1),599			account(1)600		));601		assert_ok!(TemplateModule::add_to_allow_list(602			origin1.clone(),603			CollectionId(1),604			account(2)605		));606		assert_ok!(TemplateModule::add_to_allow_list(607			origin1.clone(),608			CollectionId(1),609			account(3)610		));611612		// do approve613		assert_ok!(TemplateModule::approve(614			origin1.clone(),615			account(2),616			CollectionId(1),617			TokenId(0),618			5619		));620		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);621		assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(0), 5));622		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);623		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);624625		assert_ok!(TemplateModule::transfer_from(626			origin2.clone(),627			account(1),628			account(3),629			CollectionId(1),630			TokenId(0),631			4632		));633634		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);635636		assert_noop!(637			TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(0), 4).map_err(|e| e.error),638			CommonError::<Test>::TokenValueNotEnough639		);640	});641}642643#[test]644fn change_collection_owner() {645	new_test_ext().execute_with(|| {646		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));647648		let origin1 = Origin::signed(1);649		assert_ok!(TemplateModule::change_collection_owner(650			origin1,651			collection_id,652			2653		));654		assert_eq!(655			<pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,656			2657		);658	});659}660661#[test]662fn destroy_collection() {663	new_test_ext().execute_with(|| {664		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));665666		let origin1 = Origin::signed(1);667		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));668	});669}670671#[test]672fn burn_nft_item() {673	new_test_ext().execute_with(|| {674		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));675676		let origin1 = Origin::signed(1);677678		let data = default_nft_data();679		create_test_item(collection_id, &data.into());680681		// check balance (collection with id = 1, user id = 1)682		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);683684		// burn item685		assert_ok!(TemplateModule::burn_item(686			origin1.clone(),687			collection_id,688			TokenId(1),689			1690		));691		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);692	});693}694695#[test]696fn burn_same_nft_item_twice() {697	new_test_ext().execute_with(|| {698		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));699700		let origin1 = Origin::signed(1);701702		let data = default_nft_data();703		create_test_item(collection_id, &data.into());704705		// check balance (collection with id = 1, user id = 1)706		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);707708		// burn item709		assert_ok!(TemplateModule::burn_item(710			origin1.clone(),711			collection_id,712			TokenId(1),713			1714		));715		716		// burn item again717		assert_noop!(718			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),719			CommonError::<Test>::TokenNotFound720		);721722		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);723	});724}725726#[test]727fn burn_fungible_item() {728	new_test_ext().execute_with(|| {729		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));730731		let origin1 = Origin::signed(1);732		assert_ok!(TemplateModule::add_collection_admin(733			origin1.clone(),734			collection_id,735			account(2)736		));737738		let data = default_fungible_data();739		create_test_item(collection_id, &data.into());740741		// check balance (collection with id = 1, user id = 1)742		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);743744		// burn item745		assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(0), 5));746		assert_noop!(747			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),748			CommonError::<Test>::TokenValueTooLow749		);750751		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);752	});753}754755#[test]756fn burn_fungible_item_with_token_id() {757	new_test_ext().execute_with(|| {758		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));759760		let origin1 = Origin::signed(1);761		assert_ok!(TemplateModule::add_collection_admin(762			origin1.clone(),763			collection_id,764			account(2)765		));766767		let data = default_fungible_data();768		create_test_item(collection_id, &data.into());769770		// check balance (collection with id = 1, user id = 1)771		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);772773		// Try to burn item using Token ID774		assert_noop!(775			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),776			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId777		);778	});779}780#[test]781fn burn_refungible_item() {782	new_test_ext().execute_with(|| {783		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));784		let origin1 = Origin::signed(1);785786		assert_ok!(TemplateModule::set_mint_permission(787			origin1.clone(),788			collection_id,789			true790		));791		assert_ok!(TemplateModule::set_public_access_mode(792			origin1.clone(),793			collection_id,794			AccessMode::AllowList795		));796		assert_ok!(TemplateModule::add_to_allow_list(797			origin1.clone(),798			collection_id,799			account(1)800		));801802		assert_ok!(TemplateModule::add_collection_admin(803			origin1.clone(),804			collection_id,805			account(2)806		));807808		let data = default_re_fungible_data();809		create_test_item(collection_id, &data.into());810811		// check balance (collection with id = 1, user id = 2)812		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);813		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);814815		// burn item816		assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));817		assert_noop!(818			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),819			CommonError::<Test>::TokenValueTooLow820		);821822		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);823	});824}825826#[test]827fn add_collection_admin() {828	new_test_ext().execute_with(|| {829		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));830		let origin1 = Origin::signed(1);831832		// Add collection admins833		assert_ok!(TemplateModule::add_collection_admin(834			origin1.clone(),835			collection1_id,836			account(2)837		));838		assert_ok!(TemplateModule::add_collection_admin(839			origin1,840			collection1_id,841			account(3)842		));843844		// Owner is not an admin by default845		assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))), false);846		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));847		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));848	});849}850851#[test]852fn remove_collection_admin() {853	new_test_ext().execute_with(|| {854		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));855		let origin1 = Origin::signed(1);856		let origin2 = Origin::signed(2);857858		// Add collection admins 2 and 3859		assert_ok!(TemplateModule::add_collection_admin(860			origin1.clone(),861			collection1_id,862			account(2)863		));864		assert_ok!(TemplateModule::add_collection_admin(865			origin1,866			collection1_id,867			account(3)868		));869870		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));871		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));872873		// remove admin 3874		assert_ok!(TemplateModule::remove_collection_admin(875			origin2,876			CollectionId(1),877			account(3)878		));879880		// 2 is still admin, 3 is not an admin anymore881		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));882		assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))), false);883	});884}885886#[test]887fn balance_of() {888	new_test_ext().execute_with(|| {889		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));890		let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));891		let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));892893		// check balance before894		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);895		assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);896		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);897898		let nft_data = default_nft_data();899		create_test_item(nft_collection_id, &nft_data.into());900901		let fungible_data = default_fungible_data();902		create_test_item(fungible_collection_id, &fungible_data.into());903904		let re_fungible_data = default_re_fungible_data();905		create_test_item(re_fungible_collection_id, &re_fungible_data.into());906907		// check balance (collection with id = 1, user id = 1)908		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);909		assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);910		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1);911912		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);913		assert_eq!(<pallet_refungible::Owned<Test>>::get((re_fungible_collection_id, account(1), TokenId(1))), true);914	});915}916917#[test]918fn approve() {919	new_test_ext().execute_with(|| {920		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));921922		let data = default_nft_data();923		create_test_item(collection_id, &data.into());924925		let origin1 = Origin::signed(1);926927		// approve928		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));929		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));930	});931}932933#[test]934fn transfer_from() {935	new_test_ext().execute_with(|| {936		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));937		let origin1 = Origin::signed(1);938		let origin2 = Origin::signed(2);939940		let data = default_nft_data();941		create_test_item(collection_id, &data.into());942943		// approve944		assert_ok!(TemplateModule::approve(945			origin1.clone(),946			account(2),947			CollectionId(1),948			TokenId(1),949			1950		));951		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));952953		assert_ok!(TemplateModule::set_mint_permission(954			origin1.clone(),955			CollectionId(1),956			true957		));958		assert_ok!(TemplateModule::set_public_access_mode(959			origin1.clone(),960			CollectionId(1),961			AccessMode::AllowList962		));963		assert_ok!(TemplateModule::add_to_allow_list(964			origin1.clone(),965			CollectionId(1),966			account(1)967		));968		assert_ok!(TemplateModule::add_to_allow_list(969			origin1.clone(),970			CollectionId(1),971			account(2)972		));973		assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));974975		assert_ok!(TemplateModule::transfer_from(976			origin2,977			account(1),978			account(2),979			CollectionId(1),980			TokenId(1),981			1982		));983984		// after transfer985		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);986		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);987	});988}989990// #endregion991992// Coverage tests region993// #region994995#[test]996fn owner_can_add_address_to_allow_list() {997	new_test_ext().execute_with(|| {998		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9991000		let origin1 = Origin::signed(1);1001		assert_ok!(TemplateModule::add_to_allow_list(1002			origin1,1003			collection_id,1004			account(2)1005		));1006		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1007	});1008}10091010#[test]1011fn admin_can_add_address_to_allow_list() {1012	new_test_ext().execute_with(|| {1013		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1014		let origin1 = Origin::signed(1);1015		let origin2 = Origin::signed(2);10161017		assert_ok!(TemplateModule::add_collection_admin(1018			origin1,1019			collection_id,1020			account(2)1021		));1022		assert_ok!(TemplateModule::add_to_allow_list(1023			origin2,1024			collection_id,1025			account(3)1026		));1027		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1028	});1029}10301031#[test]1032fn nonprivileged_user_cannot_add_address_to_allow_list() {1033	new_test_ext().execute_with(|| {1034		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10351036		let origin2 = Origin::signed(2);1037		assert_noop!(1038			TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1039			CommonError::<Test>::NoPermission1040		);1041	});1042}10431044#[test]1045fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1046	new_test_ext().execute_with(|| {1047		let origin1 = Origin::signed(1);10481049		assert_noop!(1050			TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1051			CommonError::<Test>::CollectionNotFound1052		);1053	});1054}10551056#[test]1057fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1058	new_test_ext().execute_with(|| {1059		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10601061		let origin1 = Origin::signed(1);1062		assert_ok!(TemplateModule::destroy_collection(1063			origin1.clone(),1064			collection_id1065		));1066		assert_noop!(1067			TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1068			CommonError::<Test>::CollectionNotFound1069		);1070	});1071}10721073// If address is already added to allow list, nothing happens1074#[test]1075fn address_is_already_added_to_allow_list() {1076	new_test_ext().execute_with(|| {1077		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1078		let origin1 = Origin::signed(1);10791080		assert_ok!(TemplateModule::add_to_allow_list(1081			origin1.clone(),1082			collection_id,1083			account(2)1084		));1085		assert_ok!(TemplateModule::add_to_allow_list(1086			origin1,1087			collection_id,1088			account(2)1089		));1090		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1091	});1092}10931094#[test]1095fn owner_can_remove_address_from_allow_list() {1096	new_test_ext().execute_with(|| {1097		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10981099		let origin1 = Origin::signed(1);1100		assert_ok!(TemplateModule::add_to_allow_list(1101			origin1.clone(),1102			collection_id,1103			account(2)1104		));1105		assert_ok!(TemplateModule::remove_from_allow_list(1106			origin1,1107			collection_id,1108			account(2)1109		));1110		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1111	});1112}11131114#[test]1115fn admin_can_remove_address_from_allow_list() {1116	new_test_ext().execute_with(|| {1117		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1118		let origin1 = Origin::signed(1);1119		let origin2 = Origin::signed(2);11201121		// Owner adds admin1122		assert_ok!(TemplateModule::add_collection_admin(1123			origin1.clone(),1124			collection_id,1125			account(2)1126		));11271128		// Owner adds address 3 to allow list1129		assert_ok!(TemplateModule::add_to_allow_list(1130			origin1,1131			collection_id,1132			account(3)1133		));11341135		// Admin removes address 3 from allow list1136		assert_ok!(TemplateModule::remove_from_allow_list(1137			origin2,1138			collection_id,1139			account(3)1140		));1141		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))), false);1142	});1143}11441145#[test]1146fn nonprivileged_user_cannot_remove_address_from_allow_list() {1147	new_test_ext().execute_with(|| {1148		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1149		let origin1 = Origin::signed(1);1150		let origin2 = Origin::signed(2);11511152		assert_ok!(TemplateModule::add_to_allow_list(1153			origin1,1154			collection_id,1155			account(2)1156		));1157		assert_noop!(1158			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1159			CommonError::<Test>::NoPermission1160		);1161		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1162	});1163}11641165#[test]1166fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1167	new_test_ext().execute_with(|| {1168		let origin1 = Origin::signed(1);11691170		assert_noop!(1171			TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1172			CommonError::<Test>::CollectionNotFound1173		);1174	});1175}11761177#[test]1178fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1179	new_test_ext().execute_with(|| {1180		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1181		let origin1 = Origin::signed(1);1182		let origin2 = Origin::signed(2);11831184		// Add account 2 to allow list1185		assert_ok!(TemplateModule::add_to_allow_list(1186			origin1.clone(),1187			collection_id,1188			account(2)1189		));11901191		// Account 2 is in collection allow-list1192		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));11931194		// Destroy collection1195		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));11961197		// Attempt to remove account 2 from collection allow-list => error1198		assert_noop!(1199			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1200			CommonError::<Test>::CollectionNotFound1201		);12021203		// Account 2 is not found in collection allow-list anyway1204		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1205	});1206}12071208// If address is already removed from allow list, nothing happens1209#[test]1210fn address_is_already_removed_from_allow_list() {1211	new_test_ext().execute_with(|| {1212		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1213		let origin1 = Origin::signed(1);12141215		assert_ok!(TemplateModule::add_to_allow_list(1216			origin1.clone(),1217			collection_id,1218			account(2)1219		));1220		assert_ok!(TemplateModule::remove_from_allow_list(1221			origin1.clone(),1222			collection_id,1223			account(2)1224		));1225		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1226		assert_ok!(TemplateModule::remove_from_allow_list(1227			origin1,1228			collection_id,1229			account(2)1230		));1231		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1232	});1233}12341235// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1236#[test]1237fn allow_list_test_1() {1238	new_test_ext().execute_with(|| {1239		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12401241		let origin1 = Origin::signed(1);12421243		let data = default_nft_data();1244		create_test_item(collection_id, &data.into());12451246		assert_ok!(TemplateModule::set_public_access_mode(1247			origin1.clone(),1248			collection_id,1249			AccessMode::AllowList1250		));1251		assert_ok!(TemplateModule::add_to_allow_list(1252			origin1.clone(),1253			collection_id,1254			account(2)1255		));12561257		assert_noop!(1258			TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1259			CommonError::<Test>::AddressNotInAllowlist1260		);1261	});1262}12631264#[test]1265fn allow_list_test_2() {1266	new_test_ext().execute_with(|| {1267		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1268		let origin1 = Origin::signed(1);12691270		let data = default_nft_data();1271		create_test_item(collection_id, &data.into());12721273		assert_ok!(TemplateModule::set_public_access_mode(1274			origin1.clone(),1275			collection_id,1276			AccessMode::AllowList1277		));1278		assert_ok!(TemplateModule::add_to_allow_list(1279			origin1.clone(),1280			collection_id,1281			account(1)1282		));1283		assert_ok!(TemplateModule::add_to_allow_list(1284			origin1.clone(),1285			collection_id,1286			account(2)1287		));12881289		// do approve1290		assert_ok!(TemplateModule::approve(1291			origin1.clone(),1292			account(1),1293			collection_id,1294			TokenId(1),1295			11296		));1297		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12981299		assert_ok!(TemplateModule::remove_from_allow_list(1300			origin1.clone(),1301			collection_id,1302			account(1)1303		));13041305		assert_noop!(1306			TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1307			CommonError::<Test>::AddressNotInAllowlist1308		);1309	});1310}13111312// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1313#[test]1314fn allow_list_test_3() {1315	new_test_ext().execute_with(|| {1316		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13171318		let origin1 = Origin::signed(1);13191320		let data = default_nft_data();1321		create_test_item(collection_id, &data.into());13221323		assert_ok!(TemplateModule::set_public_access_mode(1324			origin1.clone(),1325			collection_id,1326			AccessMode::AllowList1327		));1328		assert_ok!(TemplateModule::add_to_allow_list(1329			origin1.clone(),1330			collection_id,1331			account(1)1332		));13331334		assert_noop!(1335			TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1336			CommonError::<Test>::AddressNotInAllowlist1337		);1338	});1339}13401341#[test]1342fn allow_list_test_4() {1343	new_test_ext().execute_with(|| {1344		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13451346		let origin1 = Origin::signed(1);13471348		let data = default_nft_data();1349		create_test_item(collection_id, &data.into());13501351		assert_ok!(TemplateModule::set_public_access_mode(1352			origin1.clone(),1353			collection_id,1354			AccessMode::AllowList1355		));1356		assert_ok!(TemplateModule::add_to_allow_list(1357			origin1.clone(),1358			collection_id,1359			account(1)1360		));1361		assert_ok!(TemplateModule::add_to_allow_list(1362			origin1.clone(),1363			collection_id,1364			account(2)1365		));13661367		// do approve1368		assert_ok!(TemplateModule::approve(1369			origin1.clone(),1370			account(1),1371			collection_id,1372			TokenId(1),1373			11374		));1375		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13761377		assert_ok!(TemplateModule::remove_from_allow_list(1378			origin1.clone(),1379			collection_id,1380			account(2)1381		));13821383		assert_noop!(1384			TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1385			CommonError::<Test>::AddressNotInAllowlist1386		);1387	});1388}13891390// 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)1391#[test]1392fn allow_list_test_5() {1393	new_test_ext().execute_with(|| {1394		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13951396		let origin1 = Origin::signed(1);13971398		let data = default_nft_data();1399		create_test_item(collection_id, &data.into());14001401		assert_ok!(TemplateModule::set_public_access_mode(1402			origin1.clone(),1403			collection_id,1404			AccessMode::AllowList1405		));1406		assert_noop!(1407			TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1408			CommonError::<Test>::AddressNotInAllowlist1409		);1410	});1411}14121413// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1414#[test]1415fn allow_list_test_6() {1416	new_test_ext().execute_with(|| {1417		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14181419		let origin1 = Origin::signed(1);14201421		let data = default_nft_data();1422		create_test_item(collection_id, &data.into());14231424		assert_ok!(TemplateModule::set_public_access_mode(1425			origin1.clone(),1426			collection_id,1427			AccessMode::AllowList1428		));14291430		// do approve1431		assert_noop!(1432			TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1433			CommonError::<Test>::AddressNotInAllowlist1434		);1435	});1436}14371438// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1439//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1440#[test]1441fn allow_list_test_7() {1442	new_test_ext().execute_with(|| {1443		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14441445		let data = default_nft_data();1446		create_test_item(collection_id, &data.into());14471448		let origin1 = Origin::signed(1);14491450		assert_ok!(TemplateModule::set_public_access_mode(1451			origin1.clone(),1452			collection_id,1453			AccessMode::AllowList1454		));1455		assert_ok!(TemplateModule::add_to_allow_list(1456			origin1.clone(),1457			collection_id,1458			account(1)1459		));1460		assert_ok!(TemplateModule::add_to_allow_list(1461			origin1.clone(),1462			collection_id,1463			account(2)1464		));14651466		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1467	});1468}14691470#[test]1471fn allow_list_test_8() {1472	new_test_ext().execute_with(|| {1473		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14741475		// Create NFT for account 11476		let data = default_nft_data();1477		create_test_item(collection_id, &data.into());14781479		let origin1 = Origin::signed(1);14801481		// Toggle Allow List mode and add accounts 1 and 21482		assert_ok!(TemplateModule::set_public_access_mode(1483			origin1.clone(),1484			collection_id,1485			AccessMode::AllowList1486		));1487		assert_ok!(TemplateModule::add_to_allow_list(1488			origin1.clone(),1489			collection_id,1490			account(1)1491		));1492		assert_ok!(TemplateModule::add_to_allow_list(1493			origin1.clone(),1494			collection_id,1495			account(2)1496		));14971498		// Sself-approve account 1 for NFT 11499		assert_ok!(TemplateModule::approve(1500			origin1.clone(),1501			account(1),1502			CollectionId(1), 1503			TokenId(1),1504			11505		));1506		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));15071508		// Transfer from 1 to 21509		assert_ok!(TemplateModule::transfer_from(1510			origin1,1511			account(1),1512			account(2),1513			CollectionId(1), 1514			TokenId(1),1515			11516		));1517	});1518}15191520// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1521#[test]1522fn allow_list_test_9() {1523	new_test_ext().execute_with(|| {1524		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1525		let origin1 = Origin::signed(1);15261527		assert_ok!(TemplateModule::set_public_access_mode(1528			origin1.clone(),1529			collection_id,1530			AccessMode::AllowList1531		));1532		assert_ok!(TemplateModule::set_mint_permission(1533			origin1,1534			collection_id,1535			false1536		));15371538		let data = default_nft_data();1539		create_test_item(collection_id, &data.into());1540	});1541}15421543// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1544#[test]1545fn allow_list_test_10() {1546	new_test_ext().execute_with(|| {1547		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15481549		let origin1 = Origin::signed(1);1550		let origin2 = Origin::signed(2);15511552		assert_ok!(TemplateModule::set_public_access_mode(1553			origin1.clone(),1554			collection_id,1555			AccessMode::AllowList1556		));1557		assert_ok!(TemplateModule::set_mint_permission(1558			origin1.clone(),1559			collection_id,1560			false1561		));15621563		assert_ok!(TemplateModule::add_collection_admin(1564			origin1,1565			collection_id,1566			account(2)1567		));15681569		assert_ok!(TemplateModule::create_item(1570			origin2,1571			collection_id,1572			account(2),1573			default_nft_data().into()1574		));1575	});1576}15771578// 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.1579#[test]1580fn allow_list_test_11() {1581	new_test_ext().execute_with(|| {1582		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15831584		let origin1 = Origin::signed(1);1585		let origin2 = Origin::signed(2);15861587		assert_ok!(TemplateModule::set_public_access_mode(1588			origin1.clone(),1589			collection_id,1590			AccessMode::AllowList1591		));1592		assert_ok!(TemplateModule::set_mint_permission(1593			origin1.clone(),1594			collection_id,1595			false1596		));1597		assert_ok!(TemplateModule::add_to_allow_list(1598			origin1,1599			collection_id,1600			account(2)1601		));16021603		assert_noop!(1604			TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1605			CommonError::<Test>::PublicMintingNotAllowed1606		);1607	});1608}16091610// 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.1611#[test]1612fn allow_list_test_12() {1613	new_test_ext().execute_with(|| {1614		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16151616		let origin1 = Origin::signed(1);1617		let origin2 = Origin::signed(2);16181619		assert_ok!(TemplateModule::set_public_access_mode(1620			origin1.clone(),1621			collection_id,1622			AccessMode::AllowList1623		));1624		assert_ok!(TemplateModule::set_mint_permission(1625			origin1,1626			collection_id,1627			false1628		));16291630		assert_noop!(1631			TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1632			CommonError::<Test>::PublicMintingNotAllowed1633		);1634	});1635}16361637// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1638#[test]1639fn allow_list_test_13() {1640	new_test_ext().execute_with(|| {1641		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16421643		let origin1 = Origin::signed(1);16441645		assert_ok!(TemplateModule::set_public_access_mode(1646			origin1.clone(),1647			collection_id,1648			AccessMode::AllowList1649		));1650		assert_ok!(TemplateModule::set_mint_permission(1651			origin1,1652			collection_id,1653			true1654		));16551656		let data = default_nft_data();1657		create_test_item(collection_id, &data.into());1658	});1659}16601661// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1662#[test]1663fn allow_list_test_14() {1664	new_test_ext().execute_with(|| {1665		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16661667		let origin1 = Origin::signed(1);1668		let origin2 = Origin::signed(2);16691670		assert_ok!(TemplateModule::set_public_access_mode(1671			origin1.clone(),1672			collection_id,1673			AccessMode::AllowList1674		));1675		assert_ok!(TemplateModule::set_mint_permission(1676			origin1.clone(),1677			collection_id,1678			true1679		));16801681		assert_ok!(TemplateModule::add_collection_admin(1682			origin1,1683			collection_id,1684			account(2)1685		));16861687		assert_ok!(TemplateModule::create_item(1688			origin2,1689			collection_id,1690			account(2),1691			default_nft_data().into()1692		));1693	});1694}16951696// 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.1697#[test]1698fn allow_list_test_15() {1699	new_test_ext().execute_with(|| {1700		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17011702		let origin1 = Origin::signed(1);1703		let origin2 = Origin::signed(2);17041705		assert_ok!(TemplateModule::set_public_access_mode(1706			origin1.clone(),1707			collection_id,1708			AccessMode::AllowList1709		));1710		assert_ok!(TemplateModule::set_mint_permission(1711			origin1,1712			collection_id,1713			true1714		));17151716		assert_noop!(1717			TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()).map_err(|e| e.error),1718			CommonError::<Test>::AddressNotInAllowlist1719		);1720	});1721}17221723// 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.1724#[test]1725fn allow_list_test_16() {1726	new_test_ext().execute_with(|| {1727		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17281729		let origin1 = Origin::signed(1);1730		let origin2 = Origin::signed(2);17311732		assert_ok!(TemplateModule::set_public_access_mode(1733			origin1.clone(),1734			collection_id,1735			AccessMode::AllowList1736		));1737		assert_ok!(TemplateModule::set_mint_permission(1738			origin1.clone(),1739			collection_id,1740			true1741		));1742		assert_ok!(TemplateModule::add_to_allow_list(1743			origin1,1744			collection_id,1745			account(2)1746		));17471748		assert_ok!(TemplateModule::create_item(1749			origin2,1750			collection_id,1751			account(2),1752			default_nft_data().into()1753		));1754	});1755}17561757// Total number of collections. Positive test1758#[test]1759fn total_number_collections_bound() {1760	new_test_ext().execute_with(|| {1761		create_test_collection(&CollectionMode::NFT, CollectionId(1));1762	});1763}17641765#[test]1766fn create_max_collections() {1767	new_test_ext().execute_with(|| {1768		for i in 1..=COLLECTION_NUMBER_LIMIT {1769			create_test_collection(&CollectionMode::NFT, CollectionId(i));1770		}1771	});1772}17731774// Total number of collections. Negative test1775#[test]1776fn total_number_collections_bound_neg() {1777	new_test_ext().execute_with(|| {1778		let origin1 = Origin::signed(1);17791780		for i in 1..=COLLECTION_NUMBER_LIMIT {1781			create_test_collection(&CollectionMode::NFT, CollectionId(i));1782		}17831784		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1785		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1786		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17871788		// 11-th collection in chain. Expects error1789		assert_noop!(1790			TemplateModule::create_collection(1791				origin1,1792				col_name1,1793				col_desc1,1794				token_prefix1,1795				CollectionMode::NFT1796			),1797			CommonError::<Test>::TotalCollectionsLimitExceeded1798		);1799	});1800}18011802// Owned tokens by a single address. Positive test1803#[test]1804fn owned_tokens_bound() {1805	new_test_ext().execute_with(|| {1806		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18071808		let data = default_nft_data();1809		create_test_item(collection_id, &data.clone().into());1810		create_test_item(collection_id, &data.into());1811	});1812}18131814// Owned tokens by a single address. Negotive test1815#[test]1816fn owned_tokens_bound_neg() {1817	new_test_ext().execute_with(|| {1818		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18191820		let origin1 = Origin::signed(1);18211822		for _ in 1..=MAX_TOKEN_OWNERSHIP {1823			let data = default_nft_data();1824			create_test_item(collection_id, &data.clone().into());1825		}18261827		let data = default_nft_data();1828		assert_noop!(1829			TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()).map_err(|e| e.error),1830			CommonError::<Test>::AccountTokenLimitExceeded1831		);1832	});1833}18341835// Number of collection admins. Positive test1836#[test]1837fn collection_admins_bound() {1838	new_test_ext().execute_with(|| {1839		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18401841		let origin1 = Origin::signed(1);18421843		assert_ok!(TemplateModule::add_collection_admin(1844			origin1.clone(),1845			collection_id,1846			account(2)1847		));1848		assert_ok!(TemplateModule::add_collection_admin(1849			origin1,1850			collection_id,1851			account(3)1852		));1853	});1854}18551856// Number of collection admins. Negotive test1857#[test]1858fn collection_admins_bound_neg() {1859	new_test_ext().execute_with(|| {1860		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18611862		let origin1 = Origin::signed(1);18631864		for i in 0..COLLECTION_ADMINS_LIMIT {1865			assert_ok!(TemplateModule::add_collection_admin(1866				origin1.clone(),1867				collection_id,1868				account((2 + i).into())1869			));1870		}1871		assert_noop!(1872			TemplateModule::add_collection_admin(1873				origin1,1874				collection_id,1875				account((3 + COLLECTION_ADMINS_LIMIT).into())1876			),1877			CommonError::<Test>::CollectionAdminCountExceeded1878		);1879	});1880}1881// #endregion18821883#[test]1884fn set_const_on_chain_schema() {1885	new_test_ext().execute_with(|| {1886		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18871888		let origin1 = Origin::signed(1);1889		assert_ok!(TemplateModule::set_const_on_chain_schema(1890			origin1,1891			collection_id,1892			b"test const on chain schema".to_vec()1893		));18941895		assert_eq!(1896			<pallet_common::CollectionById<Test>>::get(collection_id)1897				.unwrap()1898				.const_on_chain_schema,1899			b"test const on chain schema".to_vec()1900		);1901		assert_eq!(1902			<pallet_common::CollectionById<Test>>::get(collection_id)1903				.unwrap()1904				.variable_on_chain_schema,1905			b"".to_vec()1906		);1907	});1908}19091910#[test]1911fn set_variable_on_chain_schema() {1912	new_test_ext().execute_with(|| {1913		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19141915		let origin1 = Origin::signed(1);1916		assert_ok!(TemplateModule::set_variable_on_chain_schema(1917			origin1,1918			collection_id,1919			b"test variable on chain schema".to_vec()1920		));19211922		assert_eq!(1923			<pallet_common::CollectionById<Test>>::get(collection_id)1924				.unwrap()1925				.const_on_chain_schema,1926			b"".to_vec()1927		);1928		assert_eq!(1929			<pallet_common::CollectionById<Test>>::get(collection_id)1930				.unwrap()1931				.variable_on_chain_schema,1932			b"test variable on chain schema".to_vec()1933		);1934	});1935}19361937#[test]1938fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1939	new_test_ext().execute_with(|| {1940		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19411942		let origin1 = Origin::signed(1);19431944		let data = default_nft_data();1945		create_test_item(CollectionId(1), &data.into());19461947		let variable_data = b"test data".to_vec();1948		assert_ok!(TemplateModule::set_variable_meta_data(1949			origin1,1950			collection_id,1951			TokenId(1),1952			variable_data.clone()1953		));19541955		assert_eq!(1956			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1957				.unwrap()1958				.variable_data,1959			variable_data1960		);1961	});1962}19631964#[test]1965fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1966	new_test_ext().execute_with(|| {1967		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19681969		let origin1 = Origin::signed(1);19701971		let data = default_re_fungible_data();1972		create_test_item(collection_id, &data.into());19731974		let variable_data = b"test data".to_vec();1975		assert_ok!(TemplateModule::set_variable_meta_data(1976			origin1,1977			collection_id,1978			TokenId(1),1979			variable_data.clone()1980		));19811982		assert_eq!(1983			<pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1984				.variable_data,1985			variable_data1986		);1987	});1988}19891990#[test]1991fn set_variable_meta_data_on_fungible_token_fails() {1992	new_test_ext().execute_with(|| {1993		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));19941995		let origin1 = Origin::signed(1);19961997		let data = default_fungible_data();1998		create_test_item(collection_id, &data.into());19992000		let variable_data = b"test data".to_vec();2001		assert_noop!(2002			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(0), variable_data).map_err(|e| e.error),2003			<pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2004		);2005	});2006}20072008#[test]2009fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2010	new_test_ext().execute_with(|| {2011		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20122013		let origin1 = Origin::signed(1);20142015		let data = default_nft_data();2016		create_test_item(collection_id, &data.into());20172018		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2019		assert_noop!(2020			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2021			CommonError::<Test>::TokenVariableDataLimitExceeded2022		);2023	});2024}20252026#[test]2027fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2028	new_test_ext().execute_with(|| {2029		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20302031		let origin1 = Origin::signed(1);20322033		let data = default_re_fungible_data();2034		create_test_item(collection_id, &data.into());20352036		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2037		assert_noop!(2038			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2039			CommonError::<Test>::TokenVariableDataLimitExceeded2040		);2041	});2042}20432044#[test]2045fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2046	new_test_ext().execute_with(|| {2047		//default_limits();20482049		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20502051		let origin1 = Origin::signed(1);20522053		let data = default_nft_data();2054		create_test_item(collection_id, &data.into());20552056		assert_ok!(TemplateModule::set_meta_update_permission_flag(2057			origin1.clone(),2058			collection_id,2059			MetaUpdatePermission::ItemOwner,2060		));20612062		let variable_data = b"ten chars.".to_vec();2063		assert_ok!(TemplateModule::set_variable_meta_data(2064			origin1,2065			collection_id,2066			TokenId(1),2067			variable_data.clone()2068		));20692070		assert_eq!(2071			<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2072				.unwrap()2073				.variable_data,2074			variable_data2075		);2076	});2077}20782079#[test]2080fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2081	new_test_ext().execute_with(|| {2082		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));20832084		let origin1 = Origin::signed(1);20852086		assert_ok!(TemplateModule::set_mint_permission(2087			origin1.clone(),2088			collection_id,2089			true2090		));2091		assert_ok!(TemplateModule::add_to_allow_list(2092			origin1.clone(),2093			collection_id,2094			account(1)2095		));20962097		let data = default_nft_data();2098		create_test_item(collection_id, &data.into());20992100		assert_ok!(TemplateModule::set_meta_update_permission_flag(2101			origin1.clone(),2102			collection_id,2103			MetaUpdatePermission::ItemOwner,2104		));21052106		let variable_data = b"1234567890123".to_vec();2107		assert_noop!(2108			TemplateModule::set_variable_meta_data(2109				origin1,2110				collection_id,2111				TokenId(1),2112				variable_data.clone()2113			).map_err(|e| e.error),2114			CommonError::<Test>::TokenVariableDataLimitExceeded2115		);2116	})2117}21182119#[test]2120fn collection_transfer_flag_works() {2121	new_test_ext().execute_with(|| {2122		let origin1 = Origin::signed(1);21232124		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2125		assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21262127		let data = default_nft_data();2128		create_test_item(collection_id, &data.into());2129		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2130		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21312132		let origin1 = Origin::signed(1);21332134		// default scenario2135		assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2136		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2137		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2138		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2139		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2140	});2141}21422143#[test]2144fn set_variable_meta_data_on_nft_with_admin_flag() {2145	new_test_ext().execute_with(|| {2146		// default_limits();21472148		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21492150		let origin1 = Origin::signed(1);2151		let origin2 = Origin::signed(2);21522153		assert_ok!(TemplateModule::set_mint_permission(2154			origin2.clone(),2155			collection_id,2156			true2157		));2158		assert_ok!(TemplateModule::add_to_allow_list(2159			origin2.clone(),2160			collection_id,2161			account(1)2162		));21632164		assert_ok!(TemplateModule::add_collection_admin(2165			origin2.clone(),2166			collection_id,2167			account(1)2168		));21692170		let data = default_nft_data();2171		create_test_item(collection_id, &data.into());21722173		assert_ok!(TemplateModule::set_meta_update_permission_flag(2174			origin2.clone(),2175			collection_id,2176			MetaUpdatePermission::Admin,2177		));21782179		let variable_data = b"test.".to_vec();2180		assert_ok!(TemplateModule::set_variable_meta_data(2181			origin1,2182			collection_id,2183			TokenId(1),2184			variable_data.clone()2185		));21862187		assert_eq!(2188			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2189				.unwrap()2190				.variable_data,2191			variable_data2192		);2193	});2194}21952196#[test]2197fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2198	new_test_ext().execute_with(|| {2199		// default_limits();22002201		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22022203		let origin1 = Origin::signed(1);2204		let origin2 = Origin::signed(2);22052206		assert_ok!(TemplateModule::set_mint_permission(2207			origin2.clone(),2208			collection_id,2209			true2210		));2211		assert_ok!(TemplateModule::add_to_allow_list(2212			origin2.clone(),2213			collection_id,2214			account(1)2215		));22162217		let data = default_nft_data();2218		create_test_item(collection_id, &data.into());22192220		assert_ok!(TemplateModule::set_meta_update_permission_flag(2221			origin2.clone(),2222			collection_id,2223			MetaUpdatePermission::Admin,2224		));22252226		let variable_data = b"test.".to_vec();2227		assert_noop!(2228			TemplateModule::set_variable_meta_data(2229				origin1,2230				collection_id,2231				TokenId(1),2232				variable_data.clone()2233			).map_err(|e| e.error),2234			CommonError::<Test>::NoPermission2235		);2236	});2237}22382239#[test]2240fn set_variable_meta_flag_after_freeze() {2241	new_test_ext().execute_with(|| {2242		// default_limits();22432244		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22452246		let origin2 = Origin::signed(2);22472248		assert_ok!(TemplateModule::set_meta_update_permission_flag(2249			origin2.clone(),2250			collection_id,2251			MetaUpdatePermission::None,2252		));2253		assert_noop!(2254			TemplateModule::set_meta_update_permission_flag(2255				origin2.clone(),2256				collection_id,2257				MetaUpdatePermission::Admin2258			),2259			CommonError::<Test>::MetadataFlagFrozen2260		);2261	});2262}22632264#[test]2265fn set_variable_meta_data_on_nft_with_none_flag_neg() {2266	new_test_ext().execute_with(|| {2267		// default_limits();22682269		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2270		let origin1 = Origin::signed(1);22712272		let data = default_nft_data();2273		create_test_item(collection_id, &data.into());22742275		assert_ok!(TemplateModule::set_meta_update_permission_flag(2276			origin1.clone(),2277			collection_id,2278			MetaUpdatePermission::None,2279		));22802281		let variable_data = b"test.".to_vec();2282		assert_noop!(2283			TemplateModule::set_variable_meta_data(2284				origin1.clone(),2285				collection_id,2286				TokenId(1),2287				variable_data.clone()2288			).map_err(|e| e.error),2289			CommonError::<Test>::NoPermission2290		);2291	});2292}22932294#[test]2295fn collection_transfer_flag_works_neg() {2296	new_test_ext().execute_with(|| {2297		let origin1 = Origin::signed(1);22982299		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2300		assert_ok!(TemplateModule::set_transfers_enabled_flag(2301			origin1, collection_id, false2302		));23032304		let data = default_nft_data();2305		create_test_item(collection_id, &data.into());2306		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2307		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23082309		let origin1 = Origin::signed(1);23102311		// default scenario2312		assert_noop!(2313			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2314			CommonError::<Test>::TransferNotAllowed2315		);2316		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2317		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2318		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2319		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2320	});2321}
after · pallets/unique/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use up_data_structs::{6	COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,7	CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, MetaUpdatePermission,8	TokenId,9};10use frame_support::{assert_noop, assert_ok};11use sp_std::convert::TryInto;1213fn default_nft_data() -> CreateNftData {14	CreateNftData {15		const_data: vec![1, 2, 3].try_into().unwrap(),16		variable_data: vec![3, 2, 1].try_into().unwrap(),17	}18}1920fn default_fungible_data() -> CreateFungibleData {21	CreateFungibleData { value: 5 }22}2324fn default_re_fungible_data() -> CreateReFungibleData {25	CreateReFungibleData {26		const_data: vec![1, 2, 3].try_into().unwrap(),27		variable_data: vec![3, 2, 1].try_into().unwrap(),28		pieces: 1023,29	}30}3132fn create_test_collection_for_owner(33	mode: &CollectionMode,34	owner: u64,35	id: CollectionId,36) -> CollectionId {37	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();38	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();39	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4041	let origin1 = Origin::signed(owner);42	assert_ok!(TemplateModule::create_collection(43		origin1,44		col_name1,45		col_desc1,46		token_prefix1,47		mode.clone()48	));4950	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();51	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();52	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();53	assert_eq!(54		<pallet_common::CollectionById<Test>>::get(id)55			.unwrap()56			.owner,57		owner58	);59	assert_eq!(60		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,61		saved_col_name62	);63	assert_eq!(64		<pallet_common::CollectionById<Test>>::get(id).unwrap().mode,65		*mode66	);67	assert_eq!(68		<pallet_common::CollectionById<Test>>::get(id)69			.unwrap()70			.description,71		saved_description72	);73	assert_eq!(74		<pallet_common::CollectionById<Test>>::get(id)75			.unwrap()76			.token_prefix,77		saved_prefix78	);79	id80}8182fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {83	create_test_collection_for_owner(&mode, 1, id)84}8586fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {87	let origin1 = Origin::signed(1);88	assert_ok!(TemplateModule::create_item(89		origin1,90		collection_id,91		account(1),92		data.clone()93	));94}9596fn account(sub: u64) -> TestCrossAccountId {97	TestCrossAccountId::from_sub(sub)98}99100// Use cases tests region101// #region102103#[test]104fn set_version_schema() {105	new_test_ext().execute_with(|| {106		let origin1 = Origin::signed(1);107		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));108109		assert_ok!(TemplateModule::set_schema_version(110			origin1,111			collection_id,112			SchemaVersion::Unique113		));114		assert_eq!(115			<pallet_common::CollectionById<Test>>::get(collection_id)116				.unwrap()117				.schema_version,118			SchemaVersion::Unique119		);120	});121}122123#[test]124fn create_fungible_collection_fails_with_large_decimal_numbers() {125	new_test_ext().execute_with(|| {126		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();127		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();128		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();129130		let origin1 = Origin::signed(1);131		assert_noop!(132			TemplateModule::create_collection(133				origin1,134				col_name1,135				col_desc1,136				token_prefix1,137				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)138			),139			Error::<Test>::CollectionDecimalPointLimitExceeded140		);141	});142}143144#[test]145fn create_nft_item() {146	new_test_ext().execute_with(|| {147		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));148149		let data = default_nft_data();150		create_test_item(collection_id, &data.clone().into());151152		let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();153		assert_eq!(item.const_data, data.const_data.into_inner());154		assert_eq!(item.variable_data, data.variable_data.into_inner());155	});156}157158// Use cases tests region159// #region160#[test]161fn create_nft_multiple_items() {162	new_test_ext().execute_with(|| {163		create_test_collection(&CollectionMode::NFT, CollectionId(1));164165		let origin1 = Origin::signed(1);166167		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];168169		assert_ok!(TemplateModule::create_multiple_items(170			origin1,171			CollectionId(1),172			account(1),173			items_data174				.clone()175				.into_iter()176				.map(|d| { d.into() })177				.collect()178		));179		for (index, data) in items_data.into_iter().enumerate() {180			let item = <pallet_nonfungible::TokenData<Test>>::get((181				CollectionId(1),182				TokenId((index + 1) as u32),183			))184			.unwrap();185			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());186			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());187		}188	});189}190191#[test]192fn create_refungible_item() {193	new_test_ext().execute_with(|| {194		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));195196		let data = default_re_fungible_data();197		create_test_item(collection_id, &data.clone().into());198		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));199		let balance =200			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));201		assert_eq!(item.const_data, data.const_data.into_inner());202		assert_eq!(item.variable_data, data.variable_data.into_inner());203		assert_eq!(balance, 1023);204	});205}206207#[test]208fn create_multiple_refungible_items() {209	new_test_ext().execute_with(|| {210		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));211212		let origin1 = Origin::signed(1);213214		let items_data = vec![215			default_re_fungible_data(),216			default_re_fungible_data(),217			default_re_fungible_data(),218		];219220		assert_ok!(TemplateModule::create_multiple_items(221			origin1,222			CollectionId(1),223			account(1),224			items_data225				.clone()226				.into_iter()227				.map(|d| { d.into() })228				.collect()229		));230		for (index, data) in items_data.into_iter().enumerate() {231			let item = <pallet_refungible::TokenData<Test>>::get((232				CollectionId(1),233				TokenId((index + 1) as u32),234			));235			let balance =236				<pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));237			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());238			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());239			assert_eq!(balance, 1023);240		}241	});242}243244#[test]245fn create_fungible_item() {246	new_test_ext().execute_with(|| {247		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));248249		let data = default_fungible_data();250		create_test_item(collection_id, &data.into());251252		assert_eq!(253			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),254			5255		);256	});257}258259//#[test]260// fn create_multiple_fungible_items() {261//     new_test_ext().execute_with(|| {262//         default_limits();263264//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));265266//         let origin1 = Origin::signed(1);267268//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];269270//         assert_ok!(TemplateModule::create_multiple_items(271//             origin1.clone(),272//             1,273//             1,274//             items_data.clone().into_iter().map(|d| { d.into() }).collect()275//         ));276277//         for (index, _) in items_data.iter().enumerate() {278//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);279//         }280//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);281//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);282//     });283// }284285#[test]286fn transfer_fungible_item() {287	new_test_ext().execute_with(|| {288		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));289290		let origin1 = Origin::signed(1);291		let origin2 = Origin::signed(2);292293		let data = default_fungible_data();294		create_test_item(collection_id, &data.into());295296		assert_eq!(297			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),298			5299		);300301		// change owner scenario302		assert_ok!(TemplateModule::transfer(303			origin1,304			account(2),305			CollectionId(1),306			TokenId(0),307			5308		));309		assert_eq!(310			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),311			0312		);313314		// split item scenario315		assert_ok!(TemplateModule::transfer(316			origin2.clone(),317			account(3),318			CollectionId(1),319			TokenId(0),320			3321		));322323		// split item and new owner has account scenario324		assert_ok!(TemplateModule::transfer(325			origin2,326			account(3),327			CollectionId(1),328			TokenId(0),329			1330		));331		assert_eq!(332			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),333			1334		);335		assert_eq!(336			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),337			4338		);339	});340}341342#[test]343fn transfer_refungible_item() {344	new_test_ext().execute_with(|| {345		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));346347		// Create RFT 1 in 1023 pieces for account 1348		let data = default_re_fungible_data();349		create_test_item(collection_id, &data.clone().into());350		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));351		assert_eq!(item.const_data, data.const_data.into_inner());352		assert_eq!(item.variable_data, data.variable_data.into_inner());353		assert_eq!(354			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),355			1356		);357		assert_eq!(358			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),359			1023360		);361		assert_eq!(362			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),363			true364		);365366		// Account 1 transfers all 1023 pieces of RFT 1 to account 2367		let origin1 = Origin::signed(1);368		let origin2 = Origin::signed(2);369		assert_ok!(TemplateModule::transfer(370			origin1,371			account(2),372			CollectionId(1),373			TokenId(1),374			1023375		));376		assert_eq!(377			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),378			1023379		);380		assert_eq!(381			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),382			0383		);384		assert_eq!(385			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),386			1387		);388		assert_eq!(389			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),390			false391		);392		assert_eq!(393			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),394			true395		);396397		// Account 2 transfers 500 pieces of RFT 1 to account 3398		assert_ok!(TemplateModule::transfer(399			origin2.clone(),400			account(3),401			CollectionId(1),402			TokenId(1),403			500404		));405		assert_eq!(406			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),407			523408		);409		assert_eq!(410			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),411			500412		);413		assert_eq!(414			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),415			1416		);417		assert_eq!(418			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),419			1420		);421		assert_eq!(422			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),423			true424		);425		assert_eq!(426			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),427			true428		);429430		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance431		assert_ok!(TemplateModule::transfer(432			origin2,433			account(3),434			CollectionId(1),435			TokenId(1),436			200437		));438		assert_eq!(439			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),440			323441		);442		assert_eq!(443			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),444			700445		);446		assert_eq!(447			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),448			1449		);450		assert_eq!(451			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),452			1453		);454		assert_eq!(455			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),456			true457		);458		assert_eq!(459			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),460			true461		);462	});463}464465#[test]466fn transfer_nft_item() {467	new_test_ext().execute_with(|| {468		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));469470		let data = default_nft_data();471		create_test_item(collection_id, &data.into());472		assert_eq!(473			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),474			1475		);476		assert_eq!(477			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),478			true479		);480481		let origin1 = Origin::signed(1);482		// default scenario483		assert_ok!(TemplateModule::transfer(484			origin1,485			account(2),486			CollectionId(1),487			TokenId(1),488			1489		));490		assert_eq!(491			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),492			0493		);494		assert_eq!(495			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),496			1497		);498		assert_eq!(499			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),500			false501		);502		assert_eq!(503			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),504			true505		);506	});507}508509#[test]510fn transfer_nft_item_wrong_value() {511	new_test_ext().execute_with(|| {512		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));513514		let data = default_nft_data();515		create_test_item(collection_id, &data.into());516		assert_eq!(517			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),518			1519		);520		assert_eq!(521			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),522			true523		);524525		let origin1 = Origin::signed(1);526527		assert_noop!(528			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)529				.map_err(|e| e.error),530			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount531		);532	});533}534535#[test]536fn transfer_nft_item_zero_value() {537	new_test_ext().execute_with(|| {538		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));539540		let data = default_nft_data();541		create_test_item(collection_id, &data.into());542		assert_eq!(543			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),544			1545		);546		assert_eq!(547			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),548			true549		);550551		let origin1 = Origin::signed(1);552553		// Transferring 0 amount works on NFT...554		assert_ok!(TemplateModule::transfer(555			origin1,556			account(2),557			CollectionId(1),558			TokenId(1),559			0560		));561		// ... and results in no transfer562		assert_eq!(563			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),564			1565		);566		assert_eq!(567			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),568			true569		);570	});571}572573#[test]574fn nft_approve_and_transfer_from() {575	new_test_ext().execute_with(|| {576		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));577578		let data = default_nft_data();579		create_test_item(collection_id, &data.into());580581		let origin1 = Origin::signed(1);582		let origin2 = Origin::signed(2);583584		assert_eq!(585			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),586			1587		);588		assert_eq!(589			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),590			true591		);592593		// neg transfer_from594		assert_noop!(595			TemplateModule::transfer_from(596				origin2.clone(),597				account(1),598				account(2),599				CollectionId(1),600				TokenId(1),601				1602			)603			.map_err(|e| e.error),604			CommonError::<Test>::TokenValueNotEnough605		);606607		// do approve608		assert_ok!(TemplateModule::approve(609			origin1,610			account(2),611			CollectionId(1),612			TokenId(1),613			1614		));615		assert_eq!(616			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),617			account(2)618		);619620		assert_ok!(TemplateModule::transfer_from(621			origin2,622			account(1),623			account(3),624			CollectionId(1),625			TokenId(1),626			1627		));628		assert!(629			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()630		);631	});632}633634#[test]635fn nft_approve_and_transfer_from_allow_list() {636	new_test_ext().execute_with(|| {637		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));638639		let origin1 = Origin::signed(1);640		let origin2 = Origin::signed(2);641642		// Create NFT 1 for account 1643		let data = default_nft_data();644		create_test_item(collection_id, &data.clone().into());645		assert_eq!(646			&<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))647				.unwrap()648				.const_data,649			&data.const_data.into_inner()650		);651		assert_eq!(652			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),653			1654		);655		assert_eq!(656			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),657			true658		);659660		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list661		assert_ok!(TemplateModule::set_mint_permission(662			origin1.clone(),663			CollectionId(1),664			true665		));666		assert_ok!(TemplateModule::set_public_access_mode(667			origin1.clone(),668			CollectionId(1),669			AccessMode::AllowList670		));671		assert_ok!(TemplateModule::add_to_allow_list(672			origin1.clone(),673			CollectionId(1),674			account(1)675		));676		assert_ok!(TemplateModule::add_to_allow_list(677			origin1.clone(),678			CollectionId(1),679			account(2)680		));681		assert_ok!(TemplateModule::add_to_allow_list(682			origin1.clone(),683			CollectionId(1),684			account(3)685		));686687		// Account 1 approves account 2 for NFT 1688		assert_ok!(TemplateModule::approve(689			origin1.clone(),690			account(2),691			CollectionId(1),692			TokenId(1),693			1694		));695		assert_eq!(696			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),697			account(2)698		);699700		// Account 2 transfers NFT 1 from account 1 to account 3701		assert_ok!(TemplateModule::transfer_from(702			origin2,703			account(1),704			account(3),705			CollectionId(1),706			TokenId(1),707			1708		));709		assert!(710			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()711		);712	});713}714715#[test]716fn refungible_approve_and_transfer_from() {717	new_test_ext().execute_with(|| {718		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));719720		let origin1 = Origin::signed(1);721		let origin2 = Origin::signed(2);722723		// Create RFT 1 in 1023 pieces for account 1724		let data = default_re_fungible_data();725		create_test_item(collection_id, &data.into());726727		assert_eq!(728			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),729			1730		);731		assert_eq!(732			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),733			1023734		);735		assert_eq!(736			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),737			true738		);739740		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list741		assert_ok!(TemplateModule::set_mint_permission(742			origin1.clone(),743			CollectionId(1),744			true745		));746		assert_ok!(TemplateModule::set_public_access_mode(747			origin1.clone(),748			CollectionId(1),749			AccessMode::AllowList750		));751		assert_ok!(TemplateModule::add_to_allow_list(752			origin1.clone(),753			CollectionId(1),754			account(1)755		));756		assert_ok!(TemplateModule::add_to_allow_list(757			origin1.clone(),758			CollectionId(1),759			account(2)760		));761		assert_ok!(TemplateModule::add_to_allow_list(762			origin1.clone(),763			CollectionId(1),764			account(3)765		));766767		// Account 1 approves account 2 for 1023 pieces of RFT 1768		assert_ok!(TemplateModule::approve(769			origin1,770			account(2),771			CollectionId(1),772			TokenId(1),773			1023774		));775		assert_eq!(776			<pallet_refungible::Allowance<Test>>::get((777				CollectionId(1),778				TokenId(1),779				account(1),780				account(2)781			)),782			1023783		);784785		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3786		assert_ok!(TemplateModule::transfer_from(787			origin2,788			account(1),789			account(3),790			CollectionId(1),791			TokenId(1),792			100793		));794		assert_eq!(795			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),796			1797		);798		assert_eq!(799			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),800			1801		);802		assert_eq!(803			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),804			923805		);806		assert_eq!(807			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),808			100809		);810		assert_eq!(811			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),812			true813		);814		assert_eq!(815			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),816			true817		);818		assert_eq!(819			<pallet_refungible::Allowance<Test>>::get((820				CollectionId(1),821				TokenId(1),822				account(1),823				account(2)824			)),825			923826		);827	});828}829830#[test]831fn fungible_approve_and_transfer_from() {832	new_test_ext().execute_with(|| {833		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));834835		let data = default_fungible_data();836		create_test_item(collection_id, &data.into());837838		let origin1 = Origin::signed(1);839		let origin2 = Origin::signed(2);840841		assert_ok!(TemplateModule::set_mint_permission(842			origin1.clone(),843			CollectionId(1),844			true845		));846		assert_ok!(TemplateModule::set_public_access_mode(847			origin1.clone(),848			CollectionId(1),849			AccessMode::AllowList850		));851		assert_ok!(TemplateModule::add_to_allow_list(852			origin1.clone(),853			CollectionId(1),854			account(1)855		));856		assert_ok!(TemplateModule::add_to_allow_list(857			origin1.clone(),858			CollectionId(1),859			account(2)860		));861		assert_ok!(TemplateModule::add_to_allow_list(862			origin1.clone(),863			CollectionId(1),864			account(3)865		));866867		// do approve868		assert_ok!(TemplateModule::approve(869			origin1.clone(),870			account(2),871			CollectionId(1),872			TokenId(0),873			5874		));875		assert_eq!(876			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),877			5878		);879		assert_ok!(TemplateModule::approve(880			origin1,881			account(3),882			CollectionId(1),883			TokenId(0),884			5885		));886		assert_eq!(887			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),888			5889		);890		assert_eq!(891			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),892			5893		);894895		assert_ok!(TemplateModule::transfer_from(896			origin2.clone(),897			account(1),898			account(3),899			CollectionId(1),900			TokenId(0),901			4902		));903904		assert_eq!(905			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),906			1907		);908909		assert_noop!(910			TemplateModule::transfer_from(911				origin2,912				account(1),913				account(3),914				CollectionId(1),915				TokenId(0),916				4917			)918			.map_err(|e| e.error),919			CommonError::<Test>::TokenValueNotEnough920		);921	});922}923924#[test]925fn change_collection_owner() {926	new_test_ext().execute_with(|| {927		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));928929		let origin1 = Origin::signed(1);930		assert_ok!(TemplateModule::change_collection_owner(931			origin1,932			collection_id,933			2934		));935		assert_eq!(936			<pallet_common::CollectionById<Test>>::get(collection_id)937				.unwrap()938				.owner,939			2940		);941	});942}943944#[test]945fn destroy_collection() {946	new_test_ext().execute_with(|| {947		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));948949		let origin1 = Origin::signed(1);950		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));951	});952}953954#[test]955fn burn_nft_item() {956	new_test_ext().execute_with(|| {957		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));958959		let origin1 = Origin::signed(1);960961		let data = default_nft_data();962		create_test_item(collection_id, &data.into());963964		// check balance (collection with id = 1, user id = 1)965		assert_eq!(966			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),967			1968		);969970		// burn item971		assert_ok!(TemplateModule::burn_item(972			origin1.clone(),973			collection_id,974			TokenId(1),975			1976		));977		assert_eq!(978			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),979			0980		);981	});982}983984#[test]985fn burn_same_nft_item_twice() {986	new_test_ext().execute_with(|| {987		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));988989		let origin1 = Origin::signed(1);990991		let data = default_nft_data();992		create_test_item(collection_id, &data.into());993994		// check balance (collection with id = 1, user id = 1)995		assert_eq!(996			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),997			1998		);9991000		// burn item1001		assert_ok!(TemplateModule::burn_item(1002			origin1.clone(),1003			collection_id,1004			TokenId(1),1005			11006		));10071008		// burn item again1009		assert_noop!(1010			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1011			CommonError::<Test>::TokenNotFound1012		);10131014		assert_eq!(1015			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1016			01017		);1018	});1019}10201021#[test]1022fn burn_fungible_item() {1023	new_test_ext().execute_with(|| {1024		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10251026		let origin1 = Origin::signed(1);1027		assert_ok!(TemplateModule::add_collection_admin(1028			origin1.clone(),1029			collection_id,1030			account(2)1031		));10321033		let data = default_fungible_data();1034		create_test_item(collection_id, &data.into());10351036		// check balance (collection with id = 1, user id = 1)1037		assert_eq!(1038			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1039			51040		);10411042		// burn item1043		assert_ok!(TemplateModule::burn_item(1044			origin1.clone(),1045			CollectionId(1),1046			TokenId(0),1047			51048		));1049		assert_noop!(1050			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1051			CommonError::<Test>::TokenValueTooLow1052		);10531054		assert_eq!(1055			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1056			01057		);1058	});1059}10601061#[test]1062fn burn_fungible_item_with_token_id() {1063	new_test_ext().execute_with(|| {1064		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10651066		let origin1 = Origin::signed(1);1067		assert_ok!(TemplateModule::add_collection_admin(1068			origin1.clone(),1069			collection_id,1070			account(2)1071		));10721073		let data = default_fungible_data();1074		create_test_item(collection_id, &data.into());10751076		// check balance (collection with id = 1, user id = 1)1077		assert_eq!(1078			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1079			51080		);10811082		// Try to burn item using Token ID1083		assert_noop!(1084			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1085			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1086		);1087	});1088}1089#[test]1090fn burn_refungible_item() {1091	new_test_ext().execute_with(|| {1092		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1093		let origin1 = Origin::signed(1);10941095		assert_ok!(TemplateModule::set_mint_permission(1096			origin1.clone(),1097			collection_id,1098			true1099		));1100		assert_ok!(TemplateModule::set_public_access_mode(1101			origin1.clone(),1102			collection_id,1103			AccessMode::AllowList1104		));1105		assert_ok!(TemplateModule::add_to_allow_list(1106			origin1.clone(),1107			collection_id,1108			account(1)1109		));11101111		assert_ok!(TemplateModule::add_collection_admin(1112			origin1.clone(),1113			collection_id,1114			account(2)1115		));11161117		let data = default_re_fungible_data();1118		create_test_item(collection_id, &data.into());11191120		// check balance (collection with id = 1, user id = 2)1121		assert_eq!(1122			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1123			11124		);1125		assert_eq!(1126			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1127			10231128		);11291130		// burn item1131		assert_ok!(TemplateModule::burn_item(1132			origin1.clone(),1133			collection_id,1134			TokenId(1),1135			10231136		));1137		assert_noop!(1138			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023)1139				.map_err(|e| e.error),1140			CommonError::<Test>::TokenValueTooLow1141		);11421143		assert_eq!(1144			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1145			01146		);1147	});1148}11491150#[test]1151fn add_collection_admin() {1152	new_test_ext().execute_with(|| {1153		let collection1_id =1154			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1155		let origin1 = Origin::signed(1);11561157		// Add collection admins1158		assert_ok!(TemplateModule::add_collection_admin(1159			origin1.clone(),1160			collection1_id,1161			account(2)1162		));1163		assert_ok!(TemplateModule::add_collection_admin(1164			origin1,1165			collection1_id,1166			account(3)1167		));11681169		// Owner is not an admin by default1170		assert_eq!(1171			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1172			false1173		);1174		assert!(<pallet_common::IsAdmin<Test>>::get((1175			CollectionId(1),1176			account(2)1177		)));1178		assert!(<pallet_common::IsAdmin<Test>>::get((1179			CollectionId(1),1180			account(3)1181		)));1182	});1183}11841185#[test]1186fn remove_collection_admin() {1187	new_test_ext().execute_with(|| {1188		let collection1_id =1189			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1190		let origin1 = Origin::signed(1);1191		let origin2 = Origin::signed(2);11921193		// Add collection admins 2 and 31194		assert_ok!(TemplateModule::add_collection_admin(1195			origin1.clone(),1196			collection1_id,1197			account(2)1198		));1199		assert_ok!(TemplateModule::add_collection_admin(1200			origin1,1201			collection1_id,1202			account(3)1203		));12041205		assert!(<pallet_common::IsAdmin<Test>>::get((1206			CollectionId(1),1207			account(2)1208		)));1209		assert!(<pallet_common::IsAdmin<Test>>::get((1210			CollectionId(1),1211			account(3)1212		)));12131214		// remove admin 31215		assert_ok!(TemplateModule::remove_collection_admin(1216			origin2,1217			CollectionId(1),1218			account(3)1219		));12201221		// 2 is still admin, 3 is not an admin anymore1222		assert!(<pallet_common::IsAdmin<Test>>::get((1223			CollectionId(1),1224			account(2)1225		)));1226		assert_eq!(1227			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1228			false1229		);1230	});1231}12321233#[test]1234fn balance_of() {1235	new_test_ext().execute_with(|| {1236		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1237		let fungible_collection_id =1238			create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1239		let re_fungible_collection_id =1240			create_test_collection(&CollectionMode::ReFungible, CollectionId(3));12411242		// check balance before1243		assert_eq!(1244			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1245			01246		);1247		assert_eq!(1248			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1249			01250		);1251		assert_eq!(1252			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1253			01254		);12551256		let nft_data = default_nft_data();1257		create_test_item(nft_collection_id, &nft_data.into());12581259		let fungible_data = default_fungible_data();1260		create_test_item(fungible_collection_id, &fungible_data.into());12611262		let re_fungible_data = default_re_fungible_data();1263		create_test_item(re_fungible_collection_id, &re_fungible_data.into());12641265		// check balance (collection with id = 1, user id = 1)1266		assert_eq!(1267			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1268			11269		);1270		assert_eq!(1271			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1272			51273		);1274		assert_eq!(1275			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1276			11277		);12781279		assert_eq!(1280			<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1281			true1282		);1283		assert_eq!(1284			<pallet_refungible::Owned<Test>>::get((1285				re_fungible_collection_id,1286				account(1),1287				TokenId(1)1288			)),1289			true1290		);1291	});1292}12931294#[test]1295fn approve() {1296	new_test_ext().execute_with(|| {1297		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12981299		let data = default_nft_data();1300		create_test_item(collection_id, &data.into());13011302		let origin1 = Origin::signed(1);13031304		// approve1305		assert_ok!(TemplateModule::approve(1306			origin1,1307			account(2),1308			CollectionId(1),1309			TokenId(1),1310			11311		));1312		assert_eq!(1313			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1314			account(2)1315		);1316	});1317}13181319#[test]1320fn transfer_from() {1321	new_test_ext().execute_with(|| {1322		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1323		let origin1 = Origin::signed(1);1324		let origin2 = Origin::signed(2);13251326		let data = default_nft_data();1327		create_test_item(collection_id, &data.into());13281329		// approve1330		assert_ok!(TemplateModule::approve(1331			origin1.clone(),1332			account(2),1333			CollectionId(1),1334			TokenId(1),1335			11336		));1337		assert_eq!(1338			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1339			account(2)1340		);13411342		assert_ok!(TemplateModule::set_mint_permission(1343			origin1.clone(),1344			CollectionId(1),1345			true1346		));1347		assert_ok!(TemplateModule::set_public_access_mode(1348			origin1.clone(),1349			CollectionId(1),1350			AccessMode::AllowList1351		));1352		assert_ok!(TemplateModule::add_to_allow_list(1353			origin1.clone(),1354			CollectionId(1),1355			account(1)1356		));1357		assert_ok!(TemplateModule::add_to_allow_list(1358			origin1.clone(),1359			CollectionId(1),1360			account(2)1361		));1362		assert_ok!(TemplateModule::add_to_allow_list(1363			origin1,1364			CollectionId(1),1365			account(3)1366		));13671368		assert_ok!(TemplateModule::transfer_from(1369			origin2,1370			account(1),1371			account(2),1372			CollectionId(1),1373			TokenId(1),1374			11375		));13761377		// after transfer1378		assert_eq!(1379			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1380			01381		);1382		assert_eq!(1383			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1384			11385		);1386	});1387}13881389// #endregion13901391// Coverage tests region1392// #region13931394#[test]1395fn owner_can_add_address_to_allow_list() {1396	new_test_ext().execute_with(|| {1397		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13981399		let origin1 = Origin::signed(1);1400		assert_ok!(TemplateModule::add_to_allow_list(1401			origin1,1402			collection_id,1403			account(2)1404		));1405		assert!(<pallet_common::Allowlist<Test>>::get((1406			collection_id,1407			account(2)1408		)));1409	});1410}14111412#[test]1413fn admin_can_add_address_to_allow_list() {1414	new_test_ext().execute_with(|| {1415		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1416		let origin1 = Origin::signed(1);1417		let origin2 = Origin::signed(2);14181419		assert_ok!(TemplateModule::add_collection_admin(1420			origin1,1421			collection_id,1422			account(2)1423		));1424		assert_ok!(TemplateModule::add_to_allow_list(1425			origin2,1426			collection_id,1427			account(3)1428		));1429		assert!(<pallet_common::Allowlist<Test>>::get((1430			collection_id,1431			account(3)1432		)));1433	});1434}14351436#[test]1437fn nonprivileged_user_cannot_add_address_to_allow_list() {1438	new_test_ext().execute_with(|| {1439		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14401441		let origin2 = Origin::signed(2);1442		assert_noop!(1443			TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1444			CommonError::<Test>::NoPermission1445		);1446	});1447}14481449#[test]1450fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1451	new_test_ext().execute_with(|| {1452		let origin1 = Origin::signed(1);14531454		assert_noop!(1455			TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1456			CommonError::<Test>::CollectionNotFound1457		);1458	});1459}14601461#[test]1462fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1463	new_test_ext().execute_with(|| {1464		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14651466		let origin1 = Origin::signed(1);1467		assert_ok!(TemplateModule::destroy_collection(1468			origin1.clone(),1469			collection_id1470		));1471		assert_noop!(1472			TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1473			CommonError::<Test>::CollectionNotFound1474		);1475	});1476}14771478// If address is already added to allow list, nothing happens1479#[test]1480fn address_is_already_added_to_allow_list() {1481	new_test_ext().execute_with(|| {1482		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1483		let origin1 = Origin::signed(1);14841485		assert_ok!(TemplateModule::add_to_allow_list(1486			origin1.clone(),1487			collection_id,1488			account(2)1489		));1490		assert_ok!(TemplateModule::add_to_allow_list(1491			origin1,1492			collection_id,1493			account(2)1494		));1495		assert!(<pallet_common::Allowlist<Test>>::get((1496			collection_id,1497			account(2)1498		)));1499	});1500}15011502#[test]1503fn owner_can_remove_address_from_allow_list() {1504	new_test_ext().execute_with(|| {1505		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15061507		let origin1 = Origin::signed(1);1508		assert_ok!(TemplateModule::add_to_allow_list(1509			origin1.clone(),1510			collection_id,1511			account(2)1512		));1513		assert_ok!(TemplateModule::remove_from_allow_list(1514			origin1,1515			collection_id,1516			account(2)1517		));1518		assert_eq!(1519			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1520			false1521		);1522	});1523}15241525#[test]1526fn admin_can_remove_address_from_allow_list() {1527	new_test_ext().execute_with(|| {1528		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1529		let origin1 = Origin::signed(1);1530		let origin2 = Origin::signed(2);15311532		// Owner adds admin1533		assert_ok!(TemplateModule::add_collection_admin(1534			origin1.clone(),1535			collection_id,1536			account(2)1537		));15381539		// Owner adds address 3 to allow list1540		assert_ok!(TemplateModule::add_to_allow_list(1541			origin1,1542			collection_id,1543			account(3)1544		));15451546		// Admin removes address 3 from allow list1547		assert_ok!(TemplateModule::remove_from_allow_list(1548			origin2,1549			collection_id,1550			account(3)1551		));1552		assert_eq!(1553			<pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1554			false1555		);1556	});1557}15581559#[test]1560fn nonprivileged_user_cannot_remove_address_from_allow_list() {1561	new_test_ext().execute_with(|| {1562		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1563		let origin1 = Origin::signed(1);1564		let origin2 = Origin::signed(2);15651566		assert_ok!(TemplateModule::add_to_allow_list(1567			origin1,1568			collection_id,1569			account(2)1570		));1571		assert_noop!(1572			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1573			CommonError::<Test>::NoPermission1574		);1575		assert!(<pallet_common::Allowlist<Test>>::get((1576			collection_id,1577			account(2)1578		)));1579	});1580}15811582#[test]1583fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1584	new_test_ext().execute_with(|| {1585		let origin1 = Origin::signed(1);15861587		assert_noop!(1588			TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1589			CommonError::<Test>::CollectionNotFound1590		);1591	});1592}15931594#[test]1595fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1596	new_test_ext().execute_with(|| {1597		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1598		let origin1 = Origin::signed(1);1599		let origin2 = Origin::signed(2);16001601		// Add account 2 to allow list1602		assert_ok!(TemplateModule::add_to_allow_list(1603			origin1.clone(),1604			collection_id,1605			account(2)1606		));16071608		// Account 2 is in collection allow-list1609		assert!(<pallet_common::Allowlist<Test>>::get((1610			collection_id,1611			account(2)1612		)));16131614		// Destroy collection1615		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));16161617		// Attempt to remove account 2 from collection allow-list => error1618		assert_noop!(1619			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1620			CommonError::<Test>::CollectionNotFound1621		);16221623		// Account 2 is not found in collection allow-list anyway1624		assert_eq!(1625			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1626			false1627		);1628	});1629}16301631// If address is already removed from allow list, nothing happens1632#[test]1633fn address_is_already_removed_from_allow_list() {1634	new_test_ext().execute_with(|| {1635		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1636		let origin1 = Origin::signed(1);16371638		assert_ok!(TemplateModule::add_to_allow_list(1639			origin1.clone(),1640			collection_id,1641			account(2)1642		));1643		assert_ok!(TemplateModule::remove_from_allow_list(1644			origin1.clone(),1645			collection_id,1646			account(2)1647		));1648		assert_eq!(1649			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1650			false1651		);1652		assert_ok!(TemplateModule::remove_from_allow_list(1653			origin1,1654			collection_id,1655			account(2)1656		));1657		assert_eq!(1658			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1659			false1660		);1661	});1662}16631664// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1665#[test]1666fn allow_list_test_1() {1667	new_test_ext().execute_with(|| {1668		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16691670		let origin1 = Origin::signed(1);16711672		let data = default_nft_data();1673		create_test_item(collection_id, &data.into());16741675		assert_ok!(TemplateModule::set_public_access_mode(1676			origin1.clone(),1677			collection_id,1678			AccessMode::AllowList1679		));1680		assert_ok!(TemplateModule::add_to_allow_list(1681			origin1.clone(),1682			collection_id,1683			account(2)1684		));16851686		assert_noop!(1687			TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1688				.map_err(|e| e.error),1689			CommonError::<Test>::AddressNotInAllowlist1690		);1691	});1692}16931694#[test]1695fn allow_list_test_2() {1696	new_test_ext().execute_with(|| {1697		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1698		let origin1 = Origin::signed(1);16991700		let data = default_nft_data();1701		create_test_item(collection_id, &data.into());17021703		assert_ok!(TemplateModule::set_public_access_mode(1704			origin1.clone(),1705			collection_id,1706			AccessMode::AllowList1707		));1708		assert_ok!(TemplateModule::add_to_allow_list(1709			origin1.clone(),1710			collection_id,1711			account(1)1712		));1713		assert_ok!(TemplateModule::add_to_allow_list(1714			origin1.clone(),1715			collection_id,1716			account(2)1717		));17181719		// do approve1720		assert_ok!(TemplateModule::approve(1721			origin1.clone(),1722			account(1),1723			collection_id,1724			TokenId(1),1725			11726		));1727		assert_eq!(1728			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1729			account(1)1730		);17311732		assert_ok!(TemplateModule::remove_from_allow_list(1733			origin1.clone(),1734			collection_id,1735			account(1)1736		));17371738		assert_noop!(1739			TemplateModule::transfer_from(1740				origin1,1741				account(1),1742				account(3),1743				CollectionId(1),1744				TokenId(1),1745				11746			)1747			.map_err(|e| e.error),1748			CommonError::<Test>::AddressNotInAllowlist1749		);1750	});1751}17521753// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1754#[test]1755fn allow_list_test_3() {1756	new_test_ext().execute_with(|| {1757		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17581759		let origin1 = Origin::signed(1);17601761		let data = default_nft_data();1762		create_test_item(collection_id, &data.into());17631764		assert_ok!(TemplateModule::set_public_access_mode(1765			origin1.clone(),1766			collection_id,1767			AccessMode::AllowList1768		));1769		assert_ok!(TemplateModule::add_to_allow_list(1770			origin1.clone(),1771			collection_id,1772			account(1)1773		));17741775		assert_noop!(1776			TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1)1777				.map_err(|e| e.error),1778			CommonError::<Test>::AddressNotInAllowlist1779		);1780	});1781}17821783#[test]1784fn allow_list_test_4() {1785	new_test_ext().execute_with(|| {1786		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17871788		let origin1 = Origin::signed(1);17891790		let data = default_nft_data();1791		create_test_item(collection_id, &data.into());17921793		assert_ok!(TemplateModule::set_public_access_mode(1794			origin1.clone(),1795			collection_id,1796			AccessMode::AllowList1797		));1798		assert_ok!(TemplateModule::add_to_allow_list(1799			origin1.clone(),1800			collection_id,1801			account(1)1802		));1803		assert_ok!(TemplateModule::add_to_allow_list(1804			origin1.clone(),1805			collection_id,1806			account(2)1807		));18081809		// do approve1810		assert_ok!(TemplateModule::approve(1811			origin1.clone(),1812			account(1),1813			collection_id,1814			TokenId(1),1815			11816		));1817		assert_eq!(1818			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1819			account(1)1820		);18211822		assert_ok!(TemplateModule::remove_from_allow_list(1823			origin1.clone(),1824			collection_id,1825			account(2)1826		));18271828		assert_noop!(1829			TemplateModule::transfer_from(1830				origin1,1831				account(1),1832				account(3),1833				collection_id,1834				TokenId(1),1835				11836			)1837			.map_err(|e| e.error),1838			CommonError::<Test>::AddressNotInAllowlist1839		);1840	});1841}18421843// 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)1844#[test]1845fn allow_list_test_5() {1846	new_test_ext().execute_with(|| {1847		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18481849		let origin1 = Origin::signed(1);18501851		let data = default_nft_data();1852		create_test_item(collection_id, &data.into());18531854		assert_ok!(TemplateModule::set_public_access_mode(1855			origin1.clone(),1856			collection_id,1857			AccessMode::AllowList1858		));1859		assert_noop!(1860			TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1)1861				.map_err(|e| e.error),1862			CommonError::<Test>::AddressNotInAllowlist1863		);1864	});1865}18661867// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1868#[test]1869fn allow_list_test_6() {1870	new_test_ext().execute_with(|| {1871		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18721873		let origin1 = Origin::signed(1);18741875		let data = default_nft_data();1876		create_test_item(collection_id, &data.into());18771878		assert_ok!(TemplateModule::set_public_access_mode(1879			origin1.clone(),1880			collection_id,1881			AccessMode::AllowList1882		));18831884		// do approve1885		assert_noop!(1886			TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1887				.map_err(|e| e.error),1888			CommonError::<Test>::AddressNotInAllowlist1889		);1890	});1891}18921893// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1894//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1895#[test]1896fn allow_list_test_7() {1897	new_test_ext().execute_with(|| {1898		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18991900		let data = default_nft_data();1901		create_test_item(collection_id, &data.into());19021903		let origin1 = Origin::signed(1);19041905		assert_ok!(TemplateModule::set_public_access_mode(1906			origin1.clone(),1907			collection_id,1908			AccessMode::AllowList1909		));1910		assert_ok!(TemplateModule::add_to_allow_list(1911			origin1.clone(),1912			collection_id,1913			account(1)1914		));1915		assert_ok!(TemplateModule::add_to_allow_list(1916			origin1.clone(),1917			collection_id,1918			account(2)1919		));19201921		assert_ok!(TemplateModule::transfer(1922			origin1,1923			account(2),1924			CollectionId(1),1925			TokenId(1),1926			11927		));1928	});1929}19301931#[test]1932fn allow_list_test_8() {1933	new_test_ext().execute_with(|| {1934		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19351936		// Create NFT for account 11937		let data = default_nft_data();1938		create_test_item(collection_id, &data.into());19391940		let origin1 = Origin::signed(1);19411942		// Toggle Allow List mode and add accounts 1 and 21943		assert_ok!(TemplateModule::set_public_access_mode(1944			origin1.clone(),1945			collection_id,1946			AccessMode::AllowList1947		));1948		assert_ok!(TemplateModule::add_to_allow_list(1949			origin1.clone(),1950			collection_id,1951			account(1)1952		));1953		assert_ok!(TemplateModule::add_to_allow_list(1954			origin1.clone(),1955			collection_id,1956			account(2)1957		));19581959		// Sself-approve account 1 for NFT 11960		assert_ok!(TemplateModule::approve(1961			origin1.clone(),1962			account(1),1963			CollectionId(1),1964			TokenId(1),1965			11966		));1967		assert_eq!(1968			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1969			account(1)1970		);19711972		// Transfer from 1 to 21973		assert_ok!(TemplateModule::transfer_from(1974			origin1,1975			account(1),1976			account(2),1977			CollectionId(1),1978			TokenId(1),1979			11980		));1981	});1982}19831984// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1985#[test]1986fn allow_list_test_9() {1987	new_test_ext().execute_with(|| {1988		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1989		let origin1 = Origin::signed(1);19901991		assert_ok!(TemplateModule::set_public_access_mode(1992			origin1.clone(),1993			collection_id,1994			AccessMode::AllowList1995		));1996		assert_ok!(TemplateModule::set_mint_permission(1997			origin1,1998			collection_id,1999			false2000		));20012002		let data = default_nft_data();2003		create_test_item(collection_id, &data.into());2004	});2005}20062007// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2008#[test]2009fn allow_list_test_10() {2010	new_test_ext().execute_with(|| {2011		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20122013		let origin1 = Origin::signed(1);2014		let origin2 = Origin::signed(2);20152016		assert_ok!(TemplateModule::set_public_access_mode(2017			origin1.clone(),2018			collection_id,2019			AccessMode::AllowList2020		));2021		assert_ok!(TemplateModule::set_mint_permission(2022			origin1.clone(),2023			collection_id,2024			false2025		));20262027		assert_ok!(TemplateModule::add_collection_admin(2028			origin1,2029			collection_id,2030			account(2)2031		));20322033		assert_ok!(TemplateModule::create_item(2034			origin2,2035			collection_id,2036			account(2),2037			default_nft_data().into()2038		));2039	});2040}20412042// 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.2043#[test]2044fn allow_list_test_11() {2045	new_test_ext().execute_with(|| {2046		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20472048		let origin1 = Origin::signed(1);2049		let origin2 = Origin::signed(2);20502051		assert_ok!(TemplateModule::set_public_access_mode(2052			origin1.clone(),2053			collection_id,2054			AccessMode::AllowList2055		));2056		assert_ok!(TemplateModule::set_mint_permission(2057			origin1.clone(),2058			collection_id,2059			false2060		));2061		assert_ok!(TemplateModule::add_to_allow_list(2062			origin1,2063			collection_id,2064			account(2)2065		));20662067		assert_noop!(2068			TemplateModule::create_item(2069				origin2,2070				CollectionId(1),2071				account(2),2072				default_nft_data().into()2073			)2074			.map_err(|e| e.error),2075			CommonError::<Test>::PublicMintingNotAllowed2076		);2077	});2078}20792080// 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.2081#[test]2082fn allow_list_test_12() {2083	new_test_ext().execute_with(|| {2084		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20852086		let origin1 = Origin::signed(1);2087		let origin2 = Origin::signed(2);20882089		assert_ok!(TemplateModule::set_public_access_mode(2090			origin1.clone(),2091			collection_id,2092			AccessMode::AllowList2093		));2094		assert_ok!(TemplateModule::set_mint_permission(2095			origin1,2096			collection_id,2097			false2098		));20992100		assert_noop!(2101			TemplateModule::create_item(2102				origin2,2103				CollectionId(1),2104				account(2),2105				default_nft_data().into()2106			)2107			.map_err(|e| e.error),2108			CommonError::<Test>::PublicMintingNotAllowed2109		);2110	});2111}21122113// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2114#[test]2115fn allow_list_test_13() {2116	new_test_ext().execute_with(|| {2117		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21182119		let origin1 = Origin::signed(1);21202121		assert_ok!(TemplateModule::set_public_access_mode(2122			origin1.clone(),2123			collection_id,2124			AccessMode::AllowList2125		));2126		assert_ok!(TemplateModule::set_mint_permission(2127			origin1,2128			collection_id,2129			true2130		));21312132		let data = default_nft_data();2133		create_test_item(collection_id, &data.into());2134	});2135}21362137// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2138#[test]2139fn allow_list_test_14() {2140	new_test_ext().execute_with(|| {2141		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21422143		let origin1 = Origin::signed(1);2144		let origin2 = Origin::signed(2);21452146		assert_ok!(TemplateModule::set_public_access_mode(2147			origin1.clone(),2148			collection_id,2149			AccessMode::AllowList2150		));2151		assert_ok!(TemplateModule::set_mint_permission(2152			origin1.clone(),2153			collection_id,2154			true2155		));21562157		assert_ok!(TemplateModule::add_collection_admin(2158			origin1,2159			collection_id,2160			account(2)2161		));21622163		assert_ok!(TemplateModule::create_item(2164			origin2,2165			collection_id,2166			account(2),2167			default_nft_data().into()2168		));2169	});2170}21712172// 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.2173#[test]2174fn allow_list_test_15() {2175	new_test_ext().execute_with(|| {2176		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21772178		let origin1 = Origin::signed(1);2179		let origin2 = Origin::signed(2);21802181		assert_ok!(TemplateModule::set_public_access_mode(2182			origin1.clone(),2183			collection_id,2184			AccessMode::AllowList2185		));2186		assert_ok!(TemplateModule::set_mint_permission(2187			origin1,2188			collection_id,2189			true2190		));21912192		assert_noop!(2193			TemplateModule::create_item(2194				origin2,2195				collection_id,2196				account(2),2197				default_nft_data().into()2198			)2199			.map_err(|e| e.error),2200			CommonError::<Test>::AddressNotInAllowlist2201		);2202	});2203}22042205// 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.2206#[test]2207fn allow_list_test_16() {2208	new_test_ext().execute_with(|| {2209		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22102211		let origin1 = Origin::signed(1);2212		let origin2 = Origin::signed(2);22132214		assert_ok!(TemplateModule::set_public_access_mode(2215			origin1.clone(),2216			collection_id,2217			AccessMode::AllowList2218		));2219		assert_ok!(TemplateModule::set_mint_permission(2220			origin1.clone(),2221			collection_id,2222			true2223		));2224		assert_ok!(TemplateModule::add_to_allow_list(2225			origin1,2226			collection_id,2227			account(2)2228		));22292230		assert_ok!(TemplateModule::create_item(2231			origin2,2232			collection_id,2233			account(2),2234			default_nft_data().into()2235		));2236	});2237}22382239// Total number of collections. Positive test2240#[test]2241fn total_number_collections_bound() {2242	new_test_ext().execute_with(|| {2243		create_test_collection(&CollectionMode::NFT, CollectionId(1));2244	});2245}22462247#[test]2248fn create_max_collections() {2249	new_test_ext().execute_with(|| {2250		for i in 1..=COLLECTION_NUMBER_LIMIT {2251			create_test_collection(&CollectionMode::NFT, CollectionId(i));2252		}2253	});2254}22552256// Total number of collections. Negative test2257#[test]2258fn total_number_collections_bound_neg() {2259	new_test_ext().execute_with(|| {2260		let origin1 = Origin::signed(1);22612262		for i in 1..=COLLECTION_NUMBER_LIMIT {2263			create_test_collection(&CollectionMode::NFT, CollectionId(i));2264		}22652266		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2267		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2268		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();22692270		// 11-th collection in chain. Expects error2271		assert_noop!(2272			TemplateModule::create_collection(2273				origin1,2274				col_name1,2275				col_desc1,2276				token_prefix1,2277				CollectionMode::NFT2278			),2279			CommonError::<Test>::TotalCollectionsLimitExceeded2280		);2281	});2282}22832284// Owned tokens by a single address. Positive test2285#[test]2286fn owned_tokens_bound() {2287	new_test_ext().execute_with(|| {2288		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22892290		let data = default_nft_data();2291		create_test_item(collection_id, &data.clone().into());2292		create_test_item(collection_id, &data.into());2293	});2294}22952296// Owned tokens by a single address. Negotive test2297#[test]2298fn owned_tokens_bound_neg() {2299	new_test_ext().execute_with(|| {2300		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23012302		let origin1 = Origin::signed(1);23032304		for _ in 1..=MAX_TOKEN_OWNERSHIP {2305			let data = default_nft_data();2306			create_test_item(collection_id, &data.clone().into());2307		}23082309		let data = default_nft_data();2310		assert_noop!(2311			TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into())2312				.map_err(|e| e.error),2313			CommonError::<Test>::AccountTokenLimitExceeded2314		);2315	});2316}23172318// Number of collection admins. Positive test2319#[test]2320fn collection_admins_bound() {2321	new_test_ext().execute_with(|| {2322		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23232324		let origin1 = Origin::signed(1);23252326		assert_ok!(TemplateModule::add_collection_admin(2327			origin1.clone(),2328			collection_id,2329			account(2)2330		));2331		assert_ok!(TemplateModule::add_collection_admin(2332			origin1,2333			collection_id,2334			account(3)2335		));2336	});2337}23382339// Number of collection admins. Negotive test2340#[test]2341fn collection_admins_bound_neg() {2342	new_test_ext().execute_with(|| {2343		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23442345		let origin1 = Origin::signed(1);23462347		for i in 0..COLLECTION_ADMINS_LIMIT {2348			assert_ok!(TemplateModule::add_collection_admin(2349				origin1.clone(),2350				collection_id,2351				account((2 + i).into())2352			));2353		}2354		assert_noop!(2355			TemplateModule::add_collection_admin(2356				origin1,2357				collection_id,2358				account((3 + COLLECTION_ADMINS_LIMIT).into())2359			),2360			CommonError::<Test>::CollectionAdminCountExceeded2361		);2362	});2363}2364// #endregion23652366#[test]2367fn set_const_on_chain_schema() {2368	new_test_ext().execute_with(|| {2369		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23702371		let origin1 = Origin::signed(1);2372		assert_ok!(TemplateModule::set_const_on_chain_schema(2373			origin1,2374			collection_id,2375			b"test const on chain schema".to_vec()2376		));23772378		assert_eq!(2379			<pallet_common::CollectionById<Test>>::get(collection_id)2380				.unwrap()2381				.const_on_chain_schema,2382			b"test const on chain schema".to_vec()2383		);2384		assert_eq!(2385			<pallet_common::CollectionById<Test>>::get(collection_id)2386				.unwrap()2387				.variable_on_chain_schema,2388			b"".to_vec()2389		);2390	});2391}23922393#[test]2394fn set_variable_on_chain_schema() {2395	new_test_ext().execute_with(|| {2396		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23972398		let origin1 = Origin::signed(1);2399		assert_ok!(TemplateModule::set_variable_on_chain_schema(2400			origin1,2401			collection_id,2402			b"test variable on chain schema".to_vec()2403		));24042405		assert_eq!(2406			<pallet_common::CollectionById<Test>>::get(collection_id)2407				.unwrap()2408				.const_on_chain_schema,2409			b"".to_vec()2410		);2411		assert_eq!(2412			<pallet_common::CollectionById<Test>>::get(collection_id)2413				.unwrap()2414				.variable_on_chain_schema,2415			b"test variable on chain schema".to_vec()2416		);2417	});2418}24192420#[test]2421fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2422	new_test_ext().execute_with(|| {2423		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24242425		let origin1 = Origin::signed(1);24262427		let data = default_nft_data();2428		create_test_item(CollectionId(1), &data.into());24292430		let variable_data = b"test data".to_vec();2431		assert_ok!(TemplateModule::set_variable_meta_data(2432			origin1,2433			collection_id,2434			TokenId(1),2435			variable_data.clone()2436		));24372438		assert_eq!(2439			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2440				.unwrap()2441				.variable_data,2442			variable_data2443		);2444	});2445}24462447#[test]2448fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2449	new_test_ext().execute_with(|| {2450		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));24512452		let origin1 = Origin::signed(1);24532454		let data = default_re_fungible_data();2455		create_test_item(collection_id, &data.into());24562457		let variable_data = b"test data".to_vec();2458		assert_ok!(TemplateModule::set_variable_meta_data(2459			origin1,2460			collection_id,2461			TokenId(1),2462			variable_data.clone()2463		));24642465		assert_eq!(2466			<pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1))).variable_data,2467			variable_data2468		);2469	});2470}24712472#[test]2473fn set_variable_meta_data_on_fungible_token_fails() {2474	new_test_ext().execute_with(|| {2475		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));24762477		let origin1 = Origin::signed(1);24782479		let data = default_fungible_data();2480		create_test_item(collection_id, &data.into());24812482		let variable_data = b"test data".to_vec();2483		assert_noop!(2484			TemplateModule::set_variable_meta_data(2485				origin1,2486				collection_id,2487				TokenId(0),2488				variable_data2489			)2490			.map_err(|e| e.error),2491			<pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2492		);2493	});2494}24952496#[test]2497fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2498	new_test_ext().execute_with(|| {2499		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25002501		let origin1 = Origin::signed(1);25022503		let data = default_nft_data();2504		create_test_item(collection_id, &data.into());25052506		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2507		assert_noop!(2508			TemplateModule::set_variable_meta_data(2509				origin1,2510				collection_id,2511				TokenId(1),2512				variable_data2513			)2514			.map_err(|e| e.error),2515			CommonError::<Test>::TokenVariableDataLimitExceeded2516		);2517	});2518}25192520#[test]2521fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2522	new_test_ext().execute_with(|| {2523		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));25242525		let origin1 = Origin::signed(1);25262527		let data = default_re_fungible_data();2528		create_test_item(collection_id, &data.into());25292530		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2531		assert_noop!(2532			TemplateModule::set_variable_meta_data(2533				origin1,2534				collection_id,2535				TokenId(1),2536				variable_data2537			)2538			.map_err(|e| e.error),2539			CommonError::<Test>::TokenVariableDataLimitExceeded2540		);2541	});2542}25432544#[test]2545fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2546	new_test_ext().execute_with(|| {2547		//default_limits();25482549		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25502551		let origin1 = Origin::signed(1);25522553		let data = default_nft_data();2554		create_test_item(collection_id, &data.into());25552556		assert_ok!(TemplateModule::set_meta_update_permission_flag(2557			origin1.clone(),2558			collection_id,2559			MetaUpdatePermission::ItemOwner,2560		));25612562		let variable_data = b"ten chars.".to_vec();2563		assert_ok!(TemplateModule::set_variable_meta_data(2564			origin1,2565			collection_id,2566			TokenId(1),2567			variable_data.clone()2568		));25692570		assert_eq!(2571			<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2572				.unwrap()2573				.variable_data,2574			variable_data2575		);2576	});2577}25782579#[test]2580fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2581	new_test_ext().execute_with(|| {2582		let collection_id =2583			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));25842585		let origin1 = Origin::signed(1);25862587		assert_ok!(TemplateModule::set_mint_permission(2588			origin1.clone(),2589			collection_id,2590			true2591		));2592		assert_ok!(TemplateModule::add_to_allow_list(2593			origin1.clone(),2594			collection_id,2595			account(1)2596		));25972598		let data = default_nft_data();2599		create_test_item(collection_id, &data.into());26002601		assert_ok!(TemplateModule::set_meta_update_permission_flag(2602			origin1.clone(),2603			collection_id,2604			MetaUpdatePermission::ItemOwner,2605		));26062607		let variable_data = b"1234567890123".to_vec();2608		assert_noop!(2609			TemplateModule::set_variable_meta_data(2610				origin1,2611				collection_id,2612				TokenId(1),2613				variable_data.clone()2614			)2615			.map_err(|e| e.error),2616			CommonError::<Test>::TokenVariableDataLimitExceeded2617		);2618	})2619}26202621#[test]2622fn collection_transfer_flag_works() {2623	new_test_ext().execute_with(|| {2624		let origin1 = Origin::signed(1);26252626		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2627		assert_ok!(TemplateModule::set_transfers_enabled_flag(2628			origin1,2629			collection_id,2630			true2631		));26322633		let data = default_nft_data();2634		create_test_item(collection_id, &data.into());2635		assert_eq!(2636			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2637			12638		);2639		assert_eq!(2640			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2641			true2642		);26432644		let origin1 = Origin::signed(1);26452646		// default scenario2647		assert_ok!(TemplateModule::transfer(2648			origin1,2649			account(2),2650			collection_id,2651			TokenId(1),2652			12653		));2654		assert_eq!(2655			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2656			false2657		);2658		assert_eq!(2659			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2660			true2661		);2662		assert_eq!(2663			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2664			02665		);2666		assert_eq!(2667			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2668			12669		);2670	});2671}26722673#[test]2674fn set_variable_meta_data_on_nft_with_admin_flag() {2675	new_test_ext().execute_with(|| {2676		// default_limits();26772678		let collection_id =2679			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));26802681		let origin1 = Origin::signed(1);2682		let origin2 = Origin::signed(2);26832684		assert_ok!(TemplateModule::set_mint_permission(2685			origin2.clone(),2686			collection_id,2687			true2688		));2689		assert_ok!(TemplateModule::add_to_allow_list(2690			origin2.clone(),2691			collection_id,2692			account(1)2693		));26942695		assert_ok!(TemplateModule::add_collection_admin(2696			origin2.clone(),2697			collection_id,2698			account(1)2699		));27002701		let data = default_nft_data();2702		create_test_item(collection_id, &data.into());27032704		assert_ok!(TemplateModule::set_meta_update_permission_flag(2705			origin2.clone(),2706			collection_id,2707			MetaUpdatePermission::Admin,2708		));27092710		let variable_data = b"test.".to_vec();2711		assert_ok!(TemplateModule::set_variable_meta_data(2712			origin1,2713			collection_id,2714			TokenId(1),2715			variable_data.clone()2716		));27172718		assert_eq!(2719			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2720				.unwrap()2721				.variable_data,2722			variable_data2723		);2724	});2725}27262727#[test]2728fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2729	new_test_ext().execute_with(|| {2730		// default_limits();27312732		let collection_id =2733			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));27342735		let origin1 = Origin::signed(1);2736		let origin2 = Origin::signed(2);27372738		assert_ok!(TemplateModule::set_mint_permission(2739			origin2.clone(),2740			collection_id,2741			true2742		));2743		assert_ok!(TemplateModule::add_to_allow_list(2744			origin2.clone(),2745			collection_id,2746			account(1)2747		));27482749		let data = default_nft_data();2750		create_test_item(collection_id, &data.into());27512752		assert_ok!(TemplateModule::set_meta_update_permission_flag(2753			origin2.clone(),2754			collection_id,2755			MetaUpdatePermission::Admin,2756		));27572758		let variable_data = b"test.".to_vec();2759		assert_noop!(2760			TemplateModule::set_variable_meta_data(2761				origin1,2762				collection_id,2763				TokenId(1),2764				variable_data.clone()2765			)2766			.map_err(|e| e.error),2767			CommonError::<Test>::NoPermission2768		);2769	});2770}27712772#[test]2773fn set_variable_meta_flag_after_freeze() {2774	new_test_ext().execute_with(|| {2775		// default_limits();27762777		let collection_id =2778			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));27792780		let origin2 = Origin::signed(2);27812782		assert_ok!(TemplateModule::set_meta_update_permission_flag(2783			origin2.clone(),2784			collection_id,2785			MetaUpdatePermission::None,2786		));2787		assert_noop!(2788			TemplateModule::set_meta_update_permission_flag(2789				origin2.clone(),2790				collection_id,2791				MetaUpdatePermission::Admin2792			),2793			CommonError::<Test>::MetadataFlagFrozen2794		);2795	});2796}27972798#[test]2799fn set_variable_meta_data_on_nft_with_none_flag_neg() {2800	new_test_ext().execute_with(|| {2801		// default_limits();28022803		let collection_id =2804			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2805		let origin1 = Origin::signed(1);28062807		let data = default_nft_data();2808		create_test_item(collection_id, &data.into());28092810		assert_ok!(TemplateModule::set_meta_update_permission_flag(2811			origin1.clone(),2812			collection_id,2813			MetaUpdatePermission::None,2814		));28152816		let variable_data = b"test.".to_vec();2817		assert_noop!(2818			TemplateModule::set_variable_meta_data(2819				origin1.clone(),2820				collection_id,2821				TokenId(1),2822				variable_data.clone()2823			)2824			.map_err(|e| e.error),2825			CommonError::<Test>::NoPermission2826		);2827	});2828}28292830#[test]2831fn collection_transfer_flag_works_neg() {2832	new_test_ext().execute_with(|| {2833		let origin1 = Origin::signed(1);28342835		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2836		assert_ok!(TemplateModule::set_transfers_enabled_flag(2837			origin1,2838			collection_id,2839			false2840		));28412842		let data = default_nft_data();2843		create_test_item(collection_id, &data.into());2844		assert_eq!(2845			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2846			12847		);2848		assert_eq!(2849			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2850			true2851		);28522853		let origin1 = Origin::signed(1);28542855		// default scenario2856		assert_noop!(2857			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2858				.map_err(|e| e.error),2859			CommonError::<Test>::TransferNotAllowed2860		);2861		assert_eq!(2862			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2863			12864		);2865		assert_eq!(2866			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2867			02868		);2869		assert_eq!(2870			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2871			true2872		);2873		assert_eq!(2874			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2875			false2876		);2877	});2878}