git.delta.rocks / unique-network / refs/commits / 201fa4df0026

difftreelog

Refactor tests: change function 'create_collection' => 'create_collection_ex'

Trubnikov Sergey2022-02-21parent: #a6f62bd.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, CreateNftData,7	CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, MetaUpdatePermission,8	TokenId, MAX_TOKEN_OWNERSHIP,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.try_into().unwrap(),45		col_desc1.try_into().unwrap(),46		token_prefix1.try_into().unwrap(),47		mode.clone()48	));4950	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();51	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();52	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();53	assert_eq!(54		<pallet_common::CollectionById<Test>>::get(id)55			.unwrap()56			.owner,57		owner58	);59	assert_eq!(60		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,61		saved_col_name62	);63	assert_eq!(64		<pallet_common::CollectionById<Test>>::get(id).unwrap().mode,65		*mode66	);67	assert_eq!(68		<pallet_common::CollectionById<Test>>::get(id)69			.unwrap()70			.description,71		saved_description72	);73	assert_eq!(74		<pallet_common::CollectionById<Test>>::get(id)75			.unwrap()76			.token_prefix,77		saved_prefix78	);79	id80}8182fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {83	create_test_collection_for_owner(&mode, 1, id)84}8586fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {87	let origin1 = Origin::signed(1);88	assert_ok!(TemplateModule::create_item(89		origin1,90		collection_id,91		account(1),92		data.clone()93	));94}9596fn account(sub: u64) -> TestCrossAccountId {97	TestCrossAccountId::from_sub(sub)98}99100// Use cases tests region101// #region102103#[test]104fn set_version_schema() {105	new_test_ext().execute_with(|| {106		let origin1 = Origin::signed(1);107		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));108109		assert_ok!(TemplateModule::set_schema_version(110			origin1,111			collection_id,112			SchemaVersion::Unique113		));114		assert_eq!(115			<pallet_common::CollectionById<Test>>::get(collection_id)116				.unwrap()117				.schema_version,118			SchemaVersion::Unique119		);120	});121}122123#[test]124fn create_fungible_collection_fails_with_large_decimal_numbers() {125	new_test_ext().execute_with(|| {126		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();127		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();128		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();129130		let origin1 = Origin::signed(1);131		assert_noop!(132			TemplateModule::create_collection(133				origin1,134				col_name1.try_into().unwrap(),135				col_desc1.try_into().unwrap(),136				token_prefix1.try_into().unwrap(),137				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)138			),139			Error::<Test>::CollectionDecimalPointLimitExceeded140		);141	});142}143144#[test]145fn create_nft_item() {146	new_test_ext().execute_with(|| {147		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));148149		let data = default_nft_data();150		create_test_item(collection_id, &data.clone().into());151152		let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();153		assert_eq!(item.const_data, data.const_data.into_inner());154		assert_eq!(item.variable_data, data.variable_data.into_inner());155	});156}157158// Use cases tests region159// #region160#[test]161fn create_nft_multiple_items() {162	new_test_ext().execute_with(|| {163		create_test_collection(&CollectionMode::NFT, CollectionId(1));164165		let origin1 = Origin::signed(1);166167		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];168169		assert_ok!(TemplateModule::create_multiple_items(170			origin1,171			CollectionId(1),172			account(1),173			items_data174				.clone()175				.into_iter()176				.map(|d| { d.into() })177				.collect()178		));179		for (index, data) in items_data.into_iter().enumerate() {180			let item = <pallet_nonfungible::TokenData<Test>>::get((181				CollectionId(1),182				TokenId((index + 1) as u32),183			))184			.unwrap();185			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());186			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());187		}188	});189}190191#[test]192fn create_refungible_item() {193	new_test_ext().execute_with(|| {194		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));195196		let data = default_re_fungible_data();197		create_test_item(collection_id, &data.clone().into());198		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));199		let balance =200			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));201		assert_eq!(item.const_data, data.const_data.into_inner());202		assert_eq!(item.variable_data, data.variable_data.into_inner());203		assert_eq!(balance, 1023);204	});205}206207#[test]208fn create_multiple_refungible_items() {209	new_test_ext().execute_with(|| {210		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));211212		let origin1 = Origin::signed(1);213214		let items_data = vec![215			default_re_fungible_data(),216			default_re_fungible_data(),217			default_re_fungible_data(),218		];219220		assert_ok!(TemplateModule::create_multiple_items(221			origin1,222			CollectionId(1),223			account(1),224			items_data225				.clone()226				.into_iter()227				.map(|d| { d.into() })228				.collect()229		));230		for (index, data) in items_data.into_iter().enumerate() {231			let item = <pallet_refungible::TokenData<Test>>::get((232				CollectionId(1),233				TokenId((index + 1) as u32),234			));235			let balance =236				<pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));237			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());238			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());239			assert_eq!(balance, 1023);240		}241	});242}243244#[test]245fn create_fungible_item() {246	new_test_ext().execute_with(|| {247		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));248249		let data = default_fungible_data();250		create_test_item(collection_id, &data.into());251252		assert_eq!(253			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),254			5255		);256	});257}258259//#[test]260// fn create_multiple_fungible_items() {261//     new_test_ext().execute_with(|| {262//         default_limits();263264//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));265266//         let origin1 = Origin::signed(1);267268//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];269270//         assert_ok!(TemplateModule::create_multiple_items(271//             origin1.clone(),272//             1,273//             1,274//             items_data.clone().into_iter().map(|d| { d.into() }).collect()275//         ));276277//         for (index, _) in items_data.iter().enumerate() {278//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);279//         }280//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);281//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);282//     });283// }284285#[test]286fn transfer_fungible_item() {287	new_test_ext().execute_with(|| {288		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));289290		let origin1 = Origin::signed(1);291		let origin2 = Origin::signed(2);292293		let data = default_fungible_data();294		create_test_item(collection_id, &data.into());295296		assert_eq!(297			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),298			5299		);300301		// change owner scenario302		assert_ok!(TemplateModule::transfer(303			origin1,304			account(2),305			CollectionId(1),306			TokenId(0),307			5308		));309		assert_eq!(310			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),311			0312		);313314		// split item scenario315		assert_ok!(TemplateModule::transfer(316			origin2.clone(),317			account(3),318			CollectionId(1),319			TokenId(0),320			3321		));322323		// split item and new owner has account scenario324		assert_ok!(TemplateModule::transfer(325			origin2,326			account(3),327			CollectionId(1),328			TokenId(0),329			1330		));331		assert_eq!(332			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),333			1334		);335		assert_eq!(336			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),337			4338		);339	});340}341342#[test]343fn transfer_refungible_item() {344	new_test_ext().execute_with(|| {345		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));346347		// Create RFT 1 in 1023 pieces for account 1348		let data = default_re_fungible_data();349		create_test_item(collection_id, &data.clone().into());350		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));351		assert_eq!(item.const_data, data.const_data.into_inner());352		assert_eq!(item.variable_data, data.variable_data.into_inner());353		assert_eq!(354			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),355			1356		);357		assert_eq!(358			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),359			1023360		);361		assert_eq!(362			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),363			true364		);365366		// Account 1 transfers all 1023 pieces of RFT 1 to account 2367		let origin1 = Origin::signed(1);368		let origin2 = Origin::signed(2);369		assert_ok!(TemplateModule::transfer(370			origin1,371			account(2),372			CollectionId(1),373			TokenId(1),374			1023375		));376		assert_eq!(377			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),378			1023379		);380		assert_eq!(381			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),382			0383		);384		assert_eq!(385			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),386			1387		);388		assert_eq!(389			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),390			false391		);392		assert_eq!(393			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),394			true395		);396397		// Account 2 transfers 500 pieces of RFT 1 to account 3398		assert_ok!(TemplateModule::transfer(399			origin2.clone(),400			account(3),401			CollectionId(1),402			TokenId(1),403			500404		));405		assert_eq!(406			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),407			523408		);409		assert_eq!(410			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),411			500412		);413		assert_eq!(414			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),415			1416		);417		assert_eq!(418			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),419			1420		);421		assert_eq!(422			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),423			true424		);425		assert_eq!(426			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),427			true428		);429430		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance431		assert_ok!(TemplateModule::transfer(432			origin2,433			account(3),434			CollectionId(1),435			TokenId(1),436			200437		));438		assert_eq!(439			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),440			323441		);442		assert_eq!(443			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),444			700445		);446		assert_eq!(447			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),448			1449		);450		assert_eq!(451			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),452			1453		);454		assert_eq!(455			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),456			true457		);458		assert_eq!(459			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),460			true461		);462	});463}464465#[test]466fn transfer_nft_item() {467	new_test_ext().execute_with(|| {468		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));469470		let data = default_nft_data();471		create_test_item(collection_id, &data.into());472		assert_eq!(473			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),474			1475		);476		assert_eq!(477			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),478			true479		);480481		let origin1 = Origin::signed(1);482		// default scenario483		assert_ok!(TemplateModule::transfer(484			origin1,485			account(2),486			CollectionId(1),487			TokenId(1),488			1489		));490		assert_eq!(491			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),492			0493		);494		assert_eq!(495			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),496			1497		);498		assert_eq!(499			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),500			false501		);502		assert_eq!(503			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),504			true505		);506	});507}508509#[test]510fn transfer_nft_item_wrong_value() {511	new_test_ext().execute_with(|| {512		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));513514		let data = default_nft_data();515		create_test_item(collection_id, &data.into());516		assert_eq!(517			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),518			1519		);520		assert_eq!(521			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),522			true523		);524525		let origin1 = Origin::signed(1);526527		assert_noop!(528			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)529				.map_err(|e| e.error),530			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount531		);532	});533}534535#[test]536fn transfer_nft_item_zero_value() {537	new_test_ext().execute_with(|| {538		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));539540		let data = default_nft_data();541		create_test_item(collection_id, &data.into());542		assert_eq!(543			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),544			1545		);546		assert_eq!(547			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),548			true549		);550551		let origin1 = Origin::signed(1);552553		// Transferring 0 amount works on NFT...554		assert_ok!(TemplateModule::transfer(555			origin1,556			account(2),557			CollectionId(1),558			TokenId(1),559			0560		));561		// ... and results in no transfer562		assert_eq!(563			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),564			1565		);566		assert_eq!(567			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),568			true569		);570	});571}572573#[test]574fn nft_approve_and_transfer_from() {575	new_test_ext().execute_with(|| {576		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));577578		let data = default_nft_data();579		create_test_item(collection_id, &data.into());580581		let origin1 = Origin::signed(1);582		let origin2 = Origin::signed(2);583584		assert_eq!(585			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),586			1587		);588		assert_eq!(589			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),590			true591		);592593		// neg transfer_from594		assert_noop!(595			TemplateModule::transfer_from(596				origin2.clone(),597				account(1),598				account(2),599				CollectionId(1),600				TokenId(1),601				1602			)603			.map_err(|e| e.error),604			CommonError::<Test>::ApprovedValueTooLow605		);606607		// do approve608		assert_ok!(TemplateModule::approve(609			origin1,610			account(2),611			CollectionId(1),612			TokenId(1),613			1614		));615		assert_eq!(616			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),617			account(2)618		);619620		assert_ok!(TemplateModule::transfer_from(621			origin2,622			account(1),623			account(3),624			CollectionId(1),625			TokenId(1),626			1627		));628		assert!(629			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()630		);631	});632}633634#[test]635fn nft_approve_and_transfer_from_allow_list() {636	new_test_ext().execute_with(|| {637		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));638639		let origin1 = Origin::signed(1);640		let origin2 = Origin::signed(2);641642		// Create NFT 1 for account 1643		let data = default_nft_data();644		create_test_item(collection_id, &data.clone().into());645		assert_eq!(646			&<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))647				.unwrap()648				.const_data,649			&data.const_data.into_inner()650		);651		assert_eq!(652			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),653			1654		);655		assert_eq!(656			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),657			true658		);659660		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list661		assert_ok!(TemplateModule::set_mint_permission(662			origin1.clone(),663			CollectionId(1),664			true665		));666		assert_ok!(TemplateModule::set_public_access_mode(667			origin1.clone(),668			CollectionId(1),669			AccessMode::AllowList670		));671		assert_ok!(TemplateModule::add_to_allow_list(672			origin1.clone(),673			CollectionId(1),674			account(1)675		));676		assert_ok!(TemplateModule::add_to_allow_list(677			origin1.clone(),678			CollectionId(1),679			account(2)680		));681		assert_ok!(TemplateModule::add_to_allow_list(682			origin1.clone(),683			CollectionId(1),684			account(3)685		));686687		// Account 1 approves account 2 for NFT 1688		assert_ok!(TemplateModule::approve(689			origin1.clone(),690			account(2),691			CollectionId(1),692			TokenId(1),693			1694		));695		assert_eq!(696			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),697			account(2)698		);699700		// Account 2 transfers NFT 1 from account 1 to account 3701		assert_ok!(TemplateModule::transfer_from(702			origin2,703			account(1),704			account(3),705			CollectionId(1),706			TokenId(1),707			1708		));709		assert!(710			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()711		);712	});713}714715#[test]716fn refungible_approve_and_transfer_from() {717	new_test_ext().execute_with(|| {718		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));719720		let origin1 = Origin::signed(1);721		let origin2 = Origin::signed(2);722723		// Create RFT 1 in 1023 pieces for account 1724		let data = default_re_fungible_data();725		create_test_item(collection_id, &data.into());726727		assert_eq!(728			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),729			1730		);731		assert_eq!(732			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),733			1023734		);735		assert_eq!(736			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),737			true738		);739740		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list741		assert_ok!(TemplateModule::set_mint_permission(742			origin1.clone(),743			CollectionId(1),744			true745		));746		assert_ok!(TemplateModule::set_public_access_mode(747			origin1.clone(),748			CollectionId(1),749			AccessMode::AllowList750		));751		assert_ok!(TemplateModule::add_to_allow_list(752			origin1.clone(),753			CollectionId(1),754			account(1)755		));756		assert_ok!(TemplateModule::add_to_allow_list(757			origin1.clone(),758			CollectionId(1),759			account(2)760		));761		assert_ok!(TemplateModule::add_to_allow_list(762			origin1.clone(),763			CollectionId(1),764			account(3)765		));766767		// Account 1 approves account 2 for 1023 pieces of RFT 1768		assert_ok!(TemplateModule::approve(769			origin1,770			account(2),771			CollectionId(1),772			TokenId(1),773			1023774		));775		assert_eq!(776			<pallet_refungible::Allowance<Test>>::get((777				CollectionId(1),778				TokenId(1),779				account(1),780				account(2)781			)),782			1023783		);784785		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3786		assert_ok!(TemplateModule::transfer_from(787			origin2,788			account(1),789			account(3),790			CollectionId(1),791			TokenId(1),792			100793		));794		assert_eq!(795			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),796			1797		);798		assert_eq!(799			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),800			1801		);802		assert_eq!(803			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),804			923805		);806		assert_eq!(807			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),808			100809		);810		assert_eq!(811			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),812			true813		);814		assert_eq!(815			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),816			true817		);818		assert_eq!(819			<pallet_refungible::Allowance<Test>>::get((820				CollectionId(1),821				TokenId(1),822				account(1),823				account(2)824			)),825			923826		);827	});828}829830#[test]831fn fungible_approve_and_transfer_from() {832	new_test_ext().execute_with(|| {833		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));834835		let data = default_fungible_data();836		create_test_item(collection_id, &data.into());837838		let origin1 = Origin::signed(1);839		let origin2 = Origin::signed(2);840841		assert_ok!(TemplateModule::set_mint_permission(842			origin1.clone(),843			CollectionId(1),844			true845		));846		assert_ok!(TemplateModule::set_public_access_mode(847			origin1.clone(),848			CollectionId(1),849			AccessMode::AllowList850		));851		assert_ok!(TemplateModule::add_to_allow_list(852			origin1.clone(),853			CollectionId(1),854			account(1)855		));856		assert_ok!(TemplateModule::add_to_allow_list(857			origin1.clone(),858			CollectionId(1),859			account(2)860		));861		assert_ok!(TemplateModule::add_to_allow_list(862			origin1.clone(),863			CollectionId(1),864			account(3)865		));866867		// do approve868		assert_ok!(TemplateModule::approve(869			origin1.clone(),870			account(2),871			CollectionId(1),872			TokenId(0),873			5874		));875		assert_eq!(876			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),877			5878		);879		assert_ok!(TemplateModule::approve(880			origin1,881			account(3),882			CollectionId(1),883			TokenId(0),884			5885		));886		assert_eq!(887			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),888			5889		);890		assert_eq!(891			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),892			5893		);894895		assert_ok!(TemplateModule::transfer_from(896			origin2.clone(),897			account(1),898			account(3),899			CollectionId(1),900			TokenId(0),901			4902		));903904		assert_eq!(905			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),906			1907		);908909		assert_noop!(910			TemplateModule::transfer_from(911				origin2,912				account(1),913				account(3),914				CollectionId(1),915				TokenId(0),916				4917			)918			.map_err(|e| e.error),919			CommonError::<Test>::ApprovedValueTooLow920		);921	});922}923924#[test]925fn change_collection_owner() {926	new_test_ext().execute_with(|| {927		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));928929		let origin1 = Origin::signed(1);930		assert_ok!(TemplateModule::change_collection_owner(931			origin1,932			collection_id,933			2934		));935		assert_eq!(936			<pallet_common::CollectionById<Test>>::get(collection_id)937				.unwrap()938				.owner,939			2940		);941	});942}943944#[test]945fn destroy_collection() {946	new_test_ext().execute_with(|| {947		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));948949		let origin1 = Origin::signed(1);950		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));951	});952}953954#[test]955fn burn_nft_item() {956	new_test_ext().execute_with(|| {957		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));958959		let origin1 = Origin::signed(1);960961		let data = default_nft_data();962		create_test_item(collection_id, &data.into());963964		// check balance (collection with id = 1, user id = 1)965		assert_eq!(966			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),967			1968		);969970		// burn item971		assert_ok!(TemplateModule::burn_item(972			origin1.clone(),973			collection_id,974			TokenId(1),975			1976		));977		assert_eq!(978			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),979			0980		);981	});982}983984#[test]985fn burn_same_nft_item_twice() {986	new_test_ext().execute_with(|| {987		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));988989		let origin1 = Origin::signed(1);990991		let data = default_nft_data();992		create_test_item(collection_id, &data.into());993994		// check balance (collection with id = 1, user id = 1)995		assert_eq!(996			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),997			1998		);9991000		// burn item1001		assert_ok!(TemplateModule::burn_item(1002			origin1.clone(),1003			collection_id,1004			TokenId(1),1005			11006		));10071008		// burn item again1009		assert_noop!(1010			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1011			CommonError::<Test>::TokenNotFound1012		);10131014		assert_eq!(1015			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1016			01017		);1018	});1019}10201021#[test]1022fn burn_fungible_item() {1023	new_test_ext().execute_with(|| {1024		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10251026		let origin1 = Origin::signed(1);1027		assert_ok!(TemplateModule::add_collection_admin(1028			origin1.clone(),1029			collection_id,1030			account(2)1031		));10321033		let data = default_fungible_data();1034		create_test_item(collection_id, &data.into());10351036		// check balance (collection with id = 1, user id = 1)1037		assert_eq!(1038			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1039			51040		);10411042		// burn item1043		assert_ok!(TemplateModule::burn_item(1044			origin1.clone(),1045			CollectionId(1),1046			TokenId(0),1047			51048		));1049		assert_noop!(1050			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1051			CommonError::<Test>::TokenValueTooLow1052		);10531054		assert_eq!(1055			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1056			01057		);1058	});1059}10601061#[test]1062fn burn_fungible_item_with_token_id() {1063	new_test_ext().execute_with(|| {1064		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10651066		let origin1 = Origin::signed(1);1067		assert_ok!(TemplateModule::add_collection_admin(1068			origin1.clone(),1069			collection_id,1070			account(2)1071		));10721073		let data = default_fungible_data();1074		create_test_item(collection_id, &data.into());10751076		// check balance (collection with id = 1, user id = 1)1077		assert_eq!(1078			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1079			51080		);10811082		// Try to burn item using Token ID1083		assert_noop!(1084			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1085			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1086		);1087	});1088}1089#[test]1090fn burn_refungible_item() {1091	new_test_ext().execute_with(|| {1092		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1093		let origin1 = Origin::signed(1);10941095		assert_ok!(TemplateModule::set_mint_permission(1096			origin1.clone(),1097			collection_id,1098			true1099		));1100		assert_ok!(TemplateModule::set_public_access_mode(1101			origin1.clone(),1102			collection_id,1103			AccessMode::AllowList1104		));1105		assert_ok!(TemplateModule::add_to_allow_list(1106			origin1.clone(),1107			collection_id,1108			account(1)1109		));11101111		assert_ok!(TemplateModule::add_collection_admin(1112			origin1.clone(),1113			collection_id,1114			account(2)1115		));11161117		let data = default_re_fungible_data();1118		create_test_item(collection_id, &data.into());11191120		// check balance (collection with id = 1, user id = 2)1121		assert_eq!(1122			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1123			11124		);1125		assert_eq!(1126			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1127			10231128		);11291130		// burn item1131		assert_ok!(TemplateModule::burn_item(1132			origin1.clone(),1133			collection_id,1134			TokenId(1),1135			10231136		));1137		assert_noop!(1138			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023)1139				.map_err(|e| e.error),1140			CommonError::<Test>::TokenValueTooLow1141		);11421143		assert_eq!(1144			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1145			01146		);1147	});1148}11491150#[test]1151fn add_collection_admin() {1152	new_test_ext().execute_with(|| {1153		let collection1_id =1154			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1155		let origin1 = Origin::signed(1);11561157		// Add collection admins1158		assert_ok!(TemplateModule::add_collection_admin(1159			origin1.clone(),1160			collection1_id,1161			account(2)1162		));1163		assert_ok!(TemplateModule::add_collection_admin(1164			origin1,1165			collection1_id,1166			account(3)1167		));11681169		// Owner is not an admin by default1170		assert_eq!(1171			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1172			false1173		);1174		assert!(<pallet_common::IsAdmin<Test>>::get((1175			CollectionId(1),1176			account(2)1177		)));1178		assert!(<pallet_common::IsAdmin<Test>>::get((1179			CollectionId(1),1180			account(3)1181		)));1182	});1183}11841185#[test]1186fn remove_collection_admin() {1187	new_test_ext().execute_with(|| {1188		let collection1_id =1189			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1190		let origin1 = Origin::signed(1);1191		let origin2 = Origin::signed(2);11921193		// Add collection admins 2 and 31194		assert_ok!(TemplateModule::add_collection_admin(1195			origin1.clone(),1196			collection1_id,1197			account(2)1198		));1199		assert_ok!(TemplateModule::add_collection_admin(1200			origin1,1201			collection1_id,1202			account(3)1203		));12041205		assert!(<pallet_common::IsAdmin<Test>>::get((1206			CollectionId(1),1207			account(2)1208		)));1209		assert!(<pallet_common::IsAdmin<Test>>::get((1210			CollectionId(1),1211			account(3)1212		)));12131214		// remove admin 31215		assert_ok!(TemplateModule::remove_collection_admin(1216			origin2,1217			CollectionId(1),1218			account(3)1219		));12201221		// 2 is still admin, 3 is not an admin anymore1222		assert!(<pallet_common::IsAdmin<Test>>::get((1223			CollectionId(1),1224			account(2)1225		)));1226		assert_eq!(1227			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1228			false1229		);1230	});1231}12321233#[test]1234fn balance_of() {1235	new_test_ext().execute_with(|| {1236		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1237		let fungible_collection_id =1238			create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1239		let re_fungible_collection_id =1240			create_test_collection(&CollectionMode::ReFungible, CollectionId(3));12411242		// check balance before1243		assert_eq!(1244			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1245			01246		);1247		assert_eq!(1248			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1249			01250		);1251		assert_eq!(1252			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1253			01254		);12551256		let nft_data = default_nft_data();1257		create_test_item(nft_collection_id, &nft_data.into());12581259		let fungible_data = default_fungible_data();1260		create_test_item(fungible_collection_id, &fungible_data.into());12611262		let re_fungible_data = default_re_fungible_data();1263		create_test_item(re_fungible_collection_id, &re_fungible_data.into());12641265		// check balance (collection with id = 1, user id = 1)1266		assert_eq!(1267			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1268			11269		);1270		assert_eq!(1271			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1272			51273		);1274		assert_eq!(1275			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1276			11277		);12781279		assert_eq!(1280			<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1281			true1282		);1283		assert_eq!(1284			<pallet_refungible::Owned<Test>>::get((1285				re_fungible_collection_id,1286				account(1),1287				TokenId(1)1288			)),1289			true1290		);1291	});1292}12931294#[test]1295fn approve() {1296	new_test_ext().execute_with(|| {1297		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12981299		let data = default_nft_data();1300		create_test_item(collection_id, &data.into());13011302		let origin1 = Origin::signed(1);13031304		// approve1305		assert_ok!(TemplateModule::approve(1306			origin1,1307			account(2),1308			CollectionId(1),1309			TokenId(1),1310			11311		));1312		assert_eq!(1313			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1314			account(2)1315		);1316	});1317}13181319#[test]1320fn transfer_from() {1321	new_test_ext().execute_with(|| {1322		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1323		let origin1 = Origin::signed(1);1324		let origin2 = Origin::signed(2);13251326		let data = default_nft_data();1327		create_test_item(collection_id, &data.into());13281329		// approve1330		assert_ok!(TemplateModule::approve(1331			origin1.clone(),1332			account(2),1333			CollectionId(1),1334			TokenId(1),1335			11336		));1337		assert_eq!(1338			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1339			account(2)1340		);13411342		assert_ok!(TemplateModule::set_mint_permission(1343			origin1.clone(),1344			CollectionId(1),1345			true1346		));1347		assert_ok!(TemplateModule::set_public_access_mode(1348			origin1.clone(),1349			CollectionId(1),1350			AccessMode::AllowList1351		));1352		assert_ok!(TemplateModule::add_to_allow_list(1353			origin1.clone(),1354			CollectionId(1),1355			account(1)1356		));1357		assert_ok!(TemplateModule::add_to_allow_list(1358			origin1.clone(),1359			CollectionId(1),1360			account(2)1361		));1362		assert_ok!(TemplateModule::add_to_allow_list(1363			origin1,1364			CollectionId(1),1365			account(3)1366		));13671368		assert_ok!(TemplateModule::transfer_from(1369			origin2,1370			account(1),1371			account(2),1372			CollectionId(1),1373			TokenId(1),1374			11375		));13761377		// after transfer1378		assert_eq!(1379			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1380			01381		);1382		assert_eq!(1383			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1384			11385		);1386	});1387}13881389// #endregion13901391// Coverage tests region1392// #region13931394#[test]1395fn owner_can_add_address_to_allow_list() {1396	new_test_ext().execute_with(|| {1397		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13981399		let origin1 = Origin::signed(1);1400		assert_ok!(TemplateModule::add_to_allow_list(1401			origin1,1402			collection_id,1403			account(2)1404		));1405		assert!(<pallet_common::Allowlist<Test>>::get((1406			collection_id,1407			account(2)1408		)));1409	});1410}14111412#[test]1413fn admin_can_add_address_to_allow_list() {1414	new_test_ext().execute_with(|| {1415		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1416		let origin1 = Origin::signed(1);1417		let origin2 = Origin::signed(2);14181419		assert_ok!(TemplateModule::add_collection_admin(1420			origin1,1421			collection_id,1422			account(2)1423		));1424		assert_ok!(TemplateModule::add_to_allow_list(1425			origin2,1426			collection_id,1427			account(3)1428		));1429		assert!(<pallet_common::Allowlist<Test>>::get((1430			collection_id,1431			account(3)1432		)));1433	});1434}14351436#[test]1437fn nonprivileged_user_cannot_add_address_to_allow_list() {1438	new_test_ext().execute_with(|| {1439		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14401441		let origin2 = Origin::signed(2);1442		assert_noop!(1443			TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1444			CommonError::<Test>::NoPermission1445		);1446	});1447}14481449#[test]1450fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1451	new_test_ext().execute_with(|| {1452		let origin1 = Origin::signed(1);14531454		assert_noop!(1455			TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1456			CommonError::<Test>::CollectionNotFound1457		);1458	});1459}14601461#[test]1462fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1463	new_test_ext().execute_with(|| {1464		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14651466		let origin1 = Origin::signed(1);1467		assert_ok!(TemplateModule::destroy_collection(1468			origin1.clone(),1469			collection_id1470		));1471		assert_noop!(1472			TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1473			CommonError::<Test>::CollectionNotFound1474		);1475	});1476}14771478// If address is already added to allow list, nothing happens1479#[test]1480fn address_is_already_added_to_allow_list() {1481	new_test_ext().execute_with(|| {1482		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1483		let origin1 = Origin::signed(1);14841485		assert_ok!(TemplateModule::add_to_allow_list(1486			origin1.clone(),1487			collection_id,1488			account(2)1489		));1490		assert_ok!(TemplateModule::add_to_allow_list(1491			origin1,1492			collection_id,1493			account(2)1494		));1495		assert!(<pallet_common::Allowlist<Test>>::get((1496			collection_id,1497			account(2)1498		)));1499	});1500}15011502#[test]1503fn owner_can_remove_address_from_allow_list() {1504	new_test_ext().execute_with(|| {1505		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15061507		let origin1 = Origin::signed(1);1508		assert_ok!(TemplateModule::add_to_allow_list(1509			origin1.clone(),1510			collection_id,1511			account(2)1512		));1513		assert_ok!(TemplateModule::remove_from_allow_list(1514			origin1,1515			collection_id,1516			account(2)1517		));1518		assert_eq!(1519			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1520			false1521		);1522	});1523}15241525#[test]1526fn admin_can_remove_address_from_allow_list() {1527	new_test_ext().execute_with(|| {1528		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1529		let origin1 = Origin::signed(1);1530		let origin2 = Origin::signed(2);15311532		// Owner adds admin1533		assert_ok!(TemplateModule::add_collection_admin(1534			origin1.clone(),1535			collection_id,1536			account(2)1537		));15381539		// Owner adds address 3 to allow list1540		assert_ok!(TemplateModule::add_to_allow_list(1541			origin1,1542			collection_id,1543			account(3)1544		));15451546		// Admin removes address 3 from allow list1547		assert_ok!(TemplateModule::remove_from_allow_list(1548			origin2,1549			collection_id,1550			account(3)1551		));1552		assert_eq!(1553			<pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1554			false1555		);1556	});1557}15581559#[test]1560fn nonprivileged_user_cannot_remove_address_from_allow_list() {1561	new_test_ext().execute_with(|| {1562		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1563		let origin1 = Origin::signed(1);1564		let origin2 = Origin::signed(2);15651566		assert_ok!(TemplateModule::add_to_allow_list(1567			origin1,1568			collection_id,1569			account(2)1570		));1571		assert_noop!(1572			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1573			CommonError::<Test>::NoPermission1574		);1575		assert!(<pallet_common::Allowlist<Test>>::get((1576			collection_id,1577			account(2)1578		)));1579	});1580}15811582#[test]1583fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1584	new_test_ext().execute_with(|| {1585		let origin1 = Origin::signed(1);15861587		assert_noop!(1588			TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1589			CommonError::<Test>::CollectionNotFound1590		);1591	});1592}15931594#[test]1595fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1596	new_test_ext().execute_with(|| {1597		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1598		let origin1 = Origin::signed(1);1599		let origin2 = Origin::signed(2);16001601		// Add account 2 to allow list1602		assert_ok!(TemplateModule::add_to_allow_list(1603			origin1.clone(),1604			collection_id,1605			account(2)1606		));16071608		// Account 2 is in collection allow-list1609		assert!(<pallet_common::Allowlist<Test>>::get((1610			collection_id,1611			account(2)1612		)));16131614		// Destroy collection1615		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));16161617		// Attempt to remove account 2 from collection allow-list => error1618		assert_noop!(1619			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1620			CommonError::<Test>::CollectionNotFound1621		);16221623		// Account 2 is not found in collection allow-list anyway1624		assert_eq!(1625			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1626			false1627		);1628	});1629}16301631// If address is already removed from allow list, nothing happens1632#[test]1633fn address_is_already_removed_from_allow_list() {1634	new_test_ext().execute_with(|| {1635		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1636		let origin1 = Origin::signed(1);16371638		assert_ok!(TemplateModule::add_to_allow_list(1639			origin1.clone(),1640			collection_id,1641			account(2)1642		));1643		assert_ok!(TemplateModule::remove_from_allow_list(1644			origin1.clone(),1645			collection_id,1646			account(2)1647		));1648		assert_eq!(1649			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1650			false1651		);1652		assert_ok!(TemplateModule::remove_from_allow_list(1653			origin1,1654			collection_id,1655			account(2)1656		));1657		assert_eq!(1658			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1659			false1660		);1661	});1662}16631664// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1665#[test]1666fn allow_list_test_1() {1667	new_test_ext().execute_with(|| {1668		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16691670		let origin1 = Origin::signed(1);16711672		let data = default_nft_data();1673		create_test_item(collection_id, &data.into());16741675		assert_ok!(TemplateModule::set_public_access_mode(1676			origin1.clone(),1677			collection_id,1678			AccessMode::AllowList1679		));1680		assert_ok!(TemplateModule::add_to_allow_list(1681			origin1.clone(),1682			collection_id,1683			account(2)1684		));16851686		assert_noop!(1687			TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1688				.map_err(|e| e.error),1689			CommonError::<Test>::AddressNotInAllowlist1690		);1691	});1692}16931694#[test]1695fn allow_list_test_2() {1696	new_test_ext().execute_with(|| {1697		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1698		let origin1 = Origin::signed(1);16991700		let data = default_nft_data();1701		create_test_item(collection_id, &data.into());17021703		assert_ok!(TemplateModule::set_public_access_mode(1704			origin1.clone(),1705			collection_id,1706			AccessMode::AllowList1707		));1708		assert_ok!(TemplateModule::add_to_allow_list(1709			origin1.clone(),1710			collection_id,1711			account(1)1712		));1713		assert_ok!(TemplateModule::add_to_allow_list(1714			origin1.clone(),1715			collection_id,1716			account(2)1717		));17181719		// do approve1720		assert_ok!(TemplateModule::approve(1721			origin1.clone(),1722			account(1),1723			collection_id,1724			TokenId(1),1725			11726		));1727		assert_eq!(1728			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1729			account(1)1730		);17311732		assert_ok!(TemplateModule::remove_from_allow_list(1733			origin1.clone(),1734			collection_id,1735			account(1)1736		));17371738		assert_noop!(1739			TemplateModule::transfer_from(1740				origin1,1741				account(1),1742				account(3),1743				CollectionId(1),1744				TokenId(1),1745				11746			)1747			.map_err(|e| e.error),1748			CommonError::<Test>::AddressNotInAllowlist1749		);1750	});1751}17521753// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1754#[test]1755fn allow_list_test_3() {1756	new_test_ext().execute_with(|| {1757		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17581759		let origin1 = Origin::signed(1);17601761		let data = default_nft_data();1762		create_test_item(collection_id, &data.into());17631764		assert_ok!(TemplateModule::set_public_access_mode(1765			origin1.clone(),1766			collection_id,1767			AccessMode::AllowList1768		));1769		assert_ok!(TemplateModule::add_to_allow_list(1770			origin1.clone(),1771			collection_id,1772			account(1)1773		));17741775		assert_noop!(1776			TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1)1777				.map_err(|e| e.error),1778			CommonError::<Test>::AddressNotInAllowlist1779		);1780	});1781}17821783#[test]1784fn allow_list_test_4() {1785	new_test_ext().execute_with(|| {1786		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17871788		let origin1 = Origin::signed(1);17891790		let data = default_nft_data();1791		create_test_item(collection_id, &data.into());17921793		assert_ok!(TemplateModule::set_public_access_mode(1794			origin1.clone(),1795			collection_id,1796			AccessMode::AllowList1797		));1798		assert_ok!(TemplateModule::add_to_allow_list(1799			origin1.clone(),1800			collection_id,1801			account(1)1802		));1803		assert_ok!(TemplateModule::add_to_allow_list(1804			origin1.clone(),1805			collection_id,1806			account(2)1807		));18081809		// do approve1810		assert_ok!(TemplateModule::approve(1811			origin1.clone(),1812			account(1),1813			collection_id,1814			TokenId(1),1815			11816		));1817		assert_eq!(1818			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1819			account(1)1820		);18211822		assert_ok!(TemplateModule::remove_from_allow_list(1823			origin1.clone(),1824			collection_id,1825			account(2)1826		));18271828		assert_noop!(1829			TemplateModule::transfer_from(1830				origin1,1831				account(1),1832				account(3),1833				collection_id,1834				TokenId(1),1835				11836			)1837			.map_err(|e| e.error),1838			CommonError::<Test>::AddressNotInAllowlist1839		);1840	});1841}18421843// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1844#[test]1845fn allow_list_test_5() {1846	new_test_ext().execute_with(|| {1847		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18481849		let origin1 = Origin::signed(1);18501851		let data = default_nft_data();1852		create_test_item(collection_id, &data.into());18531854		assert_ok!(TemplateModule::set_public_access_mode(1855			origin1.clone(),1856			collection_id,1857			AccessMode::AllowList1858		));1859		assert_noop!(1860			TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1)1861				.map_err(|e| e.error),1862			CommonError::<Test>::AddressNotInAllowlist1863		);1864	});1865}18661867// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1868#[test]1869fn allow_list_test_6() {1870	new_test_ext().execute_with(|| {1871		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18721873		let origin1 = Origin::signed(1);18741875		let data = default_nft_data();1876		create_test_item(collection_id, &data.into());18771878		assert_ok!(TemplateModule::set_public_access_mode(1879			origin1.clone(),1880			collection_id,1881			AccessMode::AllowList1882		));18831884		// do approve1885		assert_noop!(1886			TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1887				.map_err(|e| e.error),1888			CommonError::<Test>::AddressNotInAllowlist1889		);1890	});1891}18921893// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1894//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1895#[test]1896fn allow_list_test_7() {1897	new_test_ext().execute_with(|| {1898		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18991900		let data = default_nft_data();1901		create_test_item(collection_id, &data.into());19021903		let origin1 = Origin::signed(1);19041905		assert_ok!(TemplateModule::set_public_access_mode(1906			origin1.clone(),1907			collection_id,1908			AccessMode::AllowList1909		));1910		assert_ok!(TemplateModule::add_to_allow_list(1911			origin1.clone(),1912			collection_id,1913			account(1)1914		));1915		assert_ok!(TemplateModule::add_to_allow_list(1916			origin1.clone(),1917			collection_id,1918			account(2)1919		));19201921		assert_ok!(TemplateModule::transfer(1922			origin1,1923			account(2),1924			CollectionId(1),1925			TokenId(1),1926			11927		));1928	});1929}19301931#[test]1932fn allow_list_test_8() {1933	new_test_ext().execute_with(|| {1934		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19351936		// Create NFT for account 11937		let data = default_nft_data();1938		create_test_item(collection_id, &data.into());19391940		let origin1 = Origin::signed(1);19411942		// Toggle Allow List mode and add accounts 1 and 21943		assert_ok!(TemplateModule::set_public_access_mode(1944			origin1.clone(),1945			collection_id,1946			AccessMode::AllowList1947		));1948		assert_ok!(TemplateModule::add_to_allow_list(1949			origin1.clone(),1950			collection_id,1951			account(1)1952		));1953		assert_ok!(TemplateModule::add_to_allow_list(1954			origin1.clone(),1955			collection_id,1956			account(2)1957		));19581959		// Sself-approve account 1 for NFT 11960		assert_ok!(TemplateModule::approve(1961			origin1.clone(),1962			account(1),1963			CollectionId(1),1964			TokenId(1),1965			11966		));1967		assert_eq!(1968			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1969			account(1)1970		);19711972		// Transfer from 1 to 21973		assert_ok!(TemplateModule::transfer_from(1974			origin1,1975			account(1),1976			account(2),1977			CollectionId(1),1978			TokenId(1),1979			11980		));1981	});1982}19831984// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1985#[test]1986fn allow_list_test_9() {1987	new_test_ext().execute_with(|| {1988		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1989		let origin1 = Origin::signed(1);19901991		assert_ok!(TemplateModule::set_public_access_mode(1992			origin1.clone(),1993			collection_id,1994			AccessMode::AllowList1995		));1996		assert_ok!(TemplateModule::set_mint_permission(1997			origin1,1998			collection_id,1999			false2000		));20012002		let data = default_nft_data();2003		create_test_item(collection_id, &data.into());2004	});2005}20062007// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2008#[test]2009fn allow_list_test_10() {2010	new_test_ext().execute_with(|| {2011		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20122013		let origin1 = Origin::signed(1);2014		let origin2 = Origin::signed(2);20152016		assert_ok!(TemplateModule::set_public_access_mode(2017			origin1.clone(),2018			collection_id,2019			AccessMode::AllowList2020		));2021		assert_ok!(TemplateModule::set_mint_permission(2022			origin1.clone(),2023			collection_id,2024			false2025		));20262027		assert_ok!(TemplateModule::add_collection_admin(2028			origin1,2029			collection_id,2030			account(2)2031		));20322033		assert_ok!(TemplateModule::create_item(2034			origin2,2035			collection_id,2036			account(2),2037			default_nft_data().into()2038		));2039	});2040}20412042// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.2043#[test]2044fn allow_list_test_11() {2045	new_test_ext().execute_with(|| {2046		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20472048		let origin1 = Origin::signed(1);2049		let origin2 = Origin::signed(2);20502051		assert_ok!(TemplateModule::set_public_access_mode(2052			origin1.clone(),2053			collection_id,2054			AccessMode::AllowList2055		));2056		assert_ok!(TemplateModule::set_mint_permission(2057			origin1.clone(),2058			collection_id,2059			false2060		));2061		assert_ok!(TemplateModule::add_to_allow_list(2062			origin1,2063			collection_id,2064			account(2)2065		));20662067		assert_noop!(2068			TemplateModule::create_item(2069				origin2,2070				CollectionId(1),2071				account(2),2072				default_nft_data().into()2073			)2074			.map_err(|e| e.error),2075			CommonError::<Test>::PublicMintingNotAllowed2076		);2077	});2078}20792080// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.2081#[test]2082fn allow_list_test_12() {2083	new_test_ext().execute_with(|| {2084		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20852086		let origin1 = Origin::signed(1);2087		let origin2 = Origin::signed(2);20882089		assert_ok!(TemplateModule::set_public_access_mode(2090			origin1.clone(),2091			collection_id,2092			AccessMode::AllowList2093		));2094		assert_ok!(TemplateModule::set_mint_permission(2095			origin1,2096			collection_id,2097			false2098		));20992100		assert_noop!(2101			TemplateModule::create_item(2102				origin2,2103				CollectionId(1),2104				account(2),2105				default_nft_data().into()2106			)2107			.map_err(|e| e.error),2108			CommonError::<Test>::PublicMintingNotAllowed2109		);2110	});2111}21122113// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2114#[test]2115fn allow_list_test_13() {2116	new_test_ext().execute_with(|| {2117		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21182119		let origin1 = Origin::signed(1);21202121		assert_ok!(TemplateModule::set_public_access_mode(2122			origin1.clone(),2123			collection_id,2124			AccessMode::AllowList2125		));2126		assert_ok!(TemplateModule::set_mint_permission(2127			origin1,2128			collection_id,2129			true2130		));21312132		let data = default_nft_data();2133		create_test_item(collection_id, &data.into());2134	});2135}21362137// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2138#[test]2139fn allow_list_test_14() {2140	new_test_ext().execute_with(|| {2141		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21422143		let origin1 = Origin::signed(1);2144		let origin2 = Origin::signed(2);21452146		assert_ok!(TemplateModule::set_public_access_mode(2147			origin1.clone(),2148			collection_id,2149			AccessMode::AllowList2150		));2151		assert_ok!(TemplateModule::set_mint_permission(2152			origin1.clone(),2153			collection_id,2154			true2155		));21562157		assert_ok!(TemplateModule::add_collection_admin(2158			origin1,2159			collection_id,2160			account(2)2161		));21622163		assert_ok!(TemplateModule::create_item(2164			origin2,2165			collection_id,2166			account(2),2167			default_nft_data().into()2168		));2169	});2170}21712172// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.2173#[test]2174fn allow_list_test_15() {2175	new_test_ext().execute_with(|| {2176		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21772178		let origin1 = Origin::signed(1);2179		let origin2 = Origin::signed(2);21802181		assert_ok!(TemplateModule::set_public_access_mode(2182			origin1.clone(),2183			collection_id,2184			AccessMode::AllowList2185		));2186		assert_ok!(TemplateModule::set_mint_permission(2187			origin1,2188			collection_id,2189			true2190		));21912192		assert_noop!(2193			TemplateModule::create_item(2194				origin2,2195				collection_id,2196				account(2),2197				default_nft_data().into()2198			)2199			.map_err(|e| e.error),2200			CommonError::<Test>::AddressNotInAllowlist2201		);2202	});2203}22042205// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.2206#[test]2207fn allow_list_test_16() {2208	new_test_ext().execute_with(|| {2209		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22102211		let origin1 = Origin::signed(1);2212		let origin2 = Origin::signed(2);22132214		assert_ok!(TemplateModule::set_public_access_mode(2215			origin1.clone(),2216			collection_id,2217			AccessMode::AllowList2218		));2219		assert_ok!(TemplateModule::set_mint_permission(2220			origin1.clone(),2221			collection_id,2222			true2223		));2224		assert_ok!(TemplateModule::add_to_allow_list(2225			origin1,2226			collection_id,2227			account(2)2228		));22292230		assert_ok!(TemplateModule::create_item(2231			origin2,2232			collection_id,2233			account(2),2234			default_nft_data().into()2235		));2236	});2237}22382239// Total number of collections. Positive test2240#[test]2241fn total_number_collections_bound() {2242	new_test_ext().execute_with(|| {2243		create_test_collection(&CollectionMode::NFT, CollectionId(1));2244	});2245}22462247#[test]2248fn create_max_collections() {2249	new_test_ext().execute_with(|| {2250		for i in 1..COLLECTION_NUMBER_LIMIT {2251			create_test_collection(&CollectionMode::NFT, CollectionId(i));2252		}2253	});2254}22552256// Total number of collections. Negative test2257#[test]2258fn total_number_collections_bound_neg() {2259	new_test_ext().execute_with(|| {2260		let origin1 = Origin::signed(1);22612262		for i in 1..=COLLECTION_NUMBER_LIMIT {2263			create_test_collection(&CollectionMode::NFT, CollectionId(i));2264		}22652266		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2267		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2268		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();22692270		// 11-th collection in chain. Expects error2271		assert_noop!(2272			TemplateModule::create_collection(2273				origin1,2274				col_name1.try_into().unwrap(),2275				col_desc1.try_into().unwrap(),2276				token_prefix1.try_into().unwrap(),2277				CollectionMode::NFT2278			),2279			CommonError::<Test>::TotalCollectionsLimitExceeded2280		);2281	});2282}22832284// Owned tokens by a single address. Positive test2285#[test]2286fn owned_tokens_bound() {2287	new_test_ext().execute_with(|| {2288		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22892290		let data = default_nft_data();2291		create_test_item(collection_id, &data.clone().into());2292		create_test_item(collection_id, &data.into());2293	});2294}22952296// Owned tokens by a single address. Negotive test2297#[test]2298fn owned_tokens_bound_neg() {2299	new_test_ext().execute_with(|| {2300		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23012302		let origin1 = Origin::signed(1);23032304		for _ in 1..=MAX_TOKEN_OWNERSHIP {2305			let data = default_nft_data();2306			create_test_item(collection_id, &data.clone().into());2307		}23082309		let data = default_nft_data();2310		assert_noop!(2311			TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into())2312				.map_err(|e| e.error),2313			CommonError::<Test>::AccountTokenLimitExceeded2314		);2315	});2316}23172318// Number of collection admins. Positive test2319#[test]2320fn collection_admins_bound() {2321	new_test_ext().execute_with(|| {2322		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23232324		let origin1 = Origin::signed(1);23252326		assert_ok!(TemplateModule::add_collection_admin(2327			origin1.clone(),2328			collection_id,2329			account(2)2330		));2331		assert_ok!(TemplateModule::add_collection_admin(2332			origin1,2333			collection_id,2334			account(3)2335		));2336	});2337}23382339// Number of collection admins. Negotive test2340#[test]2341fn collection_admins_bound_neg() {2342	new_test_ext().execute_with(|| {2343		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23442345		let origin1 = Origin::signed(1);23462347		for i in 0..COLLECTION_ADMINS_LIMIT {2348			assert_ok!(TemplateModule::add_collection_admin(2349				origin1.clone(),2350				collection_id,2351				account((2 + i).into())2352			));2353		}2354		assert_noop!(2355			TemplateModule::add_collection_admin(2356				origin1,2357				collection_id,2358				account((3 + COLLECTION_ADMINS_LIMIT).into())2359			),2360			CommonError::<Test>::CollectionAdminCountExceeded2361		);2362	});2363}2364// #endregion23652366#[test]2367fn set_const_on_chain_schema() {2368	new_test_ext().execute_with(|| {2369		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23702371		let origin1 = Origin::signed(1);2372		assert_ok!(TemplateModule::set_const_on_chain_schema(2373			origin1,2374			collection_id,2375			b"test const on chain schema".to_vec().try_into().unwrap()2376		));23772378		assert_eq!(2379			<pallet_common::CollectionById<Test>>::get(collection_id)2380				.unwrap()2381				.const_on_chain_schema,2382			b"test const on chain schema".to_vec()2383		);2384		assert_eq!(2385			<pallet_common::CollectionById<Test>>::get(collection_id)2386				.unwrap()2387				.variable_on_chain_schema,2388			b"".to_vec()2389		);2390	});2391}23922393#[test]2394fn set_variable_on_chain_schema() {2395	new_test_ext().execute_with(|| {2396		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23972398		let origin1 = Origin::signed(1);2399		assert_ok!(TemplateModule::set_variable_on_chain_schema(2400			origin1,2401			collection_id,2402			b"test variable on chain schema"2403				.to_vec()2404				.try_into()2405				.unwrap()2406		));24072408		assert_eq!(2409			<pallet_common::CollectionById<Test>>::get(collection_id)2410				.unwrap()2411				.const_on_chain_schema,2412			b"".to_vec()2413		);2414		assert_eq!(2415			<pallet_common::CollectionById<Test>>::get(collection_id)2416				.unwrap()2417				.variable_on_chain_schema,2418			b"test variable on chain schema".to_vec()2419		);2420	});2421}24222423#[test]2424fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2425	new_test_ext().execute_with(|| {2426		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24272428		let origin1 = Origin::signed(1);24292430		let data = default_nft_data();2431		create_test_item(CollectionId(1), &data.into());24322433		let variable_data = b"test data".to_vec();2434		assert_ok!(TemplateModule::set_variable_meta_data(2435			origin1,2436			collection_id,2437			TokenId(1),2438			variable_data.clone().try_into().unwrap()2439		));24402441		assert_eq!(2442			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2443				.unwrap()2444				.variable_data,2445			variable_data2446		);2447	});2448}24492450#[test]2451fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2452	new_test_ext().execute_with(|| {2453		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));24542455		let origin1 = Origin::signed(1);24562457		let data = default_re_fungible_data();2458		create_test_item(collection_id, &data.into());24592460		let variable_data = b"test data".to_vec();2461		assert_ok!(TemplateModule::set_variable_meta_data(2462			origin1,2463			collection_id,2464			TokenId(1),2465			variable_data.clone().try_into().unwrap()2466		));24672468		assert_eq!(2469			<pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1))).variable_data,2470			variable_data2471		);2472	});2473}24742475#[test]2476fn set_variable_meta_data_on_fungible_token_fails() {2477	new_test_ext().execute_with(|| {2478		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));24792480		let origin1 = Origin::signed(1);24812482		let data = default_fungible_data();2483		create_test_item(collection_id, &data.into());24842485		let variable_data = b"test data".to_vec();2486		assert_noop!(2487			TemplateModule::set_variable_meta_data(2488				origin1,2489				collection_id,2490				TokenId(0),2491				variable_data.try_into().unwrap()2492			)2493			.map_err(|e| e.error),2494			<pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2495		);2496	});2497}24982499#[test]2500fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2501	new_test_ext().execute_with(|| {2502		//default_limits();25032504		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25052506		let origin1 = Origin::signed(1);25072508		let data = default_nft_data();2509		create_test_item(collection_id, &data.into());25102511		assert_ok!(TemplateModule::set_meta_update_permission_flag(2512			origin1.clone(),2513			collection_id,2514			MetaUpdatePermission::ItemOwner,2515		));25162517		let variable_data = b"ten chars.".to_vec();2518		assert_ok!(TemplateModule::set_variable_meta_data(2519			origin1,2520			collection_id,2521			TokenId(1),2522			variable_data.clone().try_into().unwrap()2523		));25242525		assert_eq!(2526			<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2527				.unwrap()2528				.variable_data,2529			variable_data2530		);2531	});2532}25332534#[test]2535fn collection_transfer_flag_works() {2536	new_test_ext().execute_with(|| {2537		let origin1 = Origin::signed(1);25382539		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2540		assert_ok!(TemplateModule::set_transfers_enabled_flag(2541			origin1,2542			collection_id,2543			true2544		));25452546		let data = default_nft_data();2547		create_test_item(collection_id, &data.into());2548		assert_eq!(2549			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2550			12551		);2552		assert_eq!(2553			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2554			true2555		);25562557		let origin1 = Origin::signed(1);25582559		// default scenario2560		assert_ok!(TemplateModule::transfer(2561			origin1,2562			account(2),2563			collection_id,2564			TokenId(1),2565			12566		));2567		assert_eq!(2568			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2569			false2570		);2571		assert_eq!(2572			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2573			true2574		);2575		assert_eq!(2576			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2577			02578		);2579		assert_eq!(2580			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2581			12582		);2583	});2584}25852586#[test]2587fn set_variable_meta_data_on_nft_with_admin_flag() {2588	new_test_ext().execute_with(|| {2589		// default_limits();25902591		let collection_id =2592			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));25932594		let origin1 = Origin::signed(1);2595		let origin2 = Origin::signed(2);25962597		assert_ok!(TemplateModule::set_mint_permission(2598			origin2.clone(),2599			collection_id,2600			true2601		));2602		assert_ok!(TemplateModule::add_to_allow_list(2603			origin2.clone(),2604			collection_id,2605			account(1)2606		));26072608		assert_ok!(TemplateModule::add_collection_admin(2609			origin2.clone(),2610			collection_id,2611			account(1)2612		));26132614		let data = default_nft_data();2615		create_test_item(collection_id, &data.into());26162617		assert_ok!(TemplateModule::set_meta_update_permission_flag(2618			origin2.clone(),2619			collection_id,2620			MetaUpdatePermission::Admin,2621		));26222623		let variable_data = b"test.".to_vec();2624		assert_ok!(TemplateModule::set_variable_meta_data(2625			origin1,2626			collection_id,2627			TokenId(1),2628			variable_data.clone().try_into().unwrap()2629		));26302631		assert_eq!(2632			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2633				.unwrap()2634				.variable_data,2635			variable_data2636		);2637	});2638}26392640#[test]2641fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2642	new_test_ext().execute_with(|| {2643		// default_limits();26442645		let collection_id =2646			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));26472648		let origin1 = Origin::signed(1);2649		let origin2 = Origin::signed(2);26502651		assert_ok!(TemplateModule::set_mint_permission(2652			origin2.clone(),2653			collection_id,2654			true2655		));2656		assert_ok!(TemplateModule::add_to_allow_list(2657			origin2.clone(),2658			collection_id,2659			account(1)2660		));26612662		let data = default_nft_data();2663		create_test_item(collection_id, &data.into());26642665		assert_ok!(TemplateModule::set_meta_update_permission_flag(2666			origin2.clone(),2667			collection_id,2668			MetaUpdatePermission::Admin,2669		));26702671		let variable_data = b"test.".to_vec();2672		assert_noop!(2673			TemplateModule::set_variable_meta_data(2674				origin1,2675				collection_id,2676				TokenId(1),2677				variable_data.try_into().unwrap()2678			)2679			.map_err(|e| e.error),2680			CommonError::<Test>::NoPermission2681		);2682	});2683}26842685#[test]2686fn set_variable_meta_flag_after_freeze() {2687	new_test_ext().execute_with(|| {2688		// default_limits();26892690		let collection_id =2691			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));26922693		let origin2 = Origin::signed(2);26942695		assert_ok!(TemplateModule::set_meta_update_permission_flag(2696			origin2.clone(),2697			collection_id,2698			MetaUpdatePermission::None,2699		));2700		assert_noop!(2701			TemplateModule::set_meta_update_permission_flag(2702				origin2.clone(),2703				collection_id,2704				MetaUpdatePermission::Admin2705			),2706			CommonError::<Test>::MetadataFlagFrozen2707		);2708	});2709}27102711#[test]2712fn set_variable_meta_data_on_nft_with_none_flag_neg() {2713	new_test_ext().execute_with(|| {2714		// default_limits();27152716		let collection_id =2717			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2718		let origin1 = Origin::signed(1);27192720		let data = default_nft_data();2721		create_test_item(collection_id, &data.into());27222723		assert_ok!(TemplateModule::set_meta_update_permission_flag(2724			origin1.clone(),2725			collection_id,2726			MetaUpdatePermission::None,2727		));27282729		let variable_data = b"test.".to_vec();2730		assert_noop!(2731			TemplateModule::set_variable_meta_data(2732				origin1.clone(),2733				collection_id,2734				TokenId(1),2735				variable_data.try_into().unwrap()2736			)2737			.map_err(|e| e.error),2738			CommonError::<Test>::NoPermission2739		);2740	});2741}27422743#[test]2744fn collection_transfer_flag_works_neg() {2745	new_test_ext().execute_with(|| {2746		let origin1 = Origin::signed(1);27472748		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2749		assert_ok!(TemplateModule::set_transfers_enabled_flag(2750			origin1,2751			collection_id,2752			false2753		));27542755		let data = default_nft_data();2756		create_test_item(collection_id, &data.into());2757		assert_eq!(2758			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2759			12760		);2761		assert_eq!(2762			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2763			true2764		);27652766		let origin1 = Origin::signed(1);27672768		// default scenario2769		assert_noop!(2770			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2771				.map_err(|e| e.error),2772			CommonError::<Test>::TransferNotAllowed2773		);2774		assert_eq!(2775			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2776			12777		);2778		assert_eq!(2779			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2780			02781		);2782		assert_eq!(2783			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2784			true2785		);2786		assert_eq!(2787			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2788			false2789		);2790	});2791}
after · pallets/unique/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use up_data_structs::{6	COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,7	CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, MetaUpdatePermission,8	TokenId, MAX_TOKEN_OWNERSHIP,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 data: CreateCollectionData<u64> = CreateCollectionData {42		name: col_name1.try_into().unwrap(),43		description: col_desc1.try_into().unwrap(),44		token_prefix: token_prefix1.try_into().unwrap(),45		mode: mode.clone(),46		..Default::default()47	};4849	let origin1 = Origin::signed(owner);50	assert_ok!(TemplateModule::create_collection_ex(origin1, data));5152	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();53	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();54	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();55	assert_eq!(56		<pallet_common::CollectionById<Test>>::get(id)57			.unwrap()58			.owner,59		owner60	);61	assert_eq!(62		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,63		saved_col_name64	);65	assert_eq!(66		<pallet_common::CollectionById<Test>>::get(id).unwrap().mode,67		*mode68	);69	assert_eq!(70		<pallet_common::CollectionById<Test>>::get(id)71			.unwrap()72			.description,73		saved_description74	);75	assert_eq!(76		<pallet_common::CollectionById<Test>>::get(id)77			.unwrap()78			.token_prefix,79		saved_prefix80	);81	id82}8384fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {85	create_test_collection_for_owner(&mode, 1, id)86}8788fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {89	let origin1 = Origin::signed(1);90	assert_ok!(TemplateModule::create_item(91		origin1,92		collection_id,93		account(1),94		data.clone()95	));96}9798fn account(sub: u64) -> TestCrossAccountId {99	TestCrossAccountId::from_sub(sub)100}101102// Use cases tests region103// #region104105#[test]106fn set_version_schema() {107	new_test_ext().execute_with(|| {108		let origin1 = Origin::signed(1);109		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));110111		assert_ok!(TemplateModule::set_schema_version(112			origin1,113			collection_id,114			SchemaVersion::Unique115		));116		assert_eq!(117			<pallet_common::CollectionById<Test>>::get(collection_id)118				.unwrap()119				.schema_version,120			SchemaVersion::Unique121		);122	});123}124125#[test]126fn create_fungible_collection_fails_with_large_decimal_numbers() {127	new_test_ext().execute_with(|| {128		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();129		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();130		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();131132		let data: CreateCollectionData<u64> = CreateCollectionData {133			name: col_name1.try_into().unwrap(),134			description: col_desc1.try_into().unwrap(),135			token_prefix: token_prefix1.try_into().unwrap(),136			mode: CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1),137			..Default::default()138		};139140		let origin1 = Origin::signed(1);141		assert_noop!(142			TemplateModule::create_collection_ex(origin1, data),143			Error::<Test>::CollectionDecimalPointLimitExceeded144		);145	});146}147148#[test]149fn create_nft_item() {150	new_test_ext().execute_with(|| {151		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));152153		let data = default_nft_data();154		create_test_item(collection_id, &data.clone().into());155156		let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();157		assert_eq!(item.const_data, data.const_data.into_inner());158		assert_eq!(item.variable_data, data.variable_data.into_inner());159	});160}161162// Use cases tests region163// #region164#[test]165fn create_nft_multiple_items() {166	new_test_ext().execute_with(|| {167		create_test_collection(&CollectionMode::NFT, CollectionId(1));168169		let origin1 = Origin::signed(1);170171		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];172173		assert_ok!(TemplateModule::create_multiple_items(174			origin1,175			CollectionId(1),176			account(1),177			items_data178				.clone()179				.into_iter()180				.map(|d| { d.into() })181				.collect()182		));183		for (index, data) in items_data.into_iter().enumerate() {184			let item = <pallet_nonfungible::TokenData<Test>>::get((185				CollectionId(1),186				TokenId((index + 1) as u32),187			))188			.unwrap();189			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());190			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());191		}192	});193}194195#[test]196fn create_refungible_item() {197	new_test_ext().execute_with(|| {198		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));199200		let data = default_re_fungible_data();201		create_test_item(collection_id, &data.clone().into());202		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));203		let balance =204			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));205		assert_eq!(item.const_data, data.const_data.into_inner());206		assert_eq!(item.variable_data, data.variable_data.into_inner());207		assert_eq!(balance, 1023);208	});209}210211#[test]212fn create_multiple_refungible_items() {213	new_test_ext().execute_with(|| {214		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));215216		let origin1 = Origin::signed(1);217218		let items_data = vec![219			default_re_fungible_data(),220			default_re_fungible_data(),221			default_re_fungible_data(),222		];223224		assert_ok!(TemplateModule::create_multiple_items(225			origin1,226			CollectionId(1),227			account(1),228			items_data229				.clone()230				.into_iter()231				.map(|d| { d.into() })232				.collect()233		));234		for (index, data) in items_data.into_iter().enumerate() {235			let item = <pallet_refungible::TokenData<Test>>::get((236				CollectionId(1),237				TokenId((index + 1) as u32),238			));239			let balance =240				<pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));241			assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());242			assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());243			assert_eq!(balance, 1023);244		}245	});246}247248#[test]249fn create_fungible_item() {250	new_test_ext().execute_with(|| {251		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));252253		let data = default_fungible_data();254		create_test_item(collection_id, &data.into());255256		assert_eq!(257			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),258			5259		);260	});261}262263//#[test]264// fn create_multiple_fungible_items() {265//     new_test_ext().execute_with(|| {266//         default_limits();267268//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));269270//         let origin1 = Origin::signed(1);271272//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];273274//         assert_ok!(TemplateModule::create_multiple_items(275//             origin1.clone(),276//             1,277//             1,278//             items_data.clone().into_iter().map(|d| { d.into() }).collect()279//         ));280281//         for (index, _) in items_data.iter().enumerate() {282//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);283//         }284//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);285//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);286//     });287// }288289#[test]290fn transfer_fungible_item() {291	new_test_ext().execute_with(|| {292		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));293294		let origin1 = Origin::signed(1);295		let origin2 = Origin::signed(2);296297		let data = default_fungible_data();298		create_test_item(collection_id, &data.into());299300		assert_eq!(301			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),302			5303		);304305		// change owner scenario306		assert_ok!(TemplateModule::transfer(307			origin1,308			account(2),309			CollectionId(1),310			TokenId(0),311			5312		));313		assert_eq!(314			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),315			0316		);317318		// split item scenario319		assert_ok!(TemplateModule::transfer(320			origin2.clone(),321			account(3),322			CollectionId(1),323			TokenId(0),324			3325		));326327		// split item and new owner has account scenario328		assert_ok!(TemplateModule::transfer(329			origin2,330			account(3),331			CollectionId(1),332			TokenId(0),333			1334		));335		assert_eq!(336			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),337			1338		);339		assert_eq!(340			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),341			4342		);343	});344}345346#[test]347fn transfer_refungible_item() {348	new_test_ext().execute_with(|| {349		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));350351		// Create RFT 1 in 1023 pieces for account 1352		let data = default_re_fungible_data();353		create_test_item(collection_id, &data.clone().into());354		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));355		assert_eq!(item.const_data, data.const_data.into_inner());356		assert_eq!(item.variable_data, data.variable_data.into_inner());357		assert_eq!(358			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),359			1360		);361		assert_eq!(362			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),363			1023364		);365		assert_eq!(366			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),367			true368		);369370		// Account 1 transfers all 1023 pieces of RFT 1 to account 2371		let origin1 = Origin::signed(1);372		let origin2 = Origin::signed(2);373		assert_ok!(TemplateModule::transfer(374			origin1,375			account(2),376			CollectionId(1),377			TokenId(1),378			1023379		));380		assert_eq!(381			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),382			1023383		);384		assert_eq!(385			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),386			0387		);388		assert_eq!(389			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),390			1391		);392		assert_eq!(393			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),394			false395		);396		assert_eq!(397			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),398			true399		);400401		// Account 2 transfers 500 pieces of RFT 1 to account 3402		assert_ok!(TemplateModule::transfer(403			origin2.clone(),404			account(3),405			CollectionId(1),406			TokenId(1),407			500408		));409		assert_eq!(410			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),411			523412		);413		assert_eq!(414			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),415			500416		);417		assert_eq!(418			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),419			1420		);421		assert_eq!(422			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),423			1424		);425		assert_eq!(426			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),427			true428		);429		assert_eq!(430			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),431			true432		);433434		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance435		assert_ok!(TemplateModule::transfer(436			origin2,437			account(3),438			CollectionId(1),439			TokenId(1),440			200441		));442		assert_eq!(443			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),444			323445		);446		assert_eq!(447			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),448			700449		);450		assert_eq!(451			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),452			1453		);454		assert_eq!(455			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),456			1457		);458		assert_eq!(459			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),460			true461		);462		assert_eq!(463			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),464			true465		);466	});467}468469#[test]470fn transfer_nft_item() {471	new_test_ext().execute_with(|| {472		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));473474		let data = default_nft_data();475		create_test_item(collection_id, &data.into());476		assert_eq!(477			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),478			1479		);480		assert_eq!(481			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),482			true483		);484485		let origin1 = Origin::signed(1);486		// default scenario487		assert_ok!(TemplateModule::transfer(488			origin1,489			account(2),490			CollectionId(1),491			TokenId(1),492			1493		));494		assert_eq!(495			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),496			0497		);498		assert_eq!(499			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),500			1501		);502		assert_eq!(503			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),504			false505		);506		assert_eq!(507			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),508			true509		);510	});511}512513#[test]514fn transfer_nft_item_wrong_value() {515	new_test_ext().execute_with(|| {516		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));517518		let data = default_nft_data();519		create_test_item(collection_id, &data.into());520		assert_eq!(521			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),522			1523		);524		assert_eq!(525			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),526			true527		);528529		let origin1 = Origin::signed(1);530531		assert_noop!(532			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)533				.map_err(|e| e.error),534			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount535		);536	});537}538539#[test]540fn transfer_nft_item_zero_value() {541	new_test_ext().execute_with(|| {542		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));543544		let data = default_nft_data();545		create_test_item(collection_id, &data.into());546		assert_eq!(547			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),548			1549		);550		assert_eq!(551			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),552			true553		);554555		let origin1 = Origin::signed(1);556557		// Transferring 0 amount works on NFT...558		assert_ok!(TemplateModule::transfer(559			origin1,560			account(2),561			CollectionId(1),562			TokenId(1),563			0564		));565		// ... and results in no transfer566		assert_eq!(567			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),568			1569		);570		assert_eq!(571			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),572			true573		);574	});575}576577#[test]578fn nft_approve_and_transfer_from() {579	new_test_ext().execute_with(|| {580		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));581582		let data = default_nft_data();583		create_test_item(collection_id, &data.into());584585		let origin1 = Origin::signed(1);586		let origin2 = Origin::signed(2);587588		assert_eq!(589			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),590			1591		);592		assert_eq!(593			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),594			true595		);596597		// neg transfer_from598		assert_noop!(599			TemplateModule::transfer_from(600				origin2.clone(),601				account(1),602				account(2),603				CollectionId(1),604				TokenId(1),605				1606			)607			.map_err(|e| e.error),608			CommonError::<Test>::ApprovedValueTooLow609		);610611		// do approve612		assert_ok!(TemplateModule::approve(613			origin1,614			account(2),615			CollectionId(1),616			TokenId(1),617			1618		));619		assert_eq!(620			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),621			account(2)622		);623624		assert_ok!(TemplateModule::transfer_from(625			origin2,626			account(1),627			account(3),628			CollectionId(1),629			TokenId(1),630			1631		));632		assert!(633			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()634		);635	});636}637638#[test]639fn nft_approve_and_transfer_from_allow_list() {640	new_test_ext().execute_with(|| {641		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));642643		let origin1 = Origin::signed(1);644		let origin2 = Origin::signed(2);645646		// Create NFT 1 for account 1647		let data = default_nft_data();648		create_test_item(collection_id, &data.clone().into());649		assert_eq!(650			&<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))651				.unwrap()652				.const_data,653			&data.const_data.into_inner()654		);655		assert_eq!(656			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),657			1658		);659		assert_eq!(660			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),661			true662		);663664		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list665		assert_ok!(TemplateModule::set_mint_permission(666			origin1.clone(),667			CollectionId(1),668			true669		));670		assert_ok!(TemplateModule::set_public_access_mode(671			origin1.clone(),672			CollectionId(1),673			AccessMode::AllowList674		));675		assert_ok!(TemplateModule::add_to_allow_list(676			origin1.clone(),677			CollectionId(1),678			account(1)679		));680		assert_ok!(TemplateModule::add_to_allow_list(681			origin1.clone(),682			CollectionId(1),683			account(2)684		));685		assert_ok!(TemplateModule::add_to_allow_list(686			origin1.clone(),687			CollectionId(1),688			account(3)689		));690691		// Account 1 approves account 2 for NFT 1692		assert_ok!(TemplateModule::approve(693			origin1.clone(),694			account(2),695			CollectionId(1),696			TokenId(1),697			1698		));699		assert_eq!(700			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),701			account(2)702		);703704		// Account 2 transfers NFT 1 from account 1 to account 3705		assert_ok!(TemplateModule::transfer_from(706			origin2,707			account(1),708			account(3),709			CollectionId(1),710			TokenId(1),711			1712		));713		assert!(714			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()715		);716	});717}718719#[test]720fn refungible_approve_and_transfer_from() {721	new_test_ext().execute_with(|| {722		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));723724		let origin1 = Origin::signed(1);725		let origin2 = Origin::signed(2);726727		// Create RFT 1 in 1023 pieces for account 1728		let data = default_re_fungible_data();729		create_test_item(collection_id, &data.into());730731		assert_eq!(732			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),733			1734		);735		assert_eq!(736			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),737			1023738		);739		assert_eq!(740			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),741			true742		);743744		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list745		assert_ok!(TemplateModule::set_mint_permission(746			origin1.clone(),747			CollectionId(1),748			true749		));750		assert_ok!(TemplateModule::set_public_access_mode(751			origin1.clone(),752			CollectionId(1),753			AccessMode::AllowList754		));755		assert_ok!(TemplateModule::add_to_allow_list(756			origin1.clone(),757			CollectionId(1),758			account(1)759		));760		assert_ok!(TemplateModule::add_to_allow_list(761			origin1.clone(),762			CollectionId(1),763			account(2)764		));765		assert_ok!(TemplateModule::add_to_allow_list(766			origin1.clone(),767			CollectionId(1),768			account(3)769		));770771		// Account 1 approves account 2 for 1023 pieces of RFT 1772		assert_ok!(TemplateModule::approve(773			origin1,774			account(2),775			CollectionId(1),776			TokenId(1),777			1023778		));779		assert_eq!(780			<pallet_refungible::Allowance<Test>>::get((781				CollectionId(1),782				TokenId(1),783				account(1),784				account(2)785			)),786			1023787		);788789		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3790		assert_ok!(TemplateModule::transfer_from(791			origin2,792			account(1),793			account(3),794			CollectionId(1),795			TokenId(1),796			100797		));798		assert_eq!(799			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),800			1801		);802		assert_eq!(803			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),804			1805		);806		assert_eq!(807			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),808			923809		);810		assert_eq!(811			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),812			100813		);814		assert_eq!(815			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),816			true817		);818		assert_eq!(819			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),820			true821		);822		assert_eq!(823			<pallet_refungible::Allowance<Test>>::get((824				CollectionId(1),825				TokenId(1),826				account(1),827				account(2)828			)),829			923830		);831	});832}833834#[test]835fn fungible_approve_and_transfer_from() {836	new_test_ext().execute_with(|| {837		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));838839		let data = default_fungible_data();840		create_test_item(collection_id, &data.into());841842		let origin1 = Origin::signed(1);843		let origin2 = Origin::signed(2);844845		assert_ok!(TemplateModule::set_mint_permission(846			origin1.clone(),847			CollectionId(1),848			true849		));850		assert_ok!(TemplateModule::set_public_access_mode(851			origin1.clone(),852			CollectionId(1),853			AccessMode::AllowList854		));855		assert_ok!(TemplateModule::add_to_allow_list(856			origin1.clone(),857			CollectionId(1),858			account(1)859		));860		assert_ok!(TemplateModule::add_to_allow_list(861			origin1.clone(),862			CollectionId(1),863			account(2)864		));865		assert_ok!(TemplateModule::add_to_allow_list(866			origin1.clone(),867			CollectionId(1),868			account(3)869		));870871		// do approve872		assert_ok!(TemplateModule::approve(873			origin1.clone(),874			account(2),875			CollectionId(1),876			TokenId(0),877			5878		));879		assert_eq!(880			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),881			5882		);883		assert_ok!(TemplateModule::approve(884			origin1,885			account(3),886			CollectionId(1),887			TokenId(0),888			5889		));890		assert_eq!(891			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),892			5893		);894		assert_eq!(895			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),896			5897		);898899		assert_ok!(TemplateModule::transfer_from(900			origin2.clone(),901			account(1),902			account(3),903			CollectionId(1),904			TokenId(0),905			4906		));907908		assert_eq!(909			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),910			1911		);912913		assert_noop!(914			TemplateModule::transfer_from(915				origin2,916				account(1),917				account(3),918				CollectionId(1),919				TokenId(0),920				4921			)922			.map_err(|e| e.error),923			CommonError::<Test>::ApprovedValueTooLow924		);925	});926}927928#[test]929fn change_collection_owner() {930	new_test_ext().execute_with(|| {931		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));932933		let origin1 = Origin::signed(1);934		assert_ok!(TemplateModule::change_collection_owner(935			origin1,936			collection_id,937			2938		));939		assert_eq!(940			<pallet_common::CollectionById<Test>>::get(collection_id)941				.unwrap()942				.owner,943			2944		);945	});946}947948#[test]949fn destroy_collection() {950	new_test_ext().execute_with(|| {951		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));952953		let origin1 = Origin::signed(1);954		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));955	});956}957958#[test]959fn burn_nft_item() {960	new_test_ext().execute_with(|| {961		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));962963		let origin1 = Origin::signed(1);964965		let data = default_nft_data();966		create_test_item(collection_id, &data.into());967968		// check balance (collection with id = 1, user id = 1)969		assert_eq!(970			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),971			1972		);973974		// burn item975		assert_ok!(TemplateModule::burn_item(976			origin1.clone(),977			collection_id,978			TokenId(1),979			1980		));981		assert_eq!(982			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),983			0984		);985	});986}987988#[test]989fn burn_same_nft_item_twice() {990	new_test_ext().execute_with(|| {991		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));992993		let origin1 = Origin::signed(1);994995		let data = default_nft_data();996		create_test_item(collection_id, &data.into());997998		// check balance (collection with id = 1, user id = 1)999		assert_eq!(1000			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1001			11002		);10031004		// burn item1005		assert_ok!(TemplateModule::burn_item(1006			origin1.clone(),1007			collection_id,1008			TokenId(1),1009			11010		));10111012		// burn item again1013		assert_noop!(1014			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1015			CommonError::<Test>::TokenNotFound1016		);10171018		assert_eq!(1019			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1020			01021		);1022	});1023}10241025#[test]1026fn burn_fungible_item() {1027	new_test_ext().execute_with(|| {1028		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10291030		let origin1 = Origin::signed(1);1031		assert_ok!(TemplateModule::add_collection_admin(1032			origin1.clone(),1033			collection_id,1034			account(2)1035		));10361037		let data = default_fungible_data();1038		create_test_item(collection_id, &data.into());10391040		// check balance (collection with id = 1, user id = 1)1041		assert_eq!(1042			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1043			51044		);10451046		// burn item1047		assert_ok!(TemplateModule::burn_item(1048			origin1.clone(),1049			CollectionId(1),1050			TokenId(0),1051			51052		));1053		assert_noop!(1054			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1055			CommonError::<Test>::TokenValueTooLow1056		);10571058		assert_eq!(1059			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1060			01061		);1062	});1063}10641065#[test]1066fn burn_fungible_item_with_token_id() {1067	new_test_ext().execute_with(|| {1068		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10691070		let origin1 = Origin::signed(1);1071		assert_ok!(TemplateModule::add_collection_admin(1072			origin1.clone(),1073			collection_id,1074			account(2)1075		));10761077		let data = default_fungible_data();1078		create_test_item(collection_id, &data.into());10791080		// check balance (collection with id = 1, user id = 1)1081		assert_eq!(1082			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1083			51084		);10851086		// Try to burn item using Token ID1087		assert_noop!(1088			TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1089			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1090		);1091	});1092}1093#[test]1094fn burn_refungible_item() {1095	new_test_ext().execute_with(|| {1096		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1097		let origin1 = Origin::signed(1);10981099		assert_ok!(TemplateModule::set_mint_permission(1100			origin1.clone(),1101			collection_id,1102			true1103		));1104		assert_ok!(TemplateModule::set_public_access_mode(1105			origin1.clone(),1106			collection_id,1107			AccessMode::AllowList1108		));1109		assert_ok!(TemplateModule::add_to_allow_list(1110			origin1.clone(),1111			collection_id,1112			account(1)1113		));11141115		assert_ok!(TemplateModule::add_collection_admin(1116			origin1.clone(),1117			collection_id,1118			account(2)1119		));11201121		let data = default_re_fungible_data();1122		create_test_item(collection_id, &data.into());11231124		// check balance (collection with id = 1, user id = 2)1125		assert_eq!(1126			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1127			11128		);1129		assert_eq!(1130			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1131			10231132		);11331134		// burn item1135		assert_ok!(TemplateModule::burn_item(1136			origin1.clone(),1137			collection_id,1138			TokenId(1),1139			10231140		));1141		assert_noop!(1142			TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023)1143				.map_err(|e| e.error),1144			CommonError::<Test>::TokenValueTooLow1145		);11461147		assert_eq!(1148			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1149			01150		);1151	});1152}11531154#[test]1155fn add_collection_admin() {1156	new_test_ext().execute_with(|| {1157		let collection1_id =1158			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1159		let origin1 = Origin::signed(1);11601161		// Add collection admins1162		assert_ok!(TemplateModule::add_collection_admin(1163			origin1.clone(),1164			collection1_id,1165			account(2)1166		));1167		assert_ok!(TemplateModule::add_collection_admin(1168			origin1,1169			collection1_id,1170			account(3)1171		));11721173		// Owner is not an admin by default1174		assert_eq!(1175			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1176			false1177		);1178		assert!(<pallet_common::IsAdmin<Test>>::get((1179			CollectionId(1),1180			account(2)1181		)));1182		assert!(<pallet_common::IsAdmin<Test>>::get((1183			CollectionId(1),1184			account(3)1185		)));1186	});1187}11881189#[test]1190fn remove_collection_admin() {1191	new_test_ext().execute_with(|| {1192		let collection1_id =1193			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1194		let origin1 = Origin::signed(1);1195		let origin2 = Origin::signed(2);11961197		// Add collection admins 2 and 31198		assert_ok!(TemplateModule::add_collection_admin(1199			origin1.clone(),1200			collection1_id,1201			account(2)1202		));1203		assert_ok!(TemplateModule::add_collection_admin(1204			origin1,1205			collection1_id,1206			account(3)1207		));12081209		assert!(<pallet_common::IsAdmin<Test>>::get((1210			CollectionId(1),1211			account(2)1212		)));1213		assert!(<pallet_common::IsAdmin<Test>>::get((1214			CollectionId(1),1215			account(3)1216		)));12171218		// remove admin 31219		assert_ok!(TemplateModule::remove_collection_admin(1220			origin2,1221			CollectionId(1),1222			account(3)1223		));12241225		// 2 is still admin, 3 is not an admin anymore1226		assert!(<pallet_common::IsAdmin<Test>>::get((1227			CollectionId(1),1228			account(2)1229		)));1230		assert_eq!(1231			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1232			false1233		);1234	});1235}12361237#[test]1238fn balance_of() {1239	new_test_ext().execute_with(|| {1240		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1241		let fungible_collection_id =1242			create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1243		let re_fungible_collection_id =1244			create_test_collection(&CollectionMode::ReFungible, CollectionId(3));12451246		// check balance before1247		assert_eq!(1248			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1249			01250		);1251		assert_eq!(1252			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1253			01254		);1255		assert_eq!(1256			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1257			01258		);12591260		let nft_data = default_nft_data();1261		create_test_item(nft_collection_id, &nft_data.into());12621263		let fungible_data = default_fungible_data();1264		create_test_item(fungible_collection_id, &fungible_data.into());12651266		let re_fungible_data = default_re_fungible_data();1267		create_test_item(re_fungible_collection_id, &re_fungible_data.into());12681269		// check balance (collection with id = 1, user id = 1)1270		assert_eq!(1271			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1272			11273		);1274		assert_eq!(1275			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1276			51277		);1278		assert_eq!(1279			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1280			11281		);12821283		assert_eq!(1284			<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1285			true1286		);1287		assert_eq!(1288			<pallet_refungible::Owned<Test>>::get((1289				re_fungible_collection_id,1290				account(1),1291				TokenId(1)1292			)),1293			true1294		);1295	});1296}12971298#[test]1299fn approve() {1300	new_test_ext().execute_with(|| {1301		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13021303		let data = default_nft_data();1304		create_test_item(collection_id, &data.into());13051306		let origin1 = Origin::signed(1);13071308		// approve1309		assert_ok!(TemplateModule::approve(1310			origin1,1311			account(2),1312			CollectionId(1),1313			TokenId(1),1314			11315		));1316		assert_eq!(1317			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1318			account(2)1319		);1320	});1321}13221323#[test]1324fn transfer_from() {1325	new_test_ext().execute_with(|| {1326		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1327		let origin1 = Origin::signed(1);1328		let origin2 = Origin::signed(2);13291330		let data = default_nft_data();1331		create_test_item(collection_id, &data.into());13321333		// approve1334		assert_ok!(TemplateModule::approve(1335			origin1.clone(),1336			account(2),1337			CollectionId(1),1338			TokenId(1),1339			11340		));1341		assert_eq!(1342			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1343			account(2)1344		);13451346		assert_ok!(TemplateModule::set_mint_permission(1347			origin1.clone(),1348			CollectionId(1),1349			true1350		));1351		assert_ok!(TemplateModule::set_public_access_mode(1352			origin1.clone(),1353			CollectionId(1),1354			AccessMode::AllowList1355		));1356		assert_ok!(TemplateModule::add_to_allow_list(1357			origin1.clone(),1358			CollectionId(1),1359			account(1)1360		));1361		assert_ok!(TemplateModule::add_to_allow_list(1362			origin1.clone(),1363			CollectionId(1),1364			account(2)1365		));1366		assert_ok!(TemplateModule::add_to_allow_list(1367			origin1,1368			CollectionId(1),1369			account(3)1370		));13711372		assert_ok!(TemplateModule::transfer_from(1373			origin2,1374			account(1),1375			account(2),1376			CollectionId(1),1377			TokenId(1),1378			11379		));13801381		// after transfer1382		assert_eq!(1383			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1384			01385		);1386		assert_eq!(1387			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1388			11389		);1390	});1391}13921393// #endregion13941395// Coverage tests region1396// #region13971398#[test]1399fn owner_can_add_address_to_allow_list() {1400	new_test_ext().execute_with(|| {1401		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14021403		let origin1 = Origin::signed(1);1404		assert_ok!(TemplateModule::add_to_allow_list(1405			origin1,1406			collection_id,1407			account(2)1408		));1409		assert!(<pallet_common::Allowlist<Test>>::get((1410			collection_id,1411			account(2)1412		)));1413	});1414}14151416#[test]1417fn admin_can_add_address_to_allow_list() {1418	new_test_ext().execute_with(|| {1419		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1420		let origin1 = Origin::signed(1);1421		let origin2 = Origin::signed(2);14221423		assert_ok!(TemplateModule::add_collection_admin(1424			origin1,1425			collection_id,1426			account(2)1427		));1428		assert_ok!(TemplateModule::add_to_allow_list(1429			origin2,1430			collection_id,1431			account(3)1432		));1433		assert!(<pallet_common::Allowlist<Test>>::get((1434			collection_id,1435			account(3)1436		)));1437	});1438}14391440#[test]1441fn nonprivileged_user_cannot_add_address_to_allow_list() {1442	new_test_ext().execute_with(|| {1443		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14441445		let origin2 = Origin::signed(2);1446		assert_noop!(1447			TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1448			CommonError::<Test>::NoPermission1449		);1450	});1451}14521453#[test]1454fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1455	new_test_ext().execute_with(|| {1456		let origin1 = Origin::signed(1);14571458		assert_noop!(1459			TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1460			CommonError::<Test>::CollectionNotFound1461		);1462	});1463}14641465#[test]1466fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1467	new_test_ext().execute_with(|| {1468		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14691470		let origin1 = Origin::signed(1);1471		assert_ok!(TemplateModule::destroy_collection(1472			origin1.clone(),1473			collection_id1474		));1475		assert_noop!(1476			TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1477			CommonError::<Test>::CollectionNotFound1478		);1479	});1480}14811482// If address is already added to allow list, nothing happens1483#[test]1484fn address_is_already_added_to_allow_list() {1485	new_test_ext().execute_with(|| {1486		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1487		let origin1 = Origin::signed(1);14881489		assert_ok!(TemplateModule::add_to_allow_list(1490			origin1.clone(),1491			collection_id,1492			account(2)1493		));1494		assert_ok!(TemplateModule::add_to_allow_list(1495			origin1,1496			collection_id,1497			account(2)1498		));1499		assert!(<pallet_common::Allowlist<Test>>::get((1500			collection_id,1501			account(2)1502		)));1503	});1504}15051506#[test]1507fn owner_can_remove_address_from_allow_list() {1508	new_test_ext().execute_with(|| {1509		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15101511		let origin1 = Origin::signed(1);1512		assert_ok!(TemplateModule::add_to_allow_list(1513			origin1.clone(),1514			collection_id,1515			account(2)1516		));1517		assert_ok!(TemplateModule::remove_from_allow_list(1518			origin1,1519			collection_id,1520			account(2)1521		));1522		assert_eq!(1523			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1524			false1525		);1526	});1527}15281529#[test]1530fn admin_can_remove_address_from_allow_list() {1531	new_test_ext().execute_with(|| {1532		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1533		let origin1 = Origin::signed(1);1534		let origin2 = Origin::signed(2);15351536		// Owner adds admin1537		assert_ok!(TemplateModule::add_collection_admin(1538			origin1.clone(),1539			collection_id,1540			account(2)1541		));15421543		// Owner adds address 3 to allow list1544		assert_ok!(TemplateModule::add_to_allow_list(1545			origin1,1546			collection_id,1547			account(3)1548		));15491550		// Admin removes address 3 from allow list1551		assert_ok!(TemplateModule::remove_from_allow_list(1552			origin2,1553			collection_id,1554			account(3)1555		));1556		assert_eq!(1557			<pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1558			false1559		);1560	});1561}15621563#[test]1564fn nonprivileged_user_cannot_remove_address_from_allow_list() {1565	new_test_ext().execute_with(|| {1566		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1567		let origin1 = Origin::signed(1);1568		let origin2 = Origin::signed(2);15691570		assert_ok!(TemplateModule::add_to_allow_list(1571			origin1,1572			collection_id,1573			account(2)1574		));1575		assert_noop!(1576			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1577			CommonError::<Test>::NoPermission1578		);1579		assert!(<pallet_common::Allowlist<Test>>::get((1580			collection_id,1581			account(2)1582		)));1583	});1584}15851586#[test]1587fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1588	new_test_ext().execute_with(|| {1589		let origin1 = Origin::signed(1);15901591		assert_noop!(1592			TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1593			CommonError::<Test>::CollectionNotFound1594		);1595	});1596}15971598#[test]1599fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1600	new_test_ext().execute_with(|| {1601		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1602		let origin1 = Origin::signed(1);1603		let origin2 = Origin::signed(2);16041605		// Add account 2 to allow list1606		assert_ok!(TemplateModule::add_to_allow_list(1607			origin1.clone(),1608			collection_id,1609			account(2)1610		));16111612		// Account 2 is in collection allow-list1613		assert!(<pallet_common::Allowlist<Test>>::get((1614			collection_id,1615			account(2)1616		)));16171618		// Destroy collection1619		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));16201621		// Attempt to remove account 2 from collection allow-list => error1622		assert_noop!(1623			TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1624			CommonError::<Test>::CollectionNotFound1625		);16261627		// Account 2 is not found in collection allow-list anyway1628		assert_eq!(1629			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1630			false1631		);1632	});1633}16341635// If address is already removed from allow list, nothing happens1636#[test]1637fn address_is_already_removed_from_allow_list() {1638	new_test_ext().execute_with(|| {1639		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1640		let origin1 = Origin::signed(1);16411642		assert_ok!(TemplateModule::add_to_allow_list(1643			origin1.clone(),1644			collection_id,1645			account(2)1646		));1647		assert_ok!(TemplateModule::remove_from_allow_list(1648			origin1.clone(),1649			collection_id,1650			account(2)1651		));1652		assert_eq!(1653			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1654			false1655		);1656		assert_ok!(TemplateModule::remove_from_allow_list(1657			origin1,1658			collection_id,1659			account(2)1660		));1661		assert_eq!(1662			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1663			false1664		);1665	});1666}16671668// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1669#[test]1670fn allow_list_test_1() {1671	new_test_ext().execute_with(|| {1672		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16731674		let origin1 = Origin::signed(1);16751676		let data = default_nft_data();1677		create_test_item(collection_id, &data.into());16781679		assert_ok!(TemplateModule::set_public_access_mode(1680			origin1.clone(),1681			collection_id,1682			AccessMode::AllowList1683		));1684		assert_ok!(TemplateModule::add_to_allow_list(1685			origin1.clone(),1686			collection_id,1687			account(2)1688		));16891690		assert_noop!(1691			TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1692				.map_err(|e| e.error),1693			CommonError::<Test>::AddressNotInAllowlist1694		);1695	});1696}16971698#[test]1699fn allow_list_test_2() {1700	new_test_ext().execute_with(|| {1701		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1702		let origin1 = Origin::signed(1);17031704		let data = default_nft_data();1705		create_test_item(collection_id, &data.into());17061707		assert_ok!(TemplateModule::set_public_access_mode(1708			origin1.clone(),1709			collection_id,1710			AccessMode::AllowList1711		));1712		assert_ok!(TemplateModule::add_to_allow_list(1713			origin1.clone(),1714			collection_id,1715			account(1)1716		));1717		assert_ok!(TemplateModule::add_to_allow_list(1718			origin1.clone(),1719			collection_id,1720			account(2)1721		));17221723		// do approve1724		assert_ok!(TemplateModule::approve(1725			origin1.clone(),1726			account(1),1727			collection_id,1728			TokenId(1),1729			11730		));1731		assert_eq!(1732			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1733			account(1)1734		);17351736		assert_ok!(TemplateModule::remove_from_allow_list(1737			origin1.clone(),1738			collection_id,1739			account(1)1740		));17411742		assert_noop!(1743			TemplateModule::transfer_from(1744				origin1,1745				account(1),1746				account(3),1747				CollectionId(1),1748				TokenId(1),1749				11750			)1751			.map_err(|e| e.error),1752			CommonError::<Test>::AddressNotInAllowlist1753		);1754	});1755}17561757// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1758#[test]1759fn allow_list_test_3() {1760	new_test_ext().execute_with(|| {1761		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17621763		let origin1 = Origin::signed(1);17641765		let data = default_nft_data();1766		create_test_item(collection_id, &data.into());17671768		assert_ok!(TemplateModule::set_public_access_mode(1769			origin1.clone(),1770			collection_id,1771			AccessMode::AllowList1772		));1773		assert_ok!(TemplateModule::add_to_allow_list(1774			origin1.clone(),1775			collection_id,1776			account(1)1777		));17781779		assert_noop!(1780			TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1)1781				.map_err(|e| e.error),1782			CommonError::<Test>::AddressNotInAllowlist1783		);1784	});1785}17861787#[test]1788fn allow_list_test_4() {1789	new_test_ext().execute_with(|| {1790		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17911792		let origin1 = Origin::signed(1);17931794		let data = default_nft_data();1795		create_test_item(collection_id, &data.into());17961797		assert_ok!(TemplateModule::set_public_access_mode(1798			origin1.clone(),1799			collection_id,1800			AccessMode::AllowList1801		));1802		assert_ok!(TemplateModule::add_to_allow_list(1803			origin1.clone(),1804			collection_id,1805			account(1)1806		));1807		assert_ok!(TemplateModule::add_to_allow_list(1808			origin1.clone(),1809			collection_id,1810			account(2)1811		));18121813		// do approve1814		assert_ok!(TemplateModule::approve(1815			origin1.clone(),1816			account(1),1817			collection_id,1818			TokenId(1),1819			11820		));1821		assert_eq!(1822			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1823			account(1)1824		);18251826		assert_ok!(TemplateModule::remove_from_allow_list(1827			origin1.clone(),1828			collection_id,1829			account(2)1830		));18311832		assert_noop!(1833			TemplateModule::transfer_from(1834				origin1,1835				account(1),1836				account(3),1837				collection_id,1838				TokenId(1),1839				11840			)1841			.map_err(|e| e.error),1842			CommonError::<Test>::AddressNotInAllowlist1843		);1844	});1845}18461847// 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)1848#[test]1849fn allow_list_test_5() {1850	new_test_ext().execute_with(|| {1851		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18521853		let origin1 = Origin::signed(1);18541855		let data = default_nft_data();1856		create_test_item(collection_id, &data.into());18571858		assert_ok!(TemplateModule::set_public_access_mode(1859			origin1.clone(),1860			collection_id,1861			AccessMode::AllowList1862		));1863		assert_noop!(1864			TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1)1865				.map_err(|e| e.error),1866			CommonError::<Test>::AddressNotInAllowlist1867		);1868	});1869}18701871// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1872#[test]1873fn allow_list_test_6() {1874	new_test_ext().execute_with(|| {1875		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18761877		let origin1 = Origin::signed(1);18781879		let data = default_nft_data();1880		create_test_item(collection_id, &data.into());18811882		assert_ok!(TemplateModule::set_public_access_mode(1883			origin1.clone(),1884			collection_id,1885			AccessMode::AllowList1886		));18871888		// do approve1889		assert_noop!(1890			TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1891				.map_err(|e| e.error),1892			CommonError::<Test>::AddressNotInAllowlist1893		);1894	});1895}18961897// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1898//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1899#[test]1900fn allow_list_test_7() {1901	new_test_ext().execute_with(|| {1902		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19031904		let data = default_nft_data();1905		create_test_item(collection_id, &data.into());19061907		let origin1 = Origin::signed(1);19081909		assert_ok!(TemplateModule::set_public_access_mode(1910			origin1.clone(),1911			collection_id,1912			AccessMode::AllowList1913		));1914		assert_ok!(TemplateModule::add_to_allow_list(1915			origin1.clone(),1916			collection_id,1917			account(1)1918		));1919		assert_ok!(TemplateModule::add_to_allow_list(1920			origin1.clone(),1921			collection_id,1922			account(2)1923		));19241925		assert_ok!(TemplateModule::transfer(1926			origin1,1927			account(2),1928			CollectionId(1),1929			TokenId(1),1930			11931		));1932	});1933}19341935#[test]1936fn allow_list_test_8() {1937	new_test_ext().execute_with(|| {1938		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19391940		// Create NFT for account 11941		let data = default_nft_data();1942		create_test_item(collection_id, &data.into());19431944		let origin1 = Origin::signed(1);19451946		// Toggle Allow List mode and add accounts 1 and 21947		assert_ok!(TemplateModule::set_public_access_mode(1948			origin1.clone(),1949			collection_id,1950			AccessMode::AllowList1951		));1952		assert_ok!(TemplateModule::add_to_allow_list(1953			origin1.clone(),1954			collection_id,1955			account(1)1956		));1957		assert_ok!(TemplateModule::add_to_allow_list(1958			origin1.clone(),1959			collection_id,1960			account(2)1961		));19621963		// Sself-approve account 1 for NFT 11964		assert_ok!(TemplateModule::approve(1965			origin1.clone(),1966			account(1),1967			CollectionId(1),1968			TokenId(1),1969			11970		));1971		assert_eq!(1972			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1973			account(1)1974		);19751976		// Transfer from 1 to 21977		assert_ok!(TemplateModule::transfer_from(1978			origin1,1979			account(1),1980			account(2),1981			CollectionId(1),1982			TokenId(1),1983			11984		));1985	});1986}19871988// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1989#[test]1990fn allow_list_test_9() {1991	new_test_ext().execute_with(|| {1992		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1993		let origin1 = Origin::signed(1);19941995		assert_ok!(TemplateModule::set_public_access_mode(1996			origin1.clone(),1997			collection_id,1998			AccessMode::AllowList1999		));2000		assert_ok!(TemplateModule::set_mint_permission(2001			origin1,2002			collection_id,2003			false2004		));20052006		let data = default_nft_data();2007		create_test_item(collection_id, &data.into());2008	});2009}20102011// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2012#[test]2013fn allow_list_test_10() {2014	new_test_ext().execute_with(|| {2015		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20162017		let origin1 = Origin::signed(1);2018		let origin2 = Origin::signed(2);20192020		assert_ok!(TemplateModule::set_public_access_mode(2021			origin1.clone(),2022			collection_id,2023			AccessMode::AllowList2024		));2025		assert_ok!(TemplateModule::set_mint_permission(2026			origin1.clone(),2027			collection_id,2028			false2029		));20302031		assert_ok!(TemplateModule::add_collection_admin(2032			origin1,2033			collection_id,2034			account(2)2035		));20362037		assert_ok!(TemplateModule::create_item(2038			origin2,2039			collection_id,2040			account(2),2041			default_nft_data().into()2042		));2043	});2044}20452046// 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.2047#[test]2048fn allow_list_test_11() {2049	new_test_ext().execute_with(|| {2050		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20512052		let origin1 = Origin::signed(1);2053		let origin2 = Origin::signed(2);20542055		assert_ok!(TemplateModule::set_public_access_mode(2056			origin1.clone(),2057			collection_id,2058			AccessMode::AllowList2059		));2060		assert_ok!(TemplateModule::set_mint_permission(2061			origin1.clone(),2062			collection_id,2063			false2064		));2065		assert_ok!(TemplateModule::add_to_allow_list(2066			origin1,2067			collection_id,2068			account(2)2069		));20702071		assert_noop!(2072			TemplateModule::create_item(2073				origin2,2074				CollectionId(1),2075				account(2),2076				default_nft_data().into()2077			)2078			.map_err(|e| e.error),2079			CommonError::<Test>::PublicMintingNotAllowed2080		);2081	});2082}20832084// 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.2085#[test]2086fn allow_list_test_12() {2087	new_test_ext().execute_with(|| {2088		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20892090		let origin1 = Origin::signed(1);2091		let origin2 = Origin::signed(2);20922093		assert_ok!(TemplateModule::set_public_access_mode(2094			origin1.clone(),2095			collection_id,2096			AccessMode::AllowList2097		));2098		assert_ok!(TemplateModule::set_mint_permission(2099			origin1,2100			collection_id,2101			false2102		));21032104		assert_noop!(2105			TemplateModule::create_item(2106				origin2,2107				CollectionId(1),2108				account(2),2109				default_nft_data().into()2110			)2111			.map_err(|e| e.error),2112			CommonError::<Test>::PublicMintingNotAllowed2113		);2114	});2115}21162117// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2118#[test]2119fn allow_list_test_13() {2120	new_test_ext().execute_with(|| {2121		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21222123		let origin1 = Origin::signed(1);21242125		assert_ok!(TemplateModule::set_public_access_mode(2126			origin1.clone(),2127			collection_id,2128			AccessMode::AllowList2129		));2130		assert_ok!(TemplateModule::set_mint_permission(2131			origin1,2132			collection_id,2133			true2134		));21352136		let data = default_nft_data();2137		create_test_item(collection_id, &data.into());2138	});2139}21402141// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2142#[test]2143fn allow_list_test_14() {2144	new_test_ext().execute_with(|| {2145		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21462147		let origin1 = Origin::signed(1);2148		let origin2 = Origin::signed(2);21492150		assert_ok!(TemplateModule::set_public_access_mode(2151			origin1.clone(),2152			collection_id,2153			AccessMode::AllowList2154		));2155		assert_ok!(TemplateModule::set_mint_permission(2156			origin1.clone(),2157			collection_id,2158			true2159		));21602161		assert_ok!(TemplateModule::add_collection_admin(2162			origin1,2163			collection_id,2164			account(2)2165		));21662167		assert_ok!(TemplateModule::create_item(2168			origin2,2169			collection_id,2170			account(2),2171			default_nft_data().into()2172		));2173	});2174}21752176// 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.2177#[test]2178fn allow_list_test_15() {2179	new_test_ext().execute_with(|| {2180		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21812182		let origin1 = Origin::signed(1);2183		let origin2 = Origin::signed(2);21842185		assert_ok!(TemplateModule::set_public_access_mode(2186			origin1.clone(),2187			collection_id,2188			AccessMode::AllowList2189		));2190		assert_ok!(TemplateModule::set_mint_permission(2191			origin1,2192			collection_id,2193			true2194		));21952196		assert_noop!(2197			TemplateModule::create_item(2198				origin2,2199				collection_id,2200				account(2),2201				default_nft_data().into()2202			)2203			.map_err(|e| e.error),2204			CommonError::<Test>::AddressNotInAllowlist2205		);2206	});2207}22082209// 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.2210#[test]2211fn allow_list_test_16() {2212	new_test_ext().execute_with(|| {2213		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22142215		let origin1 = Origin::signed(1);2216		let origin2 = Origin::signed(2);22172218		assert_ok!(TemplateModule::set_public_access_mode(2219			origin1.clone(),2220			collection_id,2221			AccessMode::AllowList2222		));2223		assert_ok!(TemplateModule::set_mint_permission(2224			origin1.clone(),2225			collection_id,2226			true2227		));2228		assert_ok!(TemplateModule::add_to_allow_list(2229			origin1,2230			collection_id,2231			account(2)2232		));22332234		assert_ok!(TemplateModule::create_item(2235			origin2,2236			collection_id,2237			account(2),2238			default_nft_data().into()2239		));2240	});2241}22422243// Total number of collections. Positive test2244#[test]2245fn total_number_collections_bound() {2246	new_test_ext().execute_with(|| {2247		create_test_collection(&CollectionMode::NFT, CollectionId(1));2248	});2249}22502251#[test]2252fn create_max_collections() {2253	new_test_ext().execute_with(|| {2254		for i in 1..COLLECTION_NUMBER_LIMIT {2255			create_test_collection(&CollectionMode::NFT, CollectionId(i));2256		}2257	});2258}22592260// Total number of collections. Negative test2261#[test]2262fn total_number_collections_bound_neg() {2263	new_test_ext().execute_with(|| {2264		let origin1 = Origin::signed(1);22652266		for i in 1..=COLLECTION_NUMBER_LIMIT {2267			create_test_collection(&CollectionMode::NFT, CollectionId(i));2268		}22692270		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2271		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2272		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();22732274		let data: CreateCollectionData<u64> = CreateCollectionData {2275			name: col_name1.try_into().unwrap(),2276			description: col_desc1.try_into().unwrap(),2277			token_prefix: token_prefix1.try_into().unwrap(),2278			mode: CollectionMode::NFT,2279			..Default::default()2280		};22812282		// 11-th collection in chain. Expects error2283		assert_noop!(2284			TemplateModule::create_collection_ex(origin1, data),2285			CommonError::<Test>::TotalCollectionsLimitExceeded2286		);2287	});2288}22892290// Owned tokens by a single address. Positive test2291#[test]2292fn owned_tokens_bound() {2293	new_test_ext().execute_with(|| {2294		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22952296		let data = default_nft_data();2297		create_test_item(collection_id, &data.clone().into());2298		create_test_item(collection_id, &data.into());2299	});2300}23012302// Owned tokens by a single address. Negotive test2303#[test]2304fn owned_tokens_bound_neg() {2305	new_test_ext().execute_with(|| {2306		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23072308		let origin1 = Origin::signed(1);23092310		for _ in 1..=MAX_TOKEN_OWNERSHIP {2311			let data = default_nft_data();2312			create_test_item(collection_id, &data.clone().into());2313		}23142315		let data = default_nft_data();2316		assert_noop!(2317			TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into())2318				.map_err(|e| e.error),2319			CommonError::<Test>::AccountTokenLimitExceeded2320		);2321	});2322}23232324// Number of collection admins. Positive test2325#[test]2326fn collection_admins_bound() {2327	new_test_ext().execute_with(|| {2328		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23292330		let origin1 = Origin::signed(1);23312332		assert_ok!(TemplateModule::add_collection_admin(2333			origin1.clone(),2334			collection_id,2335			account(2)2336		));2337		assert_ok!(TemplateModule::add_collection_admin(2338			origin1,2339			collection_id,2340			account(3)2341		));2342	});2343}23442345// Number of collection admins. Negotive test2346#[test]2347fn collection_admins_bound_neg() {2348	new_test_ext().execute_with(|| {2349		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23502351		let origin1 = Origin::signed(1);23522353		for i in 0..COLLECTION_ADMINS_LIMIT {2354			assert_ok!(TemplateModule::add_collection_admin(2355				origin1.clone(),2356				collection_id,2357				account((2 + i).into())2358			));2359		}2360		assert_noop!(2361			TemplateModule::add_collection_admin(2362				origin1,2363				collection_id,2364				account((3 + COLLECTION_ADMINS_LIMIT).into())2365			),2366			CommonError::<Test>::CollectionAdminCountExceeded2367		);2368	});2369}2370// #endregion23712372#[test]2373fn set_const_on_chain_schema() {2374	new_test_ext().execute_with(|| {2375		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23762377		let origin1 = Origin::signed(1);2378		assert_ok!(TemplateModule::set_const_on_chain_schema(2379			origin1,2380			collection_id,2381			b"test const on chain schema".to_vec().try_into().unwrap()2382		));23832384		assert_eq!(2385			<pallet_common::CollectionById<Test>>::get(collection_id)2386				.unwrap()2387				.const_on_chain_schema,2388			b"test const on chain schema".to_vec()2389		);2390		assert_eq!(2391			<pallet_common::CollectionById<Test>>::get(collection_id)2392				.unwrap()2393				.variable_on_chain_schema,2394			b"".to_vec()2395		);2396	});2397}23982399#[test]2400fn set_variable_on_chain_schema() {2401	new_test_ext().execute_with(|| {2402		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24032404		let origin1 = Origin::signed(1);2405		assert_ok!(TemplateModule::set_variable_on_chain_schema(2406			origin1,2407			collection_id,2408			b"test variable on chain schema"2409				.to_vec()2410				.try_into()2411				.unwrap()2412		));24132414		assert_eq!(2415			<pallet_common::CollectionById<Test>>::get(collection_id)2416				.unwrap()2417				.const_on_chain_schema,2418			b"".to_vec()2419		);2420		assert_eq!(2421			<pallet_common::CollectionById<Test>>::get(collection_id)2422				.unwrap()2423				.variable_on_chain_schema,2424			b"test variable on chain schema".to_vec()2425		);2426	});2427}24282429#[test]2430fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2431	new_test_ext().execute_with(|| {2432		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24332434		let origin1 = Origin::signed(1);24352436		let data = default_nft_data();2437		create_test_item(CollectionId(1), &data.into());24382439		let variable_data = b"test data".to_vec();2440		assert_ok!(TemplateModule::set_variable_meta_data(2441			origin1,2442			collection_id,2443			TokenId(1),2444			variable_data.clone().try_into().unwrap()2445		));24462447		assert_eq!(2448			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2449				.unwrap()2450				.variable_data,2451			variable_data2452		);2453	});2454}24552456#[test]2457fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2458	new_test_ext().execute_with(|| {2459		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));24602461		let origin1 = Origin::signed(1);24622463		let data = default_re_fungible_data();2464		create_test_item(collection_id, &data.into());24652466		let variable_data = b"test data".to_vec();2467		assert_ok!(TemplateModule::set_variable_meta_data(2468			origin1,2469			collection_id,2470			TokenId(1),2471			variable_data.clone().try_into().unwrap()2472		));24732474		assert_eq!(2475			<pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1))).variable_data,2476			variable_data2477		);2478	});2479}24802481#[test]2482fn set_variable_meta_data_on_fungible_token_fails() {2483	new_test_ext().execute_with(|| {2484		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));24852486		let origin1 = Origin::signed(1);24872488		let data = default_fungible_data();2489		create_test_item(collection_id, &data.into());24902491		let variable_data = b"test data".to_vec();2492		assert_noop!(2493			TemplateModule::set_variable_meta_data(2494				origin1,2495				collection_id,2496				TokenId(0),2497				variable_data.try_into().unwrap()2498			)2499			.map_err(|e| e.error),2500			<pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2501		);2502	});2503}25042505#[test]2506fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2507	new_test_ext().execute_with(|| {2508		//default_limits();25092510		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25112512		let origin1 = Origin::signed(1);25132514		let data = default_nft_data();2515		create_test_item(collection_id, &data.into());25162517		assert_ok!(TemplateModule::set_meta_update_permission_flag(2518			origin1.clone(),2519			collection_id,2520			MetaUpdatePermission::ItemOwner,2521		));25222523		let variable_data = b"ten chars.".to_vec();2524		assert_ok!(TemplateModule::set_variable_meta_data(2525			origin1,2526			collection_id,2527			TokenId(1),2528			variable_data.clone().try_into().unwrap()2529		));25302531		assert_eq!(2532			<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2533				.unwrap()2534				.variable_data,2535			variable_data2536		);2537	});2538}25392540#[test]2541fn collection_transfer_flag_works() {2542	new_test_ext().execute_with(|| {2543		let origin1 = Origin::signed(1);25442545		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2546		assert_ok!(TemplateModule::set_transfers_enabled_flag(2547			origin1,2548			collection_id,2549			true2550		));25512552		let data = default_nft_data();2553		create_test_item(collection_id, &data.into());2554		assert_eq!(2555			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2556			12557		);2558		assert_eq!(2559			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2560			true2561		);25622563		let origin1 = Origin::signed(1);25642565		// default scenario2566		assert_ok!(TemplateModule::transfer(2567			origin1,2568			account(2),2569			collection_id,2570			TokenId(1),2571			12572		));2573		assert_eq!(2574			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2575			false2576		);2577		assert_eq!(2578			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2579			true2580		);2581		assert_eq!(2582			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2583			02584		);2585		assert_eq!(2586			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2587			12588		);2589	});2590}25912592#[test]2593fn set_variable_meta_data_on_nft_with_admin_flag() {2594	new_test_ext().execute_with(|| {2595		// default_limits();25962597		let collection_id =2598			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));25992600		let origin1 = Origin::signed(1);2601		let origin2 = Origin::signed(2);26022603		assert_ok!(TemplateModule::set_mint_permission(2604			origin2.clone(),2605			collection_id,2606			true2607		));2608		assert_ok!(TemplateModule::add_to_allow_list(2609			origin2.clone(),2610			collection_id,2611			account(1)2612		));26132614		assert_ok!(TemplateModule::add_collection_admin(2615			origin2.clone(),2616			collection_id,2617			account(1)2618		));26192620		let data = default_nft_data();2621		create_test_item(collection_id, &data.into());26222623		assert_ok!(TemplateModule::set_meta_update_permission_flag(2624			origin2.clone(),2625			collection_id,2626			MetaUpdatePermission::Admin,2627		));26282629		let variable_data = b"test.".to_vec();2630		assert_ok!(TemplateModule::set_variable_meta_data(2631			origin1,2632			collection_id,2633			TokenId(1),2634			variable_data.clone().try_into().unwrap()2635		));26362637		assert_eq!(2638			<pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2639				.unwrap()2640				.variable_data,2641			variable_data2642		);2643	});2644}26452646#[test]2647fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2648	new_test_ext().execute_with(|| {2649		// default_limits();26502651		let collection_id =2652			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));26532654		let origin1 = Origin::signed(1);2655		let origin2 = Origin::signed(2);26562657		assert_ok!(TemplateModule::set_mint_permission(2658			origin2.clone(),2659			collection_id,2660			true2661		));2662		assert_ok!(TemplateModule::add_to_allow_list(2663			origin2.clone(),2664			collection_id,2665			account(1)2666		));26672668		let data = default_nft_data();2669		create_test_item(collection_id, &data.into());26702671		assert_ok!(TemplateModule::set_meta_update_permission_flag(2672			origin2.clone(),2673			collection_id,2674			MetaUpdatePermission::Admin,2675		));26762677		let variable_data = b"test.".to_vec();2678		assert_noop!(2679			TemplateModule::set_variable_meta_data(2680				origin1,2681				collection_id,2682				TokenId(1),2683				variable_data.try_into().unwrap()2684			)2685			.map_err(|e| e.error),2686			CommonError::<Test>::NoPermission2687		);2688	});2689}26902691#[test]2692fn set_variable_meta_flag_after_freeze() {2693	new_test_ext().execute_with(|| {2694		// default_limits();26952696		let collection_id =2697			create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));26982699		let origin2 = Origin::signed(2);27002701		assert_ok!(TemplateModule::set_meta_update_permission_flag(2702			origin2.clone(),2703			collection_id,2704			MetaUpdatePermission::None,2705		));2706		assert_noop!(2707			TemplateModule::set_meta_update_permission_flag(2708				origin2.clone(),2709				collection_id,2710				MetaUpdatePermission::Admin2711			),2712			CommonError::<Test>::MetadataFlagFrozen2713		);2714	});2715}27162717#[test]2718fn set_variable_meta_data_on_nft_with_none_flag_neg() {2719	new_test_ext().execute_with(|| {2720		// default_limits();27212722		let collection_id =2723			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2724		let origin1 = Origin::signed(1);27252726		let data = default_nft_data();2727		create_test_item(collection_id, &data.into());27282729		assert_ok!(TemplateModule::set_meta_update_permission_flag(2730			origin1.clone(),2731			collection_id,2732			MetaUpdatePermission::None,2733		));27342735		let variable_data = b"test.".to_vec();2736		assert_noop!(2737			TemplateModule::set_variable_meta_data(2738				origin1.clone(),2739				collection_id,2740				TokenId(1),2741				variable_data.try_into().unwrap()2742			)2743			.map_err(|e| e.error),2744			CommonError::<Test>::NoPermission2745		);2746	});2747}27482749#[test]2750fn collection_transfer_flag_works_neg() {2751	new_test_ext().execute_with(|| {2752		let origin1 = Origin::signed(1);27532754		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2755		assert_ok!(TemplateModule::set_transfers_enabled_flag(2756			origin1,2757			collection_id,2758			false2759		));27602761		let data = default_nft_data();2762		create_test_item(collection_id, &data.into());2763		assert_eq!(2764			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2765			12766		);2767		assert_eq!(2768			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2769			true2770		);27712772		let origin1 = Origin::signed(1);27732774		// default scenario2775		assert_noop!(2776			TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2777				.map_err(|e| e.error),2778			CommonError::<Test>::TransferNotAllowed2779		);2780		assert_eq!(2781			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2782			12783		);2784		assert_eq!(2785			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2786			02787		);2788		assert_eq!(2789			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2790			true2791		);2792		assert_eq!(2793			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2794			false2795		);2796	});2797}