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