12use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use nft_data_structs::{6 COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, 7 CreateNftData, CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, 8 MetaUpdatePermission, TokenId,9};1011use frame_support::{assert_noop, assert_ok};12use sp_std::convert::TryInto;1314fn default_nft_data() -> CreateNftData {15 CreateNftData {16 const_data: vec![1, 2, 3].try_into().unwrap(),17 variable_data: vec![3, 2, 1].try_into().unwrap(),18 }19}2021fn default_fungible_data() -> CreateFungibleData {22 CreateFungibleData { value: 5 }23}2425fn default_re_fungible_data() -> CreateReFungibleData {26 CreateReFungibleData {27 const_data: vec![1, 2, 3].try_into().unwrap(),28 variable_data: vec![3, 2, 1].try_into().unwrap(),29 pieces: 1023,30 }31}3233fn create_test_collection_for_owner(34 mode: &CollectionMode,35 owner: u64,36 id: CollectionId,37) -> CollectionId {38 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();39 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();40 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4142 let origin1 = Origin::signed(owner);43 assert_ok!(TemplateModule::create_collection(44 origin1,45 col_name1,46 col_desc1,47 token_prefix1,48 mode.clone()49 ));5051 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();52 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();53 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();54 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);55 assert_eq!(56 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,57 saved_col_name58 );59 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);60 assert_eq!(61 <pallet_common::CollectionById<Test>>::get(id).unwrap().description,62 saved_description63 );64 assert_eq!(65 <pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,66 saved_prefix67 );68 id69}7071fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {72 create_test_collection_for_owner(&mode, 1, id)73}7475fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {76 let origin1 = Origin::signed(1);77 assert_ok!(TemplateModule::create_item(78 origin1,79 collection_id,80 account(1),81 data.clone()82 ));83}8485fn account(sub: u64) -> TestCrossAccountId {86 TestCrossAccountId::from_sub(sub)87}8889909192#[test]93fn set_version_schema() {94 new_test_ext().execute_with(|| {95 let origin1 = Origin::signed(1);96 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9798 assert_ok!(TemplateModule::set_schema_version(99 origin1,100 collection_id,101 SchemaVersion::Unique102 ));103 assert_eq!(104 <pallet_common::CollectionById<Test>>::get(collection_id)105 .unwrap()106 .schema_version,107 SchemaVersion::Unique108 );109 });110}111112#[test]113fn create_fungible_collection_fails_with_large_decimal_numbers() {114 new_test_ext().execute_with(|| {115 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();116 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();117 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();118119 let origin1 = Origin::signed(1);120 assert_noop!(121 TemplateModule::create_collection(122 origin1,123 col_name1,124 col_desc1,125 token_prefix1,126 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)127 ),128 Error::<Test>::CollectionDecimalPointLimitExceeded129 );130 });131}132133#[test]134fn create_nft_item() {135 new_test_ext().execute_with(|| {136 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));137138 let data = default_nft_data();139 create_test_item(collection_id, &data.clone().into());140141 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();142 assert_eq!(item.const_data, data.const_data.into_inner());143 assert_eq!(item.variable_data, data.variable_data.into_inner());144 });145}146147148149#[test]150fn create_nft_multiple_items() {151 new_test_ext().execute_with(|| {152 create_test_collection(&CollectionMode::NFT, CollectionId(1));153154 let origin1 = Origin::signed(1);155156 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];157158 assert_ok!(TemplateModule::create_multiple_items(159 origin1,160 CollectionId(1),161 account(1),162 items_data163 .clone()164 .into_iter()165 .map(|d| { d.into() })166 .collect()167 ));168 for (index, data) in items_data.into_iter().enumerate() {169 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();170 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());171 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());172 }173 });174}175176#[test]177fn create_refungible_item() {178 new_test_ext().execute_with(|| {179 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));180181 let data = default_re_fungible_data();182 create_test_item(collection_id, &data.clone().into());183 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));184 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));185 assert_eq!(item.const_data, data.const_data.into_inner());186 assert_eq!(item.variable_data, data.variable_data.into_inner());187 assert_eq!(balance, 1023);188 });189}190191#[test]192fn create_multiple_refungible_items() {193 new_test_ext().execute_with(|| {194 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));195196 let origin1 = Origin::signed(1);197198 let items_data = vec![199 default_re_fungible_data(),200 default_re_fungible_data(),201 default_re_fungible_data(),202 ];203204 assert_ok!(TemplateModule::create_multiple_items(205 origin1,206 CollectionId(1),207 account(1),208 items_data209 .clone()210 .into_iter()211 .map(|d| { d.into() })212 .collect()213 ));214 for (index, data) in items_data.into_iter().enumerate() {215 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32)));216 let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));217 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());218 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());219 assert_eq!(balance, 1023);220 }221 });222}223224#[test]225fn create_fungible_item() {226 new_test_ext().execute_with(|| {227 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));228229 let data = default_fungible_data();230 create_test_item(collection_id, &data.into());231232 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);233 });234}235236237238239240241242243244245246247248249250251252253254255256257258259260261262#[test]263fn transfer_fungible_item() {264 new_test_ext().execute_with(|| {265 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));266267 let origin1 = Origin::signed(1);268 let origin2 = Origin::signed(2);269270 let data = default_fungible_data();271 create_test_item(collection_id, &data.into());272273 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);274275 276 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(0), 5));277 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);278279 280 assert_ok!(TemplateModule::transfer(281 origin2.clone(),282 account(3),283 CollectionId(1),284 TokenId(0),285 3286 ));287288 289 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(0), 1));290 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);291 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);292 });293}294295#[test]296fn transfer_refungible_item() {297 new_test_ext().execute_with(|| {298 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));299300 301 let data = default_re_fungible_data();302 create_test_item(collection_id, &data.clone().into());303 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));304 assert_eq!(item.const_data, data.const_data.into_inner());305 assert_eq!(item.variable_data, data.variable_data.into_inner());306 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);307 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);308 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);309310 311 let origin1 = Origin::signed(1);312 let origin2 = Origin::signed(2);313 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));314 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 1023);315 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);316 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);317 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);318 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);319320 321 assert_ok!(TemplateModule::transfer(322 origin2.clone(),323 account(3),324 CollectionId(1),325 TokenId(1),326 500327 ));328 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 523);329 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 500);330 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);331 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);332 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);333 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);334335 336 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));337 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 323);338 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 700);339 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);340 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);341 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);342 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);343 });344}345346#[test]347fn transfer_nft_item() {348 new_test_ext().execute_with(|| {349 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));350351 let data = default_nft_data();352 create_test_item(collection_id, &data.into());353 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);354 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);355356357 let origin1 = Origin::signed(1);358 359 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));360 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);361 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);362 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);363 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);364 });365}366367#[test]368fn transfer_nft_item_wrong_value() {369 new_test_ext().execute_with(|| {370 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));371372 let data = default_nft_data();373 create_test_item(collection_id, &data.into());374 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);375 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);376377 let origin1 = Origin::signed(1);378379 assert_noop!(380 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2).map_err(|e| e.error),381 <pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount382 );383 });384}385386#[test]387fn transfer_nft_item_zero_value() {388 new_test_ext().execute_with(|| {389 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));390391 let data = default_nft_data();392 create_test_item(collection_id, &data.into());393 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);394 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);395396 let origin1 = Origin::signed(1);397398 399 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 0));400 401 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);402 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);403 });404}405406#[test]407fn nft_approve_and_transfer_from() {408 new_test_ext().execute_with(|| {409 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));410411 let data = default_nft_data();412 create_test_item(collection_id, &data.into());413414 let origin1 = Origin::signed(1);415 let origin2 = Origin::signed(2);416417 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);418 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);419420 421 assert_noop!(422 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),423 CommonError::<Test>::TokenValueNotEnough424 );425426 427 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));428 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));429430 assert_ok!(TemplateModule::transfer_from(431 origin2,432 account(1),433 account(3),434 CollectionId(1),435 TokenId(1),436 1437 ));438 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());439 });440}441442#[test]443fn nft_approve_and_transfer_from_allow_list() {444 new_test_ext().execute_with(|| {445 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));446447 let origin1 = Origin::signed(1);448 let origin2 = Origin::signed(2);449450 451 let data = default_nft_data();452 create_test_item(collection_id, &data.clone().into());453 assert_eq!(454 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,455 &data.const_data.into_inner()456 );457 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);458 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);459460 461 assert_ok!(TemplateModule::set_mint_permission(462 origin1.clone(),463 CollectionId(1),464 true465 ));466 assert_ok!(TemplateModule::set_public_access_mode(467 origin1.clone(),468 CollectionId(1),469 AccessMode::AllowList470 ));471 assert_ok!(TemplateModule::add_to_allow_list(472 origin1.clone(),473 CollectionId(1),474 account(1)475 ));476 assert_ok!(TemplateModule::add_to_allow_list(477 origin1.clone(),478 CollectionId(1),479 account(2)480 ));481 assert_ok!(TemplateModule::add_to_allow_list(482 origin1.clone(),483 CollectionId(1),484 account(3)485 ));486487 488 assert_ok!(TemplateModule::approve(489 origin1.clone(),490 account(2),491 CollectionId(1),492 TokenId(1),493 1494 ));495 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));496497 498 assert_ok!(TemplateModule::transfer_from(499 origin2,500 account(1),501 account(3),502 CollectionId(1),503 TokenId(1),504 1505 ));506 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());507 });508}509510#[test]511fn refungible_approve_and_transfer_from() {512 new_test_ext().execute_with(|| {513 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));514515 let origin1 = Origin::signed(1);516 let origin2 = Origin::signed(2);517518 519 let data = default_re_fungible_data();520 create_test_item(collection_id, &data.into());521522 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);523 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);524 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);525526 527 assert_ok!(TemplateModule::set_mint_permission(528 origin1.clone(),529 CollectionId(1),530 true531 ));532 assert_ok!(TemplateModule::set_public_access_mode(533 origin1.clone(),534 CollectionId(1),535 AccessMode::AllowList536 ));537 assert_ok!(TemplateModule::add_to_allow_list(538 origin1.clone(),539 CollectionId(1),540 account(1)541 ));542 assert_ok!(TemplateModule::add_to_allow_list(543 origin1.clone(),544 CollectionId(1),545 account(2)546 ));547 assert_ok!(TemplateModule::add_to_allow_list(548 origin1.clone(),549 CollectionId(1),550 account(3)551 ));552553 554 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));555 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);556557 558 assert_ok!(TemplateModule::transfer_from(559 origin2,560 account(1),561 account(3),562 CollectionId(1),563 TokenId(1),564 100565 ));566 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);567 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);568 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 923);569 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 100);570 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);571 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);572 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);573 });574}575576#[test]577fn fungible_approve_and_transfer_from() {578 new_test_ext().execute_with(|| {579 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));580581 let data = default_fungible_data();582 create_test_item(collection_id, &data.into());583584 let origin1 = Origin::signed(1);585 let origin2 = Origin::signed(2);586587 assert_ok!(TemplateModule::set_mint_permission(588 origin1.clone(),589 CollectionId(1),590 true591 ));592 assert_ok!(TemplateModule::set_public_access_mode(593 origin1.clone(),594 CollectionId(1),595 AccessMode::AllowList596 ));597 assert_ok!(TemplateModule::add_to_allow_list(598 origin1.clone(),599 CollectionId(1),600 account(1)601 ));602 assert_ok!(TemplateModule::add_to_allow_list(603 origin1.clone(),604 CollectionId(1),605 account(2)606 ));607 assert_ok!(TemplateModule::add_to_allow_list(608 origin1.clone(),609 CollectionId(1),610 account(3)611 ));612613 614 assert_ok!(TemplateModule::approve(615 origin1.clone(),616 account(2),617 CollectionId(1),618 TokenId(0),619 5620 ));621 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);622 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(0), 5));623 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);624 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);625626 assert_ok!(TemplateModule::transfer_from(627 origin2.clone(),628 account(1),629 account(3),630 CollectionId(1),631 TokenId(0),632 4633 ));634635 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);636637 assert_noop!(638 TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(0), 4).map_err(|e| e.error),639 CommonError::<Test>::TokenValueNotEnough640 );641 });642}643644#[test]645fn change_collection_owner() {646 new_test_ext().execute_with(|| {647 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));648649 let origin1 = Origin::signed(1);650 assert_ok!(TemplateModule::change_collection_owner(651 origin1,652 collection_id,653 2654 ));655 assert_eq!(656 <pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,657 2658 );659 });660}661662#[test]663fn destroy_collection() {664 new_test_ext().execute_with(|| {665 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));666667 let origin1 = Origin::signed(1);668 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));669 });670}671672#[test]673fn burn_nft_item() {674 new_test_ext().execute_with(|| {675 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));676677 let origin1 = Origin::signed(1);678679 let data = default_nft_data();680 create_test_item(collection_id, &data.into());681682 683 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);684685 686 assert_ok!(TemplateModule::burn_item(687 origin1.clone(),688 collection_id,689 TokenId(1),690 1691 ));692 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);693 });694}695696#[test]697fn burn_same_nft_item_twice() {698 new_test_ext().execute_with(|| {699 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));700701 let origin1 = Origin::signed(1);702703 let data = default_nft_data();704 create_test_item(collection_id, &data.into());705706 707 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);708709 710 assert_ok!(TemplateModule::burn_item(711 origin1.clone(),712 collection_id,713 TokenId(1),714 1715 ));716 717 718 assert_noop!(719 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),720 CommonError::<Test>::TokenNotFound721 );722723 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);724 });725}726727#[test]728fn burn_fungible_item() {729 new_test_ext().execute_with(|| {730 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));731732 let origin1 = Origin::signed(1);733 assert_ok!(TemplateModule::add_collection_admin(734 origin1.clone(),735 collection_id,736 account(2)737 ));738739 let data = default_fungible_data();740 create_test_item(collection_id, &data.into());741742 743 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);744745 746 assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(0), 5));747 assert_noop!(748 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),749 CommonError::<Test>::TokenValueTooLow750 );751752 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);753 });754}755756#[test]757fn burn_fungible_item_with_token_id() {758 new_test_ext().execute_with(|| {759 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));760761 let origin1 = Origin::signed(1);762 assert_ok!(TemplateModule::add_collection_admin(763 origin1.clone(),764 collection_id,765 account(2)766 ));767768 let data = default_fungible_data();769 create_test_item(collection_id, &data.into());770771 772 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);773774 775 assert_noop!(776 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),777 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId778 );779 });780}781#[test]782fn burn_refungible_item() {783 new_test_ext().execute_with(|| {784 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));785 let origin1 = Origin::signed(1);786787 assert_ok!(TemplateModule::set_mint_permission(788 origin1.clone(),789 collection_id,790 true791 ));792 assert_ok!(TemplateModule::set_public_access_mode(793 origin1.clone(),794 collection_id,795 AccessMode::AllowList796 ));797 assert_ok!(TemplateModule::add_to_allow_list(798 origin1.clone(),799 collection_id,800 account(1)801 ));802803 assert_ok!(TemplateModule::add_collection_admin(804 origin1.clone(),805 collection_id,806 account(2)807 ));808809 let data = default_re_fungible_data();810 create_test_item(collection_id, &data.into());811812 813 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);814 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);815816 817 assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));818 assert_noop!(819 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),820 CommonError::<Test>::TokenValueTooLow821 );822823 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);824 });825}826827#[test]828fn add_collection_admin() {829 new_test_ext().execute_with(|| {830 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));831 let origin1 = Origin::signed(1);832833 834 assert_ok!(TemplateModule::add_collection_admin(835 origin1.clone(),836 collection1_id,837 account(2)838 ));839 assert_ok!(TemplateModule::add_collection_admin(840 origin1,841 collection1_id,842 account(3)843 ));844845 846 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))), false);847 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));848 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));849 });850}851852#[test]853fn remove_collection_admin() {854 new_test_ext().execute_with(|| {855 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));856 let origin1 = Origin::signed(1);857 let origin2 = Origin::signed(2);858859 860 assert_ok!(TemplateModule::add_collection_admin(861 origin1.clone(),862 collection1_id,863 account(2)864 ));865 assert_ok!(TemplateModule::add_collection_admin(866 origin1,867 collection1_id,868 account(3)869 ));870871 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));872 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));873874 875 assert_ok!(TemplateModule::remove_collection_admin(876 origin2,877 CollectionId(1),878 account(3)879 ));880881 882 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));883 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))), false);884 });885}886887#[test]888fn balance_of() {889 new_test_ext().execute_with(|| {890 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));891 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));892 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));893894 895 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);896 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);897 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);898899 let nft_data = default_nft_data();900 create_test_item(nft_collection_id, &nft_data.into());901902 let fungible_data = default_fungible_data();903 create_test_item(fungible_collection_id, &fungible_data.into());904905 let re_fungible_data = default_re_fungible_data();906 create_test_item(re_fungible_collection_id, &re_fungible_data.into());907908 909 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);910 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);911 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1);912913 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);914 assert_eq!(<pallet_refungible::Owned<Test>>::get((re_fungible_collection_id, account(1), TokenId(1))), true);915 });916}917918#[test]919fn approve() {920 new_test_ext().execute_with(|| {921 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));922923 let data = default_nft_data();924 create_test_item(collection_id, &data.into());925926 let origin1 = Origin::signed(1);927928 929 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));930 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));931 });932}933934#[test]935fn transfer_from() {936 new_test_ext().execute_with(|| {937 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));938 let origin1 = Origin::signed(1);939 let origin2 = Origin::signed(2);940941 let data = default_nft_data();942 create_test_item(collection_id, &data.into());943944 945 assert_ok!(TemplateModule::approve(946 origin1.clone(),947 account(2),948 CollectionId(1),949 TokenId(1),950 1951 ));952 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));953954 assert_ok!(TemplateModule::set_mint_permission(955 origin1.clone(),956 CollectionId(1),957 true958 ));959 assert_ok!(TemplateModule::set_public_access_mode(960 origin1.clone(),961 CollectionId(1),962 AccessMode::AllowList963 ));964 assert_ok!(TemplateModule::add_to_allow_list(965 origin1.clone(),966 CollectionId(1),967 account(1)968 ));969 assert_ok!(TemplateModule::add_to_allow_list(970 origin1.clone(),971 CollectionId(1),972 account(2)973 ));974 assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));975976 assert_ok!(TemplateModule::transfer_from(977 origin2,978 account(1),979 account(2),980 CollectionId(1),981 TokenId(1),982 1983 ));984985 986 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);987 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);988 });989}990991992993994995996#[test]997fn owner_can_add_address_to_allow_list() {998 new_test_ext().execute_with(|| {999 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10001001 let origin1 = Origin::signed(1);1002 assert_ok!(TemplateModule::add_to_allow_list(1003 origin1,1004 collection_id,1005 account(2)1006 ));1007 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1008 });1009}10101011#[test]1012fn admin_can_add_address_to_allow_list() {1013 new_test_ext().execute_with(|| {1014 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1015 let origin1 = Origin::signed(1);1016 let origin2 = Origin::signed(2);10171018 assert_ok!(TemplateModule::add_collection_admin(1019 origin1,1020 collection_id,1021 account(2)1022 ));1023 assert_ok!(TemplateModule::add_to_allow_list(1024 origin2,1025 collection_id,1026 account(3)1027 ));1028 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1029 });1030}10311032#[test]1033fn nonprivileged_user_cannot_add_address_to_allow_list() {1034 new_test_ext().execute_with(|| {1035 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10361037 let origin2 = Origin::signed(2);1038 assert_noop!(1039 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1040 CommonError::<Test>::NoPermission1041 );1042 });1043}10441045#[test]1046fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1047 new_test_ext().execute_with(|| {1048 let origin1 = Origin::signed(1);10491050 assert_noop!(1051 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1052 CommonError::<Test>::CollectionNotFound1053 );1054 });1055}10561057#[test]1058fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1059 new_test_ext().execute_with(|| {1060 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10611062 let origin1 = Origin::signed(1);1063 assert_ok!(TemplateModule::destroy_collection(1064 origin1.clone(),1065 collection_id1066 ));1067 assert_noop!(1068 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1069 CommonError::<Test>::CollectionNotFound1070 );1071 });1072}107310741075#[test]1076fn address_is_already_added_to_allow_list() {1077 new_test_ext().execute_with(|| {1078 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1079 let origin1 = Origin::signed(1);10801081 assert_ok!(TemplateModule::add_to_allow_list(1082 origin1.clone(),1083 collection_id,1084 account(2)1085 ));1086 assert_ok!(TemplateModule::add_to_allow_list(1087 origin1,1088 collection_id,1089 account(2)1090 ));1091 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1092 });1093}10941095#[test]1096fn owner_can_remove_address_from_allow_list() {1097 new_test_ext().execute_with(|| {1098 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10991100 let origin1 = Origin::signed(1);1101 assert_ok!(TemplateModule::add_to_allow_list(1102 origin1.clone(),1103 collection_id,1104 account(2)1105 ));1106 assert_ok!(TemplateModule::remove_from_allow_list(1107 origin1,1108 collection_id,1109 account(2)1110 ));1111 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1112 });1113}11141115#[test]1116fn admin_can_remove_address_from_allow_list() {1117 new_test_ext().execute_with(|| {1118 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1119 let origin1 = Origin::signed(1);1120 let origin2 = Origin::signed(2);11211122 1123 assert_ok!(TemplateModule::add_collection_admin(1124 origin1.clone(),1125 collection_id,1126 account(2)1127 ));11281129 1130 assert_ok!(TemplateModule::add_to_allow_list(1131 origin1,1132 collection_id,1133 account(3)1134 ));11351136 1137 assert_ok!(TemplateModule::remove_from_allow_list(1138 origin2,1139 collection_id,1140 account(3)1141 ));1142 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))), false);1143 });1144}11451146#[test]1147fn nonprivileged_user_cannot_remove_address_from_allow_list() {1148 new_test_ext().execute_with(|| {1149 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1150 let origin1 = Origin::signed(1);1151 let origin2 = Origin::signed(2);11521153 assert_ok!(TemplateModule::add_to_allow_list(1154 origin1,1155 collection_id,1156 account(2)1157 ));1158 assert_noop!(1159 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1160 CommonError::<Test>::NoPermission1161 );1162 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1163 });1164}11651166#[test]1167fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1168 new_test_ext().execute_with(|| {1169 let origin1 = Origin::signed(1);11701171 assert_noop!(1172 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1173 CommonError::<Test>::CollectionNotFound1174 );1175 });1176}11771178#[test]1179fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1180 new_test_ext().execute_with(|| {1181 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1182 let origin1 = Origin::signed(1);1183 let origin2 = Origin::signed(2);11841185 1186 assert_ok!(TemplateModule::add_to_allow_list(1187 origin1.clone(),1188 collection_id,1189 account(2)1190 ));11911192 1193 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));11941195 1196 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));11971198 1199 assert_noop!(1200 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1201 CommonError::<Test>::CollectionNotFound1202 );12031204 1205 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1206 });1207}120812091210#[test]1211fn address_is_already_removed_from_allow_list() {1212 new_test_ext().execute_with(|| {1213 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1214 let origin1 = Origin::signed(1);12151216 assert_ok!(TemplateModule::add_to_allow_list(1217 origin1.clone(),1218 collection_id,1219 account(2)1220 ));1221 assert_ok!(TemplateModule::remove_from_allow_list(1222 origin1.clone(),1223 collection_id,1224 account(2)1225 ));1226 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1227 assert_ok!(TemplateModule::remove_from_allow_list(1228 origin1,1229 collection_id,1230 account(2)1231 ));1232 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1233 });1234}123512361237#[test]1238fn allow_list_test_1() {1239 new_test_ext().execute_with(|| {1240 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12411242 let origin1 = Origin::signed(1);12431244 let data = default_nft_data();1245 create_test_item(collection_id, &data.into());12461247 assert_ok!(TemplateModule::set_public_access_mode(1248 origin1.clone(),1249 collection_id,1250 AccessMode::AllowList1251 ));1252 assert_ok!(TemplateModule::add_to_allow_list(1253 origin1.clone(),1254 collection_id,1255 account(2)1256 ));12571258 assert_noop!(1259 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1260 CommonError::<Test>::AddressNotInAllowlist1261 );1262 });1263}12641265#[test]1266fn allow_list_test_2() {1267 new_test_ext().execute_with(|| {1268 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1269 let origin1 = Origin::signed(1);12701271 let data = default_nft_data();1272 create_test_item(collection_id, &data.into());12731274 assert_ok!(TemplateModule::set_public_access_mode(1275 origin1.clone(),1276 collection_id,1277 AccessMode::AllowList1278 ));1279 assert_ok!(TemplateModule::add_to_allow_list(1280 origin1.clone(),1281 collection_id,1282 account(1)1283 ));1284 assert_ok!(TemplateModule::add_to_allow_list(1285 origin1.clone(),1286 collection_id,1287 account(2)1288 ));12891290 1291 assert_ok!(TemplateModule::approve(1292 origin1.clone(),1293 account(1),1294 collection_id,1295 TokenId(1),1296 11297 ));1298 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12991300 assert_ok!(TemplateModule::remove_from_allow_list(1301 origin1.clone(),1302 collection_id,1303 account(1)1304 ));13051306 assert_noop!(1307 TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1308 CommonError::<Test>::AddressNotInAllowlist1309 );1310 });1311}131213131314#[test]1315fn allow_list_test_3() {1316 new_test_ext().execute_with(|| {1317 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13181319 let origin1 = Origin::signed(1);13201321 let data = default_nft_data();1322 create_test_item(collection_id, &data.into());13231324 assert_ok!(TemplateModule::set_public_access_mode(1325 origin1.clone(),1326 collection_id,1327 AccessMode::AllowList1328 ));1329 assert_ok!(TemplateModule::add_to_allow_list(1330 origin1.clone(),1331 collection_id,1332 account(1)1333 ));13341335 assert_noop!(1336 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1337 CommonError::<Test>::AddressNotInAllowlist1338 );1339 });1340}13411342#[test]1343fn allow_list_test_4() {1344 new_test_ext().execute_with(|| {1345 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13461347 let origin1 = Origin::signed(1);13481349 let data = default_nft_data();1350 create_test_item(collection_id, &data.into());13511352 assert_ok!(TemplateModule::set_public_access_mode(1353 origin1.clone(),1354 collection_id,1355 AccessMode::AllowList1356 ));1357 assert_ok!(TemplateModule::add_to_allow_list(1358 origin1.clone(),1359 collection_id,1360 account(1)1361 ));1362 assert_ok!(TemplateModule::add_to_allow_list(1363 origin1.clone(),1364 collection_id,1365 account(2)1366 ));13671368 1369 assert_ok!(TemplateModule::approve(1370 origin1.clone(),1371 account(1),1372 collection_id,1373 TokenId(1),1374 11375 ));1376 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13771378 assert_ok!(TemplateModule::remove_from_allow_list(1379 origin1.clone(),1380 collection_id,1381 account(2)1382 ));13831384 assert_noop!(1385 TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1386 CommonError::<Test>::AddressNotInAllowlist1387 );1388 });1389}139013911392#[test]1393fn allow_list_test_5() {1394 new_test_ext().execute_with(|| {1395 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13961397 let origin1 = Origin::signed(1);13981399 let data = default_nft_data();1400 create_test_item(collection_id, &data.into());14011402 assert_ok!(TemplateModule::set_public_access_mode(1403 origin1.clone(),1404 collection_id,1405 AccessMode::AllowList1406 ));1407 assert_noop!(1408 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1409 CommonError::<Test>::AddressNotInAllowlist1410 );1411 });1412}141314141415#[test]1416fn allow_list_test_6() {1417 new_test_ext().execute_with(|| {1418 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14191420 let origin1 = Origin::signed(1);14211422 let data = default_nft_data();1423 create_test_item(collection_id, &data.into());14241425 assert_ok!(TemplateModule::set_public_access_mode(1426 origin1.clone(),1427 collection_id,1428 AccessMode::AllowList1429 ));14301431 1432 assert_noop!(1433 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1434 CommonError::<Test>::AddressNotInAllowlist1435 );1436 });1437}1438143914401441#[test]1442fn allow_list_test_7() {1443 new_test_ext().execute_with(|| {1444 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14451446 let data = default_nft_data();1447 create_test_item(collection_id, &data.into());14481449 let origin1 = Origin::signed(1);14501451 assert_ok!(TemplateModule::set_public_access_mode(1452 origin1.clone(),1453 collection_id,1454 AccessMode::AllowList1455 ));1456 assert_ok!(TemplateModule::add_to_allow_list(1457 origin1.clone(),1458 collection_id,1459 account(1)1460 ));1461 assert_ok!(TemplateModule::add_to_allow_list(1462 origin1.clone(),1463 collection_id,1464 account(2)1465 ));14661467 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1468 });1469}14701471#[test]1472fn allow_list_test_8() {1473 new_test_ext().execute_with(|| {1474 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14751476 1477 let data = default_nft_data();1478 create_test_item(collection_id, &data.into());14791480 let origin1 = Origin::signed(1);14811482 1483 assert_ok!(TemplateModule::set_public_access_mode(1484 origin1.clone(),1485 collection_id,1486 AccessMode::AllowList1487 ));1488 assert_ok!(TemplateModule::add_to_allow_list(1489 origin1.clone(),1490 collection_id,1491 account(1)1492 ));1493 assert_ok!(TemplateModule::add_to_allow_list(1494 origin1.clone(),1495 collection_id,1496 account(2)1497 ));14981499 1500 assert_ok!(TemplateModule::approve(1501 origin1.clone(),1502 account(1),1503 CollectionId(1), 1504 TokenId(1),1505 11506 ));1507 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));15081509 1510 assert_ok!(TemplateModule::transfer_from(1511 origin1,1512 account(1),1513 account(2),1514 CollectionId(1), 1515 TokenId(1),1516 11517 ));1518 });1519}152015211522#[test]1523fn allow_list_test_9() {1524 new_test_ext().execute_with(|| {1525 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1526 let origin1 = Origin::signed(1);15271528 assert_ok!(TemplateModule::set_public_access_mode(1529 origin1.clone(),1530 collection_id,1531 AccessMode::AllowList1532 ));1533 assert_ok!(TemplateModule::set_mint_permission(1534 origin1,1535 collection_id,1536 false1537 ));15381539 let data = default_nft_data();1540 create_test_item(collection_id, &data.into());1541 });1542}154315441545#[test]1546fn allow_list_test_10() {1547 new_test_ext().execute_with(|| {1548 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15491550 let origin1 = Origin::signed(1);1551 let origin2 = Origin::signed(2);15521553 assert_ok!(TemplateModule::set_public_access_mode(1554 origin1.clone(),1555 collection_id,1556 AccessMode::AllowList1557 ));1558 assert_ok!(TemplateModule::set_mint_permission(1559 origin1.clone(),1560 collection_id,1561 false1562 ));15631564 assert_ok!(TemplateModule::add_collection_admin(1565 origin1,1566 collection_id,1567 account(2)1568 ));15691570 assert_ok!(TemplateModule::create_item(1571 origin2,1572 collection_id,1573 account(2),1574 default_nft_data().into()1575 ));1576 });1577}157815791580#[test]1581fn allow_list_test_11() {1582 new_test_ext().execute_with(|| {1583 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15841585 let origin1 = Origin::signed(1);1586 let origin2 = Origin::signed(2);15871588 assert_ok!(TemplateModule::set_public_access_mode(1589 origin1.clone(),1590 collection_id,1591 AccessMode::AllowList1592 ));1593 assert_ok!(TemplateModule::set_mint_permission(1594 origin1.clone(),1595 collection_id,1596 false1597 ));1598 assert_ok!(TemplateModule::add_to_allow_list(1599 origin1,1600 collection_id,1601 account(2)1602 ));16031604 assert_noop!(1605 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1606 CommonError::<Test>::PublicMintingNotAllowed1607 );1608 });1609}161016111612#[test]1613fn allow_list_test_12() {1614 new_test_ext().execute_with(|| {1615 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16161617 let origin1 = Origin::signed(1);1618 let origin2 = Origin::signed(2);16191620 assert_ok!(TemplateModule::set_public_access_mode(1621 origin1.clone(),1622 collection_id,1623 AccessMode::AllowList1624 ));1625 assert_ok!(TemplateModule::set_mint_permission(1626 origin1,1627 collection_id,1628 false1629 ));16301631 assert_noop!(1632 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1633 CommonError::<Test>::PublicMintingNotAllowed1634 );1635 });1636}163716381639#[test]1640fn allow_list_test_13() {1641 new_test_ext().execute_with(|| {1642 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16431644 let origin1 = Origin::signed(1);16451646 assert_ok!(TemplateModule::set_public_access_mode(1647 origin1.clone(),1648 collection_id,1649 AccessMode::AllowList1650 ));1651 assert_ok!(TemplateModule::set_mint_permission(1652 origin1,1653 collection_id,1654 true1655 ));16561657 let data = default_nft_data();1658 create_test_item(collection_id, &data.into());1659 });1660}166116621663#[test]1664fn allow_list_test_14() {1665 new_test_ext().execute_with(|| {1666 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16671668 let origin1 = Origin::signed(1);1669 let origin2 = Origin::signed(2);16701671 assert_ok!(TemplateModule::set_public_access_mode(1672 origin1.clone(),1673 collection_id,1674 AccessMode::AllowList1675 ));1676 assert_ok!(TemplateModule::set_mint_permission(1677 origin1.clone(),1678 collection_id,1679 true1680 ));16811682 assert_ok!(TemplateModule::add_collection_admin(1683 origin1,1684 collection_id,1685 account(2)1686 ));16871688 assert_ok!(TemplateModule::create_item(1689 origin2,1690 collection_id,1691 account(2),1692 default_nft_data().into()1693 ));1694 });1695}169616971698#[test]1699fn allow_list_test_15() {1700 new_test_ext().execute_with(|| {1701 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17021703 let origin1 = Origin::signed(1);1704 let origin2 = Origin::signed(2);17051706 assert_ok!(TemplateModule::set_public_access_mode(1707 origin1.clone(),1708 collection_id,1709 AccessMode::AllowList1710 ));1711 assert_ok!(TemplateModule::set_mint_permission(1712 origin1,1713 collection_id,1714 true1715 ));17161717 assert_noop!(1718 TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()).map_err(|e| e.error),1719 CommonError::<Test>::AddressNotInAllowlist1720 );1721 });1722}172317241725#[test]1726fn allow_list_test_16() {1727 new_test_ext().execute_with(|| {1728 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17291730 let origin1 = Origin::signed(1);1731 let origin2 = Origin::signed(2);17321733 assert_ok!(TemplateModule::set_public_access_mode(1734 origin1.clone(),1735 collection_id,1736 AccessMode::AllowList1737 ));1738 assert_ok!(TemplateModule::set_mint_permission(1739 origin1.clone(),1740 collection_id,1741 true1742 ));1743 assert_ok!(TemplateModule::add_to_allow_list(1744 origin1,1745 collection_id,1746 account(2)1747 ));17481749 assert_ok!(TemplateModule::create_item(1750 origin2,1751 collection_id,1752 account(2),1753 default_nft_data().into()1754 ));1755 });1756}175717581759#[test]1760fn total_number_collections_bound() {1761 new_test_ext().execute_with(|| {1762 create_test_collection(&CollectionMode::NFT, CollectionId(1));1763 });1764}17651766#[test]1767fn create_max_collections() {1768 new_test_ext().execute_with(|| {1769 for i in 1..=COLLECTION_NUMBER_LIMIT {1770 create_test_collection(&CollectionMode::NFT, CollectionId(i));1771 }1772 });1773}177417751776#[test]1777fn total_number_collections_bound_neg() {1778 new_test_ext().execute_with(|| {1779 let origin1 = Origin::signed(1);17801781 for i in 1..=COLLECTION_NUMBER_LIMIT {1782 create_test_collection(&CollectionMode::NFT, CollectionId(i));1783 }17841785 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1786 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1787 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17881789 1790 assert_noop!(1791 TemplateModule::create_collection(1792 origin1,1793 col_name1,1794 col_desc1,1795 token_prefix1,1796 CollectionMode::NFT1797 ),1798 CommonError::<Test>::TotalCollectionsLimitExceeded1799 );1800 });1801}180218031804#[test]1805fn owned_tokens_bound() {1806 new_test_ext().execute_with(|| {1807 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18081809 let data = default_nft_data();1810 create_test_item(collection_id, &data.clone().into());1811 create_test_item(collection_id, &data.into());1812 });1813}181418151816#[test]1817fn owned_tokens_bound_neg() {1818 new_test_ext().execute_with(|| {1819 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18201821 let origin1 = Origin::signed(1);18221823 for _ in 1..=MAX_TOKEN_OWNERSHIP {1824 let data = default_nft_data();1825 create_test_item(collection_id, &data.clone().into());1826 }18271828 let data = default_nft_data();1829 assert_noop!(1830 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()).map_err(|e| e.error),1831 CommonError::<Test>::AccountTokenLimitExceeded1832 );1833 });1834}183518361837#[test]1838fn collection_admins_bound() {1839 new_test_ext().execute_with(|| {1840 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18411842 let origin1 = Origin::signed(1);18431844 assert_ok!(TemplateModule::add_collection_admin(1845 origin1.clone(),1846 collection_id,1847 account(2)1848 ));1849 assert_ok!(TemplateModule::add_collection_admin(1850 origin1,1851 collection_id,1852 account(3)1853 ));1854 });1855}185618571858#[test]1859fn collection_admins_bound_neg() {1860 new_test_ext().execute_with(|| {1861 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18621863 let origin1 = Origin::signed(1);18641865 for i in 0..COLLECTION_ADMINS_LIMIT {1866 assert_ok!(TemplateModule::add_collection_admin(1867 origin1.clone(),1868 collection_id,1869 account((2 + i).into())1870 ));1871 }1872 assert_noop!(1873 TemplateModule::add_collection_admin(1874 origin1,1875 collection_id,1876 account((3 + COLLECTION_ADMINS_LIMIT).into())1877 ),1878 CommonError::<Test>::CollectionAdminCountExceeded1879 );1880 });1881}188218831884#[test]1885fn set_const_on_chain_schema() {1886 new_test_ext().execute_with(|| {1887 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18881889 let origin1 = Origin::signed(1);1890 assert_ok!(TemplateModule::set_const_on_chain_schema(1891 origin1,1892 collection_id,1893 b"test const on chain schema".to_vec()1894 ));18951896 assert_eq!(1897 <pallet_common::CollectionById<Test>>::get(collection_id)1898 .unwrap()1899 .const_on_chain_schema,1900 b"test const on chain schema".to_vec()1901 );1902 assert_eq!(1903 <pallet_common::CollectionById<Test>>::get(collection_id)1904 .unwrap()1905 .variable_on_chain_schema,1906 b"".to_vec()1907 );1908 });1909}19101911#[test]1912fn set_variable_on_chain_schema() {1913 new_test_ext().execute_with(|| {1914 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19151916 let origin1 = Origin::signed(1);1917 assert_ok!(TemplateModule::set_variable_on_chain_schema(1918 origin1,1919 collection_id,1920 b"test variable on chain schema".to_vec()1921 ));19221923 assert_eq!(1924 <pallet_common::CollectionById<Test>>::get(collection_id)1925 .unwrap()1926 .const_on_chain_schema,1927 b"".to_vec()1928 );1929 assert_eq!(1930 <pallet_common::CollectionById<Test>>::get(collection_id)1931 .unwrap()1932 .variable_on_chain_schema,1933 b"test variable on chain schema".to_vec()1934 );1935 });1936}19371938#[test]1939fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1940 new_test_ext().execute_with(|| {1941 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19421943 let origin1 = Origin::signed(1);19441945 let data = default_nft_data();1946 create_test_item(CollectionId(1), &data.into());19471948 let variable_data = b"test data".to_vec();1949 assert_ok!(TemplateModule::set_variable_meta_data(1950 origin1,1951 collection_id,1952 TokenId(1),1953 variable_data.clone()1954 ));19551956 assert_eq!(1957 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1958 .unwrap()1959 .variable_data,1960 variable_data1961 );1962 });1963}19641965#[test]1966fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1967 new_test_ext().execute_with(|| {1968 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19691970 let origin1 = Origin::signed(1);19711972 let data = default_re_fungible_data();1973 create_test_item(collection_id, &data.into());19741975 let variable_data = b"test data".to_vec();1976 assert_ok!(TemplateModule::set_variable_meta_data(1977 origin1,1978 collection_id,1979 TokenId(1),1980 variable_data.clone()1981 ));19821983 assert_eq!(1984 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1985 .variable_data,1986 variable_data1987 );1988 });1989}19901991#[test]1992fn set_variable_meta_data_on_fungible_token_fails() {1993 new_test_ext().execute_with(|| {1994 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));19951996 let origin1 = Origin::signed(1);19971998 let data = default_fungible_data();1999 create_test_item(collection_id, &data.into());20002001 let variable_data = b"test data".to_vec();2002 assert_noop!(2003 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(0), variable_data).map_err(|e| e.error),2004 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2005 );2006 });2007}20082009#[test]2010fn set_variable_meta_data_on_fungible_token_with_token_id_fails() {2011 new_test_ext().execute_with(|| {2012 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20132014 let origin1 = Origin::signed(1);20152016 let data = default_fungible_data();2017 create_test_item(collection_id, &data.into());20182019 let variable_data = b"test data".to_vec();2020 assert_noop!(2021 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2022 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId2023 );2024 });2025}20262027#[test]2028fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2029 new_test_ext().execute_with(|| {2030 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20312032 let origin1 = Origin::signed(1);20332034 let data = default_nft_data();2035 create_test_item(collection_id, &data.into());20362037 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2038 assert_noop!(2039 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2040 CommonError::<Test>::TokenVariableDataLimitExceeded2041 );2042 });2043}20442045#[test]2046fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2047 new_test_ext().execute_with(|| {2048 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20492050 let origin1 = Origin::signed(1);20512052 let data = default_re_fungible_data();2053 create_test_item(collection_id, &data.into());20542055 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2056 assert_noop!(2057 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2058 CommonError::<Test>::TokenVariableDataLimitExceeded2059 );2060 });2061}20622063#[test]2064fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2065 new_test_ext().execute_with(|| {2066 20672068 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20692070 let origin1 = Origin::signed(1);20712072 let data = default_nft_data();2073 create_test_item(collection_id, &data.into());20742075 assert_ok!(TemplateModule::set_meta_update_permission_flag(2076 origin1.clone(),2077 collection_id,2078 MetaUpdatePermission::ItemOwner,2079 ));20802081 let variable_data = b"ten chars.".to_vec();2082 assert_ok!(TemplateModule::set_variable_meta_data(2083 origin1,2084 collection_id,2085 TokenId(1),2086 variable_data.clone()2087 ));20882089 assert_eq!(2090 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2091 .unwrap()2092 .variable_data,2093 variable_data2094 );2095 });2096}20972098#[test]2099fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2100 new_test_ext().execute_with(|| {2101 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));21022103 let origin1 = Origin::signed(1);21042105 assert_ok!(TemplateModule::set_mint_permission(2106 origin1.clone(),2107 collection_id,2108 true2109 ));2110 assert_ok!(TemplateModule::add_to_allow_list(2111 origin1.clone(),2112 collection_id,2113 account(1)2114 ));21152116 let data = default_nft_data();2117 create_test_item(collection_id, &data.into());21182119 assert_ok!(TemplateModule::set_meta_update_permission_flag(2120 origin1.clone(),2121 collection_id,2122 MetaUpdatePermission::ItemOwner,2123 ));21242125 let variable_data = b"1234567890123".to_vec();2126 assert_noop!(2127 TemplateModule::set_variable_meta_data(2128 origin1,2129 collection_id,2130 TokenId(1),2131 variable_data.clone()2132 ).map_err(|e| e.error),2133 CommonError::<Test>::TokenVariableDataLimitExceeded2134 );2135 })2136}21372138#[test]2139fn collection_transfer_flag_works() {2140 new_test_ext().execute_with(|| {2141 let origin1 = Origin::signed(1);21422143 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2144 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21452146 let data = default_nft_data();2147 create_test_item(collection_id, &data.into());2148 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2149 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21502151 let origin1 = Origin::signed(1);21522153 2154 assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2155 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2156 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2157 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2158 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2159 });2160}21612162#[test]2163fn set_variable_meta_data_on_nft_with_admin_flag() {2164 new_test_ext().execute_with(|| {2165 21662167 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21682169 let origin1 = Origin::signed(1);2170 let origin2 = Origin::signed(2);21712172 assert_ok!(TemplateModule::set_mint_permission(2173 origin2.clone(),2174 collection_id,2175 true2176 ));2177 assert_ok!(TemplateModule::add_to_allow_list(2178 origin2.clone(),2179 collection_id,2180 account(1)2181 ));21822183 assert_ok!(TemplateModule::add_collection_admin(2184 origin2.clone(),2185 collection_id,2186 account(1)2187 ));21882189 let data = default_nft_data();2190 create_test_item(collection_id, &data.into());21912192 assert_ok!(TemplateModule::set_meta_update_permission_flag(2193 origin2.clone(),2194 collection_id,2195 MetaUpdatePermission::Admin,2196 ));21972198 let variable_data = b"test.".to_vec();2199 assert_ok!(TemplateModule::set_variable_meta_data(2200 origin1,2201 collection_id,2202 TokenId(1),2203 variable_data.clone()2204 ));22052206 assert_eq!(2207 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2208 .unwrap()2209 .variable_data,2210 variable_data2211 );2212 });2213}22142215#[test]2216fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2217 new_test_ext().execute_with(|| {2218 22192220 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22212222 let origin1 = Origin::signed(1);2223 let origin2 = Origin::signed(2);22242225 assert_ok!(TemplateModule::set_mint_permission(2226 origin2.clone(),2227 collection_id,2228 true2229 ));2230 assert_ok!(TemplateModule::add_to_allow_list(2231 origin2.clone(),2232 collection_id,2233 account(1)2234 ));22352236 let data = default_nft_data();2237 create_test_item(collection_id, &data.into());22382239 assert_ok!(TemplateModule::set_meta_update_permission_flag(2240 origin2.clone(),2241 collection_id,2242 MetaUpdatePermission::Admin,2243 ));22442245 let variable_data = b"test.".to_vec();2246 assert_noop!(2247 TemplateModule::set_variable_meta_data(2248 origin1,2249 collection_id,2250 TokenId(1),2251 variable_data.clone()2252 ).map_err(|e| e.error),2253 CommonError::<Test>::NoPermission2254 );2255 });2256}22572258#[test]2259fn set_variable_meta_flag_after_freeze() {2260 new_test_ext().execute_with(|| {2261 22622263 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22642265 let origin2 = Origin::signed(2);22662267 assert_ok!(TemplateModule::set_meta_update_permission_flag(2268 origin2.clone(),2269 collection_id,2270 MetaUpdatePermission::None,2271 ));2272 assert_noop!(2273 TemplateModule::set_meta_update_permission_flag(2274 origin2.clone(),2275 collection_id,2276 MetaUpdatePermission::Admin2277 ),2278 CommonError::<Test>::MetadataFlagFrozen2279 );2280 });2281}22822283#[test]2284fn set_variable_meta_data_on_nft_with_none_flag_neg() {2285 new_test_ext().execute_with(|| {2286 22872288 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2289 let origin1 = Origin::signed(1);22902291 let data = default_nft_data();2292 create_test_item(collection_id, &data.into());22932294 assert_ok!(TemplateModule::set_meta_update_permission_flag(2295 origin1.clone(),2296 collection_id,2297 MetaUpdatePermission::None,2298 ));22992300 let variable_data = b"test.".to_vec();2301 assert_noop!(2302 TemplateModule::set_variable_meta_data(2303 origin1.clone(),2304 collection_id,2305 TokenId(1),2306 variable_data.clone()2307 ).map_err(|e| e.error),2308 CommonError::<Test>::NoPermission2309 );2310 });2311}23122313#[test]2314fn collection_transfer_flag_works_neg() {2315 new_test_ext().execute_with(|| {2316 let origin1 = Origin::signed(1);23172318 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2319 assert_ok!(TemplateModule::set_transfers_enabled_flag(2320 origin1, collection_id, false2321 ));23222323 let data = default_nft_data();2324 create_test_item(collection_id, &data.into());2325 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2326 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23272328 let origin1 = Origin::signed(1);23292330 2331 assert_noop!(2332 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2333 CommonError::<Test>::TransferNotAllowed2334 );2335 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2336 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2337 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2338 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2339 });2340}