git.delta.rocks / unique-network / refs/commits / 5c899aa72293

difftreelog

Remove commented uses

Greg Zaitsev2021-11-24parent: #859444d.patch.diff
in: master

1 file changed

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};10// use crate::{AccessMode, CollectionMode, Ownership, CreateItemData};11// use up_data_structs::{12// 	CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,13// 	MAX_DECIMAL_POINTS,14// };1516use frame_support::{assert_noop, assert_ok};17use sp_std::convert::TryInto;1819fn default_nft_data() -> CreateNftData {20	CreateNftData {21		const_data: vec![1, 2, 3].try_into().unwrap(),22		variable_data: vec![3, 2, 1].try_into().unwrap(),23	}24}2526fn default_fungible_data() -> CreateFungibleData {27	CreateFungibleData { value: 5 }28}2930fn default_re_fungible_data() -> CreateReFungibleData {31	CreateReFungibleData {32		const_data: vec![1, 2, 3].try_into().unwrap(),33		variable_data: vec![3, 2, 1].try_into().unwrap(),34		pieces: 1023,35	}36}3738fn create_test_collection_for_owner(39	mode: &CollectionMode,40	owner: u64,41	id: CollectionId,42) -> CollectionId {43	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();44	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();45	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4647	let origin1 = Origin::signed(owner);48	assert_ok!(TemplateModule::create_collection(49		origin1,50		col_name1,51		col_desc1,52		token_prefix1,53		mode.clone()54	));5556	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();57	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();58	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();59	assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);60	assert_eq!(61		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,62		saved_col_name63	);64	assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);65	assert_eq!(66		<pallet_common::CollectionById<Test>>::get(id).unwrap().description,67		saved_description68	);69	assert_eq!(70		<pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,71		saved_prefix72	);73	id74}7576fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {77	create_test_collection_for_owner(&mode, 1, id)78}7980fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {81	let origin1 = Origin::signed(1);82	assert_ok!(TemplateModule::create_item(83		origin1,84		collection_id,85		account(1),86		data.clone()87	));88}8990fn account(sub: u64) -> TestCrossAccountId {91	TestCrossAccountId::from_sub(sub)92}9394// Use cases tests region95// #region9697#[test]98fn set_version_schema() {99	new_test_ext().execute_with(|| {100		let origin1 = Origin::signed(1);101		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));102103		assert_ok!(TemplateModule::set_schema_version(104			origin1,105			collection_id,106			SchemaVersion::Unique107		));108		assert_eq!(109			<pallet_common::CollectionById<Test>>::get(collection_id)110				.unwrap()111				.schema_version,112			SchemaVersion::Unique113		);114	});115}116117#[test]118fn create_fungible_collection_fails_with_large_decimal_numbers() {119	new_test_ext().execute_with(|| {120		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();121		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();122		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();123124		let origin1 = Origin::signed(1);125		assert_noop!(126			TemplateModule::create_collection(127				origin1,128				col_name1,129				col_desc1,130				token_prefix1,131				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)132			),133			Error::<Test>::CollectionDecimalPointLimitExceeded134		);135	});136}137138#[test]139fn create_nft_item() {140	new_test_ext().execute_with(|| {141		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));142143		let data = default_nft_data();144		create_test_item(collection_id, &data.clone().into());145146		let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();147		assert_eq!(item.const_data, data.const_data.into_inner());148		assert_eq!(item.variable_data, data.variable_data.into_inner());149	});150}151152// Use cases tests region153// #region154#[test]155fn create_nft_multiple_items() {156	new_test_ext().execute_with(|| {157		create_test_collection(&CollectionMode::NFT, CollectionId(1));158159		let origin1 = Origin::signed(1);160161		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];162163		assert_ok!(TemplateModule::create_multiple_items(164			origin1,165			CollectionId(1),166			account(1),167			items_data168				.clone()169				.into_iter()170				.map(|d| { d.into() })171				.collect()172		));173		for (index, data) in items_data.into_iter().enumerate() {174			let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();175			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());176			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());177		}178	});179}180181#[test]182fn create_refungible_item() {183	new_test_ext().execute_with(|| {184		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));185186		let data = default_re_fungible_data();187		create_test_item(collection_id, &data.clone().into());188		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));189		let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));190		assert_eq!(item.const_data, data.const_data.into_inner());191		assert_eq!(item.variable_data, data.variable_data.into_inner());192		assert_eq!(balance, 1023);193	});194}195196#[test]197fn create_multiple_refungible_items() {198	new_test_ext().execute_with(|| {199		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));200201		let origin1 = Origin::signed(1);202203		let items_data = vec![204			default_re_fungible_data(),205			default_re_fungible_data(),206			default_re_fungible_data(),207		];208209		assert_ok!(TemplateModule::create_multiple_items(210			origin1,211			CollectionId(1),212			account(1),213			items_data214				.clone()215				.into_iter()216				.map(|d| { d.into() })217				.collect()218		));219		for (index, data) in items_data.into_iter().enumerate() {220			let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32)));221			let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));222			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());223			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());224			assert_eq!(balance, 1023);225		}226	});227}228229#[test]230fn create_fungible_item() {231	new_test_ext().execute_with(|| {232		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));233234		let data = default_fungible_data();235		create_test_item(collection_id, &data.into());236237		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);238	});239}240241//#[test]242// fn create_multiple_fungible_items() {243//     new_test_ext().execute_with(|| {244//         default_limits();245246//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));247248//         let origin1 = Origin::signed(1);249250//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];251252//         assert_ok!(TemplateModule::create_multiple_items(253//             origin1.clone(),254//             1,255//             1,256//             items_data.clone().into_iter().map(|d| { d.into() }).collect()257//         ));258259//         for (index, _) in items_data.iter().enumerate() {260//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);261//         }262//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);263//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);264//     });265// }266267#[test]268fn transfer_fungible_item() {269	new_test_ext().execute_with(|| {270		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));271272		let origin1 = Origin::signed(1);273		let origin2 = Origin::signed(2);274275		let data = default_fungible_data();276		create_test_item(collection_id, &data.into());277278		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);279280		// change owner scenario281		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(0), 5));282		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);283284		// split item scenario285		assert_ok!(TemplateModule::transfer(286			origin2.clone(),287			account(3),288			CollectionId(1),289			TokenId(0),290			3291		));292293		// split item and new owner has account scenario294		assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(0), 1));295		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);296		assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);297	});298}299300#[test]301fn transfer_refungible_item() {302	new_test_ext().execute_with(|| {303		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));304305		// Create RFT 1 in 1023 pieces for account 1306		let data = default_re_fungible_data();307		create_test_item(collection_id, &data.clone().into());308		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));309		assert_eq!(item.const_data, data.const_data.into_inner());310		assert_eq!(item.variable_data, data.variable_data.into_inner());311		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);312		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);313		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);314315		// Account 1 transfers all 1023 pieces of RFT 1 to account 2316		let origin1 = Origin::signed(1);317		let origin2 = Origin::signed(2);318		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));319		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 1023);320		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);321		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);322		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);323		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);324325		// Account 2 transfers 500 pieces of RFT 1 to account 3326		assert_ok!(TemplateModule::transfer(327			origin2.clone(),328			account(3),329			CollectionId(1),330			TokenId(1),331			500332		));333		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 523);334		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 500);335		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);336		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);337		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);338		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);339340		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance341		assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));342		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 323);343		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 700);344		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);345		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);346		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);347		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);348	});349}350351#[test]352fn transfer_nft_item() {353	new_test_ext().execute_with(|| {354		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));355356		let data = default_nft_data();357		create_test_item(collection_id, &data.into());358		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);359		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);360361362		let origin1 = Origin::signed(1);363		// default scenario364		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));365		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);366		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);367		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);368		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);369	});370}371372#[test]373fn transfer_nft_item_wrong_value() {374	new_test_ext().execute_with(|| {375		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));376377		let data = default_nft_data();378		create_test_item(collection_id, &data.into());379		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);380		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);381382		let origin1 = Origin::signed(1);383384		assert_noop!(385			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2).map_err(|e| e.error),386			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount387		);388	});389}390391#[test]392fn transfer_nft_item_zero_value() {393	new_test_ext().execute_with(|| {394		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));395396		let data = default_nft_data();397		create_test_item(collection_id, &data.into());398		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);399		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);400401		let origin1 = Origin::signed(1);402403		// Transferring 0 amount works on NFT...404		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 0));405		// ... and results in no transfer406		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);407		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);408	});409}410411#[test]412fn nft_approve_and_transfer_from() {413	new_test_ext().execute_with(|| {414		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));415416		let data = default_nft_data();417		create_test_item(collection_id, &data.into());418419		let origin1 = Origin::signed(1);420		let origin2 = Origin::signed(2);421422		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);423		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);424425		// neg transfer_from426		assert_noop!(427			TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),428			CommonError::<Test>::TokenValueNotEnough429		);430431		// do approve432		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));433		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));434435		assert_ok!(TemplateModule::transfer_from(436			origin2,437			account(1),438			account(3),439			CollectionId(1),440			TokenId(1),441			1442		));443		assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());444	});445}446447#[test]448fn nft_approve_and_transfer_from_allow_list() {449	new_test_ext().execute_with(|| {450		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));451452		let origin1 = Origin::signed(1);453		let origin2 = Origin::signed(2);454455		// Create NFT 1 for account 1456		let data = default_nft_data();457		create_test_item(collection_id, &data.clone().into());458		assert_eq!(459			&<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,460			&data.const_data.into_inner()461		);462		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);463		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);464465		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list466		assert_ok!(TemplateModule::set_mint_permission(467			origin1.clone(),468			CollectionId(1),469			true470		));471		assert_ok!(TemplateModule::set_public_access_mode(472			origin1.clone(),473			CollectionId(1),474			AccessMode::AllowList475		));476		assert_ok!(TemplateModule::add_to_allow_list(477			origin1.clone(),478			CollectionId(1),479			account(1)480		));481		assert_ok!(TemplateModule::add_to_allow_list(482			origin1.clone(),483			CollectionId(1),484			account(2)485		));486		assert_ok!(TemplateModule::add_to_allow_list(487			origin1.clone(),488			CollectionId(1),489			account(3)490		));491492		// Account 1 approves account 2 for NFT 1 493		assert_ok!(TemplateModule::approve(494			origin1.clone(),495			account(2),496			CollectionId(1),497			TokenId(1),498			1499		));500		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));501502		// Account 2 transfers NFT 1 from account 1 to account 3503		assert_ok!(TemplateModule::transfer_from(504			origin2,505			account(1),506			account(3),507			CollectionId(1),508			TokenId(1),509			1510		));511		assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());512	});513}514515#[test]516fn refungible_approve_and_transfer_from() {517	new_test_ext().execute_with(|| {518		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));519520		let origin1 = Origin::signed(1);521		let origin2 = Origin::signed(2);522523		// Create RFT 1 in 1023 pieces for account 1524		let data = default_re_fungible_data();525		create_test_item(collection_id, &data.into());526527		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);528		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);529		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);530531		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list532		assert_ok!(TemplateModule::set_mint_permission(533			origin1.clone(),534			CollectionId(1),535			true536		));537		assert_ok!(TemplateModule::set_public_access_mode(538			origin1.clone(),539			CollectionId(1),540			AccessMode::AllowList541		));542		assert_ok!(TemplateModule::add_to_allow_list(543			origin1.clone(),544			CollectionId(1),545			account(1)546		));547		assert_ok!(TemplateModule::add_to_allow_list(548			origin1.clone(),549			CollectionId(1),550			account(2)551		));552		assert_ok!(TemplateModule::add_to_allow_list(553			origin1.clone(),554			CollectionId(1),555			account(3)556		));557558		// Account 1 approves account 2 for 1023 pieces of RFT 1559		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));560		assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);561562		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3563		assert_ok!(TemplateModule::transfer_from(564			origin2,565			account(1),566			account(3),567			CollectionId(1),568			TokenId(1),569			100570		));571		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);572		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);573		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 923);574		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 100);575		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);576		assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);577		assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);578	});579}580581#[test]582fn fungible_approve_and_transfer_from() {583	new_test_ext().execute_with(|| {584		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));585586		let data = default_fungible_data();587		create_test_item(collection_id, &data.into());588589		let origin1 = Origin::signed(1);590		let origin2 = Origin::signed(2);591592		assert_ok!(TemplateModule::set_mint_permission(593			origin1.clone(),594			CollectionId(1),595			true596		));597		assert_ok!(TemplateModule::set_public_access_mode(598			origin1.clone(),599			CollectionId(1),600			AccessMode::AllowList601		));602		assert_ok!(TemplateModule::add_to_allow_list(603			origin1.clone(),604			CollectionId(1),605			account(1)606		));607		assert_ok!(TemplateModule::add_to_allow_list(608			origin1.clone(),609			CollectionId(1),610			account(2)611		));612		assert_ok!(TemplateModule::add_to_allow_list(613			origin1.clone(),614			CollectionId(1),615			account(3)616		));617618		// do approve619		assert_ok!(TemplateModule::approve(620			origin1.clone(),621			account(2),622			CollectionId(1),623			TokenId(0),624			5625		));626		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);627		assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(0), 5));628		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);629		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);630631		assert_ok!(TemplateModule::transfer_from(632			origin2.clone(),633			account(1),634			account(3),635			CollectionId(1),636			TokenId(0),637			4638		));639640		assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);641642		assert_noop!(643			TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(0), 4).map_err(|e| e.error),644			CommonError::<Test>::TokenValueNotEnough645		);646	});647}648649#[test]650fn change_collection_owner() {651	new_test_ext().execute_with(|| {652		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));653654		let origin1 = Origin::signed(1);655		assert_ok!(TemplateModule::change_collection_owner(656			origin1,657			collection_id,658			2659		));660		assert_eq!(661			<pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,662			2663		);664	});665}666667#[test]668fn destroy_collection() {669	new_test_ext().execute_with(|| {670		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));671672		let origin1 = Origin::signed(1);673		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));674	});675}676677#[test]678fn burn_nft_item() {679	new_test_ext().execute_with(|| {680		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));681682		let origin1 = Origin::signed(1);683684		let data = default_nft_data();685		create_test_item(collection_id, &data.into());686687		// check balance (collection with id = 1, user id = 1)688		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);689690		// burn item691		assert_ok!(TemplateModule::burn_item(692			origin1.clone(),693			collection_id,694			TokenId(1),695			1696		));697		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);698	});699}700701#[test]702fn burn_same_nft_item_twice() {703	new_test_ext().execute_with(|| {704		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));705706		let origin1 = Origin::signed(1);707708		let data = default_nft_data();709		create_test_item(collection_id, &data.into());710711		// check balance (collection with id = 1, user id = 1)712		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);713714		// burn item715		assert_ok!(TemplateModule::burn_item(716			origin1.clone(),717			collection_id,718			TokenId(1),719			1720		));721		722		// burn item again723		assert_noop!(724			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),725			CommonError::<Test>::TokenNotFound726		);727728		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);729	});730}731732#[test]733fn burn_fungible_item() {734	new_test_ext().execute_with(|| {735		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));736737		let origin1 = Origin::signed(1);738		assert_ok!(TemplateModule::add_collection_admin(739			origin1.clone(),740			collection_id,741			account(2)742		));743744		let data = default_fungible_data();745		create_test_item(collection_id, &data.into());746747		// check balance (collection with id = 1, user id = 1)748		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);749750		// burn item751		assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(0), 5));752		assert_noop!(753			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),754			CommonError::<Test>::TokenValueTooLow755		);756757		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);758	});759}760761#[test]762fn burn_fungible_item_with_token_id() {763	new_test_ext().execute_with(|| {764		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));765766		let origin1 = Origin::signed(1);767		assert_ok!(TemplateModule::add_collection_admin(768			origin1.clone(),769			collection_id,770			account(2)771		));772773		let data = default_fungible_data();774		create_test_item(collection_id, &data.into());775776		// check balance (collection with id = 1, user id = 1)777		assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);778779		// Try to burn item using Token ID780		assert_noop!(781			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),782			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId783		);784	});785}786#[test]787fn burn_refungible_item() {788	new_test_ext().execute_with(|| {789		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));790		let origin1 = Origin::signed(1);791792		assert_ok!(TemplateModule::set_mint_permission(793			origin1.clone(),794			collection_id,795			true796		));797		assert_ok!(TemplateModule::set_public_access_mode(798			origin1.clone(),799			collection_id,800			AccessMode::AllowList801		));802		assert_ok!(TemplateModule::add_to_allow_list(803			origin1.clone(),804			collection_id,805			account(1)806		));807808		assert_ok!(TemplateModule::add_collection_admin(809			origin1.clone(),810			collection_id,811			account(2)812		));813814		let data = default_re_fungible_data();815		create_test_item(collection_id, &data.into());816817		// check balance (collection with id = 1, user id = 2)818		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);819		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);820821		// burn item822		assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));823		assert_noop!(824			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),825			CommonError::<Test>::TokenValueTooLow826		);827828		assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);829	});830}831832#[test]833fn add_collection_admin() {834	new_test_ext().execute_with(|| {835		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));836		let origin1 = Origin::signed(1);837838		// Add collection admins839		assert_ok!(TemplateModule::add_collection_admin(840			origin1.clone(),841			collection1_id,842			account(2)843		));844		assert_ok!(TemplateModule::add_collection_admin(845			origin1,846			collection1_id,847			account(3)848		));849850		// Owner is not an admin by default851		assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))), false);852		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));853		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));854	});855}856857#[test]858fn remove_collection_admin() {859	new_test_ext().execute_with(|| {860		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));861		let origin1 = Origin::signed(1);862		let origin2 = Origin::signed(2);863864		// Add collection admins 2 and 3865		assert_ok!(TemplateModule::add_collection_admin(866			origin1.clone(),867			collection1_id,868			account(2)869		));870		assert_ok!(TemplateModule::add_collection_admin(871			origin1,872			collection1_id,873			account(3)874		));875876		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));877		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));878879		// remove admin 3880		assert_ok!(TemplateModule::remove_collection_admin(881			origin2,882			CollectionId(1),883			account(3)884		));885886		// 2 is still admin, 3 is not an admin anymore887		assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));888		assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))), false);889	});890}891892#[test]893fn balance_of() {894	new_test_ext().execute_with(|| {895		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));896		let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));897		let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));898899		// check balance before900		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);901		assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);902		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);903904		let nft_data = default_nft_data();905		create_test_item(nft_collection_id, &nft_data.into());906907		let fungible_data = default_fungible_data();908		create_test_item(fungible_collection_id, &fungible_data.into());909910		let re_fungible_data = default_re_fungible_data();911		create_test_item(re_fungible_collection_id, &re_fungible_data.into());912913		// check balance (collection with id = 1, user id = 1)914		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);915		assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);916		assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1);917918		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);919		assert_eq!(<pallet_refungible::Owned<Test>>::get((re_fungible_collection_id, account(1), TokenId(1))), true);920	});921}922923#[test]924fn approve() {925	new_test_ext().execute_with(|| {926		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));927928		let data = default_nft_data();929		create_test_item(collection_id, &data.into());930931		let origin1 = Origin::signed(1);932933		// approve934		assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));935		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));936	});937}938939#[test]940fn transfer_from() {941	new_test_ext().execute_with(|| {942		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));943		let origin1 = Origin::signed(1);944		let origin2 = Origin::signed(2);945946		let data = default_nft_data();947		create_test_item(collection_id, &data.into());948949		// approve950		assert_ok!(TemplateModule::approve(951			origin1.clone(),952			account(2),953			CollectionId(1),954			TokenId(1),955			1956		));957		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));958959		assert_ok!(TemplateModule::set_mint_permission(960			origin1.clone(),961			CollectionId(1),962			true963		));964		assert_ok!(TemplateModule::set_public_access_mode(965			origin1.clone(),966			CollectionId(1),967			AccessMode::AllowList968		));969		assert_ok!(TemplateModule::add_to_allow_list(970			origin1.clone(),971			CollectionId(1),972			account(1)973		));974		assert_ok!(TemplateModule::add_to_allow_list(975			origin1.clone(),976			CollectionId(1),977			account(2)978		));979		assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));980981		assert_ok!(TemplateModule::transfer_from(982			origin2,983			account(1),984			account(2),985			CollectionId(1),986			TokenId(1),987			1988		));989990		// after transfer991		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);992		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);993	});994}995996// #endregion997998// Coverage tests region999// #region10001001#[test]1002fn owner_can_add_address_to_allow_list() {1003	new_test_ext().execute_with(|| {1004		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10051006		let origin1 = Origin::signed(1);1007		assert_ok!(TemplateModule::add_to_allow_list(1008			origin1,1009			collection_id,1010			account(2)1011		));1012		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1013	});1014}10151016#[test]1017fn admin_can_add_address_to_allow_list() {1018	new_test_ext().execute_with(|| {1019		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1020		let origin1 = Origin::signed(1);1021		let origin2 = Origin::signed(2);10221023		assert_ok!(TemplateModule::add_collection_admin(1024			origin1,1025			collection_id,1026			account(2)1027		));1028		assert_ok!(TemplateModule::add_to_allow_list(1029			origin2,1030			collection_id,1031			account(3)1032		));1033		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1034	});1035}10361037#[test]1038fn nonprivileged_user_cannot_add_address_to_allow_list() {1039	new_test_ext().execute_with(|| {1040		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10411042		let origin2 = Origin::signed(2);1043		assert_noop!(1044			TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1045			CommonError::<Test>::NoPermission1046		);1047	});1048}10491050#[test]1051fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1052	new_test_ext().execute_with(|| {1053		let origin1 = Origin::signed(1);10541055		assert_noop!(1056			TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1057			CommonError::<Test>::CollectionNotFound1058		);1059	});1060}10611062#[test]1063fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1064	new_test_ext().execute_with(|| {1065		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10661067		let origin1 = Origin::signed(1);1068		assert_ok!(TemplateModule::destroy_collection(1069			origin1.clone(),1070			collection_id1071		));1072		assert_noop!(1073			TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1074			CommonError::<Test>::CollectionNotFound1075		);1076	});1077}10781079// If address is already added to allow list, nothing happens1080#[test]1081fn address_is_already_added_to_allow_list() {1082	new_test_ext().execute_with(|| {1083		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1084		let origin1 = Origin::signed(1);10851086		assert_ok!(TemplateModule::add_to_allow_list(1087			origin1.clone(),1088			collection_id,1089			account(2)1090		));1091		assert_ok!(TemplateModule::add_to_allow_list(1092			origin1,1093			collection_id,1094			account(2)1095		));1096		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1097	});1098}10991100#[test]1101fn owner_can_remove_address_from_allow_list() {1102	new_test_ext().execute_with(|| {1103		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));11041105		let origin1 = Origin::signed(1);1106		assert_ok!(TemplateModule::add_to_allow_list(1107			origin1.clone(),1108			collection_id,1109			account(2)1110		));1111		assert_ok!(TemplateModule::remove_from_allow_list(1112			origin1,1113			collection_id,1114			account(2)1115		));1116		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1117	});1118}11191120#[test]1121fn admin_can_remove_address_from_allow_list() {1122	new_test_ext().execute_with(|| {1123		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1124		let origin1 = Origin::signed(1);1125		let origin2 = Origin::signed(2);11261127		// Owner adds admin1128		assert_ok!(TemplateModule::add_collection_admin(1129			origin1.clone(),1130			collection_id,1131			account(2)1132		));11331134		// Owner adds address 3 to allow list1135		assert_ok!(TemplateModule::add_to_allow_list(1136			origin1,1137			collection_id,1138			account(3)1139		));11401141		// Admin removes address 3 from allow list1142		assert_ok!(TemplateModule::remove_from_allow_list(1143			origin2,1144			collection_id,1145			account(3)1146		));1147		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))), false);1148	});1149}11501151#[test]1152fn nonprivileged_user_cannot_remove_address_from_allow_list() {1153	new_test_ext().execute_with(|| {1154		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1155		let origin1 = Origin::signed(1);1156		let origin2 = Origin::signed(2);11571158		assert_ok!(TemplateModule::add_to_allow_list(1159			origin1,1160			collection_id,1161			account(2)1162		));1163		assert_noop!(1164			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1165			CommonError::<Test>::NoPermission1166		);1167		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1168	});1169}11701171#[test]1172fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1173	new_test_ext().execute_with(|| {1174		let origin1 = Origin::signed(1);11751176		assert_noop!(1177			TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1178			CommonError::<Test>::CollectionNotFound1179		);1180	});1181}11821183#[test]1184fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1185	new_test_ext().execute_with(|| {1186		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1187		let origin1 = Origin::signed(1);1188		let origin2 = Origin::signed(2);11891190		// Add account 2 to allow list1191		assert_ok!(TemplateModule::add_to_allow_list(1192			origin1.clone(),1193			collection_id,1194			account(2)1195		));11961197		// Account 2 is in collection allow-list1198		assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));11991200		// Destroy collection1201		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));12021203		// Attempt to remove account 2 from collection allow-list => error1204		assert_noop!(1205			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1206			CommonError::<Test>::CollectionNotFound1207		);12081209		// Account 2 is not found in collection allow-list anyway1210		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1211	});1212}12131214// If address is already removed from allow list, nothing happens1215#[test]1216fn address_is_already_removed_from_allow_list() {1217	new_test_ext().execute_with(|| {1218		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1219		let origin1 = Origin::signed(1);12201221		assert_ok!(TemplateModule::add_to_allow_list(1222			origin1.clone(),1223			collection_id,1224			account(2)1225		));1226		assert_ok!(TemplateModule::remove_from_allow_list(1227			origin1.clone(),1228			collection_id,1229			account(2)1230		));1231		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1232		assert_ok!(TemplateModule::remove_from_allow_list(1233			origin1,1234			collection_id,1235			account(2)1236		));1237		assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1238	});1239}12401241// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1242#[test]1243fn allow_list_test_1() {1244	new_test_ext().execute_with(|| {1245		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12461247		let origin1 = Origin::signed(1);12481249		let data = default_nft_data();1250		create_test_item(collection_id, &data.into());12511252		assert_ok!(TemplateModule::set_public_access_mode(1253			origin1.clone(),1254			collection_id,1255			AccessMode::AllowList1256		));1257		assert_ok!(TemplateModule::add_to_allow_list(1258			origin1.clone(),1259			collection_id,1260			account(2)1261		));12621263		assert_noop!(1264			TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1265			CommonError::<Test>::AddressNotInAllowlist1266		);1267	});1268}12691270#[test]1271fn allow_list_test_2() {1272	new_test_ext().execute_with(|| {1273		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1274		let origin1 = Origin::signed(1);12751276		let data = default_nft_data();1277		create_test_item(collection_id, &data.into());12781279		assert_ok!(TemplateModule::set_public_access_mode(1280			origin1.clone(),1281			collection_id,1282			AccessMode::AllowList1283		));1284		assert_ok!(TemplateModule::add_to_allow_list(1285			origin1.clone(),1286			collection_id,1287			account(1)1288		));1289		assert_ok!(TemplateModule::add_to_allow_list(1290			origin1.clone(),1291			collection_id,1292			account(2)1293		));12941295		// do approve1296		assert_ok!(TemplateModule::approve(1297			origin1.clone(),1298			account(1),1299			collection_id,1300			TokenId(1),1301			11302		));1303		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13041305		assert_ok!(TemplateModule::remove_from_allow_list(1306			origin1.clone(),1307			collection_id,1308			account(1)1309		));13101311		assert_noop!(1312			TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1313			CommonError::<Test>::AddressNotInAllowlist1314		);1315	});1316}13171318// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1319#[test]1320fn allow_list_test_3() {1321	new_test_ext().execute_with(|| {1322		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13231324		let origin1 = Origin::signed(1);13251326		let data = default_nft_data();1327		create_test_item(collection_id, &data.into());13281329		assert_ok!(TemplateModule::set_public_access_mode(1330			origin1.clone(),1331			collection_id,1332			AccessMode::AllowList1333		));1334		assert_ok!(TemplateModule::add_to_allow_list(1335			origin1.clone(),1336			collection_id,1337			account(1)1338		));13391340		assert_noop!(1341			TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1342			CommonError::<Test>::AddressNotInAllowlist1343		);1344	});1345}13461347#[test]1348fn allow_list_test_4() {1349	new_test_ext().execute_with(|| {1350		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13511352		let origin1 = Origin::signed(1);13531354		let data = default_nft_data();1355		create_test_item(collection_id, &data.into());13561357		assert_ok!(TemplateModule::set_public_access_mode(1358			origin1.clone(),1359			collection_id,1360			AccessMode::AllowList1361		));1362		assert_ok!(TemplateModule::add_to_allow_list(1363			origin1.clone(),1364			collection_id,1365			account(1)1366		));1367		assert_ok!(TemplateModule::add_to_allow_list(1368			origin1.clone(),1369			collection_id,1370			account(2)1371		));13721373		// do approve1374		assert_ok!(TemplateModule::approve(1375			origin1.clone(),1376			account(1),1377			collection_id,1378			TokenId(1),1379			11380		));1381		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13821383		assert_ok!(TemplateModule::remove_from_allow_list(1384			origin1.clone(),1385			collection_id,1386			account(2)1387		));13881389		assert_noop!(1390			TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1391			CommonError::<Test>::AddressNotInAllowlist1392		);1393	});1394}13951396// 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)1397#[test]1398fn allow_list_test_5() {1399	new_test_ext().execute_with(|| {1400		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14011402		let origin1 = Origin::signed(1);14031404		let data = default_nft_data();1405		create_test_item(collection_id, &data.into());14061407		assert_ok!(TemplateModule::set_public_access_mode(1408			origin1.clone(),1409			collection_id,1410			AccessMode::AllowList1411		));1412		assert_noop!(1413			TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1414			CommonError::<Test>::AddressNotInAllowlist1415		);1416	});1417}14181419// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1420#[test]1421fn allow_list_test_6() {1422	new_test_ext().execute_with(|| {1423		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14241425		let origin1 = Origin::signed(1);14261427		let data = default_nft_data();1428		create_test_item(collection_id, &data.into());14291430		assert_ok!(TemplateModule::set_public_access_mode(1431			origin1.clone(),1432			collection_id,1433			AccessMode::AllowList1434		));14351436		// do approve1437		assert_noop!(1438			TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1439			CommonError::<Test>::AddressNotInAllowlist1440		);1441	});1442}14431444// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1445//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1446#[test]1447fn allow_list_test_7() {1448	new_test_ext().execute_with(|| {1449		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14501451		let data = default_nft_data();1452		create_test_item(collection_id, &data.into());14531454		let origin1 = Origin::signed(1);14551456		assert_ok!(TemplateModule::set_public_access_mode(1457			origin1.clone(),1458			collection_id,1459			AccessMode::AllowList1460		));1461		assert_ok!(TemplateModule::add_to_allow_list(1462			origin1.clone(),1463			collection_id,1464			account(1)1465		));1466		assert_ok!(TemplateModule::add_to_allow_list(1467			origin1.clone(),1468			collection_id,1469			account(2)1470		));14711472		assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1473	});1474}14751476#[test]1477fn allow_list_test_8() {1478	new_test_ext().execute_with(|| {1479		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14801481		// Create NFT for account 11482		let data = default_nft_data();1483		create_test_item(collection_id, &data.into());14841485		let origin1 = Origin::signed(1);14861487		// Toggle Allow List mode and add accounts 1 and 21488		assert_ok!(TemplateModule::set_public_access_mode(1489			origin1.clone(),1490			collection_id,1491			AccessMode::AllowList1492		));1493		assert_ok!(TemplateModule::add_to_allow_list(1494			origin1.clone(),1495			collection_id,1496			account(1)1497		));1498		assert_ok!(TemplateModule::add_to_allow_list(1499			origin1.clone(),1500			collection_id,1501			account(2)1502		));15031504		// Sself-approve account 1 for NFT 11505		assert_ok!(TemplateModule::approve(1506			origin1.clone(),1507			account(1),1508			CollectionId(1), 1509			TokenId(1),1510			11511		));1512		assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));15131514		// Transfer from 1 to 21515		assert_ok!(TemplateModule::transfer_from(1516			origin1,1517			account(1),1518			account(2),1519			CollectionId(1), 1520			TokenId(1),1521			11522		));1523	});1524}15251526// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1527#[test]1528fn allow_list_test_9() {1529	new_test_ext().execute_with(|| {1530		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1531		let origin1 = Origin::signed(1);15321533		assert_ok!(TemplateModule::set_public_access_mode(1534			origin1.clone(),1535			collection_id,1536			AccessMode::AllowList1537		));1538		assert_ok!(TemplateModule::set_mint_permission(1539			origin1,1540			collection_id,1541			false1542		));15431544		let data = default_nft_data();1545		create_test_item(collection_id, &data.into());1546	});1547}15481549// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1550#[test]1551fn allow_list_test_10() {1552	new_test_ext().execute_with(|| {1553		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15541555		let origin1 = Origin::signed(1);1556		let origin2 = Origin::signed(2);15571558		assert_ok!(TemplateModule::set_public_access_mode(1559			origin1.clone(),1560			collection_id,1561			AccessMode::AllowList1562		));1563		assert_ok!(TemplateModule::set_mint_permission(1564			origin1.clone(),1565			collection_id,1566			false1567		));15681569		assert_ok!(TemplateModule::add_collection_admin(1570			origin1,1571			collection_id,1572			account(2)1573		));15741575		assert_ok!(TemplateModule::create_item(1576			origin2,1577			collection_id,1578			account(2),1579			default_nft_data().into()1580		));1581	});1582}15831584// 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.1585#[test]1586fn allow_list_test_11() {1587	new_test_ext().execute_with(|| {1588		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15891590		let origin1 = Origin::signed(1);1591		let origin2 = Origin::signed(2);15921593		assert_ok!(TemplateModule::set_public_access_mode(1594			origin1.clone(),1595			collection_id,1596			AccessMode::AllowList1597		));1598		assert_ok!(TemplateModule::set_mint_permission(1599			origin1.clone(),1600			collection_id,1601			false1602		));1603		assert_ok!(TemplateModule::add_to_allow_list(1604			origin1,1605			collection_id,1606			account(2)1607		));16081609		assert_noop!(1610			TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1611			CommonError::<Test>::PublicMintingNotAllowed1612		);1613	});1614}16151616// 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.1617#[test]1618fn allow_list_test_12() {1619	new_test_ext().execute_with(|| {1620		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16211622		let origin1 = Origin::signed(1);1623		let origin2 = Origin::signed(2);16241625		assert_ok!(TemplateModule::set_public_access_mode(1626			origin1.clone(),1627			collection_id,1628			AccessMode::AllowList1629		));1630		assert_ok!(TemplateModule::set_mint_permission(1631			origin1,1632			collection_id,1633			false1634		));16351636		assert_noop!(1637			TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1638			CommonError::<Test>::PublicMintingNotAllowed1639		);1640	});1641}16421643// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1644#[test]1645fn allow_list_test_13() {1646	new_test_ext().execute_with(|| {1647		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16481649		let origin1 = Origin::signed(1);16501651		assert_ok!(TemplateModule::set_public_access_mode(1652			origin1.clone(),1653			collection_id,1654			AccessMode::AllowList1655		));1656		assert_ok!(TemplateModule::set_mint_permission(1657			origin1,1658			collection_id,1659			true1660		));16611662		let data = default_nft_data();1663		create_test_item(collection_id, &data.into());1664	});1665}16661667// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1668#[test]1669fn allow_list_test_14() {1670	new_test_ext().execute_with(|| {1671		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16721673		let origin1 = Origin::signed(1);1674		let origin2 = Origin::signed(2);16751676		assert_ok!(TemplateModule::set_public_access_mode(1677			origin1.clone(),1678			collection_id,1679			AccessMode::AllowList1680		));1681		assert_ok!(TemplateModule::set_mint_permission(1682			origin1.clone(),1683			collection_id,1684			true1685		));16861687		assert_ok!(TemplateModule::add_collection_admin(1688			origin1,1689			collection_id,1690			account(2)1691		));16921693		assert_ok!(TemplateModule::create_item(1694			origin2,1695			collection_id,1696			account(2),1697			default_nft_data().into()1698		));1699	});1700}17011702// 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.1703#[test]1704fn allow_list_test_15() {1705	new_test_ext().execute_with(|| {1706		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17071708		let origin1 = Origin::signed(1);1709		let origin2 = Origin::signed(2);17101711		assert_ok!(TemplateModule::set_public_access_mode(1712			origin1.clone(),1713			collection_id,1714			AccessMode::AllowList1715		));1716		assert_ok!(TemplateModule::set_mint_permission(1717			origin1,1718			collection_id,1719			true1720		));17211722		assert_noop!(1723			TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()).map_err(|e| e.error),1724			CommonError::<Test>::AddressNotInAllowlist1725		);1726	});1727}17281729// 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.1730#[test]1731fn allow_list_test_16() {1732	new_test_ext().execute_with(|| {1733		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17341735		let origin1 = Origin::signed(1);1736		let origin2 = Origin::signed(2);17371738		assert_ok!(TemplateModule::set_public_access_mode(1739			origin1.clone(),1740			collection_id,1741			AccessMode::AllowList1742		));1743		assert_ok!(TemplateModule::set_mint_permission(1744			origin1.clone(),1745			collection_id,1746			true1747		));1748		assert_ok!(TemplateModule::add_to_allow_list(1749			origin1,1750			collection_id,1751			account(2)1752		));17531754		assert_ok!(TemplateModule::create_item(1755			origin2,1756			collection_id,1757			account(2),1758			default_nft_data().into()1759		));1760	});1761}17621763// Total number of collections. Positive test1764#[test]1765fn total_number_collections_bound() {1766	new_test_ext().execute_with(|| {1767		create_test_collection(&CollectionMode::NFT, CollectionId(1));1768	});1769}17701771#[test]1772fn create_max_collections() {1773	new_test_ext().execute_with(|| {1774		for i in 1..=COLLECTION_NUMBER_LIMIT {1775			create_test_collection(&CollectionMode::NFT, CollectionId(i));1776		}1777	});1778}17791780// Total number of collections. Negative test1781#[test]1782fn total_number_collections_bound_neg() {1783	new_test_ext().execute_with(|| {1784		let origin1 = Origin::signed(1);17851786		for i in 1..=COLLECTION_NUMBER_LIMIT {1787			create_test_collection(&CollectionMode::NFT, CollectionId(i));1788		}17891790		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1791		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1792		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17931794		// 11-th collection in chain. Expects error1795		assert_noop!(1796			TemplateModule::create_collection(1797				origin1,1798				col_name1,1799				col_desc1,1800				token_prefix1,1801				CollectionMode::NFT1802			),1803			CommonError::<Test>::TotalCollectionsLimitExceeded1804		);1805	});1806}18071808// Owned tokens by a single address. Positive test1809#[test]1810fn owned_tokens_bound() {1811	new_test_ext().execute_with(|| {1812		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18131814		let data = default_nft_data();1815		create_test_item(collection_id, &data.clone().into());1816		create_test_item(collection_id, &data.into());1817	});1818}18191820// Owned tokens by a single address. Negotive test1821#[test]1822fn owned_tokens_bound_neg() {1823	new_test_ext().execute_with(|| {1824		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18251826		let origin1 = Origin::signed(1);18271828		for _ in 1..=MAX_TOKEN_OWNERSHIP {1829			let data = default_nft_data();1830			create_test_item(collection_id, &data.clone().into());1831		}18321833		let data = default_nft_data();1834		assert_noop!(1835			TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()).map_err(|e| e.error),1836			CommonError::<Test>::AccountTokenLimitExceeded1837		);1838	});1839}18401841// Number of collection admins. Positive test1842#[test]1843fn collection_admins_bound() {1844	new_test_ext().execute_with(|| {1845		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18461847		let origin1 = Origin::signed(1);18481849		assert_ok!(TemplateModule::add_collection_admin(1850			origin1.clone(),1851			collection_id,1852			account(2)1853		));1854		assert_ok!(TemplateModule::add_collection_admin(1855			origin1,1856			collection_id,1857			account(3)1858		));1859	});1860}18611862// Number of collection admins. Negotive test1863#[test]1864fn collection_admins_bound_neg() {1865	new_test_ext().execute_with(|| {1866		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18671868		let origin1 = Origin::signed(1);18691870		for i in 0..COLLECTION_ADMINS_LIMIT {1871			assert_ok!(TemplateModule::add_collection_admin(1872				origin1.clone(),1873				collection_id,1874				account((2 + i).into())1875			));1876		}1877		assert_noop!(1878			TemplateModule::add_collection_admin(1879				origin1,1880				collection_id,1881				account((3 + COLLECTION_ADMINS_LIMIT).into())1882			),1883			CommonError::<Test>::CollectionAdminCountExceeded1884		);1885	});1886}1887// #endregion18881889#[test]1890fn set_const_on_chain_schema() {1891	new_test_ext().execute_with(|| {1892		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18931894		let origin1 = Origin::signed(1);1895		assert_ok!(TemplateModule::set_const_on_chain_schema(1896			origin1,1897			collection_id,1898			b"test const on chain schema".to_vec()1899		));19001901		assert_eq!(1902			<pallet_common::CollectionById<Test>>::get(collection_id)1903				.unwrap()1904				.const_on_chain_schema,1905			b"test const on chain schema".to_vec()1906		);1907		assert_eq!(1908			<pallet_common::CollectionById<Test>>::get(collection_id)1909				.unwrap()1910				.variable_on_chain_schema,1911			b"".to_vec()1912		);1913	});1914}19151916#[test]1917fn set_variable_on_chain_schema() {1918	new_test_ext().execute_with(|| {1919		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19201921		let origin1 = Origin::signed(1);1922		assert_ok!(TemplateModule::set_variable_on_chain_schema(1923			origin1,1924			collection_id,1925			b"test variable on chain schema".to_vec()1926		));19271928		assert_eq!(1929			<pallet_common::CollectionById<Test>>::get(collection_id)1930				.unwrap()1931				.const_on_chain_schema,1932			b"".to_vec()1933		);1934		assert_eq!(1935			<pallet_common::CollectionById<Test>>::get(collection_id)1936				.unwrap()1937				.variable_on_chain_schema,1938			b"test variable on chain schema".to_vec()1939		);1940	});1941}19421943#[test]1944fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1945	new_test_ext().execute_with(|| {1946		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19471948		let origin1 = Origin::signed(1);19491950		let data = default_nft_data();1951		create_test_item(CollectionId(1), &data.into());19521953		let variable_data = b"test data".to_vec();1954		assert_ok!(TemplateModule::set_variable_meta_data(1955			origin1,1956			collection_id,1957			TokenId(1),1958			variable_data.clone()1959		));19601961		assert_eq!(1962			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1963				.unwrap()1964				.variable_data,1965			variable_data1966		);1967	});1968}19691970#[test]1971fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1972	new_test_ext().execute_with(|| {1973		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19741975		let origin1 = Origin::signed(1);19761977		let data = default_re_fungible_data();1978		create_test_item(collection_id, &data.into());19791980		let variable_data = b"test data".to_vec();1981		assert_ok!(TemplateModule::set_variable_meta_data(1982			origin1,1983			collection_id,1984			TokenId(1),1985			variable_data.clone()1986		));19871988		assert_eq!(1989			<pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1990				.variable_data,1991			variable_data1992		);1993	});1994}19951996#[test]1997fn set_variable_meta_data_on_fungible_token_fails() {1998	new_test_ext().execute_with(|| {1999		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20002001		let origin1 = Origin::signed(1);20022003		let data = default_fungible_data();2004		create_test_item(collection_id, &data.into());20052006		let variable_data = b"test data".to_vec();2007		assert_noop!(2008			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(0), variable_data).map_err(|e| e.error),2009			<pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2010		);2011	});2012}20132014#[test]2015fn set_variable_meta_data_on_fungible_token_with_token_id_fails() {2016	new_test_ext().execute_with(|| {2017		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20182019		let origin1 = Origin::signed(1);20202021		let data = default_fungible_data();2022		create_test_item(collection_id, &data.into());20232024		let variable_data = b"test data".to_vec();2025		assert_noop!(2026			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2027			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId2028		);2029	});2030}20312032#[test]2033fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2034	new_test_ext().execute_with(|| {2035		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20362037		let origin1 = Origin::signed(1);20382039		let data = default_nft_data();2040		create_test_item(collection_id, &data.into());20412042		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2043		assert_noop!(2044			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2045			CommonError::<Test>::TokenVariableDataLimitExceeded2046		);2047	});2048}20492050#[test]2051fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2052	new_test_ext().execute_with(|| {2053		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20542055		let origin1 = Origin::signed(1);20562057		let data = default_re_fungible_data();2058		create_test_item(collection_id, &data.into());20592060		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2061		assert_noop!(2062			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2063			CommonError::<Test>::TokenVariableDataLimitExceeded2064		);2065	});2066}20672068#[test]2069fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2070	new_test_ext().execute_with(|| {2071		//default_limits();20722073		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20742075		let origin1 = Origin::signed(1);20762077		let data = default_nft_data();2078		create_test_item(collection_id, &data.into());20792080		assert_ok!(TemplateModule::set_meta_update_permission_flag(2081			origin1.clone(),2082			collection_id,2083			MetaUpdatePermission::ItemOwner,2084		));20852086		let variable_data = b"ten chars.".to_vec();2087		assert_ok!(TemplateModule::set_variable_meta_data(2088			origin1,2089			collection_id,2090			TokenId(1),2091			variable_data.clone()2092		));20932094		assert_eq!(2095			<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2096				.unwrap()2097				.variable_data,2098			variable_data2099		);2100	});2101}21022103#[test]2104fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2105	new_test_ext().execute_with(|| {2106		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));21072108		let origin1 = Origin::signed(1);21092110		assert_ok!(TemplateModule::set_mint_permission(2111			origin1.clone(),2112			collection_id,2113			true2114		));2115		assert_ok!(TemplateModule::add_to_allow_list(2116			origin1.clone(),2117			collection_id,2118			account(1)2119		));21202121		let data = default_nft_data();2122		create_test_item(collection_id, &data.into());21232124		assert_ok!(TemplateModule::set_meta_update_permission_flag(2125			origin1.clone(),2126			collection_id,2127			MetaUpdatePermission::ItemOwner,2128		));21292130		let variable_data = b"1234567890123".to_vec();2131		assert_noop!(2132			TemplateModule::set_variable_meta_data(2133				origin1,2134				collection_id,2135				TokenId(1),2136				variable_data.clone()2137			).map_err(|e| e.error),2138			CommonError::<Test>::TokenVariableDataLimitExceeded2139		);2140	})2141}21422143#[test]2144fn collection_transfer_flag_works() {2145	new_test_ext().execute_with(|| {2146		let origin1 = Origin::signed(1);21472148		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2149		assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21502151		let data = default_nft_data();2152		create_test_item(collection_id, &data.into());2153		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2154		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21552156		let origin1 = Origin::signed(1);21572158		// default scenario2159		assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2160		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2161		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2162		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2163		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2164	});2165}21662167#[test]2168fn set_variable_meta_data_on_nft_with_admin_flag() {2169	new_test_ext().execute_with(|| {2170		// default_limits();21712172		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21732174		let origin1 = Origin::signed(1);2175		let origin2 = Origin::signed(2);21762177		assert_ok!(TemplateModule::set_mint_permission(2178			origin2.clone(),2179			collection_id,2180			true2181		));2182		assert_ok!(TemplateModule::add_to_allow_list(2183			origin2.clone(),2184			collection_id,2185			account(1)2186		));21872188		assert_ok!(TemplateModule::add_collection_admin(2189			origin2.clone(),2190			collection_id,2191			account(1)2192		));21932194		let data = default_nft_data();2195		create_test_item(collection_id, &data.into());21962197		assert_ok!(TemplateModule::set_meta_update_permission_flag(2198			origin2.clone(),2199			collection_id,2200			MetaUpdatePermission::Admin,2201		));22022203		let variable_data = b"test.".to_vec();2204		assert_ok!(TemplateModule::set_variable_meta_data(2205			origin1,2206			collection_id,2207			TokenId(1),2208			variable_data.clone()2209		));22102211		assert_eq!(2212			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2213				.unwrap()2214				.variable_data,2215			variable_data2216		);2217	});2218}22192220#[test]2221fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2222	new_test_ext().execute_with(|| {2223		// default_limits();22242225		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22262227		let origin1 = Origin::signed(1);2228		let origin2 = Origin::signed(2);22292230		assert_ok!(TemplateModule::set_mint_permission(2231			origin2.clone(),2232			collection_id,2233			true2234		));2235		assert_ok!(TemplateModule::add_to_allow_list(2236			origin2.clone(),2237			collection_id,2238			account(1)2239		));22402241		let data = default_nft_data();2242		create_test_item(collection_id, &data.into());22432244		assert_ok!(TemplateModule::set_meta_update_permission_flag(2245			origin2.clone(),2246			collection_id,2247			MetaUpdatePermission::Admin,2248		));22492250		let variable_data = b"test.".to_vec();2251		assert_noop!(2252			TemplateModule::set_variable_meta_data(2253				origin1,2254				collection_id,2255				TokenId(1),2256				variable_data.clone()2257			).map_err(|e| e.error),2258			CommonError::<Test>::NoPermission2259		);2260	});2261}22622263#[test]2264fn set_variable_meta_flag_after_freeze() {2265	new_test_ext().execute_with(|| {2266		// default_limits();22672268		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22692270		let origin2 = Origin::signed(2);22712272		assert_ok!(TemplateModule::set_meta_update_permission_flag(2273			origin2.clone(),2274			collection_id,2275			MetaUpdatePermission::None,2276		));2277		assert_noop!(2278			TemplateModule::set_meta_update_permission_flag(2279				origin2.clone(),2280				collection_id,2281				MetaUpdatePermission::Admin2282			),2283			CommonError::<Test>::MetadataFlagFrozen2284		);2285	});2286}22872288#[test]2289fn set_variable_meta_data_on_nft_with_none_flag_neg() {2290	new_test_ext().execute_with(|| {2291		// default_limits();22922293		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2294		let origin1 = Origin::signed(1);22952296		let data = default_nft_data();2297		create_test_item(collection_id, &data.into());22982299		assert_ok!(TemplateModule::set_meta_update_permission_flag(2300			origin1.clone(),2301			collection_id,2302			MetaUpdatePermission::None,2303		));23042305		let variable_data = b"test.".to_vec();2306		assert_noop!(2307			TemplateModule::set_variable_meta_data(2308				origin1.clone(),2309				collection_id,2310				TokenId(1),2311				variable_data.clone()2312			).map_err(|e| e.error),2313			CommonError::<Test>::NoPermission2314		);2315	});2316}23172318#[test]2319fn collection_transfer_flag_works_neg() {2320	new_test_ext().execute_with(|| {2321		let origin1 = Origin::signed(1);23222323		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2324		assert_ok!(TemplateModule::set_transfers_enabled_flag(2325			origin1, collection_id, false2326		));23272328		let data = default_nft_data();2329		create_test_item(collection_id, &data.into());2330		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2331		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23322333		let origin1 = Origin::signed(1);23342335		// default scenario2336		assert_noop!(2337			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2338			CommonError::<Test>::TransferNotAllowed2339		);2340		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2341		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2342		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2343		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2344	});2345}
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, 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_fungible_token_with_token_id_fails() {2010	new_test_ext().execute_with(|| {2011		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20122013		let origin1 = Origin::signed(1);20142015		let data = default_fungible_data();2016		create_test_item(collection_id, &data.into());20172018		let variable_data = b"test data".to_vec();2019		assert_noop!(2020			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2021			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId2022		);2023	});2024}20252026#[test]2027fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2028	new_test_ext().execute_with(|| {2029		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20302031		let origin1 = Origin::signed(1);20322033		let data = default_nft_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_re_fungible_token_fails_for_big_data() {2046	new_test_ext().execute_with(|| {2047		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20482049		let origin1 = Origin::signed(1);20502051		let data = default_re_fungible_data();2052		create_test_item(collection_id, &data.into());20532054		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2055		assert_noop!(2056			TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2057			CommonError::<Test>::TokenVariableDataLimitExceeded2058		);2059	});2060}20612062#[test]2063fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2064	new_test_ext().execute_with(|| {2065		//default_limits();20662067		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20682069		let origin1 = Origin::signed(1);20702071		let data = default_nft_data();2072		create_test_item(collection_id, &data.into());20732074		assert_ok!(TemplateModule::set_meta_update_permission_flag(2075			origin1.clone(),2076			collection_id,2077			MetaUpdatePermission::ItemOwner,2078		));20792080		let variable_data = b"ten chars.".to_vec();2081		assert_ok!(TemplateModule::set_variable_meta_data(2082			origin1,2083			collection_id,2084			TokenId(1),2085			variable_data.clone()2086		));20872088		assert_eq!(2089			<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2090				.unwrap()2091				.variable_data,2092			variable_data2093		);2094	});2095}20962097#[test]2098fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2099	new_test_ext().execute_with(|| {2100		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));21012102		let origin1 = Origin::signed(1);21032104		assert_ok!(TemplateModule::set_mint_permission(2105			origin1.clone(),2106			collection_id,2107			true2108		));2109		assert_ok!(TemplateModule::add_to_allow_list(2110			origin1.clone(),2111			collection_id,2112			account(1)2113		));21142115		let data = default_nft_data();2116		create_test_item(collection_id, &data.into());21172118		assert_ok!(TemplateModule::set_meta_update_permission_flag(2119			origin1.clone(),2120			collection_id,2121			MetaUpdatePermission::ItemOwner,2122		));21232124		let variable_data = b"1234567890123".to_vec();2125		assert_noop!(2126			TemplateModule::set_variable_meta_data(2127				origin1,2128				collection_id,2129				TokenId(1),2130				variable_data.clone()2131			).map_err(|e| e.error),2132			CommonError::<Test>::TokenVariableDataLimitExceeded2133		);2134	})2135}21362137#[test]2138fn collection_transfer_flag_works() {2139	new_test_ext().execute_with(|| {2140		let origin1 = Origin::signed(1);21412142		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2143		assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21442145		let data = default_nft_data();2146		create_test_item(collection_id, &data.into());2147		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2148		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21492150		let origin1 = Origin::signed(1);21512152		// default scenario2153		assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2154		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2155		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2156		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2157		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2158	});2159}21602161#[test]2162fn set_variable_meta_data_on_nft_with_admin_flag() {2163	new_test_ext().execute_with(|| {2164		// default_limits();21652166		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21672168		let origin1 = Origin::signed(1);2169		let origin2 = Origin::signed(2);21702171		assert_ok!(TemplateModule::set_mint_permission(2172			origin2.clone(),2173			collection_id,2174			true2175		));2176		assert_ok!(TemplateModule::add_to_allow_list(2177			origin2.clone(),2178			collection_id,2179			account(1)2180		));21812182		assert_ok!(TemplateModule::add_collection_admin(2183			origin2.clone(),2184			collection_id,2185			account(1)2186		));21872188		let data = default_nft_data();2189		create_test_item(collection_id, &data.into());21902191		assert_ok!(TemplateModule::set_meta_update_permission_flag(2192			origin2.clone(),2193			collection_id,2194			MetaUpdatePermission::Admin,2195		));21962197		let variable_data = b"test.".to_vec();2198		assert_ok!(TemplateModule::set_variable_meta_data(2199			origin1,2200			collection_id,2201			TokenId(1),2202			variable_data.clone()2203		));22042205		assert_eq!(2206			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2207				.unwrap()2208				.variable_data,2209			variable_data2210		);2211	});2212}22132214#[test]2215fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2216	new_test_ext().execute_with(|| {2217		// default_limits();22182219		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22202221		let origin1 = Origin::signed(1);2222		let origin2 = Origin::signed(2);22232224		assert_ok!(TemplateModule::set_mint_permission(2225			origin2.clone(),2226			collection_id,2227			true2228		));2229		assert_ok!(TemplateModule::add_to_allow_list(2230			origin2.clone(),2231			collection_id,2232			account(1)2233		));22342235		let data = default_nft_data();2236		create_test_item(collection_id, &data.into());22372238		assert_ok!(TemplateModule::set_meta_update_permission_flag(2239			origin2.clone(),2240			collection_id,2241			MetaUpdatePermission::Admin,2242		));22432244		let variable_data = b"test.".to_vec();2245		assert_noop!(2246			TemplateModule::set_variable_meta_data(2247				origin1,2248				collection_id,2249				TokenId(1),2250				variable_data.clone()2251			).map_err(|e| e.error),2252			CommonError::<Test>::NoPermission2253		);2254	});2255}22562257#[test]2258fn set_variable_meta_flag_after_freeze() {2259	new_test_ext().execute_with(|| {2260		// default_limits();22612262		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22632264		let origin2 = Origin::signed(2);22652266		assert_ok!(TemplateModule::set_meta_update_permission_flag(2267			origin2.clone(),2268			collection_id,2269			MetaUpdatePermission::None,2270		));2271		assert_noop!(2272			TemplateModule::set_meta_update_permission_flag(2273				origin2.clone(),2274				collection_id,2275				MetaUpdatePermission::Admin2276			),2277			CommonError::<Test>::MetadataFlagFrozen2278		);2279	});2280}22812282#[test]2283fn set_variable_meta_data_on_nft_with_none_flag_neg() {2284	new_test_ext().execute_with(|| {2285		// default_limits();22862287		let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2288		let origin1 = Origin::signed(1);22892290		let data = default_nft_data();2291		create_test_item(collection_id, &data.into());22922293		assert_ok!(TemplateModule::set_meta_update_permission_flag(2294			origin1.clone(),2295			collection_id,2296			MetaUpdatePermission::None,2297		));22982299		let variable_data = b"test.".to_vec();2300		assert_noop!(2301			TemplateModule::set_variable_meta_data(2302				origin1.clone(),2303				collection_id,2304				TokenId(1),2305				variable_data.clone()2306			).map_err(|e| e.error),2307			CommonError::<Test>::NoPermission2308		);2309	});2310}23112312#[test]2313fn collection_transfer_flag_works_neg() {2314	new_test_ext().execute_with(|| {2315		let origin1 = Origin::signed(1);23162317		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2318		assert_ok!(TemplateModule::set_transfers_enabled_flag(2319			origin1, collection_id, false2320		));23212322		let data = default_nft_data();2323		create_test_item(collection_id, &data.into());2324		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2325		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23262327		let origin1 = Origin::signed(1);23282329		// default scenario2330		assert_noop!(2331			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2332			CommonError::<Test>::TransferNotAllowed2333		);2334		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2335		assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2336		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2337		assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2338	});2339}