git.delta.rocks / unique-network / refs/commits / 3fb3c00ba4fd

difftreelog

chore(tests) fix unit tests still using RFT' TokenData

Fahrrader2022-12-14parent: #a94868f.patch.diff
in: master

1 file changed

modifiedruntime/tests/src/tests.rsdiffbeforeafterboth
before · runtime/tests/src/tests.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617// Tests to be written here18use crate::{Test, TestCrossAccountId, CollectionCreationPrice, RuntimeOrigin, Unique, new_test_ext};19use up_data_structs::{20	COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,21	CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, TokenId,22	MAX_TOKEN_OWNERSHIP, CreateCollectionData, CollectionMode, AccessMode, CollectionPermissions,23	PropertyKeyPermission, PropertyPermission, Property, CollectionPropertiesVec,24	CollectionPropertiesPermissionsVec,25};26use frame_support::{assert_noop, assert_ok, assert_err};27use sp_std::convert::TryInto;28use pallet_evm::account::CrossAccountId;29use pallet_common::Error as CommonError;30use pallet_unique::Error as UniqueError;3132fn add_balance(user: u64, value: u64) {33	const DONOR_USER: u64 = 999;34	assert_ok!(<pallet_balances::Pallet<Test>>::set_balance(35		RuntimeOrigin::root(),36		DONOR_USER,37		value,38		039	));40	assert_ok!(<pallet_balances::Pallet<Test>>::force_transfer(41		RuntimeOrigin::root(),42		DONOR_USER,43		user,44		value45	));46}4748fn default_nft_data() -> CreateNftData {49	CreateNftData {50		properties: vec![Property {51			key: b"test-prop".to_vec().try_into().unwrap(),52			value: b"test-nft-prop".to_vec().try_into().unwrap(),53		}]54		.try_into()55		.unwrap(),56	}57}5859fn default_fungible_data() -> CreateFungibleData {60	CreateFungibleData { value: 5 }61}6263fn default_re_fungible_data() -> CreateReFungibleData {64	CreateReFungibleData {65		pieces: 1023,66		properties: vec![Property {67			key: b"test-prop".to_vec().try_into().unwrap(),68			value: b"test-nft-prop".to_vec().try_into().unwrap(),69		}]70		.try_into()71		.unwrap(),72	}73}7475fn create_test_collection_for_owner(76	mode: &CollectionMode,77	owner: u64,78	id: CollectionId,79) -> CollectionId {80	add_balance(owner, CollectionCreationPrice::get() as u64 + 1);8182	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();83	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();84	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();85	let token_property_permissions: CollectionPropertiesPermissionsVec =86		vec![PropertyKeyPermission {87			key: b"test-prop".to_vec().try_into().unwrap(),88			permission: PropertyPermission {89				mutable: true,90				collection_admin: false,91				token_owner: true,92			},93		}]94		.try_into()95		.unwrap();96	let properties: CollectionPropertiesVec = vec![Property {97		key: b"test-collection-prop".to_vec().try_into().unwrap(),98		value: b"test-collection-value".to_vec().try_into().unwrap(),99	}]100	.try_into()101	.unwrap();102103	let data: CreateCollectionData<u64> = CreateCollectionData {104		name: col_name1.try_into().unwrap(),105		description: col_desc1.try_into().unwrap(),106		token_prefix: token_prefix1.try_into().unwrap(),107		mode: mode.clone(),108		token_property_permissions: token_property_permissions.clone(),109		properties: properties.clone(),110		..Default::default()111	};112113	let origin1 = RuntimeOrigin::signed(owner);114	assert_ok!(Unique::create_collection_ex(origin1, data));115116	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();117	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();118	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();119	assert_eq!(120		<pallet_common::CollectionById<Test>>::get(id)121			.unwrap()122			.owner,123		owner124	);125	assert_eq!(126		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,127		saved_col_name128	);129	assert_eq!(130		<pallet_common::CollectionById<Test>>::get(id).unwrap().mode,131		*mode132	);133	assert_eq!(134		<pallet_common::CollectionById<Test>>::get(id)135			.unwrap()136			.description,137		saved_description138	);139	assert_eq!(140		<pallet_common::CollectionById<Test>>::get(id)141			.unwrap()142			.token_prefix,143		saved_prefix144	);145	assert_eq!(146		get_collection_property_permissions(id).as_slice(),147		token_property_permissions.as_slice()148	);149	assert_eq!(150		get_collection_properties(id).as_slice(),151		properties.as_slice()152	);153	id154}155156fn get_collection_property_permissions(collection_id: CollectionId) -> Vec<PropertyKeyPermission> {157	<pallet_common::Pallet<Test>>::property_permissions(collection_id)158		.into_iter()159		.map(|(key, permission)| PropertyKeyPermission { key, permission })160		.collect()161}162163fn get_collection_properties(collection_id: CollectionId) -> Vec<Property> {164	<pallet_common::Pallet<Test>>::collection_properties(collection_id)165		.into_iter()166		.map(|(key, value)| Property { key, value })167		.collect()168}169170fn get_token_properties(collection_id: CollectionId, token_id: TokenId) -> Vec<Property> {171	<pallet_nonfungible::Pallet<Test>>::token_properties((collection_id, token_id))172		.into_iter()173		.map(|(key, value)| Property { key, value })174		.collect()175}176177fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {178	create_test_collection_for_owner(&mode, 1, id)179}180181fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {182	let origin1 = RuntimeOrigin::signed(1);183	assert_ok!(Unique::create_item(184		origin1,185		collection_id,186		account(1),187		data.clone()188	));189}190191fn account(sub: u64) -> TestCrossAccountId {192	TestCrossAccountId::from_sub(sub)193}194195// Use cases tests region196// #region197198#[test]199fn check_not_sufficient_founds() {200	new_test_ext().execute_with(|| {201		let acc: u64 = 1;202		<pallet_balances::Pallet<Test>>::set_balance(RuntimeOrigin::root(), acc, 0, 0).unwrap();203204		let name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();205		let description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();206		let token_prefix: Vec<u8> = b"token_prefix1\0".to_vec();207208		let data: CreateCollectionData<<Test as frame_system::Config>::AccountId> =209			CreateCollectionData {210				name: name.try_into().unwrap(),211				description: description.try_into().unwrap(),212				token_prefix: token_prefix.try_into().unwrap(),213				mode: CollectionMode::NFT,214				..Default::default()215			};216217		let result = Unique::create_collection_ex(RuntimeOrigin::signed(acc), data);218		assert_err!(result, <CommonError<Test>>::NotSufficientFounds);219	});220}221222#[test]223fn create_fungible_collection_fails_with_large_decimal_numbers() {224	new_test_ext().execute_with(|| {225		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();226		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();227		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();228229		let data: CreateCollectionData<u64> = CreateCollectionData {230			name: col_name1.try_into().unwrap(),231			description: col_desc1.try_into().unwrap(),232			token_prefix: token_prefix1.try_into().unwrap(),233			mode: CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1),234			..Default::default()235		};236237		let origin1 = RuntimeOrigin::signed(1);238		assert_noop!(239			Unique::create_collection_ex(origin1, data),240			UniqueError::<Test>::CollectionDecimalPointLimitExceeded241		);242	});243}244245#[test]246fn create_nft_item() {247	new_test_ext().execute_with(|| {248		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));249250		let data = default_nft_data();251		create_test_item(collection_id, &data.clone().into());252253		assert_eq!(254			get_token_properties(collection_id, TokenId(1)).as_slice(),255			data.properties.as_slice(),256		);257	});258}259260// Use cases tests region261// #region262#[test]263fn create_nft_multiple_items() {264	new_test_ext().execute_with(|| {265		create_test_collection(&CollectionMode::NFT, CollectionId(1));266267		let origin1 = RuntimeOrigin::signed(1);268269		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];270271		assert_ok!(Unique::create_multiple_items(272			origin1,273			CollectionId(1),274			account(1),275			items_data276				.clone()277				.into_iter()278				.map(|d| { d.into() })279				.collect()280		));281		for (index, data) in items_data.into_iter().enumerate() {282			assert_eq!(283				get_token_properties(CollectionId(1), TokenId(index as u32 + 1)).as_slice(),284				data.properties.as_slice()285			);286		}287	});288}289290#[test]291fn create_refungible_item() {292	new_test_ext().execute_with(|| {293		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));294295		let data = default_re_fungible_data();296		create_test_item(collection_id, &data.clone().into());297		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));298		let balance =299			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));300		assert_eq!(balance, 1023);301	});302}303304#[test]305fn create_multiple_refungible_items() {306	new_test_ext().execute_with(|| {307		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));308309		let origin1 = RuntimeOrigin::signed(1);310311		let items_data = vec![312			default_re_fungible_data(),313			default_re_fungible_data(),314			default_re_fungible_data(),315		];316317		assert_ok!(Unique::create_multiple_items(318			origin1,319			CollectionId(1),320			account(1),321			items_data322				.clone()323				.into_iter()324				.map(|d| { d.into() })325				.collect()326		));327		for (index, data) in items_data.into_iter().enumerate() {328			let item = <pallet_refungible::TokenData<Test>>::get((329				CollectionId(1),330				TokenId((index + 1) as u32),331			));332			let balance =333				<pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));334			assert_eq!(balance, 1023);335		}336	});337}338339#[test]340fn create_fungible_item() {341	new_test_ext().execute_with(|| {342		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));343344		let data = default_fungible_data();345		create_test_item(collection_id, &data.into());346347		assert_eq!(348			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),349			5350		);351	});352}353354//#[test]355// fn create_multiple_fungible_items() {356//     new_test_ext().execute_with(|| {357//         default_limits();358359//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));360361//         let origin1 = RuntimeOrigin::signed(1);362363//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];364365//         assert_ok!(Unique::create_multiple_items(366//             origin1.clone(),367//             1,368//             1,369//             items_data.clone().into_iter().map(|d| { d.into() }).collect()370//         ));371372//         for (index, _) in items_data.iter().enumerate() {373//             assert_eq!(Unique::fungible_item_id(1, (index + 1) as TokenId).value, 5);374//         }375//         assert_eq!(Unique::balance_count(1, 1), 3000);376//         assert_eq!(Unique::address_tokens(1, 1), [1, 2, 3]);377//     });378// }379380#[test]381fn transfer_fungible_item() {382	new_test_ext().execute_with(|| {383		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));384385		let origin1 = RuntimeOrigin::signed(1);386		let origin2 = RuntimeOrigin::signed(2);387388		let data = default_fungible_data();389		create_test_item(collection_id, &data.into());390391		assert_eq!(392			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),393			5394		);395396		// change owner scenario397		assert_ok!(Unique::transfer(398			origin1,399			account(2),400			CollectionId(1),401			TokenId(0),402			5403		));404		assert_eq!(405			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),406			0407		);408409		// split item scenario410		assert_ok!(Unique::transfer(411			origin2.clone(),412			account(3),413			CollectionId(1),414			TokenId(0),415			3416		));417418		// split item and new owner has account scenario419		assert_ok!(Unique::transfer(420			origin2,421			account(3),422			CollectionId(1),423			TokenId(0),424			1425		));426		assert_eq!(427			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),428			1429		);430		assert_eq!(431			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),432			4433		);434	});435}436437#[test]438fn transfer_refungible_item() {439	new_test_ext().execute_with(|| {440		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));441442		// Create RFT 1 in 1023 pieces for account 1443		let data = default_re_fungible_data();444		create_test_item(collection_id, &data.clone().into());445		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));446		assert_eq!(447			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),448			1449		);450		assert_eq!(451			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),452			1023453		);454		assert_eq!(455			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),456			true457		);458459		// Account 1 transfers all 1023 pieces of RFT 1 to account 2460		let origin1 = RuntimeOrigin::signed(1);461		let origin2 = RuntimeOrigin::signed(2);462		assert_ok!(Unique::transfer(463			origin1,464			account(2),465			CollectionId(1),466			TokenId(1),467			1023468		));469		assert_eq!(470			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),471			1023472		);473		assert_eq!(474			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),475			0476		);477		assert_eq!(478			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),479			1480		);481		assert_eq!(482			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),483			false484		);485		assert_eq!(486			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),487			true488		);489490		// Account 2 transfers 500 pieces of RFT 1 to account 3491		assert_ok!(Unique::transfer(492			origin2.clone(),493			account(3),494			CollectionId(1),495			TokenId(1),496			500497		));498		assert_eq!(499			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),500			523501		);502		assert_eq!(503			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),504			500505		);506		assert_eq!(507			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),508			1509		);510		assert_eq!(511			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),512			1513		);514		assert_eq!(515			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),516			true517		);518		assert_eq!(519			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),520			true521		);522523		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance524		assert_ok!(Unique::transfer(525			origin2,526			account(3),527			CollectionId(1),528			TokenId(1),529			200530		));531		assert_eq!(532			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),533			323534		);535		assert_eq!(536			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),537			700538		);539		assert_eq!(540			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),541			1542		);543		assert_eq!(544			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),545			1546		);547		assert_eq!(548			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),549			true550		);551		assert_eq!(552			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),553			true554		);555	});556}557558#[test]559fn transfer_nft_item() {560	new_test_ext().execute_with(|| {561		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));562563		let data = default_nft_data();564		create_test_item(collection_id, &data.into());565		assert_eq!(566			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),567			1568		);569		assert_eq!(570			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),571			true572		);573574		let origin1 = RuntimeOrigin::signed(1);575		// default scenario576		assert_ok!(Unique::transfer(577			origin1,578			account(2),579			CollectionId(1),580			TokenId(1),581			1582		));583		assert_eq!(584			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),585			0586		);587		assert_eq!(588			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),589			1590		);591		assert_eq!(592			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),593			false594		);595		assert_eq!(596			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),597			true598		);599	});600}601602#[test]603fn transfer_nft_item_wrong_value() {604	new_test_ext().execute_with(|| {605		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));606607		let data = default_nft_data();608		create_test_item(collection_id, &data.into());609		assert_eq!(610			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),611			1612		);613		assert_eq!(614			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),615			true616		);617618		let origin1 = RuntimeOrigin::signed(1);619620		assert_noop!(621			Unique::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)622				.map_err(|e| e.error),623			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount624		);625	});626}627628#[test]629fn transfer_nft_item_zero_value() {630	new_test_ext().execute_with(|| {631		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));632633		let data = default_nft_data();634		create_test_item(collection_id, &data.into());635		assert_eq!(636			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),637			1638		);639		assert_eq!(640			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),641			true642		);643644		let origin1 = RuntimeOrigin::signed(1);645646		// Transferring 0 amount works on NFT...647		assert_ok!(Unique::transfer(648			origin1,649			account(2),650			CollectionId(1),651			TokenId(1),652			0653		));654		// ... and results in no transfer655		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		);663	});664}665666#[test]667fn nft_approve_and_transfer_from() {668	new_test_ext().execute_with(|| {669		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));670671		let data = default_nft_data();672		create_test_item(collection_id, &data.into());673674		let origin1 = RuntimeOrigin::signed(1);675		let origin2 = RuntimeOrigin::signed(2);676677		assert_eq!(678			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),679			1680		);681		assert_eq!(682			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),683			true684		);685686		// neg transfer_from687		assert_noop!(688			Unique::transfer_from(689				origin2.clone(),690				account(1),691				account(2),692				CollectionId(1),693				TokenId(1),694				1695			)696			.map_err(|e| e.error),697			CommonError::<Test>::ApprovedValueTooLow698		);699700		// do approve701		assert_ok!(Unique::approve(702			origin1,703			account(2),704			CollectionId(1),705			TokenId(1),706			1707		));708		assert_eq!(709			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),710			account(2)711		);712713		assert_ok!(Unique::transfer_from(714			origin2,715			account(1),716			account(3),717			CollectionId(1),718			TokenId(1),719			1720		));721		assert!(722			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()723		);724	});725}726727#[test]728fn nft_approve_and_transfer_from_allow_list() {729	new_test_ext().execute_with(|| {730		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));731732		let origin1 = RuntimeOrigin::signed(1);733		let origin2 = RuntimeOrigin::signed(2);734735		// Create NFT 1 for account 1736		let data = default_nft_data();737		create_test_item(collection_id, &data.clone().into());738		assert_eq!(739			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),740			1741		);742		assert_eq!(743			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),744			true745		);746747		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list748		assert_ok!(Unique::set_collection_permissions(749			origin1.clone(),750			CollectionId(1),751			CollectionPermissions {752				mint_mode: Some(true),753				access: Some(AccessMode::AllowList),754				nesting: None,755			}756		));757		assert_ok!(Unique::add_to_allow_list(758			origin1.clone(),759			CollectionId(1),760			account(1)761		));762		assert_ok!(Unique::add_to_allow_list(763			origin1.clone(),764			CollectionId(1),765			account(2)766		));767		assert_ok!(Unique::add_to_allow_list(768			origin1.clone(),769			CollectionId(1),770			account(3)771		));772773		// Account 1 approves account 2 for NFT 1774		assert_ok!(Unique::approve(775			origin1.clone(),776			account(2),777			CollectionId(1),778			TokenId(1),779			1780		));781		assert_eq!(782			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),783			account(2)784		);785786		// Account 2 transfers NFT 1 from account 1 to account 3787		assert_ok!(Unique::transfer_from(788			origin2,789			account(1),790			account(3),791			CollectionId(1),792			TokenId(1),793			1794		));795		assert!(796			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()797		);798	});799}800801#[test]802fn refungible_approve_and_transfer_from() {803	new_test_ext().execute_with(|| {804		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));805806		let origin1 = RuntimeOrigin::signed(1);807		let origin2 = RuntimeOrigin::signed(2);808809		// Create RFT 1 in 1023 pieces for account 1810		let data = default_re_fungible_data();811		create_test_item(collection_id, &data.into());812813		assert_eq!(814			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),815			1816		);817		assert_eq!(818			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),819			1023820		);821		assert_eq!(822			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),823			true824		);825826		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list827		assert_ok!(Unique::set_collection_permissions(828			origin1.clone(),829			CollectionId(1),830			CollectionPermissions {831				mint_mode: Some(true),832				access: Some(AccessMode::AllowList),833				nesting: None,834			}835		));836		assert_ok!(Unique::add_to_allow_list(837			origin1.clone(),838			CollectionId(1),839			account(1)840		));841		assert_ok!(Unique::add_to_allow_list(842			origin1.clone(),843			CollectionId(1),844			account(2)845		));846		assert_ok!(Unique::add_to_allow_list(847			origin1.clone(),848			CollectionId(1),849			account(3)850		));851852		// Account 1 approves account 2 for 1023 pieces of RFT 1853		assert_ok!(Unique::approve(854			origin1,855			account(2),856			CollectionId(1),857			TokenId(1),858			1023859		));860		assert_eq!(861			<pallet_refungible::Allowance<Test>>::get((862				CollectionId(1),863				TokenId(1),864				account(1),865				account(2)866			)),867			1023868		);869870		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3871		assert_ok!(Unique::transfer_from(872			origin2,873			account(1),874			account(3),875			CollectionId(1),876			TokenId(1),877			100878		));879		assert_eq!(880			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),881			1882		);883		assert_eq!(884			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),885			1886		);887		assert_eq!(888			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),889			923890		);891		assert_eq!(892			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),893			100894		);895		assert_eq!(896			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),897			true898		);899		assert_eq!(900			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),901			true902		);903		assert_eq!(904			<pallet_refungible::Allowance<Test>>::get((905				CollectionId(1),906				TokenId(1),907				account(1),908				account(2)909			)),910			923911		);912	});913}914915#[test]916fn fungible_approve_and_transfer_from() {917	new_test_ext().execute_with(|| {918		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));919920		let data = default_fungible_data();921		create_test_item(collection_id, &data.into());922923		let origin1 = RuntimeOrigin::signed(1);924		let origin2 = RuntimeOrigin::signed(2);925926		assert_ok!(Unique::set_collection_permissions(927			origin1.clone(),928			CollectionId(1),929			CollectionPermissions {930				mint_mode: Some(true),931				access: Some(AccessMode::AllowList),932				nesting: None,933			}934		));935		assert_ok!(Unique::add_to_allow_list(936			origin1.clone(),937			CollectionId(1),938			account(1)939		));940		assert_ok!(Unique::add_to_allow_list(941			origin1.clone(),942			CollectionId(1),943			account(2)944		));945		assert_ok!(Unique::add_to_allow_list(946			origin1.clone(),947			CollectionId(1),948			account(3)949		));950951		// do approve952		assert_ok!(Unique::approve(953			origin1.clone(),954			account(2),955			CollectionId(1),956			TokenId(0),957			5958		));959		assert_eq!(960			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),961			5962		);963		assert_ok!(Unique::approve(964			origin1,965			account(3),966			CollectionId(1),967			TokenId(0),968			5969		));970		assert_eq!(971			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),972			5973		);974		assert_eq!(975			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),976			5977		);978979		assert_ok!(Unique::transfer_from(980			origin2.clone(),981			account(1),982			account(3),983			CollectionId(1),984			TokenId(0),985			4986		));987988		assert_eq!(989			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),990			1991		);992993		assert_noop!(994			Unique::transfer_from(995				origin2,996				account(1),997				account(3),998				CollectionId(1),999				TokenId(0),1000				41001			)1002			.map_err(|e| e.error),1003			CommonError::<Test>::ApprovedValueTooLow1004		);1005	});1006}10071008#[test]1009fn change_collection_owner() {1010	new_test_ext().execute_with(|| {1011		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10121013		let origin1 = RuntimeOrigin::signed(1);1014		assert_ok!(Unique::change_collection_owner(origin1, collection_id, 2));1015		assert_eq!(1016			<pallet_common::CollectionById<Test>>::get(collection_id)1017				.unwrap()1018				.owner,1019			21020		);1021	});1022}10231024#[test]1025fn destroy_collection() {1026	new_test_ext().execute_with(|| {1027		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10281029		let origin1 = RuntimeOrigin::signed(1);1030		assert_ok!(Unique::destroy_collection(origin1, collection_id));1031	});1032}10331034#[test]1035fn burn_nft_item() {1036	new_test_ext().execute_with(|| {1037		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10381039		let origin1 = RuntimeOrigin::signed(1);10401041		let data = default_nft_data();1042		create_test_item(collection_id, &data.into());10431044		// check balance (collection with id = 1, user id = 1)1045		assert_eq!(1046			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1047			11048		);10491050		// burn item1051		assert_ok!(Unique::burn_item(1052			origin1.clone(),1053			collection_id,1054			TokenId(1),1055			11056		));1057		assert_eq!(1058			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1059			01060		);1061	});1062}10631064#[test]1065fn burn_same_nft_item_twice() {1066	new_test_ext().execute_with(|| {1067		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10681069		let origin1 = RuntimeOrigin::signed(1);10701071		let data = default_nft_data();1072		create_test_item(collection_id, &data.into());10731074		// check balance (collection with id = 1, user id = 1)1075		assert_eq!(1076			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1077			11078		);10791080		// burn item1081		assert_ok!(Unique::burn_item(1082			origin1.clone(),1083			collection_id,1084			TokenId(1),1085			11086		));10871088		// burn item again1089		assert_noop!(1090			Unique::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1091			CommonError::<Test>::TokenNotFound1092		);10931094		assert_eq!(1095			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1096			01097		);1098	});1099}11001101#[test]1102fn burn_fungible_item() {1103	new_test_ext().execute_with(|| {1104		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));11051106		let origin1 = RuntimeOrigin::signed(1);1107		assert_ok!(Unique::add_collection_admin(1108			origin1.clone(),1109			collection_id,1110			account(2)1111		));11121113		let data = default_fungible_data();1114		create_test_item(collection_id, &data.into());11151116		// check balance (collection with id = 1, user id = 1)1117		assert_eq!(1118			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1119			51120		);11211122		// burn item1123		assert_ok!(Unique::burn_item(1124			origin1.clone(),1125			CollectionId(1),1126			TokenId(0),1127			51128		));1129		assert_noop!(1130			Unique::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1131			CommonError::<Test>::TokenValueTooLow1132		);11331134		assert_eq!(1135			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1136			01137		);1138	});1139}11401141#[test]1142fn burn_fungible_item_with_token_id() {1143	new_test_ext().execute_with(|| {1144		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));11451146		let origin1 = RuntimeOrigin::signed(1);1147		assert_ok!(Unique::add_collection_admin(1148			origin1.clone(),1149			collection_id,1150			account(2)1151		));11521153		let data = default_fungible_data();1154		create_test_item(collection_id, &data.into());11551156		// check balance (collection with id = 1, user id = 1)1157		assert_eq!(1158			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1159			51160		);11611162		// Try to burn item using Token ID1163		assert_noop!(1164			Unique::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1165			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1166		);1167	});1168}1169#[test]1170fn burn_refungible_item() {1171	new_test_ext().execute_with(|| {1172		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1173		let origin1 = RuntimeOrigin::signed(1);11741175		assert_ok!(Unique::set_collection_permissions(1176			origin1.clone(),1177			collection_id,1178			CollectionPermissions {1179				mint_mode: Some(true),1180				access: Some(AccessMode::AllowList),1181				nesting: None,1182			}1183		));1184		assert_ok!(Unique::add_to_allow_list(1185			origin1.clone(),1186			collection_id,1187			account(1)1188		));11891190		assert_ok!(Unique::add_collection_admin(1191			origin1.clone(),1192			collection_id,1193			account(2)1194		));11951196		let data = default_re_fungible_data();1197		create_test_item(collection_id, &data.into());11981199		// check balance (collection with id = 1, user id = 2)1200		assert_eq!(1201			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1202			11203		);1204		assert_eq!(1205			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1206			10231207		);12081209		// burn item1210		assert_ok!(Unique::burn_item(1211			origin1.clone(),1212			collection_id,1213			TokenId(1),1214			10231215		));1216		assert_noop!(1217			Unique::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),1218			CommonError::<Test>::TokenValueTooLow1219		);12201221		assert_eq!(1222			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1223			01224		);1225	});1226}12271228#[test]1229fn add_collection_admin() {1230	new_test_ext().execute_with(|| {1231		let collection1_id =1232			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1233		let origin1 = RuntimeOrigin::signed(1);12341235		// Add collection admins1236		assert_ok!(Unique::add_collection_admin(1237			origin1.clone(),1238			collection1_id,1239			account(2)1240		));1241		assert_ok!(Unique::add_collection_admin(1242			origin1,1243			collection1_id,1244			account(3)1245		));12461247		// Owner is not an admin by default1248		assert_eq!(1249			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1250			false1251		);1252		assert!(<pallet_common::IsAdmin<Test>>::get((1253			CollectionId(1),1254			account(2)1255		)));1256		assert!(<pallet_common::IsAdmin<Test>>::get((1257			CollectionId(1),1258			account(3)1259		)));1260	});1261}12621263#[test]1264fn remove_collection_admin() {1265	new_test_ext().execute_with(|| {1266		let collection1_id =1267			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1268		let origin1 = RuntimeOrigin::signed(1);12691270		// Add collection admins 2 and 31271		assert_ok!(Unique::add_collection_admin(1272			origin1.clone(),1273			collection1_id,1274			account(2)1275		));1276		assert_ok!(Unique::add_collection_admin(1277			origin1.clone(),1278			collection1_id,1279			account(3)1280		));12811282		assert!(<pallet_common::IsAdmin<Test>>::get((1283			CollectionId(1),1284			account(2)1285		)));1286		assert!(<pallet_common::IsAdmin<Test>>::get((1287			CollectionId(1),1288			account(3)1289		)));12901291		// remove admin 31292		assert_ok!(Unique::remove_collection_admin(1293			origin1,1294			CollectionId(1),1295			account(3)1296		));12971298		// 2 is still admin, 3 is not an admin anymore1299		assert!(<pallet_common::IsAdmin<Test>>::get((1300			CollectionId(1),1301			account(2)1302		)));1303		assert_eq!(1304			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1305			false1306		);1307	});1308}13091310#[test]1311fn balance_of() {1312	new_test_ext().execute_with(|| {1313		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1314		let fungible_collection_id =1315			create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1316		let re_fungible_collection_id =1317			create_test_collection(&CollectionMode::ReFungible, CollectionId(3));13181319		// check balance before1320		assert_eq!(1321			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1322			01323		);1324		assert_eq!(1325			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1326			01327		);1328		assert_eq!(1329			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1330			01331		);13321333		let nft_data = default_nft_data();1334		create_test_item(nft_collection_id, &nft_data.into());13351336		let fungible_data = default_fungible_data();1337		create_test_item(fungible_collection_id, &fungible_data.into());13381339		let re_fungible_data = default_re_fungible_data();1340		create_test_item(re_fungible_collection_id, &re_fungible_data.into());13411342		// check balance (collection with id = 1, user id = 1)1343		assert_eq!(1344			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1345			11346		);1347		assert_eq!(1348			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1349			51350		);1351		assert_eq!(1352			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1353			11354		);13551356		assert_eq!(1357			<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1358			true1359		);1360		assert_eq!(1361			<pallet_refungible::Owned<Test>>::get((1362				re_fungible_collection_id,1363				account(1),1364				TokenId(1)1365			)),1366			true1367		);1368	});1369}13701371#[test]1372fn approve() {1373	new_test_ext().execute_with(|| {1374		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13751376		let data = default_nft_data();1377		create_test_item(collection_id, &data.into());13781379		let origin1 = RuntimeOrigin::signed(1);13801381		// approve1382		assert_ok!(Unique::approve(1383			origin1,1384			account(2),1385			CollectionId(1),1386			TokenId(1),1387			11388		));1389		assert_eq!(1390			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1391			account(2)1392		);1393	});1394}13951396#[test]1397fn transfer_from() {1398	new_test_ext().execute_with(|| {1399		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1400		let origin1 = RuntimeOrigin::signed(1);1401		let origin2 = RuntimeOrigin::signed(2);14021403		let data = default_nft_data();1404		create_test_item(collection_id, &data.into());14051406		// approve1407		assert_ok!(Unique::approve(1408			origin1.clone(),1409			account(2),1410			CollectionId(1),1411			TokenId(1),1412			11413		));1414		assert_eq!(1415			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1416			account(2)1417		);14181419		assert_ok!(Unique::set_collection_permissions(1420			origin1.clone(),1421			CollectionId(1),1422			CollectionPermissions {1423				mint_mode: Some(true),1424				access: Some(AccessMode::AllowList),1425				nesting: None,1426			}1427		));1428		assert_ok!(Unique::add_to_allow_list(1429			origin1.clone(),1430			CollectionId(1),1431			account(1)1432		));1433		assert_ok!(Unique::add_to_allow_list(1434			origin1.clone(),1435			CollectionId(1),1436			account(2)1437		));1438		assert_ok!(Unique::add_to_allow_list(1439			origin1,1440			CollectionId(1),1441			account(3)1442		));14431444		assert_ok!(Unique::transfer_from(1445			origin2,1446			account(1),1447			account(2),1448			CollectionId(1),1449			TokenId(1),1450			11451		));14521453		// after transfer1454		assert_eq!(1455			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1456			01457		);1458		assert_eq!(1459			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1460			11461		);1462	});1463}14641465// #endregion14661467// Coverage tests region1468// #region14691470#[test]1471fn owner_can_add_address_to_allow_list() {1472	new_test_ext().execute_with(|| {1473		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14741475		let origin1 = RuntimeOrigin::signed(1);1476		assert_ok!(Unique::add_to_allow_list(1477			origin1,1478			collection_id,1479			account(2)1480		));1481		assert!(<pallet_common::Allowlist<Test>>::get((1482			collection_id,1483			account(2)1484		)));1485	});1486}14871488#[test]1489fn admin_can_add_address_to_allow_list() {1490	new_test_ext().execute_with(|| {1491		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1492		let origin1 = RuntimeOrigin::signed(1);1493		let origin2 = RuntimeOrigin::signed(2);14941495		assert_ok!(Unique::add_collection_admin(1496			origin1,1497			collection_id,1498			account(2)1499		));1500		assert_ok!(Unique::add_to_allow_list(1501			origin2,1502			collection_id,1503			account(3)1504		));1505		assert!(<pallet_common::Allowlist<Test>>::get((1506			collection_id,1507			account(3)1508		)));1509	});1510}15111512#[test]1513fn nonprivileged_user_cannot_add_address_to_allow_list() {1514	new_test_ext().execute_with(|| {1515		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15161517		let origin2 = RuntimeOrigin::signed(2);1518		assert_noop!(1519			Unique::add_to_allow_list(origin2, collection_id, account(3)),1520			CommonError::<Test>::NoPermission1521		);1522	});1523}15241525#[test]1526fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1527	new_test_ext().execute_with(|| {1528		let origin1 = RuntimeOrigin::signed(1);15291530		assert_noop!(1531			Unique::add_to_allow_list(origin1, CollectionId(1), account(2)),1532			CommonError::<Test>::CollectionNotFound1533		);1534	});1535}15361537#[test]1538fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1539	new_test_ext().execute_with(|| {1540		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15411542		let origin1 = RuntimeOrigin::signed(1);1543		assert_ok!(Unique::destroy_collection(origin1.clone(), collection_id));1544		assert_noop!(1545			Unique::add_to_allow_list(origin1, collection_id, account(2)),1546			CommonError::<Test>::CollectionNotFound1547		);1548	});1549}15501551// If address is already added to allow list, nothing happens1552#[test]1553fn address_is_already_added_to_allow_list() {1554	new_test_ext().execute_with(|| {1555		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1556		let origin1 = RuntimeOrigin::signed(1);15571558		assert_ok!(Unique::add_to_allow_list(1559			origin1.clone(),1560			collection_id,1561			account(2)1562		));1563		assert_ok!(Unique::add_to_allow_list(1564			origin1,1565			collection_id,1566			account(2)1567		));1568		assert!(<pallet_common::Allowlist<Test>>::get((1569			collection_id,1570			account(2)1571		)));1572	});1573}15741575#[test]1576fn owner_can_remove_address_from_allow_list() {1577	new_test_ext().execute_with(|| {1578		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15791580		let origin1 = RuntimeOrigin::signed(1);1581		assert_ok!(Unique::add_to_allow_list(1582			origin1.clone(),1583			collection_id,1584			account(2)1585		));1586		assert_ok!(Unique::remove_from_allow_list(1587			origin1,1588			collection_id,1589			account(2)1590		));1591		assert_eq!(1592			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1593			false1594		);1595	});1596}15971598#[test]1599fn admin_can_remove_address_from_allow_list() {1600	new_test_ext().execute_with(|| {1601		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1602		let origin1 = RuntimeOrigin::signed(1);1603		let origin2 = RuntimeOrigin::signed(2);16041605		// Owner adds admin1606		assert_ok!(Unique::add_collection_admin(1607			origin1.clone(),1608			collection_id,1609			account(2)1610		));16111612		// Owner adds address 3 to allow list1613		assert_ok!(Unique::add_to_allow_list(1614			origin1,1615			collection_id,1616			account(3)1617		));16181619		// Admin removes address 3 from allow list1620		assert_ok!(Unique::remove_from_allow_list(1621			origin2,1622			collection_id,1623			account(3)1624		));1625		assert_eq!(1626			<pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1627			false1628		);1629	});1630}16311632#[test]1633fn nonprivileged_user_cannot_remove_address_from_allow_list() {1634	new_test_ext().execute_with(|| {1635		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1636		let origin1 = RuntimeOrigin::signed(1);1637		let origin2 = RuntimeOrigin::signed(2);16381639		assert_ok!(Unique::add_to_allow_list(1640			origin1,1641			collection_id,1642			account(2)1643		));1644		assert_noop!(1645			Unique::remove_from_allow_list(origin2, collection_id, account(2)),1646			CommonError::<Test>::NoPermission1647		);1648		assert!(<pallet_common::Allowlist<Test>>::get((1649			collection_id,1650			account(2)1651		)));1652	});1653}16541655#[test]1656fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1657	new_test_ext().execute_with(|| {1658		let origin1 = RuntimeOrigin::signed(1);16591660		assert_noop!(1661			Unique::remove_from_allow_list(origin1, CollectionId(1), account(2)),1662			CommonError::<Test>::CollectionNotFound1663		);1664	});1665}16661667#[test]1668fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1669	new_test_ext().execute_with(|| {1670		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1671		let origin1 = RuntimeOrigin::signed(1);1672		let origin2 = RuntimeOrigin::signed(2);16731674		// Add account 2 to allow list1675		assert_ok!(Unique::add_to_allow_list(1676			origin1.clone(),1677			collection_id,1678			account(2)1679		));16801681		// Account 2 is in collection allow-list1682		assert!(<pallet_common::Allowlist<Test>>::get((1683			collection_id,1684			account(2)1685		)));16861687		// Destroy collection1688		assert_ok!(Unique::destroy_collection(origin1, collection_id));16891690		// Attempt to remove account 2 from collection allow-list => error1691		assert_noop!(1692			Unique::remove_from_allow_list(origin2, collection_id, account(2)),1693			CommonError::<Test>::CollectionNotFound1694		);16951696		// Account 2 is not found in collection allow-list anyway1697		assert_eq!(1698			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1699			false1700		);1701	});1702}17031704// If address is already removed from allow list, nothing happens1705#[test]1706fn address_is_already_removed_from_allow_list() {1707	new_test_ext().execute_with(|| {1708		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1709		let origin1 = RuntimeOrigin::signed(1);17101711		assert_ok!(Unique::add_to_allow_list(1712			origin1.clone(),1713			collection_id,1714			account(2)1715		));1716		assert_ok!(Unique::remove_from_allow_list(1717			origin1.clone(),1718			collection_id,1719			account(2)1720		));1721		assert_eq!(1722			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1723			false1724		);1725		assert_ok!(Unique::remove_from_allow_list(1726			origin1,1727			collection_id,1728			account(2)1729		));1730		assert_eq!(1731			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1732			false1733		);1734	});1735}17361737// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1738#[test]1739fn allow_list_test_1() {1740	new_test_ext().execute_with(|| {1741		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17421743		let origin1 = RuntimeOrigin::signed(1);17441745		let data = default_nft_data();1746		create_test_item(collection_id, &data.into());17471748		assert_ok!(Unique::set_collection_permissions(1749			origin1.clone(),1750			collection_id,1751			CollectionPermissions {1752				mint_mode: None,1753				access: Some(AccessMode::AllowList),1754				nesting: None,1755			}1756		));1757		assert_ok!(Unique::add_to_allow_list(1758			origin1.clone(),1759			collection_id,1760			account(2)1761		));17621763		assert_noop!(1764			Unique::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1765				.map_err(|e| e.error),1766			CommonError::<Test>::AddressNotInAllowlist1767		);1768	});1769}17701771#[test]1772fn allow_list_test_2() {1773	new_test_ext().execute_with(|| {1774		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1775		let origin1 = RuntimeOrigin::signed(1);17761777		let data = default_nft_data();1778		create_test_item(collection_id, &data.into());17791780		assert_ok!(Unique::set_collection_permissions(1781			origin1.clone(),1782			collection_id,1783			CollectionPermissions {1784				mint_mode: None,1785				access: Some(AccessMode::AllowList),1786				nesting: None,1787			}1788		));1789		assert_ok!(Unique::add_to_allow_list(1790			origin1.clone(),1791			collection_id,1792			account(1)1793		));1794		assert_ok!(Unique::add_to_allow_list(1795			origin1.clone(),1796			collection_id,1797			account(2)1798		));17991800		// do approve1801		assert_ok!(Unique::approve(1802			origin1.clone(),1803			account(1),1804			collection_id,1805			TokenId(1),1806			11807		));1808		assert_eq!(1809			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1810			account(1)1811		);18121813		assert_ok!(Unique::remove_from_allow_list(1814			origin1.clone(),1815			collection_id,1816			account(1)1817		));18181819		assert_noop!(1820			Unique::transfer_from(1821				origin1,1822				account(1),1823				account(3),1824				CollectionId(1),1825				TokenId(1),1826				11827			)1828			.map_err(|e| e.error),1829			CommonError::<Test>::AddressNotInAllowlist1830		);1831	});1832}18331834// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1835#[test]1836fn allow_list_test_3() {1837	new_test_ext().execute_with(|| {1838		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18391840		let origin1 = RuntimeOrigin::signed(1);18411842		let data = default_nft_data();1843		create_test_item(collection_id, &data.into());18441845		assert_ok!(Unique::set_collection_permissions(1846			origin1.clone(),1847			collection_id,1848			CollectionPermissions {1849				mint_mode: None,1850				access: Some(AccessMode::AllowList),1851				nesting: None,1852			}1853		));1854		assert_ok!(Unique::add_to_allow_list(1855			origin1.clone(),1856			collection_id,1857			account(1)1858		));18591860		assert_noop!(1861			Unique::transfer(origin1, account(3), collection_id, TokenId(1), 1)1862				.map_err(|e| e.error),1863			CommonError::<Test>::AddressNotInAllowlist1864		);1865	});1866}18671868#[test]1869fn allow_list_test_4() {1870	new_test_ext().execute_with(|| {1871		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18721873		let origin1 = RuntimeOrigin::signed(1);18741875		let data = default_nft_data();1876		create_test_item(collection_id, &data.into());18771878		assert_ok!(Unique::set_collection_permissions(1879			origin1.clone(),1880			collection_id,1881			CollectionPermissions {1882				mint_mode: None,1883				access: Some(AccessMode::AllowList),1884				nesting: None,1885			}1886		));1887		assert_ok!(Unique::add_to_allow_list(1888			origin1.clone(),1889			collection_id,1890			account(1)1891		));1892		assert_ok!(Unique::add_to_allow_list(1893			origin1.clone(),1894			collection_id,1895			account(2)1896		));18971898		// do approve1899		assert_ok!(Unique::approve(1900			origin1.clone(),1901			account(1),1902			collection_id,1903			TokenId(1),1904			11905		));1906		assert_eq!(1907			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1908			account(1)1909		);19101911		assert_ok!(Unique::remove_from_allow_list(1912			origin1.clone(),1913			collection_id,1914			account(2)1915		));19161917		assert_noop!(1918			Unique::transfer_from(1919				origin1,1920				account(1),1921				account(3),1922				collection_id,1923				TokenId(1),1924				11925			)1926			.map_err(|e| e.error),1927			CommonError::<Test>::AddressNotInAllowlist1928		);1929	});1930}19311932// 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)1933#[test]1934fn allow_list_test_5() {1935	new_test_ext().execute_with(|| {1936		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19371938		let origin1 = RuntimeOrigin::signed(1);19391940		let data = default_nft_data();1941		create_test_item(collection_id, &data.into());19421943		assert_ok!(Unique::set_collection_permissions(1944			origin1.clone(),1945			collection_id,1946			CollectionPermissions {1947				mint_mode: None,1948				access: Some(AccessMode::AllowList),1949				nesting: None,1950			}1951		));1952		assert_noop!(1953			Unique::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1954			CommonError::<Test>::AddressNotInAllowlist1955		);1956	});1957}19581959// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1960#[test]1961fn allow_list_test_6() {1962	new_test_ext().execute_with(|| {1963		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19641965		let origin1 = RuntimeOrigin::signed(1);19661967		let data = default_nft_data();1968		create_test_item(collection_id, &data.into());19691970		assert_ok!(Unique::set_collection_permissions(1971			origin1.clone(),1972			collection_id,1973			CollectionPermissions {1974				mint_mode: None,1975				access: Some(AccessMode::AllowList),1976				nesting: None,1977			}1978		));19791980		// do approve1981		assert_noop!(1982			Unique::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1983				.map_err(|e| e.error),1984			CommonError::<Test>::AddressNotInAllowlist1985		);1986	});1987}19881989// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1990//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1991#[test]1992fn allow_list_test_7() {1993	new_test_ext().execute_with(|| {1994		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19951996		let data = default_nft_data();1997		create_test_item(collection_id, &data.into());19981999		let origin1 = RuntimeOrigin::signed(1);20002001		assert_ok!(Unique::set_collection_permissions(2002			origin1.clone(),2003			collection_id,2004			CollectionPermissions {2005				mint_mode: None,2006				access: Some(AccessMode::AllowList),2007				nesting: None,2008			}2009		));2010		assert_ok!(Unique::add_to_allow_list(2011			origin1.clone(),2012			collection_id,2013			account(1)2014		));2015		assert_ok!(Unique::add_to_allow_list(2016			origin1.clone(),2017			collection_id,2018			account(2)2019		));20202021		assert_ok!(Unique::transfer(2022			origin1,2023			account(2),2024			CollectionId(1),2025			TokenId(1),2026			12027		));2028	});2029}20302031#[test]2032fn allow_list_test_8() {2033	new_test_ext().execute_with(|| {2034		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20352036		// Create NFT for account 12037		let data = default_nft_data();2038		create_test_item(collection_id, &data.into());20392040		let origin1 = RuntimeOrigin::signed(1);20412042		// Toggle Allow List mode and add accounts 1 and 22043		assert_ok!(Unique::set_collection_permissions(2044			origin1.clone(),2045			collection_id,2046			CollectionPermissions {2047				mint_mode: None,2048				access: Some(AccessMode::AllowList),2049				nesting: None,2050			}2051		));2052		assert_ok!(Unique::add_to_allow_list(2053			origin1.clone(),2054			collection_id,2055			account(1)2056		));2057		assert_ok!(Unique::add_to_allow_list(2058			origin1.clone(),2059			collection_id,2060			account(2)2061		));20622063		// Sself-approve account 1 for NFT 12064		assert_ok!(Unique::approve(2065			origin1.clone(),2066			account(1),2067			CollectionId(1),2068			TokenId(1),2069			12070		));2071		assert_eq!(2072			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),2073			account(1)2074		);20752076		// Transfer from 1 to 22077		assert_ok!(Unique::transfer_from(2078			origin1,2079			account(1),2080			account(2),2081			CollectionId(1),2082			TokenId(1),2083			12084		));2085	});2086}20872088// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.2089#[test]2090fn allow_list_test_9() {2091	new_test_ext().execute_with(|| {2092		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2093		let origin1 = RuntimeOrigin::signed(1);20942095		assert_ok!(Unique::set_collection_permissions(2096			origin1.clone(),2097			collection_id,2098			CollectionPermissions {2099				mint_mode: Some(false),2100				access: Some(AccessMode::AllowList),2101				nesting: None,2102			}2103		));21042105		let data = default_nft_data();2106		create_test_item(collection_id, &data.into());2107	});2108}21092110// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2111#[test]2112fn allow_list_test_10() {2113	new_test_ext().execute_with(|| {2114		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21152116		let origin1 = RuntimeOrigin::signed(1);2117		let origin2 = RuntimeOrigin::signed(2);21182119		assert_ok!(Unique::set_collection_permissions(2120			origin1.clone(),2121			collection_id,2122			CollectionPermissions {2123				mint_mode: Some(false),2124				access: Some(AccessMode::AllowList),2125				nesting: None,2126			}2127		));21282129		assert_ok!(Unique::add_collection_admin(2130			origin1,2131			collection_id,2132			account(2)2133		));21342135		assert_ok!(Unique::create_item(2136			origin2,2137			collection_id,2138			account(2),2139			default_nft_data().into()2140		));2141	});2142}21432144// 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.2145#[test]2146fn allow_list_test_11() {2147	new_test_ext().execute_with(|| {2148		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21492150		let origin1 = RuntimeOrigin::signed(1);2151		let origin2 = RuntimeOrigin::signed(2);21522153		assert_ok!(Unique::set_collection_permissions(2154			origin1.clone(),2155			collection_id,2156			CollectionPermissions {2157				mint_mode: Some(false),2158				access: Some(AccessMode::AllowList),2159				nesting: None,2160			}2161		));2162		assert_ok!(Unique::add_to_allow_list(2163			origin1,2164			collection_id,2165			account(2)2166		));21672168		assert_noop!(2169			Unique::create_item(2170				origin2,2171				CollectionId(1),2172				account(2),2173				default_nft_data().into()2174			)2175			.map_err(|e| e.error),2176			CommonError::<Test>::PublicMintingNotAllowed2177		);2178	});2179}21802181// 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.2182#[test]2183fn allow_list_test_12() {2184	new_test_ext().execute_with(|| {2185		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21862187		let origin1 = RuntimeOrigin::signed(1);2188		let origin2 = RuntimeOrigin::signed(2);21892190		assert_ok!(Unique::set_collection_permissions(2191			origin1.clone(),2192			collection_id,2193			CollectionPermissions {2194				mint_mode: Some(false),2195				access: Some(AccessMode::AllowList),2196				nesting: None,2197			}2198		));21992200		assert_noop!(2201			Unique::create_item(2202				origin2,2203				CollectionId(1),2204				account(2),2205				default_nft_data().into()2206			)2207			.map_err(|e| e.error),2208			CommonError::<Test>::PublicMintingNotAllowed2209		);2210	});2211}22122213// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2214#[test]2215fn allow_list_test_13() {2216	new_test_ext().execute_with(|| {2217		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22182219		let origin1 = RuntimeOrigin::signed(1);22202221		assert_ok!(Unique::set_collection_permissions(2222			origin1.clone(),2223			collection_id,2224			CollectionPermissions {2225				mint_mode: Some(true),2226				access: Some(AccessMode::AllowList),2227				nesting: None,2228			}2229		));22302231		let data = default_nft_data();2232		create_test_item(collection_id, &data.into());2233	});2234}22352236// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2237#[test]2238fn allow_list_test_14() {2239	new_test_ext().execute_with(|| {2240		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22412242		let origin1 = RuntimeOrigin::signed(1);2243		let origin2 = RuntimeOrigin::signed(2);22442245		assert_ok!(Unique::set_collection_permissions(2246			origin1.clone(),2247			collection_id,2248			CollectionPermissions {2249				mint_mode: Some(true),2250				access: Some(AccessMode::AllowList),2251				nesting: None,2252			}2253		));22542255		assert_ok!(Unique::add_collection_admin(2256			origin1,2257			collection_id,2258			account(2)2259		));22602261		assert_ok!(Unique::create_item(2262			origin2,2263			collection_id,2264			account(2),2265			default_nft_data().into()2266		));2267	});2268}22692270// 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.2271#[test]2272fn allow_list_test_15() {2273	new_test_ext().execute_with(|| {2274		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22752276		let origin1 = RuntimeOrigin::signed(1);2277		let origin2 = RuntimeOrigin::signed(2);22782279		assert_ok!(Unique::set_collection_permissions(2280			origin1.clone(),2281			collection_id,2282			CollectionPermissions {2283				mint_mode: Some(true),2284				access: Some(AccessMode::AllowList),2285				nesting: None,2286			}2287		));22882289		assert_noop!(2290			Unique::create_item(2291				origin2,2292				collection_id,2293				account(2),2294				default_nft_data().into()2295			)2296			.map_err(|e| e.error),2297			CommonError::<Test>::AddressNotInAllowlist2298		);2299	});2300}23012302// 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.2303#[test]2304fn allow_list_test_16() {2305	new_test_ext().execute_with(|| {2306		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23072308		let origin1 = RuntimeOrigin::signed(1);2309		let origin2 = RuntimeOrigin::signed(2);23102311		assert_ok!(Unique::set_collection_permissions(2312			origin1.clone(),2313			collection_id,2314			CollectionPermissions {2315				mint_mode: Some(true),2316				access: Some(AccessMode::AllowList),2317				nesting: None,2318			}2319		));2320		assert_ok!(Unique::add_to_allow_list(2321			origin1,2322			collection_id,2323			account(2)2324		));23252326		assert_ok!(Unique::create_item(2327			origin2,2328			collection_id,2329			account(2),2330			default_nft_data().into()2331		));2332	});2333}23342335// Total number of collections. Positive test2336#[test]2337fn total_number_collections_bound() {2338	new_test_ext().execute_with(|| {2339		create_test_collection(&CollectionMode::NFT, CollectionId(1));2340	});2341}23422343#[test]2344fn create_max_collections() {2345	new_test_ext().execute_with(|| {2346		for i in 1..COLLECTION_NUMBER_LIMIT {2347			create_test_collection(&CollectionMode::NFT, CollectionId(i));2348		}2349	});2350}23512352// Total number of collections. Negative test2353#[test]2354fn total_number_collections_bound_neg() {2355	new_test_ext().execute_with(|| {2356		let origin1 = RuntimeOrigin::signed(1);23572358		for i in 1..=COLLECTION_NUMBER_LIMIT {2359			create_test_collection(&CollectionMode::NFT, CollectionId(i));2360		}23612362		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2363		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2364		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();23652366		let data: CreateCollectionData<u64> = CreateCollectionData {2367			name: col_name1.try_into().unwrap(),2368			description: col_desc1.try_into().unwrap(),2369			token_prefix: token_prefix1.try_into().unwrap(),2370			mode: CollectionMode::NFT,2371			..Default::default()2372		};23732374		// 11-th collection in chain. Expects error2375		assert_noop!(2376			Unique::create_collection_ex(origin1, data),2377			CommonError::<Test>::TotalCollectionsLimitExceeded2378		);2379	});2380}23812382// Owned tokens by a single address. Positive test2383#[test]2384fn owned_tokens_bound() {2385	new_test_ext().execute_with(|| {2386		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23872388		let data = default_nft_data();2389		create_test_item(collection_id, &data.clone().into());2390		create_test_item(collection_id, &data.into());2391	});2392}23932394// Owned tokens by a single address. Negotive test2395#[test]2396fn owned_tokens_bound_neg() {2397	new_test_ext().execute_with(|| {2398		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23992400		let origin1 = RuntimeOrigin::signed(1);24012402		for _ in 1..=MAX_TOKEN_OWNERSHIP {2403			let data = default_nft_data();2404			create_test_item(collection_id, &data.clone().into());2405		}24062407		let data = default_nft_data();2408		assert_noop!(2409			Unique::create_item(origin1, CollectionId(1), account(1), data.into())2410				.map_err(|e| e.error),2411			CommonError::<Test>::AccountTokenLimitExceeded2412		);2413	});2414}24152416// Number of collection admins. Positive test2417#[test]2418fn collection_admins_bound() {2419	new_test_ext().execute_with(|| {2420		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24212422		let origin1 = RuntimeOrigin::signed(1);24232424		assert_ok!(Unique::add_collection_admin(2425			origin1.clone(),2426			collection_id,2427			account(2)2428		));2429		assert_ok!(Unique::add_collection_admin(2430			origin1,2431			collection_id,2432			account(3)2433		));2434	});2435}24362437// Number of collection admins. Negotive test2438#[test]2439fn collection_admins_bound_neg() {2440	new_test_ext().execute_with(|| {2441		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24422443		let origin1 = RuntimeOrigin::signed(1);24442445		for i in 0..COLLECTION_ADMINS_LIMIT {2446			assert_ok!(Unique::add_collection_admin(2447				origin1.clone(),2448				collection_id,2449				account((2 + i).into())2450			));2451		}2452		assert_noop!(2453			Unique::add_collection_admin(2454				origin1,2455				collection_id,2456				account((3 + COLLECTION_ADMINS_LIMIT).into())2457			),2458			CommonError::<Test>::CollectionAdminCountExceeded2459		);2460	});2461}2462// #endregion24632464#[test]2465fn collection_transfer_flag_works() {2466	new_test_ext().execute_with(|| {2467		let origin1 = RuntimeOrigin::signed(1);24682469		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2470		assert_ok!(Unique::set_transfers_enabled_flag(2471			origin1,2472			collection_id,2473			true2474		));24752476		let data = default_nft_data();2477		create_test_item(collection_id, &data.into());2478		assert_eq!(2479			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2480			12481		);2482		assert_eq!(2483			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2484			true2485		);24862487		let origin1 = RuntimeOrigin::signed(1);24882489		// default scenario2490		assert_ok!(Unique::transfer(2491			origin1,2492			account(2),2493			collection_id,2494			TokenId(1),2495			12496		));2497		assert_eq!(2498			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2499			false2500		);2501		assert_eq!(2502			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2503			true2504		);2505		assert_eq!(2506			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2507			02508		);2509		assert_eq!(2510			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2511			12512		);2513	});2514}25152516#[test]2517fn collection_transfer_flag_works_neg() {2518	new_test_ext().execute_with(|| {2519		let origin1 = RuntimeOrigin::signed(1);25202521		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2522		assert_ok!(Unique::set_transfers_enabled_flag(2523			origin1,2524			collection_id,2525			false2526		));25272528		let data = default_nft_data();2529		create_test_item(collection_id, &data.into());2530		assert_eq!(2531			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2532			12533		);2534		assert_eq!(2535			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2536			true2537		);25382539		let origin1 = RuntimeOrigin::signed(1);25402541		// default scenario2542		assert_noop!(2543			Unique::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2544				.map_err(|e| e.error),2545			CommonError::<Test>::TransferNotAllowed2546		);2547		assert_eq!(2548			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2549			12550		);2551		assert_eq!(2552			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2553			02554		);2555		assert_eq!(2556			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2557			true2558		);2559		assert_eq!(2560			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2561			false2562		);2563	});2564}25652566#[test]2567fn collection_sponsoring() {2568	new_test_ext().execute_with(|| {2569		// default_limits();2570		let user1 = 1_u64;2571		let user2 = 777_u64;2572		let origin1 = RuntimeOrigin::signed(user1);2573		let origin2 = RuntimeOrigin::signed(user2);2574		let account2 = account(user2);25752576		let collection_id =2577			create_test_collection_for_owner(&CollectionMode::NFT, user1, CollectionId(1));2578		assert_ok!(Unique::set_collection_sponsor(2579			origin1.clone(),2580			collection_id,2581			user12582		));2583		assert_ok!(Unique::confirm_sponsorship(origin1.clone(), collection_id));25842585		// Expect error while have no permissions2586		assert!(Unique::create_item(2587			origin2.clone(),2588			collection_id,2589			account2.clone(),2590			default_nft_data().into()2591		)2592		.is_err());25932594		assert_ok!(Unique::set_collection_permissions(2595			origin1.clone(),2596			collection_id,2597			CollectionPermissions {2598				mint_mode: Some(true),2599				access: Some(AccessMode::AllowList),2600				nesting: None,2601			}2602		));2603		assert_ok!(Unique::add_to_allow_list(2604			origin1.clone(),2605			collection_id,2606			account2.clone()2607		));26082609		assert_ok!(Unique::create_item(2610			origin2,2611			collection_id,2612			account2,2613			default_nft_data().into()2614		));2615	});2616}
after · runtime/tests/src/tests.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617// Tests to be written here18use crate::{Test, TestCrossAccountId, CollectionCreationPrice, RuntimeOrigin, Unique, new_test_ext};19use up_data_structs::{20	COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,21	CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, TokenId,22	MAX_TOKEN_OWNERSHIP, CreateCollectionData, CollectionMode, AccessMode, CollectionPermissions,23	PropertyKeyPermission, PropertyPermission, Property, CollectionPropertiesVec,24	CollectionPropertiesPermissionsVec,25};26use frame_support::{assert_noop, assert_ok, assert_err};27use sp_std::convert::TryInto;28use pallet_evm::account::CrossAccountId;29use pallet_common::Error as CommonError;30use pallet_unique::Error as UniqueError;3132fn add_balance(user: u64, value: u64) {33	const DONOR_USER: u64 = 999;34	assert_ok!(<pallet_balances::Pallet<Test>>::set_balance(35		RuntimeOrigin::root(),36		DONOR_USER,37		value,38		039	));40	assert_ok!(<pallet_balances::Pallet<Test>>::force_transfer(41		RuntimeOrigin::root(),42		DONOR_USER,43		user,44		value45	));46}4748fn default_nft_data() -> CreateNftData {49	CreateNftData {50		properties: vec![Property {51			key: b"test-prop".to_vec().try_into().unwrap(),52			value: b"test-nft-prop".to_vec().try_into().unwrap(),53		}]54		.try_into()55		.unwrap(),56	}57}5859fn default_fungible_data() -> CreateFungibleData {60	CreateFungibleData { value: 5 }61}6263fn default_re_fungible_data() -> CreateReFungibleData {64	CreateReFungibleData {65		pieces: 1023,66		properties: vec![Property {67			key: b"test-prop".to_vec().try_into().unwrap(),68			value: b"test-nft-prop".to_vec().try_into().unwrap(),69		}]70		.try_into()71		.unwrap(),72	}73}7475fn create_test_collection_for_owner(76	mode: &CollectionMode,77	owner: u64,78	id: CollectionId,79) -> CollectionId {80	add_balance(owner, CollectionCreationPrice::get() as u64 + 1);8182	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();83	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();84	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();85	let token_property_permissions: CollectionPropertiesPermissionsVec =86		vec![PropertyKeyPermission {87			key: b"test-prop".to_vec().try_into().unwrap(),88			permission: PropertyPermission {89				mutable: true,90				collection_admin: false,91				token_owner: true,92			},93		}]94		.try_into()95		.unwrap();96	let properties: CollectionPropertiesVec = vec![Property {97		key: b"test-collection-prop".to_vec().try_into().unwrap(),98		value: b"test-collection-value".to_vec().try_into().unwrap(),99	}]100	.try_into()101	.unwrap();102103	let data: CreateCollectionData<u64> = CreateCollectionData {104		name: col_name1.try_into().unwrap(),105		description: col_desc1.try_into().unwrap(),106		token_prefix: token_prefix1.try_into().unwrap(),107		mode: mode.clone(),108		token_property_permissions: token_property_permissions.clone(),109		properties: properties.clone(),110		..Default::default()111	};112113	let origin1 = RuntimeOrigin::signed(owner);114	assert_ok!(Unique::create_collection_ex(origin1, data));115116	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();117	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();118	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();119	assert_eq!(120		<pallet_common::CollectionById<Test>>::get(id)121			.unwrap()122			.owner,123		owner124	);125	assert_eq!(126		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,127		saved_col_name128	);129	assert_eq!(130		<pallet_common::CollectionById<Test>>::get(id).unwrap().mode,131		*mode132	);133	assert_eq!(134		<pallet_common::CollectionById<Test>>::get(id)135			.unwrap()136			.description,137		saved_description138	);139	assert_eq!(140		<pallet_common::CollectionById<Test>>::get(id)141			.unwrap()142			.token_prefix,143		saved_prefix144	);145	assert_eq!(146		get_collection_property_permissions(id).as_slice(),147		token_property_permissions.as_slice()148	);149	assert_eq!(150		get_collection_properties(id).as_slice(),151		properties.as_slice()152	);153	id154}155156fn get_collection_property_permissions(collection_id: CollectionId) -> Vec<PropertyKeyPermission> {157	<pallet_common::Pallet<Test>>::property_permissions(collection_id)158		.into_iter()159		.map(|(key, permission)| PropertyKeyPermission { key, permission })160		.collect()161}162163fn get_collection_properties(collection_id: CollectionId) -> Vec<Property> {164	<pallet_common::Pallet<Test>>::collection_properties(collection_id)165		.into_iter()166		.map(|(key, value)| Property { key, value })167		.collect()168}169170fn get_token_properties(collection_id: CollectionId, token_id: TokenId) -> Vec<Property> {171	<pallet_nonfungible::Pallet<Test>>::token_properties((collection_id, token_id))172		.into_iter()173		.map(|(key, value)| Property { key, value })174		.collect()175}176177fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {178	create_test_collection_for_owner(&mode, 1, id)179}180181fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {182	let origin1 = RuntimeOrigin::signed(1);183	assert_ok!(Unique::create_item(184		origin1,185		collection_id,186		account(1),187		data.clone()188	));189}190191fn account(sub: u64) -> TestCrossAccountId {192	TestCrossAccountId::from_sub(sub)193}194195// Use cases tests region196// #region197198#[test]199fn check_not_sufficient_founds() {200	new_test_ext().execute_with(|| {201		let acc: u64 = 1;202		<pallet_balances::Pallet<Test>>::set_balance(RuntimeOrigin::root(), acc, 0, 0).unwrap();203204		let name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();205		let description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();206		let token_prefix: Vec<u8> = b"token_prefix1\0".to_vec();207208		let data: CreateCollectionData<<Test as frame_system::Config>::AccountId> =209			CreateCollectionData {210				name: name.try_into().unwrap(),211				description: description.try_into().unwrap(),212				token_prefix: token_prefix.try_into().unwrap(),213				mode: CollectionMode::NFT,214				..Default::default()215			};216217		let result = Unique::create_collection_ex(RuntimeOrigin::signed(acc), data);218		assert_err!(result, <CommonError<Test>>::NotSufficientFounds);219	});220}221222#[test]223fn create_fungible_collection_fails_with_large_decimal_numbers() {224	new_test_ext().execute_with(|| {225		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();226		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();227		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();228229		let data: CreateCollectionData<u64> = CreateCollectionData {230			name: col_name1.try_into().unwrap(),231			description: col_desc1.try_into().unwrap(),232			token_prefix: token_prefix1.try_into().unwrap(),233			mode: CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1),234			..Default::default()235		};236237		let origin1 = RuntimeOrigin::signed(1);238		assert_noop!(239			Unique::create_collection_ex(origin1, data),240			UniqueError::<Test>::CollectionDecimalPointLimitExceeded241		);242	});243}244245#[test]246fn create_nft_item() {247	new_test_ext().execute_with(|| {248		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));249250		let data = default_nft_data();251		create_test_item(collection_id, &data.clone().into());252253		assert_eq!(254			get_token_properties(collection_id, TokenId(1)).as_slice(),255			data.properties.as_slice(),256		);257	});258}259260// Use cases tests region261// #region262#[test]263fn create_nft_multiple_items() {264	new_test_ext().execute_with(|| {265		create_test_collection(&CollectionMode::NFT, CollectionId(1));266267		let origin1 = RuntimeOrigin::signed(1);268269		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];270271		assert_ok!(Unique::create_multiple_items(272			origin1,273			CollectionId(1),274			account(1),275			items_data276				.clone()277				.into_iter()278				.map(|d| { d.into() })279				.collect()280		));281		for (index, data) in items_data.into_iter().enumerate() {282			assert_eq!(283				get_token_properties(CollectionId(1), TokenId(index as u32 + 1)).as_slice(),284				data.properties.as_slice()285			);286		}287	});288}289290#[test]291fn create_refungible_item() {292	new_test_ext().execute_with(|| {293		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));294295		let data = default_re_fungible_data();296		create_test_item(collection_id, &data.clone().into());297		let balance =298			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));299		assert_eq!(balance, 1023);300	});301}302303#[test]304fn create_multiple_refungible_items() {305	new_test_ext().execute_with(|| {306		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));307308		let origin1 = RuntimeOrigin::signed(1);309310		let items_data = vec![311			default_re_fungible_data(),312			default_re_fungible_data(),313			default_re_fungible_data(),314		];315316		assert_ok!(Unique::create_multiple_items(317			origin1,318			CollectionId(1),319			account(1),320			items_data321				.clone()322				.into_iter()323				.map(|d| { d.into() })324				.collect()325		));326		for (index, data) in items_data.into_iter().enumerate() {327			let balance =328				<pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId((index + 1) as u32), account(1)));329			assert_eq!(balance, 1023);330		}331	});332}333334#[test]335fn create_fungible_item() {336	new_test_ext().execute_with(|| {337		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));338339		let data = default_fungible_data();340		create_test_item(collection_id, &data.into());341342		assert_eq!(343			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),344			5345		);346	});347}348349//#[test]350// fn create_multiple_fungible_items() {351//     new_test_ext().execute_with(|| {352//         default_limits();353354//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));355356//         let origin1 = RuntimeOrigin::signed(1);357358//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];359360//         assert_ok!(Unique::create_multiple_items(361//             origin1.clone(),362//             1,363//             1,364//             items_data.clone().into_iter().map(|d| { d.into() }).collect()365//         ));366367//         for (index, _) in items_data.iter().enumerate() {368//             assert_eq!(Unique::fungible_item_id(1, (index + 1) as TokenId).value, 5);369//         }370//         assert_eq!(Unique::balance_count(1, 1), 3000);371//         assert_eq!(Unique::address_tokens(1, 1), [1, 2, 3]);372//     });373// }374375#[test]376fn transfer_fungible_item() {377	new_test_ext().execute_with(|| {378		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));379380		let origin1 = RuntimeOrigin::signed(1);381		let origin2 = RuntimeOrigin::signed(2);382383		let data = default_fungible_data();384		create_test_item(collection_id, &data.into());385386		assert_eq!(387			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),388			5389		);390391		// change owner scenario392		assert_ok!(Unique::transfer(393			origin1,394			account(2),395			CollectionId(1),396			TokenId(0),397			5398		));399		assert_eq!(400			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),401			0402		);403404		// split item scenario405		assert_ok!(Unique::transfer(406			origin2.clone(),407			account(3),408			CollectionId(1),409			TokenId(0),410			3411		));412413		// split item and new owner has account scenario414		assert_ok!(Unique::transfer(415			origin2,416			account(3),417			CollectionId(1),418			TokenId(0),419			1420		));421		assert_eq!(422			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),423			1424		);425		assert_eq!(426			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),427			4428		);429	});430}431432#[test]433fn transfer_refungible_item() {434	new_test_ext().execute_with(|| {435		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));436437		// Create RFT 1 in 1023 pieces for account 1438		let data = default_re_fungible_data();439		create_test_item(collection_id, &data.clone().into());440		assert_eq!(441			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),442			1443		);444		assert_eq!(445			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),446			1023447		);448		assert_eq!(449			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),450			true451		);452453		// Account 1 transfers all 1023 pieces of RFT 1 to account 2454		let origin1 = RuntimeOrigin::signed(1);455		let origin2 = RuntimeOrigin::signed(2);456		assert_ok!(Unique::transfer(457			origin1,458			account(2),459			CollectionId(1),460			TokenId(1),461			1023462		));463		assert_eq!(464			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),465			1023466		);467		assert_eq!(468			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),469			0470		);471		assert_eq!(472			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),473			1474		);475		assert_eq!(476			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),477			false478		);479		assert_eq!(480			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),481			true482		);483484		// Account 2 transfers 500 pieces of RFT 1 to account 3485		assert_ok!(Unique::transfer(486			origin2.clone(),487			account(3),488			CollectionId(1),489			TokenId(1),490			500491		));492		assert_eq!(493			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),494			523495		);496		assert_eq!(497			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),498			500499		);500		assert_eq!(501			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),502			1503		);504		assert_eq!(505			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),506			1507		);508		assert_eq!(509			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),510			true511		);512		assert_eq!(513			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),514			true515		);516517		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance518		assert_ok!(Unique::transfer(519			origin2,520			account(3),521			CollectionId(1),522			TokenId(1),523			200524		));525		assert_eq!(526			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),527			323528		);529		assert_eq!(530			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),531			700532		);533		assert_eq!(534			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),535			1536		);537		assert_eq!(538			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),539			1540		);541		assert_eq!(542			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),543			true544		);545		assert_eq!(546			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),547			true548		);549	});550}551552#[test]553fn transfer_nft_item() {554	new_test_ext().execute_with(|| {555		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));556557		let data = default_nft_data();558		create_test_item(collection_id, &data.into());559		assert_eq!(560			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),561			1562		);563		assert_eq!(564			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),565			true566		);567568		let origin1 = RuntimeOrigin::signed(1);569		// default scenario570		assert_ok!(Unique::transfer(571			origin1,572			account(2),573			CollectionId(1),574			TokenId(1),575			1576		));577		assert_eq!(578			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),579			0580		);581		assert_eq!(582			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),583			1584		);585		assert_eq!(586			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),587			false588		);589		assert_eq!(590			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),591			true592		);593	});594}595596#[test]597fn transfer_nft_item_wrong_value() {598	new_test_ext().execute_with(|| {599		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));600601		let data = default_nft_data();602		create_test_item(collection_id, &data.into());603		assert_eq!(604			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),605			1606		);607		assert_eq!(608			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),609			true610		);611612		let origin1 = RuntimeOrigin::signed(1);613614		assert_noop!(615			Unique::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)616				.map_err(|e| e.error),617			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount618		);619	});620}621622#[test]623fn transfer_nft_item_zero_value() {624	new_test_ext().execute_with(|| {625		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));626627		let data = default_nft_data();628		create_test_item(collection_id, &data.into());629		assert_eq!(630			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),631			1632		);633		assert_eq!(634			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),635			true636		);637638		let origin1 = RuntimeOrigin::signed(1);639640		// Transferring 0 amount works on NFT...641		assert_ok!(Unique::transfer(642			origin1,643			account(2),644			CollectionId(1),645			TokenId(1),646			0647		));648		// ... and results in no transfer649		assert_eq!(650			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),651			1652		);653		assert_eq!(654			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),655			true656		);657	});658}659660#[test]661fn nft_approve_and_transfer_from() {662	new_test_ext().execute_with(|| {663		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));664665		let data = default_nft_data();666		create_test_item(collection_id, &data.into());667668		let origin1 = RuntimeOrigin::signed(1);669		let origin2 = RuntimeOrigin::signed(2);670671		assert_eq!(672			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),673			1674		);675		assert_eq!(676			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),677			true678		);679680		// neg transfer_from681		assert_noop!(682			Unique::transfer_from(683				origin2.clone(),684				account(1),685				account(2),686				CollectionId(1),687				TokenId(1),688				1689			)690			.map_err(|e| e.error),691			CommonError::<Test>::ApprovedValueTooLow692		);693694		// do approve695		assert_ok!(Unique::approve(696			origin1,697			account(2),698			CollectionId(1),699			TokenId(1),700			1701		));702		assert_eq!(703			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),704			account(2)705		);706707		assert_ok!(Unique::transfer_from(708			origin2,709			account(1),710			account(3),711			CollectionId(1),712			TokenId(1),713			1714		));715		assert!(716			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()717		);718	});719}720721#[test]722fn nft_approve_and_transfer_from_allow_list() {723	new_test_ext().execute_with(|| {724		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));725726		let origin1 = RuntimeOrigin::signed(1);727		let origin2 = RuntimeOrigin::signed(2);728729		// Create NFT 1 for account 1730		let data = default_nft_data();731		create_test_item(collection_id, &data.clone().into());732		assert_eq!(733			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),734			1735		);736		assert_eq!(737			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),738			true739		);740741		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list742		assert_ok!(Unique::set_collection_permissions(743			origin1.clone(),744			CollectionId(1),745			CollectionPermissions {746				mint_mode: Some(true),747				access: Some(AccessMode::AllowList),748				nesting: None,749			}750		));751		assert_ok!(Unique::add_to_allow_list(752			origin1.clone(),753			CollectionId(1),754			account(1)755		));756		assert_ok!(Unique::add_to_allow_list(757			origin1.clone(),758			CollectionId(1),759			account(2)760		));761		assert_ok!(Unique::add_to_allow_list(762			origin1.clone(),763			CollectionId(1),764			account(3)765		));766767		// Account 1 approves account 2 for NFT 1768		assert_ok!(Unique::approve(769			origin1.clone(),770			account(2),771			CollectionId(1),772			TokenId(1),773			1774		));775		assert_eq!(776			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),777			account(2)778		);779780		// Account 2 transfers NFT 1 from account 1 to account 3781		assert_ok!(Unique::transfer_from(782			origin2,783			account(1),784			account(3),785			CollectionId(1),786			TokenId(1),787			1788		));789		assert!(790			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()791		);792	});793}794795#[test]796fn refungible_approve_and_transfer_from() {797	new_test_ext().execute_with(|| {798		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));799800		let origin1 = RuntimeOrigin::signed(1);801		let origin2 = RuntimeOrigin::signed(2);802803		// Create RFT 1 in 1023 pieces for account 1804		let data = default_re_fungible_data();805		create_test_item(collection_id, &data.into());806807		assert_eq!(808			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),809			1810		);811		assert_eq!(812			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),813			1023814		);815		assert_eq!(816			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),817			true818		);819820		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list821		assert_ok!(Unique::set_collection_permissions(822			origin1.clone(),823			CollectionId(1),824			CollectionPermissions {825				mint_mode: Some(true),826				access: Some(AccessMode::AllowList),827				nesting: None,828			}829		));830		assert_ok!(Unique::add_to_allow_list(831			origin1.clone(),832			CollectionId(1),833			account(1)834		));835		assert_ok!(Unique::add_to_allow_list(836			origin1.clone(),837			CollectionId(1),838			account(2)839		));840		assert_ok!(Unique::add_to_allow_list(841			origin1.clone(),842			CollectionId(1),843			account(3)844		));845846		// Account 1 approves account 2 for 1023 pieces of RFT 1847		assert_ok!(Unique::approve(848			origin1,849			account(2),850			CollectionId(1),851			TokenId(1),852			1023853		));854		assert_eq!(855			<pallet_refungible::Allowance<Test>>::get((856				CollectionId(1),857				TokenId(1),858				account(1),859				account(2)860			)),861			1023862		);863864		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3865		assert_ok!(Unique::transfer_from(866			origin2,867			account(1),868			account(3),869			CollectionId(1),870			TokenId(1),871			100872		));873		assert_eq!(874			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),875			1876		);877		assert_eq!(878			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),879			1880		);881		assert_eq!(882			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),883			923884		);885		assert_eq!(886			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),887			100888		);889		assert_eq!(890			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),891			true892		);893		assert_eq!(894			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),895			true896		);897		assert_eq!(898			<pallet_refungible::Allowance<Test>>::get((899				CollectionId(1),900				TokenId(1),901				account(1),902				account(2)903			)),904			923905		);906	});907}908909#[test]910fn fungible_approve_and_transfer_from() {911	new_test_ext().execute_with(|| {912		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));913914		let data = default_fungible_data();915		create_test_item(collection_id, &data.into());916917		let origin1 = RuntimeOrigin::signed(1);918		let origin2 = RuntimeOrigin::signed(2);919920		assert_ok!(Unique::set_collection_permissions(921			origin1.clone(),922			CollectionId(1),923			CollectionPermissions {924				mint_mode: Some(true),925				access: Some(AccessMode::AllowList),926				nesting: None,927			}928		));929		assert_ok!(Unique::add_to_allow_list(930			origin1.clone(),931			CollectionId(1),932			account(1)933		));934		assert_ok!(Unique::add_to_allow_list(935			origin1.clone(),936			CollectionId(1),937			account(2)938		));939		assert_ok!(Unique::add_to_allow_list(940			origin1.clone(),941			CollectionId(1),942			account(3)943		));944945		// do approve946		assert_ok!(Unique::approve(947			origin1.clone(),948			account(2),949			CollectionId(1),950			TokenId(0),951			5952		));953		assert_eq!(954			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),955			5956		);957		assert_ok!(Unique::approve(958			origin1,959			account(3),960			CollectionId(1),961			TokenId(0),962			5963		));964		assert_eq!(965			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),966			5967		);968		assert_eq!(969			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),970			5971		);972973		assert_ok!(Unique::transfer_from(974			origin2.clone(),975			account(1),976			account(3),977			CollectionId(1),978			TokenId(0),979			4980		));981982		assert_eq!(983			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),984			1985		);986987		assert_noop!(988			Unique::transfer_from(989				origin2,990				account(1),991				account(3),992				CollectionId(1),993				TokenId(0),994				4995			)996			.map_err(|e| e.error),997			CommonError::<Test>::ApprovedValueTooLow998		);999	});1000}10011002#[test]1003fn change_collection_owner() {1004	new_test_ext().execute_with(|| {1005		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10061007		let origin1 = RuntimeOrigin::signed(1);1008		assert_ok!(Unique::change_collection_owner(origin1, collection_id, 2));1009		assert_eq!(1010			<pallet_common::CollectionById<Test>>::get(collection_id)1011				.unwrap()1012				.owner,1013			21014		);1015	});1016}10171018#[test]1019fn destroy_collection() {1020	new_test_ext().execute_with(|| {1021		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10221023		let origin1 = RuntimeOrigin::signed(1);1024		assert_ok!(Unique::destroy_collection(origin1, collection_id));1025	});1026}10271028#[test]1029fn burn_nft_item() {1030	new_test_ext().execute_with(|| {1031		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10321033		let origin1 = RuntimeOrigin::signed(1);10341035		let data = default_nft_data();1036		create_test_item(collection_id, &data.into());10371038		// check balance (collection with id = 1, user id = 1)1039		assert_eq!(1040			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1041			11042		);10431044		// burn item1045		assert_ok!(Unique::burn_item(1046			origin1.clone(),1047			collection_id,1048			TokenId(1),1049			11050		));1051		assert_eq!(1052			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1053			01054		);1055	});1056}10571058#[test]1059fn burn_same_nft_item_twice() {1060	new_test_ext().execute_with(|| {1061		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10621063		let origin1 = RuntimeOrigin::signed(1);10641065		let data = default_nft_data();1066		create_test_item(collection_id, &data.into());10671068		// check balance (collection with id = 1, user id = 1)1069		assert_eq!(1070			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1071			11072		);10731074		// burn item1075		assert_ok!(Unique::burn_item(1076			origin1.clone(),1077			collection_id,1078			TokenId(1),1079			11080		));10811082		// burn item again1083		assert_noop!(1084			Unique::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1085			CommonError::<Test>::TokenNotFound1086		);10871088		assert_eq!(1089			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1090			01091		);1092	});1093}10941095#[test]1096fn burn_fungible_item() {1097	new_test_ext().execute_with(|| {1098		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10991100		let origin1 = RuntimeOrigin::signed(1);1101		assert_ok!(Unique::add_collection_admin(1102			origin1.clone(),1103			collection_id,1104			account(2)1105		));11061107		let data = default_fungible_data();1108		create_test_item(collection_id, &data.into());11091110		// check balance (collection with id = 1, user id = 1)1111		assert_eq!(1112			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1113			51114		);11151116		// burn item1117		assert_ok!(Unique::burn_item(1118			origin1.clone(),1119			CollectionId(1),1120			TokenId(0),1121			51122		));1123		assert_noop!(1124			Unique::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1125			CommonError::<Test>::TokenValueTooLow1126		);11271128		assert_eq!(1129			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1130			01131		);1132	});1133}11341135#[test]1136fn burn_fungible_item_with_token_id() {1137	new_test_ext().execute_with(|| {1138		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));11391140		let origin1 = RuntimeOrigin::signed(1);1141		assert_ok!(Unique::add_collection_admin(1142			origin1.clone(),1143			collection_id,1144			account(2)1145		));11461147		let data = default_fungible_data();1148		create_test_item(collection_id, &data.into());11491150		// check balance (collection with id = 1, user id = 1)1151		assert_eq!(1152			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1153			51154		);11551156		// Try to burn item using Token ID1157		assert_noop!(1158			Unique::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1159			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1160		);1161	});1162}1163#[test]1164fn burn_refungible_item() {1165	new_test_ext().execute_with(|| {1166		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1167		let origin1 = RuntimeOrigin::signed(1);11681169		assert_ok!(Unique::set_collection_permissions(1170			origin1.clone(),1171			collection_id,1172			CollectionPermissions {1173				mint_mode: Some(true),1174				access: Some(AccessMode::AllowList),1175				nesting: None,1176			}1177		));1178		assert_ok!(Unique::add_to_allow_list(1179			origin1.clone(),1180			collection_id,1181			account(1)1182		));11831184		assert_ok!(Unique::add_collection_admin(1185			origin1.clone(),1186			collection_id,1187			account(2)1188		));11891190		let data = default_re_fungible_data();1191		create_test_item(collection_id, &data.into());11921193		// check balance (collection with id = 1, user id = 2)1194		assert_eq!(1195			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1196			11197		);1198		assert_eq!(1199			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1200			10231201		);12021203		// burn item1204		assert_ok!(Unique::burn_item(1205			origin1.clone(),1206			collection_id,1207			TokenId(1),1208			10231209		));1210		assert_noop!(1211			Unique::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),1212			CommonError::<Test>::TokenValueTooLow1213		);12141215		assert_eq!(1216			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1217			01218		);1219	});1220}12211222#[test]1223fn add_collection_admin() {1224	new_test_ext().execute_with(|| {1225		let collection1_id =1226			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1227		let origin1 = RuntimeOrigin::signed(1);12281229		// Add collection admins1230		assert_ok!(Unique::add_collection_admin(1231			origin1.clone(),1232			collection1_id,1233			account(2)1234		));1235		assert_ok!(Unique::add_collection_admin(1236			origin1,1237			collection1_id,1238			account(3)1239		));12401241		// Owner is not an admin by default1242		assert_eq!(1243			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1244			false1245		);1246		assert!(<pallet_common::IsAdmin<Test>>::get((1247			CollectionId(1),1248			account(2)1249		)));1250		assert!(<pallet_common::IsAdmin<Test>>::get((1251			CollectionId(1),1252			account(3)1253		)));1254	});1255}12561257#[test]1258fn remove_collection_admin() {1259	new_test_ext().execute_with(|| {1260		let collection1_id =1261			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1262		let origin1 = RuntimeOrigin::signed(1);12631264		// Add collection admins 2 and 31265		assert_ok!(Unique::add_collection_admin(1266			origin1.clone(),1267			collection1_id,1268			account(2)1269		));1270		assert_ok!(Unique::add_collection_admin(1271			origin1.clone(),1272			collection1_id,1273			account(3)1274		));12751276		assert!(<pallet_common::IsAdmin<Test>>::get((1277			CollectionId(1),1278			account(2)1279		)));1280		assert!(<pallet_common::IsAdmin<Test>>::get((1281			CollectionId(1),1282			account(3)1283		)));12841285		// remove admin 31286		assert_ok!(Unique::remove_collection_admin(1287			origin1,1288			CollectionId(1),1289			account(3)1290		));12911292		// 2 is still admin, 3 is not an admin anymore1293		assert!(<pallet_common::IsAdmin<Test>>::get((1294			CollectionId(1),1295			account(2)1296		)));1297		assert_eq!(1298			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1299			false1300		);1301	});1302}13031304#[test]1305fn balance_of() {1306	new_test_ext().execute_with(|| {1307		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1308		let fungible_collection_id =1309			create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1310		let re_fungible_collection_id =1311			create_test_collection(&CollectionMode::ReFungible, CollectionId(3));13121313		// check balance before1314		assert_eq!(1315			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1316			01317		);1318		assert_eq!(1319			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1320			01321		);1322		assert_eq!(1323			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1324			01325		);13261327		let nft_data = default_nft_data();1328		create_test_item(nft_collection_id, &nft_data.into());13291330		let fungible_data = default_fungible_data();1331		create_test_item(fungible_collection_id, &fungible_data.into());13321333		let re_fungible_data = default_re_fungible_data();1334		create_test_item(re_fungible_collection_id, &re_fungible_data.into());13351336		// check balance (collection with id = 1, user id = 1)1337		assert_eq!(1338			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1339			11340		);1341		assert_eq!(1342			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1343			51344		);1345		assert_eq!(1346			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1347			11348		);13491350		assert_eq!(1351			<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1352			true1353		);1354		assert_eq!(1355			<pallet_refungible::Owned<Test>>::get((1356				re_fungible_collection_id,1357				account(1),1358				TokenId(1)1359			)),1360			true1361		);1362	});1363}13641365#[test]1366fn approve() {1367	new_test_ext().execute_with(|| {1368		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13691370		let data = default_nft_data();1371		create_test_item(collection_id, &data.into());13721373		let origin1 = RuntimeOrigin::signed(1);13741375		// approve1376		assert_ok!(Unique::approve(1377			origin1,1378			account(2),1379			CollectionId(1),1380			TokenId(1),1381			11382		));1383		assert_eq!(1384			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1385			account(2)1386		);1387	});1388}13891390#[test]1391fn transfer_from() {1392	new_test_ext().execute_with(|| {1393		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1394		let origin1 = RuntimeOrigin::signed(1);1395		let origin2 = RuntimeOrigin::signed(2);13961397		let data = default_nft_data();1398		create_test_item(collection_id, &data.into());13991400		// approve1401		assert_ok!(Unique::approve(1402			origin1.clone(),1403			account(2),1404			CollectionId(1),1405			TokenId(1),1406			11407		));1408		assert_eq!(1409			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1410			account(2)1411		);14121413		assert_ok!(Unique::set_collection_permissions(1414			origin1.clone(),1415			CollectionId(1),1416			CollectionPermissions {1417				mint_mode: Some(true),1418				access: Some(AccessMode::AllowList),1419				nesting: None,1420			}1421		));1422		assert_ok!(Unique::add_to_allow_list(1423			origin1.clone(),1424			CollectionId(1),1425			account(1)1426		));1427		assert_ok!(Unique::add_to_allow_list(1428			origin1.clone(),1429			CollectionId(1),1430			account(2)1431		));1432		assert_ok!(Unique::add_to_allow_list(1433			origin1,1434			CollectionId(1),1435			account(3)1436		));14371438		assert_ok!(Unique::transfer_from(1439			origin2,1440			account(1),1441			account(2),1442			CollectionId(1),1443			TokenId(1),1444			11445		));14461447		// after transfer1448		assert_eq!(1449			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1450			01451		);1452		assert_eq!(1453			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1454			11455		);1456	});1457}14581459// #endregion14601461// Coverage tests region1462// #region14631464#[test]1465fn owner_can_add_address_to_allow_list() {1466	new_test_ext().execute_with(|| {1467		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14681469		let origin1 = RuntimeOrigin::signed(1);1470		assert_ok!(Unique::add_to_allow_list(1471			origin1,1472			collection_id,1473			account(2)1474		));1475		assert!(<pallet_common::Allowlist<Test>>::get((1476			collection_id,1477			account(2)1478		)));1479	});1480}14811482#[test]1483fn admin_can_add_address_to_allow_list() {1484	new_test_ext().execute_with(|| {1485		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1486		let origin1 = RuntimeOrigin::signed(1);1487		let origin2 = RuntimeOrigin::signed(2);14881489		assert_ok!(Unique::add_collection_admin(1490			origin1,1491			collection_id,1492			account(2)1493		));1494		assert_ok!(Unique::add_to_allow_list(1495			origin2,1496			collection_id,1497			account(3)1498		));1499		assert!(<pallet_common::Allowlist<Test>>::get((1500			collection_id,1501			account(3)1502		)));1503	});1504}15051506#[test]1507fn nonprivileged_user_cannot_add_address_to_allow_list() {1508	new_test_ext().execute_with(|| {1509		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15101511		let origin2 = RuntimeOrigin::signed(2);1512		assert_noop!(1513			Unique::add_to_allow_list(origin2, collection_id, account(3)),1514			CommonError::<Test>::NoPermission1515		);1516	});1517}15181519#[test]1520fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1521	new_test_ext().execute_with(|| {1522		let origin1 = RuntimeOrigin::signed(1);15231524		assert_noop!(1525			Unique::add_to_allow_list(origin1, CollectionId(1), account(2)),1526			CommonError::<Test>::CollectionNotFound1527		);1528	});1529}15301531#[test]1532fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1533	new_test_ext().execute_with(|| {1534		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15351536		let origin1 = RuntimeOrigin::signed(1);1537		assert_ok!(Unique::destroy_collection(origin1.clone(), collection_id));1538		assert_noop!(1539			Unique::add_to_allow_list(origin1, collection_id, account(2)),1540			CommonError::<Test>::CollectionNotFound1541		);1542	});1543}15441545// If address is already added to allow list, nothing happens1546#[test]1547fn address_is_already_added_to_allow_list() {1548	new_test_ext().execute_with(|| {1549		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1550		let origin1 = RuntimeOrigin::signed(1);15511552		assert_ok!(Unique::add_to_allow_list(1553			origin1.clone(),1554			collection_id,1555			account(2)1556		));1557		assert_ok!(Unique::add_to_allow_list(1558			origin1,1559			collection_id,1560			account(2)1561		));1562		assert!(<pallet_common::Allowlist<Test>>::get((1563			collection_id,1564			account(2)1565		)));1566	});1567}15681569#[test]1570fn owner_can_remove_address_from_allow_list() {1571	new_test_ext().execute_with(|| {1572		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15731574		let origin1 = RuntimeOrigin::signed(1);1575		assert_ok!(Unique::add_to_allow_list(1576			origin1.clone(),1577			collection_id,1578			account(2)1579		));1580		assert_ok!(Unique::remove_from_allow_list(1581			origin1,1582			collection_id,1583			account(2)1584		));1585		assert_eq!(1586			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1587			false1588		);1589	});1590}15911592#[test]1593fn admin_can_remove_address_from_allow_list() {1594	new_test_ext().execute_with(|| {1595		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1596		let origin1 = RuntimeOrigin::signed(1);1597		let origin2 = RuntimeOrigin::signed(2);15981599		// Owner adds admin1600		assert_ok!(Unique::add_collection_admin(1601			origin1.clone(),1602			collection_id,1603			account(2)1604		));16051606		// Owner adds address 3 to allow list1607		assert_ok!(Unique::add_to_allow_list(1608			origin1,1609			collection_id,1610			account(3)1611		));16121613		// Admin removes address 3 from allow list1614		assert_ok!(Unique::remove_from_allow_list(1615			origin2,1616			collection_id,1617			account(3)1618		));1619		assert_eq!(1620			<pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1621			false1622		);1623	});1624}16251626#[test]1627fn nonprivileged_user_cannot_remove_address_from_allow_list() {1628	new_test_ext().execute_with(|| {1629		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1630		let origin1 = RuntimeOrigin::signed(1);1631		let origin2 = RuntimeOrigin::signed(2);16321633		assert_ok!(Unique::add_to_allow_list(1634			origin1,1635			collection_id,1636			account(2)1637		));1638		assert_noop!(1639			Unique::remove_from_allow_list(origin2, collection_id, account(2)),1640			CommonError::<Test>::NoPermission1641		);1642		assert!(<pallet_common::Allowlist<Test>>::get((1643			collection_id,1644			account(2)1645		)));1646	});1647}16481649#[test]1650fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1651	new_test_ext().execute_with(|| {1652		let origin1 = RuntimeOrigin::signed(1);16531654		assert_noop!(1655			Unique::remove_from_allow_list(origin1, CollectionId(1), account(2)),1656			CommonError::<Test>::CollectionNotFound1657		);1658	});1659}16601661#[test]1662fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1663	new_test_ext().execute_with(|| {1664		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1665		let origin1 = RuntimeOrigin::signed(1);1666		let origin2 = RuntimeOrigin::signed(2);16671668		// Add account 2 to allow list1669		assert_ok!(Unique::add_to_allow_list(1670			origin1.clone(),1671			collection_id,1672			account(2)1673		));16741675		// Account 2 is in collection allow-list1676		assert!(<pallet_common::Allowlist<Test>>::get((1677			collection_id,1678			account(2)1679		)));16801681		// Destroy collection1682		assert_ok!(Unique::destroy_collection(origin1, collection_id));16831684		// Attempt to remove account 2 from collection allow-list => error1685		assert_noop!(1686			Unique::remove_from_allow_list(origin2, collection_id, account(2)),1687			CommonError::<Test>::CollectionNotFound1688		);16891690		// Account 2 is not found in collection allow-list anyway1691		assert_eq!(1692			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1693			false1694		);1695	});1696}16971698// If address is already removed from allow list, nothing happens1699#[test]1700fn address_is_already_removed_from_allow_list() {1701	new_test_ext().execute_with(|| {1702		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1703		let origin1 = RuntimeOrigin::signed(1);17041705		assert_ok!(Unique::add_to_allow_list(1706			origin1.clone(),1707			collection_id,1708			account(2)1709		));1710		assert_ok!(Unique::remove_from_allow_list(1711			origin1.clone(),1712			collection_id,1713			account(2)1714		));1715		assert_eq!(1716			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1717			false1718		);1719		assert_ok!(Unique::remove_from_allow_list(1720			origin1,1721			collection_id,1722			account(2)1723		));1724		assert_eq!(1725			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1726			false1727		);1728	});1729}17301731// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1732#[test]1733fn allow_list_test_1() {1734	new_test_ext().execute_with(|| {1735		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17361737		let origin1 = RuntimeOrigin::signed(1);17381739		let data = default_nft_data();1740		create_test_item(collection_id, &data.into());17411742		assert_ok!(Unique::set_collection_permissions(1743			origin1.clone(),1744			collection_id,1745			CollectionPermissions {1746				mint_mode: None,1747				access: Some(AccessMode::AllowList),1748				nesting: None,1749			}1750		));1751		assert_ok!(Unique::add_to_allow_list(1752			origin1.clone(),1753			collection_id,1754			account(2)1755		));17561757		assert_noop!(1758			Unique::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1759				.map_err(|e| e.error),1760			CommonError::<Test>::AddressNotInAllowlist1761		);1762	});1763}17641765#[test]1766fn allow_list_test_2() {1767	new_test_ext().execute_with(|| {1768		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1769		let origin1 = RuntimeOrigin::signed(1);17701771		let data = default_nft_data();1772		create_test_item(collection_id, &data.into());17731774		assert_ok!(Unique::set_collection_permissions(1775			origin1.clone(),1776			collection_id,1777			CollectionPermissions {1778				mint_mode: None,1779				access: Some(AccessMode::AllowList),1780				nesting: None,1781			}1782		));1783		assert_ok!(Unique::add_to_allow_list(1784			origin1.clone(),1785			collection_id,1786			account(1)1787		));1788		assert_ok!(Unique::add_to_allow_list(1789			origin1.clone(),1790			collection_id,1791			account(2)1792		));17931794		// do approve1795		assert_ok!(Unique::approve(1796			origin1.clone(),1797			account(1),1798			collection_id,1799			TokenId(1),1800			11801		));1802		assert_eq!(1803			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1804			account(1)1805		);18061807		assert_ok!(Unique::remove_from_allow_list(1808			origin1.clone(),1809			collection_id,1810			account(1)1811		));18121813		assert_noop!(1814			Unique::transfer_from(1815				origin1,1816				account(1),1817				account(3),1818				CollectionId(1),1819				TokenId(1),1820				11821			)1822			.map_err(|e| e.error),1823			CommonError::<Test>::AddressNotInAllowlist1824		);1825	});1826}18271828// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1829#[test]1830fn allow_list_test_3() {1831	new_test_ext().execute_with(|| {1832		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18331834		let origin1 = RuntimeOrigin::signed(1);18351836		let data = default_nft_data();1837		create_test_item(collection_id, &data.into());18381839		assert_ok!(Unique::set_collection_permissions(1840			origin1.clone(),1841			collection_id,1842			CollectionPermissions {1843				mint_mode: None,1844				access: Some(AccessMode::AllowList),1845				nesting: None,1846			}1847		));1848		assert_ok!(Unique::add_to_allow_list(1849			origin1.clone(),1850			collection_id,1851			account(1)1852		));18531854		assert_noop!(1855			Unique::transfer(origin1, account(3), collection_id, TokenId(1), 1)1856				.map_err(|e| e.error),1857			CommonError::<Test>::AddressNotInAllowlist1858		);1859	});1860}18611862#[test]1863fn allow_list_test_4() {1864	new_test_ext().execute_with(|| {1865		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18661867		let origin1 = RuntimeOrigin::signed(1);18681869		let data = default_nft_data();1870		create_test_item(collection_id, &data.into());18711872		assert_ok!(Unique::set_collection_permissions(1873			origin1.clone(),1874			collection_id,1875			CollectionPermissions {1876				mint_mode: None,1877				access: Some(AccessMode::AllowList),1878				nesting: None,1879			}1880		));1881		assert_ok!(Unique::add_to_allow_list(1882			origin1.clone(),1883			collection_id,1884			account(1)1885		));1886		assert_ok!(Unique::add_to_allow_list(1887			origin1.clone(),1888			collection_id,1889			account(2)1890		));18911892		// do approve1893		assert_ok!(Unique::approve(1894			origin1.clone(),1895			account(1),1896			collection_id,1897			TokenId(1),1898			11899		));1900		assert_eq!(1901			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1902			account(1)1903		);19041905		assert_ok!(Unique::remove_from_allow_list(1906			origin1.clone(),1907			collection_id,1908			account(2)1909		));19101911		assert_noop!(1912			Unique::transfer_from(1913				origin1,1914				account(1),1915				account(3),1916				collection_id,1917				TokenId(1),1918				11919			)1920			.map_err(|e| e.error),1921			CommonError::<Test>::AddressNotInAllowlist1922		);1923	});1924}19251926// 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)1927#[test]1928fn allow_list_test_5() {1929	new_test_ext().execute_with(|| {1930		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19311932		let origin1 = RuntimeOrigin::signed(1);19331934		let data = default_nft_data();1935		create_test_item(collection_id, &data.into());19361937		assert_ok!(Unique::set_collection_permissions(1938			origin1.clone(),1939			collection_id,1940			CollectionPermissions {1941				mint_mode: None,1942				access: Some(AccessMode::AllowList),1943				nesting: None,1944			}1945		));1946		assert_noop!(1947			Unique::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1948			CommonError::<Test>::AddressNotInAllowlist1949		);1950	});1951}19521953// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1954#[test]1955fn allow_list_test_6() {1956	new_test_ext().execute_with(|| {1957		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19581959		let origin1 = RuntimeOrigin::signed(1);19601961		let data = default_nft_data();1962		create_test_item(collection_id, &data.into());19631964		assert_ok!(Unique::set_collection_permissions(1965			origin1.clone(),1966			collection_id,1967			CollectionPermissions {1968				mint_mode: None,1969				access: Some(AccessMode::AllowList),1970				nesting: None,1971			}1972		));19731974		// do approve1975		assert_noop!(1976			Unique::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1977				.map_err(|e| e.error),1978			CommonError::<Test>::AddressNotInAllowlist1979		);1980	});1981}19821983// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1984//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1985#[test]1986fn allow_list_test_7() {1987	new_test_ext().execute_with(|| {1988		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19891990		let data = default_nft_data();1991		create_test_item(collection_id, &data.into());19921993		let origin1 = RuntimeOrigin::signed(1);19941995		assert_ok!(Unique::set_collection_permissions(1996			origin1.clone(),1997			collection_id,1998			CollectionPermissions {1999				mint_mode: None,2000				access: Some(AccessMode::AllowList),2001				nesting: None,2002			}2003		));2004		assert_ok!(Unique::add_to_allow_list(2005			origin1.clone(),2006			collection_id,2007			account(1)2008		));2009		assert_ok!(Unique::add_to_allow_list(2010			origin1.clone(),2011			collection_id,2012			account(2)2013		));20142015		assert_ok!(Unique::transfer(2016			origin1,2017			account(2),2018			CollectionId(1),2019			TokenId(1),2020			12021		));2022	});2023}20242025#[test]2026fn allow_list_test_8() {2027	new_test_ext().execute_with(|| {2028		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20292030		// Create NFT for account 12031		let data = default_nft_data();2032		create_test_item(collection_id, &data.into());20332034		let origin1 = RuntimeOrigin::signed(1);20352036		// Toggle Allow List mode and add accounts 1 and 22037		assert_ok!(Unique::set_collection_permissions(2038			origin1.clone(),2039			collection_id,2040			CollectionPermissions {2041				mint_mode: None,2042				access: Some(AccessMode::AllowList),2043				nesting: None,2044			}2045		));2046		assert_ok!(Unique::add_to_allow_list(2047			origin1.clone(),2048			collection_id,2049			account(1)2050		));2051		assert_ok!(Unique::add_to_allow_list(2052			origin1.clone(),2053			collection_id,2054			account(2)2055		));20562057		// Sself-approve account 1 for NFT 12058		assert_ok!(Unique::approve(2059			origin1.clone(),2060			account(1),2061			CollectionId(1),2062			TokenId(1),2063			12064		));2065		assert_eq!(2066			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),2067			account(1)2068		);20692070		// Transfer from 1 to 22071		assert_ok!(Unique::transfer_from(2072			origin1,2073			account(1),2074			account(2),2075			CollectionId(1),2076			TokenId(1),2077			12078		));2079	});2080}20812082// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.2083#[test]2084fn allow_list_test_9() {2085	new_test_ext().execute_with(|| {2086		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2087		let origin1 = RuntimeOrigin::signed(1);20882089		assert_ok!(Unique::set_collection_permissions(2090			origin1.clone(),2091			collection_id,2092			CollectionPermissions {2093				mint_mode: Some(false),2094				access: Some(AccessMode::AllowList),2095				nesting: None,2096			}2097		));20982099		let data = default_nft_data();2100		create_test_item(collection_id, &data.into());2101	});2102}21032104// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2105#[test]2106fn allow_list_test_10() {2107	new_test_ext().execute_with(|| {2108		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21092110		let origin1 = RuntimeOrigin::signed(1);2111		let origin2 = RuntimeOrigin::signed(2);21122113		assert_ok!(Unique::set_collection_permissions(2114			origin1.clone(),2115			collection_id,2116			CollectionPermissions {2117				mint_mode: Some(false),2118				access: Some(AccessMode::AllowList),2119				nesting: None,2120			}2121		));21222123		assert_ok!(Unique::add_collection_admin(2124			origin1,2125			collection_id,2126			account(2)2127		));21282129		assert_ok!(Unique::create_item(2130			origin2,2131			collection_id,2132			account(2),2133			default_nft_data().into()2134		));2135	});2136}21372138// 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.2139#[test]2140fn allow_list_test_11() {2141	new_test_ext().execute_with(|| {2142		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21432144		let origin1 = RuntimeOrigin::signed(1);2145		let origin2 = RuntimeOrigin::signed(2);21462147		assert_ok!(Unique::set_collection_permissions(2148			origin1.clone(),2149			collection_id,2150			CollectionPermissions {2151				mint_mode: Some(false),2152				access: Some(AccessMode::AllowList),2153				nesting: None,2154			}2155		));2156		assert_ok!(Unique::add_to_allow_list(2157			origin1,2158			collection_id,2159			account(2)2160		));21612162		assert_noop!(2163			Unique::create_item(2164				origin2,2165				CollectionId(1),2166				account(2),2167				default_nft_data().into()2168			)2169			.map_err(|e| e.error),2170			CommonError::<Test>::PublicMintingNotAllowed2171		);2172	});2173}21742175// 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.2176#[test]2177fn allow_list_test_12() {2178	new_test_ext().execute_with(|| {2179		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21802181		let origin1 = RuntimeOrigin::signed(1);2182		let origin2 = RuntimeOrigin::signed(2);21832184		assert_ok!(Unique::set_collection_permissions(2185			origin1.clone(),2186			collection_id,2187			CollectionPermissions {2188				mint_mode: Some(false),2189				access: Some(AccessMode::AllowList),2190				nesting: None,2191			}2192		));21932194		assert_noop!(2195			Unique::create_item(2196				origin2,2197				CollectionId(1),2198				account(2),2199				default_nft_data().into()2200			)2201			.map_err(|e| e.error),2202			CommonError::<Test>::PublicMintingNotAllowed2203		);2204	});2205}22062207// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2208#[test]2209fn allow_list_test_13() {2210	new_test_ext().execute_with(|| {2211		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22122213		let origin1 = RuntimeOrigin::signed(1);22142215		assert_ok!(Unique::set_collection_permissions(2216			origin1.clone(),2217			collection_id,2218			CollectionPermissions {2219				mint_mode: Some(true),2220				access: Some(AccessMode::AllowList),2221				nesting: None,2222			}2223		));22242225		let data = default_nft_data();2226		create_test_item(collection_id, &data.into());2227	});2228}22292230// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2231#[test]2232fn allow_list_test_14() {2233	new_test_ext().execute_with(|| {2234		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22352236		let origin1 = RuntimeOrigin::signed(1);2237		let origin2 = RuntimeOrigin::signed(2);22382239		assert_ok!(Unique::set_collection_permissions(2240			origin1.clone(),2241			collection_id,2242			CollectionPermissions {2243				mint_mode: Some(true),2244				access: Some(AccessMode::AllowList),2245				nesting: None,2246			}2247		));22482249		assert_ok!(Unique::add_collection_admin(2250			origin1,2251			collection_id,2252			account(2)2253		));22542255		assert_ok!(Unique::create_item(2256			origin2,2257			collection_id,2258			account(2),2259			default_nft_data().into()2260		));2261	});2262}22632264// 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.2265#[test]2266fn allow_list_test_15() {2267	new_test_ext().execute_with(|| {2268		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22692270		let origin1 = RuntimeOrigin::signed(1);2271		let origin2 = RuntimeOrigin::signed(2);22722273		assert_ok!(Unique::set_collection_permissions(2274			origin1.clone(),2275			collection_id,2276			CollectionPermissions {2277				mint_mode: Some(true),2278				access: Some(AccessMode::AllowList),2279				nesting: None,2280			}2281		));22822283		assert_noop!(2284			Unique::create_item(2285				origin2,2286				collection_id,2287				account(2),2288				default_nft_data().into()2289			)2290			.map_err(|e| e.error),2291			CommonError::<Test>::AddressNotInAllowlist2292		);2293	});2294}22952296// 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.2297#[test]2298fn allow_list_test_16() {2299	new_test_ext().execute_with(|| {2300		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23012302		let origin1 = RuntimeOrigin::signed(1);2303		let origin2 = RuntimeOrigin::signed(2);23042305		assert_ok!(Unique::set_collection_permissions(2306			origin1.clone(),2307			collection_id,2308			CollectionPermissions {2309				mint_mode: Some(true),2310				access: Some(AccessMode::AllowList),2311				nesting: None,2312			}2313		));2314		assert_ok!(Unique::add_to_allow_list(2315			origin1,2316			collection_id,2317			account(2)2318		));23192320		assert_ok!(Unique::create_item(2321			origin2,2322			collection_id,2323			account(2),2324			default_nft_data().into()2325		));2326	});2327}23282329// Total number of collections. Positive test2330#[test]2331fn total_number_collections_bound() {2332	new_test_ext().execute_with(|| {2333		create_test_collection(&CollectionMode::NFT, CollectionId(1));2334	});2335}23362337#[test]2338fn create_max_collections() {2339	new_test_ext().execute_with(|| {2340		for i in 1..COLLECTION_NUMBER_LIMIT {2341			create_test_collection(&CollectionMode::NFT, CollectionId(i));2342		}2343	});2344}23452346// Total number of collections. Negative test2347#[test]2348fn total_number_collections_bound_neg() {2349	new_test_ext().execute_with(|| {2350		let origin1 = RuntimeOrigin::signed(1);23512352		for i in 1..=COLLECTION_NUMBER_LIMIT {2353			create_test_collection(&CollectionMode::NFT, CollectionId(i));2354		}23552356		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2357		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2358		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();23592360		let data: CreateCollectionData<u64> = CreateCollectionData {2361			name: col_name1.try_into().unwrap(),2362			description: col_desc1.try_into().unwrap(),2363			token_prefix: token_prefix1.try_into().unwrap(),2364			mode: CollectionMode::NFT,2365			..Default::default()2366		};23672368		// 11-th collection in chain. Expects error2369		assert_noop!(2370			Unique::create_collection_ex(origin1, data),2371			CommonError::<Test>::TotalCollectionsLimitExceeded2372		);2373	});2374}23752376// Owned tokens by a single address. Positive test2377#[test]2378fn owned_tokens_bound() {2379	new_test_ext().execute_with(|| {2380		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23812382		let data = default_nft_data();2383		create_test_item(collection_id, &data.clone().into());2384		create_test_item(collection_id, &data.into());2385	});2386}23872388// Owned tokens by a single address. Negotive test2389#[test]2390fn owned_tokens_bound_neg() {2391	new_test_ext().execute_with(|| {2392		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23932394		let origin1 = RuntimeOrigin::signed(1);23952396		for _ in 1..=MAX_TOKEN_OWNERSHIP {2397			let data = default_nft_data();2398			create_test_item(collection_id, &data.clone().into());2399		}24002401		let data = default_nft_data();2402		assert_noop!(2403			Unique::create_item(origin1, CollectionId(1), account(1), data.into())2404				.map_err(|e| e.error),2405			CommonError::<Test>::AccountTokenLimitExceeded2406		);2407	});2408}24092410// Number of collection admins. Positive test2411#[test]2412fn collection_admins_bound() {2413	new_test_ext().execute_with(|| {2414		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24152416		let origin1 = RuntimeOrigin::signed(1);24172418		assert_ok!(Unique::add_collection_admin(2419			origin1.clone(),2420			collection_id,2421			account(2)2422		));2423		assert_ok!(Unique::add_collection_admin(2424			origin1,2425			collection_id,2426			account(3)2427		));2428	});2429}24302431// Number of collection admins. Negotive test2432#[test]2433fn collection_admins_bound_neg() {2434	new_test_ext().execute_with(|| {2435		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24362437		let origin1 = RuntimeOrigin::signed(1);24382439		for i in 0..COLLECTION_ADMINS_LIMIT {2440			assert_ok!(Unique::add_collection_admin(2441				origin1.clone(),2442				collection_id,2443				account((2 + i).into())2444			));2445		}2446		assert_noop!(2447			Unique::add_collection_admin(2448				origin1,2449				collection_id,2450				account((3 + COLLECTION_ADMINS_LIMIT).into())2451			),2452			CommonError::<Test>::CollectionAdminCountExceeded2453		);2454	});2455}2456// #endregion24572458#[test]2459fn collection_transfer_flag_works() {2460	new_test_ext().execute_with(|| {2461		let origin1 = RuntimeOrigin::signed(1);24622463		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2464		assert_ok!(Unique::set_transfers_enabled_flag(2465			origin1,2466			collection_id,2467			true2468		));24692470		let data = default_nft_data();2471		create_test_item(collection_id, &data.into());2472		assert_eq!(2473			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2474			12475		);2476		assert_eq!(2477			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2478			true2479		);24802481		let origin1 = RuntimeOrigin::signed(1);24822483		// default scenario2484		assert_ok!(Unique::transfer(2485			origin1,2486			account(2),2487			collection_id,2488			TokenId(1),2489			12490		));2491		assert_eq!(2492			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2493			false2494		);2495		assert_eq!(2496			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2497			true2498		);2499		assert_eq!(2500			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2501			02502		);2503		assert_eq!(2504			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2505			12506		);2507	});2508}25092510#[test]2511fn collection_transfer_flag_works_neg() {2512	new_test_ext().execute_with(|| {2513		let origin1 = RuntimeOrigin::signed(1);25142515		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2516		assert_ok!(Unique::set_transfers_enabled_flag(2517			origin1,2518			collection_id,2519			false2520		));25212522		let data = default_nft_data();2523		create_test_item(collection_id, &data.into());2524		assert_eq!(2525			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2526			12527		);2528		assert_eq!(2529			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2530			true2531		);25322533		let origin1 = RuntimeOrigin::signed(1);25342535		// default scenario2536		assert_noop!(2537			Unique::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2538				.map_err(|e| e.error),2539			CommonError::<Test>::TransferNotAllowed2540		);2541		assert_eq!(2542			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2543			12544		);2545		assert_eq!(2546			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2547			02548		);2549		assert_eq!(2550			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2551			true2552		);2553		assert_eq!(2554			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2555			false2556		);2557	});2558}25592560#[test]2561fn collection_sponsoring() {2562	new_test_ext().execute_with(|| {2563		// default_limits();2564		let user1 = 1_u64;2565		let user2 = 777_u64;2566		let origin1 = RuntimeOrigin::signed(user1);2567		let origin2 = RuntimeOrigin::signed(user2);2568		let account2 = account(user2);25692570		let collection_id =2571			create_test_collection_for_owner(&CollectionMode::NFT, user1, CollectionId(1));2572		assert_ok!(Unique::set_collection_sponsor(2573			origin1.clone(),2574			collection_id,2575			user12576		));2577		assert_ok!(Unique::confirm_sponsorship(origin1.clone(), collection_id));25782579		// Expect error while have no permissions2580		assert!(Unique::create_item(2581			origin2.clone(),2582			collection_id,2583			account2.clone(),2584			default_nft_data().into()2585		)2586		.is_err());25872588		assert_ok!(Unique::set_collection_permissions(2589			origin1.clone(),2590			collection_id,2591			CollectionPermissions {2592				mint_mode: Some(true),2593				access: Some(AccessMode::AllowList),2594				nesting: None,2595			}2596		));2597		assert_ok!(Unique::add_to_allow_list(2598			origin1.clone(),2599			collection_id,2600			account2.clone()2601		));26022603		assert_ok!(Unique::create_item(2604			origin2,2605			collection_id,2606			account2,2607			default_nft_data().into()2608		));2609	});2610}