difftreelog
Remove commented uses
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, 7 CreateNftData, CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, 8 MetaUpdatePermission, TokenId,9};10// use crate::{AccessMode, CollectionMode, Ownership, CreateItemData};11// use up_data_structs::{12// CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,13// MAX_DECIMAL_POINTS,14// };1516use frame_support::{assert_noop, assert_ok};17use sp_std::convert::TryInto;1819fn default_nft_data() -> CreateNftData {20 CreateNftData {21 const_data: vec![1, 2, 3].try_into().unwrap(),22 variable_data: vec![3, 2, 1].try_into().unwrap(),23 }24}2526fn default_fungible_data() -> CreateFungibleData {27 CreateFungibleData { value: 5 }28}2930fn default_re_fungible_data() -> CreateReFungibleData {31 CreateReFungibleData {32 const_data: vec![1, 2, 3].try_into().unwrap(),33 variable_data: vec![3, 2, 1].try_into().unwrap(),34 pieces: 1023,35 }36}3738fn create_test_collection_for_owner(39 mode: &CollectionMode,40 owner: u64,41 id: CollectionId,42) -> CollectionId {43 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();44 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();45 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4647 let origin1 = Origin::signed(owner);48 assert_ok!(TemplateModule::create_collection(49 origin1,50 col_name1,51 col_desc1,52 token_prefix1,53 mode.clone()54 ));5556 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();57 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();58 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();59 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);60 assert_eq!(61 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,62 saved_col_name63 );64 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);65 assert_eq!(66 <pallet_common::CollectionById<Test>>::get(id).unwrap().description,67 saved_description68 );69 assert_eq!(70 <pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,71 saved_prefix72 );73 id74}7576fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {77 create_test_collection_for_owner(&mode, 1, id)78}7980fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {81 let origin1 = Origin::signed(1);82 assert_ok!(TemplateModule::create_item(83 origin1,84 collection_id,85 account(1),86 data.clone()87 ));88}8990fn account(sub: u64) -> TestCrossAccountId {91 TestCrossAccountId::from_sub(sub)92}9394// Use cases tests region95// #region9697#[test]98fn set_version_schema() {99 new_test_ext().execute_with(|| {100 let origin1 = Origin::signed(1);101 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));102103 assert_ok!(TemplateModule::set_schema_version(104 origin1,105 collection_id,106 SchemaVersion::Unique107 ));108 assert_eq!(109 <pallet_common::CollectionById<Test>>::get(collection_id)110 .unwrap()111 .schema_version,112 SchemaVersion::Unique113 );114 });115}116117#[test]118fn create_fungible_collection_fails_with_large_decimal_numbers() {119 new_test_ext().execute_with(|| {120 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();121 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();122 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();123124 let origin1 = Origin::signed(1);125 assert_noop!(126 TemplateModule::create_collection(127 origin1,128 col_name1,129 col_desc1,130 token_prefix1,131 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)132 ),133 Error::<Test>::CollectionDecimalPointLimitExceeded134 );135 });136}137138#[test]139fn create_nft_item() {140 new_test_ext().execute_with(|| {141 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));142143 let data = default_nft_data();144 create_test_item(collection_id, &data.clone().into());145146 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();147 assert_eq!(item.const_data, data.const_data.into_inner());148 assert_eq!(item.variable_data, data.variable_data.into_inner());149 });150}151152// Use cases tests region153// #region154#[test]155fn create_nft_multiple_items() {156 new_test_ext().execute_with(|| {157 create_test_collection(&CollectionMode::NFT, CollectionId(1));158159 let origin1 = Origin::signed(1);160161 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];162163 assert_ok!(TemplateModule::create_multiple_items(164 origin1,165 CollectionId(1),166 account(1),167 items_data168 .clone()169 .into_iter()170 .map(|d| { d.into() })171 .collect()172 ));173 for (index, data) in items_data.into_iter().enumerate() {174 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();175 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());176 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());177 }178 });179}180181#[test]182fn create_refungible_item() {183 new_test_ext().execute_with(|| {184 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));185186 let data = default_re_fungible_data();187 create_test_item(collection_id, &data.clone().into());188 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));189 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));190 assert_eq!(item.const_data, data.const_data.into_inner());191 assert_eq!(item.variable_data, data.variable_data.into_inner());192 assert_eq!(balance, 1023);193 });194}195196#[test]197fn create_multiple_refungible_items() {198 new_test_ext().execute_with(|| {199 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));200201 let origin1 = Origin::signed(1);202203 let items_data = vec![204 default_re_fungible_data(),205 default_re_fungible_data(),206 default_re_fungible_data(),207 ];208209 assert_ok!(TemplateModule::create_multiple_items(210 origin1,211 CollectionId(1),212 account(1),213 items_data214 .clone()215 .into_iter()216 .map(|d| { d.into() })217 .collect()218 ));219 for (index, data) in items_data.into_iter().enumerate() {220 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32)));221 let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));222 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());223 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());224 assert_eq!(balance, 1023);225 }226 });227}228229#[test]230fn create_fungible_item() {231 new_test_ext().execute_with(|| {232 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));233234 let data = default_fungible_data();235 create_test_item(collection_id, &data.into());236237 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);238 });239}240241//#[test]242// fn create_multiple_fungible_items() {243// new_test_ext().execute_with(|| {244// default_limits();245246// create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));247248// let origin1 = Origin::signed(1);249250// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];251252// assert_ok!(TemplateModule::create_multiple_items(253// origin1.clone(),254// 1,255// 1,256// items_data.clone().into_iter().map(|d| { d.into() }).collect()257// ));258259// for (index, _) in items_data.iter().enumerate() {260// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);261// }262// assert_eq!(TemplateModule::balance_count(1, 1), 3000);263// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);264// });265// }266267#[test]268fn transfer_fungible_item() {269 new_test_ext().execute_with(|| {270 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));271272 let origin1 = Origin::signed(1);273 let origin2 = Origin::signed(2);274275 let data = default_fungible_data();276 create_test_item(collection_id, &data.into());277278 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);279280 // change owner scenario281 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(0), 5));282 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);283284 // split item scenario285 assert_ok!(TemplateModule::transfer(286 origin2.clone(),287 account(3),288 CollectionId(1),289 TokenId(0),290 3291 ));292293 // split item and new owner has account scenario294 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(0), 1));295 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);296 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);297 });298}299300#[test]301fn transfer_refungible_item() {302 new_test_ext().execute_with(|| {303 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));304305 // Create RFT 1 in 1023 pieces for account 1306 let data = default_re_fungible_data();307 create_test_item(collection_id, &data.clone().into());308 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));309 assert_eq!(item.const_data, data.const_data.into_inner());310 assert_eq!(item.variable_data, data.variable_data.into_inner());311 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);312 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);313 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);314315 // Account 1 transfers all 1023 pieces of RFT 1 to account 2316 let origin1 = Origin::signed(1);317 let origin2 = Origin::signed(2);318 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));319 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 1023);320 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);321 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);322 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);323 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);324325 // Account 2 transfers 500 pieces of RFT 1 to account 3326 assert_ok!(TemplateModule::transfer(327 origin2.clone(),328 account(3),329 CollectionId(1),330 TokenId(1),331 500332 ));333 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 523);334 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 500);335 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);336 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);337 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);338 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);339340 // Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance341 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));342 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 323);343 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 700);344 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);345 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);346 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);347 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);348 });349}350351#[test]352fn transfer_nft_item() {353 new_test_ext().execute_with(|| {354 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));355356 let data = default_nft_data();357 create_test_item(collection_id, &data.into());358 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);359 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);360361362 let origin1 = Origin::signed(1);363 // default scenario364 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));365 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);366 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);367 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);368 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);369 });370}371372#[test]373fn transfer_nft_item_wrong_value() {374 new_test_ext().execute_with(|| {375 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));376377 let data = default_nft_data();378 create_test_item(collection_id, &data.into());379 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);380 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);381382 let origin1 = Origin::signed(1);383384 assert_noop!(385 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2).map_err(|e| e.error),386 <pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount387 );388 });389}390391#[test]392fn transfer_nft_item_zero_value() {393 new_test_ext().execute_with(|| {394 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));395396 let data = default_nft_data();397 create_test_item(collection_id, &data.into());398 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);399 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);400401 let origin1 = Origin::signed(1);402403 // Transferring 0 amount works on NFT...404 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 0));405 // ... and results in no transfer406 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);407 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);408 });409}410411#[test]412fn nft_approve_and_transfer_from() {413 new_test_ext().execute_with(|| {414 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));415416 let data = default_nft_data();417 create_test_item(collection_id, &data.into());418419 let origin1 = Origin::signed(1);420 let origin2 = Origin::signed(2);421422 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);423 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);424425 // neg transfer_from426 assert_noop!(427 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),428 CommonError::<Test>::TokenValueNotEnough429 );430431 // do approve432 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));433 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));434435 assert_ok!(TemplateModule::transfer_from(436 origin2,437 account(1),438 account(3),439 CollectionId(1),440 TokenId(1),441 1442 ));443 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());444 });445}446447#[test]448fn nft_approve_and_transfer_from_allow_list() {449 new_test_ext().execute_with(|| {450 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));451452 let origin1 = Origin::signed(1);453 let origin2 = Origin::signed(2);454455 // Create NFT 1 for account 1456 let data = default_nft_data();457 create_test_item(collection_id, &data.clone().into());458 assert_eq!(459 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,460 &data.const_data.into_inner()461 );462 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);463 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);464465 // Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list466 assert_ok!(TemplateModule::set_mint_permission(467 origin1.clone(),468 CollectionId(1),469 true470 ));471 assert_ok!(TemplateModule::set_public_access_mode(472 origin1.clone(),473 CollectionId(1),474 AccessMode::AllowList475 ));476 assert_ok!(TemplateModule::add_to_allow_list(477 origin1.clone(),478 CollectionId(1),479 account(1)480 ));481 assert_ok!(TemplateModule::add_to_allow_list(482 origin1.clone(),483 CollectionId(1),484 account(2)485 ));486 assert_ok!(TemplateModule::add_to_allow_list(487 origin1.clone(),488 CollectionId(1),489 account(3)490 ));491492 // Account 1 approves account 2 for NFT 1 493 assert_ok!(TemplateModule::approve(494 origin1.clone(),495 account(2),496 CollectionId(1),497 TokenId(1),498 1499 ));500 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));501502 // Account 2 transfers NFT 1 from account 1 to account 3503 assert_ok!(TemplateModule::transfer_from(504 origin2,505 account(1),506 account(3),507 CollectionId(1),508 TokenId(1),509 1510 ));511 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());512 });513}514515#[test]516fn refungible_approve_and_transfer_from() {517 new_test_ext().execute_with(|| {518 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));519520 let origin1 = Origin::signed(1);521 let origin2 = Origin::signed(2);522523 // Create RFT 1 in 1023 pieces for account 1524 let data = default_re_fungible_data();525 create_test_item(collection_id, &data.into());526527 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);528 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);529 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);530531 // Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list532 assert_ok!(TemplateModule::set_mint_permission(533 origin1.clone(),534 CollectionId(1),535 true536 ));537 assert_ok!(TemplateModule::set_public_access_mode(538 origin1.clone(),539 CollectionId(1),540 AccessMode::AllowList541 ));542 assert_ok!(TemplateModule::add_to_allow_list(543 origin1.clone(),544 CollectionId(1),545 account(1)546 ));547 assert_ok!(TemplateModule::add_to_allow_list(548 origin1.clone(),549 CollectionId(1),550 account(2)551 ));552 assert_ok!(TemplateModule::add_to_allow_list(553 origin1.clone(),554 CollectionId(1),555 account(3)556 ));557558 // Account 1 approves account 2 for 1023 pieces of RFT 1559 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));560 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);561562 // Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3563 assert_ok!(TemplateModule::transfer_from(564 origin2,565 account(1),566 account(3),567 CollectionId(1),568 TokenId(1),569 100570 ));571 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);572 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);573 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 923);574 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 100);575 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);576 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);577 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);578 });579}580581#[test]582fn fungible_approve_and_transfer_from() {583 new_test_ext().execute_with(|| {584 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));585586 let data = default_fungible_data();587 create_test_item(collection_id, &data.into());588589 let origin1 = Origin::signed(1);590 let origin2 = Origin::signed(2);591592 assert_ok!(TemplateModule::set_mint_permission(593 origin1.clone(),594 CollectionId(1),595 true596 ));597 assert_ok!(TemplateModule::set_public_access_mode(598 origin1.clone(),599 CollectionId(1),600 AccessMode::AllowList601 ));602 assert_ok!(TemplateModule::add_to_allow_list(603 origin1.clone(),604 CollectionId(1),605 account(1)606 ));607 assert_ok!(TemplateModule::add_to_allow_list(608 origin1.clone(),609 CollectionId(1),610 account(2)611 ));612 assert_ok!(TemplateModule::add_to_allow_list(613 origin1.clone(),614 CollectionId(1),615 account(3)616 ));617618 // do approve619 assert_ok!(TemplateModule::approve(620 origin1.clone(),621 account(2),622 CollectionId(1),623 TokenId(0),624 5625 ));626 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);627 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(0), 5));628 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);629 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);630631 assert_ok!(TemplateModule::transfer_from(632 origin2.clone(),633 account(1),634 account(3),635 CollectionId(1),636 TokenId(0),637 4638 ));639640 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);641642 assert_noop!(643 TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(0), 4).map_err(|e| e.error),644 CommonError::<Test>::TokenValueNotEnough645 );646 });647}648649#[test]650fn change_collection_owner() {651 new_test_ext().execute_with(|| {652 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));653654 let origin1 = Origin::signed(1);655 assert_ok!(TemplateModule::change_collection_owner(656 origin1,657 collection_id,658 2659 ));660 assert_eq!(661 <pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,662 2663 );664 });665}666667#[test]668fn destroy_collection() {669 new_test_ext().execute_with(|| {670 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));671672 let origin1 = Origin::signed(1);673 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));674 });675}676677#[test]678fn burn_nft_item() {679 new_test_ext().execute_with(|| {680 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));681682 let origin1 = Origin::signed(1);683684 let data = default_nft_data();685 create_test_item(collection_id, &data.into());686687 // check balance (collection with id = 1, user id = 1)688 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);689690 // burn item691 assert_ok!(TemplateModule::burn_item(692 origin1.clone(),693 collection_id,694 TokenId(1),695 1696 ));697 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);698 });699}700701#[test]702fn burn_same_nft_item_twice() {703 new_test_ext().execute_with(|| {704 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));705706 let origin1 = Origin::signed(1);707708 let data = default_nft_data();709 create_test_item(collection_id, &data.into());710711 // check balance (collection with id = 1, user id = 1)712 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);713714 // burn item715 assert_ok!(TemplateModule::burn_item(716 origin1.clone(),717 collection_id,718 TokenId(1),719 1720 ));721 722 // burn item again723 assert_noop!(724 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),725 CommonError::<Test>::TokenNotFound726 );727728 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);729 });730}731732#[test]733fn burn_fungible_item() {734 new_test_ext().execute_with(|| {735 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));736737 let origin1 = Origin::signed(1);738 assert_ok!(TemplateModule::add_collection_admin(739 origin1.clone(),740 collection_id,741 account(2)742 ));743744 let data = default_fungible_data();745 create_test_item(collection_id, &data.into());746747 // check balance (collection with id = 1, user id = 1)748 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);749750 // burn item751 assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(0), 5));752 assert_noop!(753 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),754 CommonError::<Test>::TokenValueTooLow755 );756757 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);758 });759}760761#[test]762fn burn_fungible_item_with_token_id() {763 new_test_ext().execute_with(|| {764 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));765766 let origin1 = Origin::signed(1);767 assert_ok!(TemplateModule::add_collection_admin(768 origin1.clone(),769 collection_id,770 account(2)771 ));772773 let data = default_fungible_data();774 create_test_item(collection_id, &data.into());775776 // check balance (collection with id = 1, user id = 1)777 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);778779 // Try to burn item using Token ID780 assert_noop!(781 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),782 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId783 );784 });785}786#[test]787fn burn_refungible_item() {788 new_test_ext().execute_with(|| {789 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));790 let origin1 = Origin::signed(1);791792 assert_ok!(TemplateModule::set_mint_permission(793 origin1.clone(),794 collection_id,795 true796 ));797 assert_ok!(TemplateModule::set_public_access_mode(798 origin1.clone(),799 collection_id,800 AccessMode::AllowList801 ));802 assert_ok!(TemplateModule::add_to_allow_list(803 origin1.clone(),804 collection_id,805 account(1)806 ));807808 assert_ok!(TemplateModule::add_collection_admin(809 origin1.clone(),810 collection_id,811 account(2)812 ));813814 let data = default_re_fungible_data();815 create_test_item(collection_id, &data.into());816817 // check balance (collection with id = 1, user id = 2)818 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);819 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);820821 // burn item822 assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));823 assert_noop!(824 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),825 CommonError::<Test>::TokenValueTooLow826 );827828 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);829 });830}831832#[test]833fn add_collection_admin() {834 new_test_ext().execute_with(|| {835 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));836 let origin1 = Origin::signed(1);837838 // Add collection admins839 assert_ok!(TemplateModule::add_collection_admin(840 origin1.clone(),841 collection1_id,842 account(2)843 ));844 assert_ok!(TemplateModule::add_collection_admin(845 origin1,846 collection1_id,847 account(3)848 ));849850 // Owner is not an admin by default851 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))), false);852 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));853 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));854 });855}856857#[test]858fn remove_collection_admin() {859 new_test_ext().execute_with(|| {860 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));861 let origin1 = Origin::signed(1);862 let origin2 = Origin::signed(2);863864 // Add collection admins 2 and 3865 assert_ok!(TemplateModule::add_collection_admin(866 origin1.clone(),867 collection1_id,868 account(2)869 ));870 assert_ok!(TemplateModule::add_collection_admin(871 origin1,872 collection1_id,873 account(3)874 ));875876 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));877 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));878879 // remove admin 3880 assert_ok!(TemplateModule::remove_collection_admin(881 origin2,882 CollectionId(1),883 account(3)884 ));885886 // 2 is still admin, 3 is not an admin anymore887 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));888 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))), false);889 });890}891892#[test]893fn balance_of() {894 new_test_ext().execute_with(|| {895 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));896 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));897 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));898899 // check balance before900 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);901 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);902 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);903904 let nft_data = default_nft_data();905 create_test_item(nft_collection_id, &nft_data.into());906907 let fungible_data = default_fungible_data();908 create_test_item(fungible_collection_id, &fungible_data.into());909910 let re_fungible_data = default_re_fungible_data();911 create_test_item(re_fungible_collection_id, &re_fungible_data.into());912913 // check balance (collection with id = 1, user id = 1)914 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);915 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);916 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1);917918 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);919 assert_eq!(<pallet_refungible::Owned<Test>>::get((re_fungible_collection_id, account(1), TokenId(1))), true);920 });921}922923#[test]924fn approve() {925 new_test_ext().execute_with(|| {926 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));927928 let data = default_nft_data();929 create_test_item(collection_id, &data.into());930931 let origin1 = Origin::signed(1);932933 // approve934 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));935 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));936 });937}938939#[test]940fn transfer_from() {941 new_test_ext().execute_with(|| {942 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));943 let origin1 = Origin::signed(1);944 let origin2 = Origin::signed(2);945946 let data = default_nft_data();947 create_test_item(collection_id, &data.into());948949 // approve950 assert_ok!(TemplateModule::approve(951 origin1.clone(),952 account(2),953 CollectionId(1),954 TokenId(1),955 1956 ));957 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));958959 assert_ok!(TemplateModule::set_mint_permission(960 origin1.clone(),961 CollectionId(1),962 true963 ));964 assert_ok!(TemplateModule::set_public_access_mode(965 origin1.clone(),966 CollectionId(1),967 AccessMode::AllowList968 ));969 assert_ok!(TemplateModule::add_to_allow_list(970 origin1.clone(),971 CollectionId(1),972 account(1)973 ));974 assert_ok!(TemplateModule::add_to_allow_list(975 origin1.clone(),976 CollectionId(1),977 account(2)978 ));979 assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));980981 assert_ok!(TemplateModule::transfer_from(982 origin2,983 account(1),984 account(2),985 CollectionId(1),986 TokenId(1),987 1988 ));989990 // after transfer991 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);992 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);993 });994}995996// #endregion997998// Coverage tests region999// #region10001001#[test]1002fn owner_can_add_address_to_allow_list() {1003 new_test_ext().execute_with(|| {1004 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10051006 let origin1 = Origin::signed(1);1007 assert_ok!(TemplateModule::add_to_allow_list(1008 origin1,1009 collection_id,1010 account(2)1011 ));1012 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1013 });1014}10151016#[test]1017fn admin_can_add_address_to_allow_list() {1018 new_test_ext().execute_with(|| {1019 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1020 let origin1 = Origin::signed(1);1021 let origin2 = Origin::signed(2);10221023 assert_ok!(TemplateModule::add_collection_admin(1024 origin1,1025 collection_id,1026 account(2)1027 ));1028 assert_ok!(TemplateModule::add_to_allow_list(1029 origin2,1030 collection_id,1031 account(3)1032 ));1033 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1034 });1035}10361037#[test]1038fn nonprivileged_user_cannot_add_address_to_allow_list() {1039 new_test_ext().execute_with(|| {1040 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10411042 let origin2 = Origin::signed(2);1043 assert_noop!(1044 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1045 CommonError::<Test>::NoPermission1046 );1047 });1048}10491050#[test]1051fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1052 new_test_ext().execute_with(|| {1053 let origin1 = Origin::signed(1);10541055 assert_noop!(1056 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1057 CommonError::<Test>::CollectionNotFound1058 );1059 });1060}10611062#[test]1063fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1064 new_test_ext().execute_with(|| {1065 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10661067 let origin1 = Origin::signed(1);1068 assert_ok!(TemplateModule::destroy_collection(1069 origin1.clone(),1070 collection_id1071 ));1072 assert_noop!(1073 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1074 CommonError::<Test>::CollectionNotFound1075 );1076 });1077}10781079// If address is already added to allow list, nothing happens1080#[test]1081fn address_is_already_added_to_allow_list() {1082 new_test_ext().execute_with(|| {1083 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1084 let origin1 = Origin::signed(1);10851086 assert_ok!(TemplateModule::add_to_allow_list(1087 origin1.clone(),1088 collection_id,1089 account(2)1090 ));1091 assert_ok!(TemplateModule::add_to_allow_list(1092 origin1,1093 collection_id,1094 account(2)1095 ));1096 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1097 });1098}10991100#[test]1101fn owner_can_remove_address_from_allow_list() {1102 new_test_ext().execute_with(|| {1103 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));11041105 let origin1 = Origin::signed(1);1106 assert_ok!(TemplateModule::add_to_allow_list(1107 origin1.clone(),1108 collection_id,1109 account(2)1110 ));1111 assert_ok!(TemplateModule::remove_from_allow_list(1112 origin1,1113 collection_id,1114 account(2)1115 ));1116 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1117 });1118}11191120#[test]1121fn admin_can_remove_address_from_allow_list() {1122 new_test_ext().execute_with(|| {1123 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1124 let origin1 = Origin::signed(1);1125 let origin2 = Origin::signed(2);11261127 // Owner adds admin1128 assert_ok!(TemplateModule::add_collection_admin(1129 origin1.clone(),1130 collection_id,1131 account(2)1132 ));11331134 // Owner adds address 3 to allow list1135 assert_ok!(TemplateModule::add_to_allow_list(1136 origin1,1137 collection_id,1138 account(3)1139 ));11401141 // Admin removes address 3 from allow list1142 assert_ok!(TemplateModule::remove_from_allow_list(1143 origin2,1144 collection_id,1145 account(3)1146 ));1147 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))), false);1148 });1149}11501151#[test]1152fn nonprivileged_user_cannot_remove_address_from_allow_list() {1153 new_test_ext().execute_with(|| {1154 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1155 let origin1 = Origin::signed(1);1156 let origin2 = Origin::signed(2);11571158 assert_ok!(TemplateModule::add_to_allow_list(1159 origin1,1160 collection_id,1161 account(2)1162 ));1163 assert_noop!(1164 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1165 CommonError::<Test>::NoPermission1166 );1167 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1168 });1169}11701171#[test]1172fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1173 new_test_ext().execute_with(|| {1174 let origin1 = Origin::signed(1);11751176 assert_noop!(1177 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1178 CommonError::<Test>::CollectionNotFound1179 );1180 });1181}11821183#[test]1184fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1185 new_test_ext().execute_with(|| {1186 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1187 let origin1 = Origin::signed(1);1188 let origin2 = Origin::signed(2);11891190 // Add account 2 to allow list1191 assert_ok!(TemplateModule::add_to_allow_list(1192 origin1.clone(),1193 collection_id,1194 account(2)1195 ));11961197 // Account 2 is in collection allow-list1198 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));11991200 // Destroy collection1201 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));12021203 // Attempt to remove account 2 from collection allow-list => error1204 assert_noop!(1205 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1206 CommonError::<Test>::CollectionNotFound1207 );12081209 // Account 2 is not found in collection allow-list anyway1210 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1211 });1212}12131214// If address is already removed from allow list, nothing happens1215#[test]1216fn address_is_already_removed_from_allow_list() {1217 new_test_ext().execute_with(|| {1218 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1219 let origin1 = Origin::signed(1);12201221 assert_ok!(TemplateModule::add_to_allow_list(1222 origin1.clone(),1223 collection_id,1224 account(2)1225 ));1226 assert_ok!(TemplateModule::remove_from_allow_list(1227 origin1.clone(),1228 collection_id,1229 account(2)1230 ));1231 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1232 assert_ok!(TemplateModule::remove_from_allow_list(1233 origin1,1234 collection_id,1235 account(2)1236 ));1237 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1238 });1239}12401241// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1242#[test]1243fn allow_list_test_1() {1244 new_test_ext().execute_with(|| {1245 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12461247 let origin1 = Origin::signed(1);12481249 let data = default_nft_data();1250 create_test_item(collection_id, &data.into());12511252 assert_ok!(TemplateModule::set_public_access_mode(1253 origin1.clone(),1254 collection_id,1255 AccessMode::AllowList1256 ));1257 assert_ok!(TemplateModule::add_to_allow_list(1258 origin1.clone(),1259 collection_id,1260 account(2)1261 ));12621263 assert_noop!(1264 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1265 CommonError::<Test>::AddressNotInAllowlist1266 );1267 });1268}12691270#[test]1271fn allow_list_test_2() {1272 new_test_ext().execute_with(|| {1273 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1274 let origin1 = Origin::signed(1);12751276 let data = default_nft_data();1277 create_test_item(collection_id, &data.into());12781279 assert_ok!(TemplateModule::set_public_access_mode(1280 origin1.clone(),1281 collection_id,1282 AccessMode::AllowList1283 ));1284 assert_ok!(TemplateModule::add_to_allow_list(1285 origin1.clone(),1286 collection_id,1287 account(1)1288 ));1289 assert_ok!(TemplateModule::add_to_allow_list(1290 origin1.clone(),1291 collection_id,1292 account(2)1293 ));12941295 // do approve1296 assert_ok!(TemplateModule::approve(1297 origin1.clone(),1298 account(1),1299 collection_id,1300 TokenId(1),1301 11302 ));1303 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13041305 assert_ok!(TemplateModule::remove_from_allow_list(1306 origin1.clone(),1307 collection_id,1308 account(1)1309 ));13101311 assert_noop!(1312 TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1313 CommonError::<Test>::AddressNotInAllowlist1314 );1315 });1316}13171318// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1319#[test]1320fn allow_list_test_3() {1321 new_test_ext().execute_with(|| {1322 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13231324 let origin1 = Origin::signed(1);13251326 let data = default_nft_data();1327 create_test_item(collection_id, &data.into());13281329 assert_ok!(TemplateModule::set_public_access_mode(1330 origin1.clone(),1331 collection_id,1332 AccessMode::AllowList1333 ));1334 assert_ok!(TemplateModule::add_to_allow_list(1335 origin1.clone(),1336 collection_id,1337 account(1)1338 ));13391340 assert_noop!(1341 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1342 CommonError::<Test>::AddressNotInAllowlist1343 );1344 });1345}13461347#[test]1348fn allow_list_test_4() {1349 new_test_ext().execute_with(|| {1350 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13511352 let origin1 = Origin::signed(1);13531354 let data = default_nft_data();1355 create_test_item(collection_id, &data.into());13561357 assert_ok!(TemplateModule::set_public_access_mode(1358 origin1.clone(),1359 collection_id,1360 AccessMode::AllowList1361 ));1362 assert_ok!(TemplateModule::add_to_allow_list(1363 origin1.clone(),1364 collection_id,1365 account(1)1366 ));1367 assert_ok!(TemplateModule::add_to_allow_list(1368 origin1.clone(),1369 collection_id,1370 account(2)1371 ));13721373 // do approve1374 assert_ok!(TemplateModule::approve(1375 origin1.clone(),1376 account(1),1377 collection_id,1378 TokenId(1),1379 11380 ));1381 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13821383 assert_ok!(TemplateModule::remove_from_allow_list(1384 origin1.clone(),1385 collection_id,1386 account(2)1387 ));13881389 assert_noop!(1390 TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1391 CommonError::<Test>::AddressNotInAllowlist1392 );1393 });1394}13951396// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1397#[test]1398fn allow_list_test_5() {1399 new_test_ext().execute_with(|| {1400 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14011402 let origin1 = Origin::signed(1);14031404 let data = default_nft_data();1405 create_test_item(collection_id, &data.into());14061407 assert_ok!(TemplateModule::set_public_access_mode(1408 origin1.clone(),1409 collection_id,1410 AccessMode::AllowList1411 ));1412 assert_noop!(1413 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1414 CommonError::<Test>::AddressNotInAllowlist1415 );1416 });1417}14181419// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1420#[test]1421fn allow_list_test_6() {1422 new_test_ext().execute_with(|| {1423 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14241425 let origin1 = Origin::signed(1);14261427 let data = default_nft_data();1428 create_test_item(collection_id, &data.into());14291430 assert_ok!(TemplateModule::set_public_access_mode(1431 origin1.clone(),1432 collection_id,1433 AccessMode::AllowList1434 ));14351436 // do approve1437 assert_noop!(1438 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1439 CommonError::<Test>::AddressNotInAllowlist1440 );1441 });1442}14431444// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1445// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1446#[test]1447fn allow_list_test_7() {1448 new_test_ext().execute_with(|| {1449 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14501451 let data = default_nft_data();1452 create_test_item(collection_id, &data.into());14531454 let origin1 = Origin::signed(1);14551456 assert_ok!(TemplateModule::set_public_access_mode(1457 origin1.clone(),1458 collection_id,1459 AccessMode::AllowList1460 ));1461 assert_ok!(TemplateModule::add_to_allow_list(1462 origin1.clone(),1463 collection_id,1464 account(1)1465 ));1466 assert_ok!(TemplateModule::add_to_allow_list(1467 origin1.clone(),1468 collection_id,1469 account(2)1470 ));14711472 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1473 });1474}14751476#[test]1477fn allow_list_test_8() {1478 new_test_ext().execute_with(|| {1479 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14801481 // Create NFT for account 11482 let data = default_nft_data();1483 create_test_item(collection_id, &data.into());14841485 let origin1 = Origin::signed(1);14861487 // Toggle Allow List mode and add accounts 1 and 21488 assert_ok!(TemplateModule::set_public_access_mode(1489 origin1.clone(),1490 collection_id,1491 AccessMode::AllowList1492 ));1493 assert_ok!(TemplateModule::add_to_allow_list(1494 origin1.clone(),1495 collection_id,1496 account(1)1497 ));1498 assert_ok!(TemplateModule::add_to_allow_list(1499 origin1.clone(),1500 collection_id,1501 account(2)1502 ));15031504 // Sself-approve account 1 for NFT 11505 assert_ok!(TemplateModule::approve(1506 origin1.clone(),1507 account(1),1508 CollectionId(1), 1509 TokenId(1),1510 11511 ));1512 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));15131514 // Transfer from 1 to 21515 assert_ok!(TemplateModule::transfer_from(1516 origin1,1517 account(1),1518 account(2),1519 CollectionId(1), 1520 TokenId(1),1521 11522 ));1523 });1524}15251526// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1527#[test]1528fn allow_list_test_9() {1529 new_test_ext().execute_with(|| {1530 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1531 let origin1 = Origin::signed(1);15321533 assert_ok!(TemplateModule::set_public_access_mode(1534 origin1.clone(),1535 collection_id,1536 AccessMode::AllowList1537 ));1538 assert_ok!(TemplateModule::set_mint_permission(1539 origin1,1540 collection_id,1541 false1542 ));15431544 let data = default_nft_data();1545 create_test_item(collection_id, &data.into());1546 });1547}15481549// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1550#[test]1551fn allow_list_test_10() {1552 new_test_ext().execute_with(|| {1553 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15541555 let origin1 = Origin::signed(1);1556 let origin2 = Origin::signed(2);15571558 assert_ok!(TemplateModule::set_public_access_mode(1559 origin1.clone(),1560 collection_id,1561 AccessMode::AllowList1562 ));1563 assert_ok!(TemplateModule::set_mint_permission(1564 origin1.clone(),1565 collection_id,1566 false1567 ));15681569 assert_ok!(TemplateModule::add_collection_admin(1570 origin1,1571 collection_id,1572 account(2)1573 ));15741575 assert_ok!(TemplateModule::create_item(1576 origin2,1577 collection_id,1578 account(2),1579 default_nft_data().into()1580 ));1581 });1582}15831584// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.1585#[test]1586fn allow_list_test_11() {1587 new_test_ext().execute_with(|| {1588 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15891590 let origin1 = Origin::signed(1);1591 let origin2 = Origin::signed(2);15921593 assert_ok!(TemplateModule::set_public_access_mode(1594 origin1.clone(),1595 collection_id,1596 AccessMode::AllowList1597 ));1598 assert_ok!(TemplateModule::set_mint_permission(1599 origin1.clone(),1600 collection_id,1601 false1602 ));1603 assert_ok!(TemplateModule::add_to_allow_list(1604 origin1,1605 collection_id,1606 account(2)1607 ));16081609 assert_noop!(1610 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1611 CommonError::<Test>::PublicMintingNotAllowed1612 );1613 });1614}16151616// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.1617#[test]1618fn allow_list_test_12() {1619 new_test_ext().execute_with(|| {1620 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16211622 let origin1 = Origin::signed(1);1623 let origin2 = Origin::signed(2);16241625 assert_ok!(TemplateModule::set_public_access_mode(1626 origin1.clone(),1627 collection_id,1628 AccessMode::AllowList1629 ));1630 assert_ok!(TemplateModule::set_mint_permission(1631 origin1,1632 collection_id,1633 false1634 ));16351636 assert_noop!(1637 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1638 CommonError::<Test>::PublicMintingNotAllowed1639 );1640 });1641}16421643// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1644#[test]1645fn allow_list_test_13() {1646 new_test_ext().execute_with(|| {1647 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16481649 let origin1 = Origin::signed(1);16501651 assert_ok!(TemplateModule::set_public_access_mode(1652 origin1.clone(),1653 collection_id,1654 AccessMode::AllowList1655 ));1656 assert_ok!(TemplateModule::set_mint_permission(1657 origin1,1658 collection_id,1659 true1660 ));16611662 let data = default_nft_data();1663 create_test_item(collection_id, &data.into());1664 });1665}16661667// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1668#[test]1669fn allow_list_test_14() {1670 new_test_ext().execute_with(|| {1671 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16721673 let origin1 = Origin::signed(1);1674 let origin2 = Origin::signed(2);16751676 assert_ok!(TemplateModule::set_public_access_mode(1677 origin1.clone(),1678 collection_id,1679 AccessMode::AllowList1680 ));1681 assert_ok!(TemplateModule::set_mint_permission(1682 origin1.clone(),1683 collection_id,1684 true1685 ));16861687 assert_ok!(TemplateModule::add_collection_admin(1688 origin1,1689 collection_id,1690 account(2)1691 ));16921693 assert_ok!(TemplateModule::create_item(1694 origin2,1695 collection_id,1696 account(2),1697 default_nft_data().into()1698 ));1699 });1700}17011702// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.1703#[test]1704fn allow_list_test_15() {1705 new_test_ext().execute_with(|| {1706 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17071708 let origin1 = Origin::signed(1);1709 let origin2 = Origin::signed(2);17101711 assert_ok!(TemplateModule::set_public_access_mode(1712 origin1.clone(),1713 collection_id,1714 AccessMode::AllowList1715 ));1716 assert_ok!(TemplateModule::set_mint_permission(1717 origin1,1718 collection_id,1719 true1720 ));17211722 assert_noop!(1723 TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()).map_err(|e| e.error),1724 CommonError::<Test>::AddressNotInAllowlist1725 );1726 });1727}17281729// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.1730#[test]1731fn allow_list_test_16() {1732 new_test_ext().execute_with(|| {1733 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17341735 let origin1 = Origin::signed(1);1736 let origin2 = Origin::signed(2);17371738 assert_ok!(TemplateModule::set_public_access_mode(1739 origin1.clone(),1740 collection_id,1741 AccessMode::AllowList1742 ));1743 assert_ok!(TemplateModule::set_mint_permission(1744 origin1.clone(),1745 collection_id,1746 true1747 ));1748 assert_ok!(TemplateModule::add_to_allow_list(1749 origin1,1750 collection_id,1751 account(2)1752 ));17531754 assert_ok!(TemplateModule::create_item(1755 origin2,1756 collection_id,1757 account(2),1758 default_nft_data().into()1759 ));1760 });1761}17621763// Total number of collections. Positive test1764#[test]1765fn total_number_collections_bound() {1766 new_test_ext().execute_with(|| {1767 create_test_collection(&CollectionMode::NFT, CollectionId(1));1768 });1769}17701771#[test]1772fn create_max_collections() {1773 new_test_ext().execute_with(|| {1774 for i in 1..=COLLECTION_NUMBER_LIMIT {1775 create_test_collection(&CollectionMode::NFT, CollectionId(i));1776 }1777 });1778}17791780// Total number of collections. Negative test1781#[test]1782fn total_number_collections_bound_neg() {1783 new_test_ext().execute_with(|| {1784 let origin1 = Origin::signed(1);17851786 for i in 1..=COLLECTION_NUMBER_LIMIT {1787 create_test_collection(&CollectionMode::NFT, CollectionId(i));1788 }17891790 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1791 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1792 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17931794 // 11-th collection in chain. Expects error1795 assert_noop!(1796 TemplateModule::create_collection(1797 origin1,1798 col_name1,1799 col_desc1,1800 token_prefix1,1801 CollectionMode::NFT1802 ),1803 CommonError::<Test>::TotalCollectionsLimitExceeded1804 );1805 });1806}18071808// Owned tokens by a single address. Positive test1809#[test]1810fn owned_tokens_bound() {1811 new_test_ext().execute_with(|| {1812 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18131814 let data = default_nft_data();1815 create_test_item(collection_id, &data.clone().into());1816 create_test_item(collection_id, &data.into());1817 });1818}18191820// Owned tokens by a single address. Negotive test1821#[test]1822fn owned_tokens_bound_neg() {1823 new_test_ext().execute_with(|| {1824 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18251826 let origin1 = Origin::signed(1);18271828 for _ in 1..=MAX_TOKEN_OWNERSHIP {1829 let data = default_nft_data();1830 create_test_item(collection_id, &data.clone().into());1831 }18321833 let data = default_nft_data();1834 assert_noop!(1835 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()).map_err(|e| e.error),1836 CommonError::<Test>::AccountTokenLimitExceeded1837 );1838 });1839}18401841// Number of collection admins. Positive test1842#[test]1843fn collection_admins_bound() {1844 new_test_ext().execute_with(|| {1845 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18461847 let origin1 = Origin::signed(1);18481849 assert_ok!(TemplateModule::add_collection_admin(1850 origin1.clone(),1851 collection_id,1852 account(2)1853 ));1854 assert_ok!(TemplateModule::add_collection_admin(1855 origin1,1856 collection_id,1857 account(3)1858 ));1859 });1860}18611862// Number of collection admins. Negotive test1863#[test]1864fn collection_admins_bound_neg() {1865 new_test_ext().execute_with(|| {1866 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18671868 let origin1 = Origin::signed(1);18691870 for i in 0..COLLECTION_ADMINS_LIMIT {1871 assert_ok!(TemplateModule::add_collection_admin(1872 origin1.clone(),1873 collection_id,1874 account((2 + i).into())1875 ));1876 }1877 assert_noop!(1878 TemplateModule::add_collection_admin(1879 origin1,1880 collection_id,1881 account((3 + COLLECTION_ADMINS_LIMIT).into())1882 ),1883 CommonError::<Test>::CollectionAdminCountExceeded1884 );1885 });1886}1887// #endregion18881889#[test]1890fn set_const_on_chain_schema() {1891 new_test_ext().execute_with(|| {1892 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18931894 let origin1 = Origin::signed(1);1895 assert_ok!(TemplateModule::set_const_on_chain_schema(1896 origin1,1897 collection_id,1898 b"test const on chain schema".to_vec()1899 ));19001901 assert_eq!(1902 <pallet_common::CollectionById<Test>>::get(collection_id)1903 .unwrap()1904 .const_on_chain_schema,1905 b"test const on chain schema".to_vec()1906 );1907 assert_eq!(1908 <pallet_common::CollectionById<Test>>::get(collection_id)1909 .unwrap()1910 .variable_on_chain_schema,1911 b"".to_vec()1912 );1913 });1914}19151916#[test]1917fn set_variable_on_chain_schema() {1918 new_test_ext().execute_with(|| {1919 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19201921 let origin1 = Origin::signed(1);1922 assert_ok!(TemplateModule::set_variable_on_chain_schema(1923 origin1,1924 collection_id,1925 b"test variable on chain schema".to_vec()1926 ));19271928 assert_eq!(1929 <pallet_common::CollectionById<Test>>::get(collection_id)1930 .unwrap()1931 .const_on_chain_schema,1932 b"".to_vec()1933 );1934 assert_eq!(1935 <pallet_common::CollectionById<Test>>::get(collection_id)1936 .unwrap()1937 .variable_on_chain_schema,1938 b"test variable on chain schema".to_vec()1939 );1940 });1941}19421943#[test]1944fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1945 new_test_ext().execute_with(|| {1946 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19471948 let origin1 = Origin::signed(1);19491950 let data = default_nft_data();1951 create_test_item(CollectionId(1), &data.into());19521953 let variable_data = b"test data".to_vec();1954 assert_ok!(TemplateModule::set_variable_meta_data(1955 origin1,1956 collection_id,1957 TokenId(1),1958 variable_data.clone()1959 ));19601961 assert_eq!(1962 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1963 .unwrap()1964 .variable_data,1965 variable_data1966 );1967 });1968}19691970#[test]1971fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1972 new_test_ext().execute_with(|| {1973 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19741975 let origin1 = Origin::signed(1);19761977 let data = default_re_fungible_data();1978 create_test_item(collection_id, &data.into());19791980 let variable_data = b"test data".to_vec();1981 assert_ok!(TemplateModule::set_variable_meta_data(1982 origin1,1983 collection_id,1984 TokenId(1),1985 variable_data.clone()1986 ));19871988 assert_eq!(1989 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1990 .variable_data,1991 variable_data1992 );1993 });1994}19951996#[test]1997fn set_variable_meta_data_on_fungible_token_fails() {1998 new_test_ext().execute_with(|| {1999 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20002001 let origin1 = Origin::signed(1);20022003 let data = default_fungible_data();2004 create_test_item(collection_id, &data.into());20052006 let variable_data = b"test data".to_vec();2007 assert_noop!(2008 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(0), variable_data).map_err(|e| e.error),2009 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2010 );2011 });2012}20132014#[test]2015fn set_variable_meta_data_on_fungible_token_with_token_id_fails() {2016 new_test_ext().execute_with(|| {2017 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20182019 let origin1 = Origin::signed(1);20202021 let data = default_fungible_data();2022 create_test_item(collection_id, &data.into());20232024 let variable_data = b"test data".to_vec();2025 assert_noop!(2026 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2027 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId2028 );2029 });2030}20312032#[test]2033fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2034 new_test_ext().execute_with(|| {2035 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20362037 let origin1 = Origin::signed(1);20382039 let data = default_nft_data();2040 create_test_item(collection_id, &data.into());20412042 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2043 assert_noop!(2044 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2045 CommonError::<Test>::TokenVariableDataLimitExceeded2046 );2047 });2048}20492050#[test]2051fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2052 new_test_ext().execute_with(|| {2053 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20542055 let origin1 = Origin::signed(1);20562057 let data = default_re_fungible_data();2058 create_test_item(collection_id, &data.into());20592060 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2061 assert_noop!(2062 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2063 CommonError::<Test>::TokenVariableDataLimitExceeded2064 );2065 });2066}20672068#[test]2069fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2070 new_test_ext().execute_with(|| {2071 //default_limits();20722073 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20742075 let origin1 = Origin::signed(1);20762077 let data = default_nft_data();2078 create_test_item(collection_id, &data.into());20792080 assert_ok!(TemplateModule::set_meta_update_permission_flag(2081 origin1.clone(),2082 collection_id,2083 MetaUpdatePermission::ItemOwner,2084 ));20852086 let variable_data = b"ten chars.".to_vec();2087 assert_ok!(TemplateModule::set_variable_meta_data(2088 origin1,2089 collection_id,2090 TokenId(1),2091 variable_data.clone()2092 ));20932094 assert_eq!(2095 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2096 .unwrap()2097 .variable_data,2098 variable_data2099 );2100 });2101}21022103#[test]2104fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2105 new_test_ext().execute_with(|| {2106 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));21072108 let origin1 = Origin::signed(1);21092110 assert_ok!(TemplateModule::set_mint_permission(2111 origin1.clone(),2112 collection_id,2113 true2114 ));2115 assert_ok!(TemplateModule::add_to_allow_list(2116 origin1.clone(),2117 collection_id,2118 account(1)2119 ));21202121 let data = default_nft_data();2122 create_test_item(collection_id, &data.into());21232124 assert_ok!(TemplateModule::set_meta_update_permission_flag(2125 origin1.clone(),2126 collection_id,2127 MetaUpdatePermission::ItemOwner,2128 ));21292130 let variable_data = b"1234567890123".to_vec();2131 assert_noop!(2132 TemplateModule::set_variable_meta_data(2133 origin1,2134 collection_id,2135 TokenId(1),2136 variable_data.clone()2137 ).map_err(|e| e.error),2138 CommonError::<Test>::TokenVariableDataLimitExceeded2139 );2140 })2141}21422143#[test]2144fn collection_transfer_flag_works() {2145 new_test_ext().execute_with(|| {2146 let origin1 = Origin::signed(1);21472148 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2149 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21502151 let data = default_nft_data();2152 create_test_item(collection_id, &data.into());2153 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2154 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21552156 let origin1 = Origin::signed(1);21572158 // default scenario2159 assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2160 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2161 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2162 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2163 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2164 });2165}21662167#[test]2168fn set_variable_meta_data_on_nft_with_admin_flag() {2169 new_test_ext().execute_with(|| {2170 // default_limits();21712172 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21732174 let origin1 = Origin::signed(1);2175 let origin2 = Origin::signed(2);21762177 assert_ok!(TemplateModule::set_mint_permission(2178 origin2.clone(),2179 collection_id,2180 true2181 ));2182 assert_ok!(TemplateModule::add_to_allow_list(2183 origin2.clone(),2184 collection_id,2185 account(1)2186 ));21872188 assert_ok!(TemplateModule::add_collection_admin(2189 origin2.clone(),2190 collection_id,2191 account(1)2192 ));21932194 let data = default_nft_data();2195 create_test_item(collection_id, &data.into());21962197 assert_ok!(TemplateModule::set_meta_update_permission_flag(2198 origin2.clone(),2199 collection_id,2200 MetaUpdatePermission::Admin,2201 ));22022203 let variable_data = b"test.".to_vec();2204 assert_ok!(TemplateModule::set_variable_meta_data(2205 origin1,2206 collection_id,2207 TokenId(1),2208 variable_data.clone()2209 ));22102211 assert_eq!(2212 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2213 .unwrap()2214 .variable_data,2215 variable_data2216 );2217 });2218}22192220#[test]2221fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2222 new_test_ext().execute_with(|| {2223 // default_limits();22242225 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22262227 let origin1 = Origin::signed(1);2228 let origin2 = Origin::signed(2);22292230 assert_ok!(TemplateModule::set_mint_permission(2231 origin2.clone(),2232 collection_id,2233 true2234 ));2235 assert_ok!(TemplateModule::add_to_allow_list(2236 origin2.clone(),2237 collection_id,2238 account(1)2239 ));22402241 let data = default_nft_data();2242 create_test_item(collection_id, &data.into());22432244 assert_ok!(TemplateModule::set_meta_update_permission_flag(2245 origin2.clone(),2246 collection_id,2247 MetaUpdatePermission::Admin,2248 ));22492250 let variable_data = b"test.".to_vec();2251 assert_noop!(2252 TemplateModule::set_variable_meta_data(2253 origin1,2254 collection_id,2255 TokenId(1),2256 variable_data.clone()2257 ).map_err(|e| e.error),2258 CommonError::<Test>::NoPermission2259 );2260 });2261}22622263#[test]2264fn set_variable_meta_flag_after_freeze() {2265 new_test_ext().execute_with(|| {2266 // default_limits();22672268 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22692270 let origin2 = Origin::signed(2);22712272 assert_ok!(TemplateModule::set_meta_update_permission_flag(2273 origin2.clone(),2274 collection_id,2275 MetaUpdatePermission::None,2276 ));2277 assert_noop!(2278 TemplateModule::set_meta_update_permission_flag(2279 origin2.clone(),2280 collection_id,2281 MetaUpdatePermission::Admin2282 ),2283 CommonError::<Test>::MetadataFlagFrozen2284 );2285 });2286}22872288#[test]2289fn set_variable_meta_data_on_nft_with_none_flag_neg() {2290 new_test_ext().execute_with(|| {2291 // default_limits();22922293 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2294 let origin1 = Origin::signed(1);22952296 let data = default_nft_data();2297 create_test_item(collection_id, &data.into());22982299 assert_ok!(TemplateModule::set_meta_update_permission_flag(2300 origin1.clone(),2301 collection_id,2302 MetaUpdatePermission::None,2303 ));23042305 let variable_data = b"test.".to_vec();2306 assert_noop!(2307 TemplateModule::set_variable_meta_data(2308 origin1.clone(),2309 collection_id,2310 TokenId(1),2311 variable_data.clone()2312 ).map_err(|e| e.error),2313 CommonError::<Test>::NoPermission2314 );2315 });2316}23172318#[test]2319fn collection_transfer_flag_works_neg() {2320 new_test_ext().execute_with(|| {2321 let origin1 = Origin::signed(1);23222323 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2324 assert_ok!(TemplateModule::set_transfers_enabled_flag(2325 origin1, collection_id, false2326 ));23272328 let data = default_nft_data();2329 create_test_item(collection_id, &data.into());2330 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2331 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23322333 let origin1 = Origin::signed(1);23342335 // default scenario2336 assert_noop!(2337 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2338 CommonError::<Test>::TransferNotAllowed2339 );2340 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2341 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2342 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2343 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2344 });2345}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use up_data_structs::{6 COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, 7 CreateNftData, CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, 8 MetaUpdatePermission, TokenId,9};10use frame_support::{assert_noop, assert_ok};11use sp_std::convert::TryInto;1213fn default_nft_data() -> CreateNftData {14 CreateNftData {15 const_data: vec![1, 2, 3].try_into().unwrap(),16 variable_data: vec![3, 2, 1].try_into().unwrap(),17 }18}1920fn default_fungible_data() -> CreateFungibleData {21 CreateFungibleData { value: 5 }22}2324fn default_re_fungible_data() -> CreateReFungibleData {25 CreateReFungibleData {26 const_data: vec![1, 2, 3].try_into().unwrap(),27 variable_data: vec![3, 2, 1].try_into().unwrap(),28 pieces: 1023,29 }30}3132fn create_test_collection_for_owner(33 mode: &CollectionMode,34 owner: u64,35 id: CollectionId,36) -> CollectionId {37 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();38 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();39 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4041 let origin1 = Origin::signed(owner);42 assert_ok!(TemplateModule::create_collection(43 origin1,44 col_name1,45 col_desc1,46 token_prefix1,47 mode.clone()48 ));4950 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();51 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();52 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();53 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);54 assert_eq!(55 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,56 saved_col_name57 );58 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);59 assert_eq!(60 <pallet_common::CollectionById<Test>>::get(id).unwrap().description,61 saved_description62 );63 assert_eq!(64 <pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,65 saved_prefix66 );67 id68}6970fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {71 create_test_collection_for_owner(&mode, 1, id)72}7374fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {75 let origin1 = Origin::signed(1);76 assert_ok!(TemplateModule::create_item(77 origin1,78 collection_id,79 account(1),80 data.clone()81 ));82}8384fn account(sub: u64) -> TestCrossAccountId {85 TestCrossAccountId::from_sub(sub)86}8788// Use cases tests region89// #region9091#[test]92fn set_version_schema() {93 new_test_ext().execute_with(|| {94 let origin1 = Origin::signed(1);95 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9697 assert_ok!(TemplateModule::set_schema_version(98 origin1,99 collection_id,100 SchemaVersion::Unique101 ));102 assert_eq!(103 <pallet_common::CollectionById<Test>>::get(collection_id)104 .unwrap()105 .schema_version,106 SchemaVersion::Unique107 );108 });109}110111#[test]112fn create_fungible_collection_fails_with_large_decimal_numbers() {113 new_test_ext().execute_with(|| {114 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();115 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();116 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();117118 let origin1 = Origin::signed(1);119 assert_noop!(120 TemplateModule::create_collection(121 origin1,122 col_name1,123 col_desc1,124 token_prefix1,125 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)126 ),127 Error::<Test>::CollectionDecimalPointLimitExceeded128 );129 });130}131132#[test]133fn create_nft_item() {134 new_test_ext().execute_with(|| {135 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));136137 let data = default_nft_data();138 create_test_item(collection_id, &data.clone().into());139140 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();141 assert_eq!(item.const_data, data.const_data.into_inner());142 assert_eq!(item.variable_data, data.variable_data.into_inner());143 });144}145146// Use cases tests region147// #region148#[test]149fn create_nft_multiple_items() {150 new_test_ext().execute_with(|| {151 create_test_collection(&CollectionMode::NFT, CollectionId(1));152153 let origin1 = Origin::signed(1);154155 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];156157 assert_ok!(TemplateModule::create_multiple_items(158 origin1,159 CollectionId(1),160 account(1),161 items_data162 .clone()163 .into_iter()164 .map(|d| { d.into() })165 .collect()166 ));167 for (index, data) in items_data.into_iter().enumerate() {168 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();169 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());170 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());171 }172 });173}174175#[test]176fn create_refungible_item() {177 new_test_ext().execute_with(|| {178 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));179180 let data = default_re_fungible_data();181 create_test_item(collection_id, &data.clone().into());182 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));183 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));184 assert_eq!(item.const_data, data.const_data.into_inner());185 assert_eq!(item.variable_data, data.variable_data.into_inner());186 assert_eq!(balance, 1023);187 });188}189190#[test]191fn create_multiple_refungible_items() {192 new_test_ext().execute_with(|| {193 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));194195 let origin1 = Origin::signed(1);196197 let items_data = vec![198 default_re_fungible_data(),199 default_re_fungible_data(),200 default_re_fungible_data(),201 ];202203 assert_ok!(TemplateModule::create_multiple_items(204 origin1,205 CollectionId(1),206 account(1),207 items_data208 .clone()209 .into_iter()210 .map(|d| { d.into() })211 .collect()212 ));213 for (index, data) in items_data.into_iter().enumerate() {214 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32)));215 let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));216 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());217 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());218 assert_eq!(balance, 1023);219 }220 });221}222223#[test]224fn create_fungible_item() {225 new_test_ext().execute_with(|| {226 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));227228 let data = default_fungible_data();229 create_test_item(collection_id, &data.into());230231 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);232 });233}234235//#[test]236// fn create_multiple_fungible_items() {237// new_test_ext().execute_with(|| {238// default_limits();239240// create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));241242// let origin1 = Origin::signed(1);243244// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];245246// assert_ok!(TemplateModule::create_multiple_items(247// origin1.clone(),248// 1,249// 1,250// items_data.clone().into_iter().map(|d| { d.into() }).collect()251// ));252253// for (index, _) in items_data.iter().enumerate() {254// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);255// }256// assert_eq!(TemplateModule::balance_count(1, 1), 3000);257// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);258// });259// }260261#[test]262fn transfer_fungible_item() {263 new_test_ext().execute_with(|| {264 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));265266 let origin1 = Origin::signed(1);267 let origin2 = Origin::signed(2);268269 let data = default_fungible_data();270 create_test_item(collection_id, &data.into());271272 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);273274 // change owner scenario275 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(0), 5));276 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);277278 // split item scenario279 assert_ok!(TemplateModule::transfer(280 origin2.clone(),281 account(3),282 CollectionId(1),283 TokenId(0),284 3285 ));286287 // split item and new owner has account scenario288 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(0), 1));289 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);290 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);291 });292}293294#[test]295fn transfer_refungible_item() {296 new_test_ext().execute_with(|| {297 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));298299 // Create RFT 1 in 1023 pieces for account 1300 let data = default_re_fungible_data();301 create_test_item(collection_id, &data.clone().into());302 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));303 assert_eq!(item.const_data, data.const_data.into_inner());304 assert_eq!(item.variable_data, data.variable_data.into_inner());305 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);306 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);307 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);308309 // Account 1 transfers all 1023 pieces of RFT 1 to account 2310 let origin1 = Origin::signed(1);311 let origin2 = Origin::signed(2);312 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));313 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 1023);314 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);315 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);316 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);317 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);318319 // Account 2 transfers 500 pieces of RFT 1 to account 3320 assert_ok!(TemplateModule::transfer(321 origin2.clone(),322 account(3),323 CollectionId(1),324 TokenId(1),325 500326 ));327 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 523);328 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 500);329 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);330 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);331 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);332 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);333334 // Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance335 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));336 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 323);337 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 700);338 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);339 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);340 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);341 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);342 });343}344345#[test]346fn transfer_nft_item() {347 new_test_ext().execute_with(|| {348 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));349350 let data = default_nft_data();351 create_test_item(collection_id, &data.into());352 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);353 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);354355356 let origin1 = Origin::signed(1);357 // default scenario358 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));359 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);360 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);361 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);362 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);363 });364}365366#[test]367fn transfer_nft_item_wrong_value() {368 new_test_ext().execute_with(|| {369 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));370371 let data = default_nft_data();372 create_test_item(collection_id, &data.into());373 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);374 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);375376 let origin1 = Origin::signed(1);377378 assert_noop!(379 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2).map_err(|e| e.error),380 <pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount381 );382 });383}384385#[test]386fn transfer_nft_item_zero_value() {387 new_test_ext().execute_with(|| {388 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));389390 let data = default_nft_data();391 create_test_item(collection_id, &data.into());392 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);393 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);394395 let origin1 = Origin::signed(1);396397 // Transferring 0 amount works on NFT...398 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 0));399 // ... and results in no transfer400 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);401 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);402 });403}404405#[test]406fn nft_approve_and_transfer_from() {407 new_test_ext().execute_with(|| {408 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));409410 let data = default_nft_data();411 create_test_item(collection_id, &data.into());412413 let origin1 = Origin::signed(1);414 let origin2 = Origin::signed(2);415416 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);417 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);418419 // neg transfer_from420 assert_noop!(421 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),422 CommonError::<Test>::TokenValueNotEnough423 );424425 // do approve426 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));427 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));428429 assert_ok!(TemplateModule::transfer_from(430 origin2,431 account(1),432 account(3),433 CollectionId(1),434 TokenId(1),435 1436 ));437 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());438 });439}440441#[test]442fn nft_approve_and_transfer_from_allow_list() {443 new_test_ext().execute_with(|| {444 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));445446 let origin1 = Origin::signed(1);447 let origin2 = Origin::signed(2);448449 // Create NFT 1 for account 1450 let data = default_nft_data();451 create_test_item(collection_id, &data.clone().into());452 assert_eq!(453 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,454 &data.const_data.into_inner()455 );456 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);457 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);458459 // Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list460 assert_ok!(TemplateModule::set_mint_permission(461 origin1.clone(),462 CollectionId(1),463 true464 ));465 assert_ok!(TemplateModule::set_public_access_mode(466 origin1.clone(),467 CollectionId(1),468 AccessMode::AllowList469 ));470 assert_ok!(TemplateModule::add_to_allow_list(471 origin1.clone(),472 CollectionId(1),473 account(1)474 ));475 assert_ok!(TemplateModule::add_to_allow_list(476 origin1.clone(),477 CollectionId(1),478 account(2)479 ));480 assert_ok!(TemplateModule::add_to_allow_list(481 origin1.clone(),482 CollectionId(1),483 account(3)484 ));485486 // Account 1 approves account 2 for NFT 1 487 assert_ok!(TemplateModule::approve(488 origin1.clone(),489 account(2),490 CollectionId(1),491 TokenId(1),492 1493 ));494 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));495496 // Account 2 transfers NFT 1 from account 1 to account 3497 assert_ok!(TemplateModule::transfer_from(498 origin2,499 account(1),500 account(3),501 CollectionId(1),502 TokenId(1),503 1504 ));505 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());506 });507}508509#[test]510fn refungible_approve_and_transfer_from() {511 new_test_ext().execute_with(|| {512 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));513514 let origin1 = Origin::signed(1);515 let origin2 = Origin::signed(2);516517 // Create RFT 1 in 1023 pieces for account 1518 let data = default_re_fungible_data();519 create_test_item(collection_id, &data.into());520521 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);522 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);523 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);524525 // Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list526 assert_ok!(TemplateModule::set_mint_permission(527 origin1.clone(),528 CollectionId(1),529 true530 ));531 assert_ok!(TemplateModule::set_public_access_mode(532 origin1.clone(),533 CollectionId(1),534 AccessMode::AllowList535 ));536 assert_ok!(TemplateModule::add_to_allow_list(537 origin1.clone(),538 CollectionId(1),539 account(1)540 ));541 assert_ok!(TemplateModule::add_to_allow_list(542 origin1.clone(),543 CollectionId(1),544 account(2)545 ));546 assert_ok!(TemplateModule::add_to_allow_list(547 origin1.clone(),548 CollectionId(1),549 account(3)550 ));551552 // Account 1 approves account 2 for 1023 pieces of RFT 1553 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));554 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);555556 // Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3557 assert_ok!(TemplateModule::transfer_from(558 origin2,559 account(1),560 account(3),561 CollectionId(1),562 TokenId(1),563 100564 ));565 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);566 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);567 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 923);568 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 100);569 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);570 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);571 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);572 });573}574575#[test]576fn fungible_approve_and_transfer_from() {577 new_test_ext().execute_with(|| {578 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));579580 let data = default_fungible_data();581 create_test_item(collection_id, &data.into());582583 let origin1 = Origin::signed(1);584 let origin2 = Origin::signed(2);585586 assert_ok!(TemplateModule::set_mint_permission(587 origin1.clone(),588 CollectionId(1),589 true590 ));591 assert_ok!(TemplateModule::set_public_access_mode(592 origin1.clone(),593 CollectionId(1),594 AccessMode::AllowList595 ));596 assert_ok!(TemplateModule::add_to_allow_list(597 origin1.clone(),598 CollectionId(1),599 account(1)600 ));601 assert_ok!(TemplateModule::add_to_allow_list(602 origin1.clone(),603 CollectionId(1),604 account(2)605 ));606 assert_ok!(TemplateModule::add_to_allow_list(607 origin1.clone(),608 CollectionId(1),609 account(3)610 ));611612 // do approve613 assert_ok!(TemplateModule::approve(614 origin1.clone(),615 account(2),616 CollectionId(1),617 TokenId(0),618 5619 ));620 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);621 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(0), 5));622 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);623 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);624625 assert_ok!(TemplateModule::transfer_from(626 origin2.clone(),627 account(1),628 account(3),629 CollectionId(1),630 TokenId(0),631 4632 ));633634 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);635636 assert_noop!(637 TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(0), 4).map_err(|e| e.error),638 CommonError::<Test>::TokenValueNotEnough639 );640 });641}642643#[test]644fn change_collection_owner() {645 new_test_ext().execute_with(|| {646 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));647648 let origin1 = Origin::signed(1);649 assert_ok!(TemplateModule::change_collection_owner(650 origin1,651 collection_id,652 2653 ));654 assert_eq!(655 <pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,656 2657 );658 });659}660661#[test]662fn destroy_collection() {663 new_test_ext().execute_with(|| {664 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));665666 let origin1 = Origin::signed(1);667 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));668 });669}670671#[test]672fn burn_nft_item() {673 new_test_ext().execute_with(|| {674 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));675676 let origin1 = Origin::signed(1);677678 let data = default_nft_data();679 create_test_item(collection_id, &data.into());680681 // check balance (collection with id = 1, user id = 1)682 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);683684 // burn item685 assert_ok!(TemplateModule::burn_item(686 origin1.clone(),687 collection_id,688 TokenId(1),689 1690 ));691 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);692 });693}694695#[test]696fn burn_same_nft_item_twice() {697 new_test_ext().execute_with(|| {698 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));699700 let origin1 = Origin::signed(1);701702 let data = default_nft_data();703 create_test_item(collection_id, &data.into());704705 // check balance (collection with id = 1, user id = 1)706 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);707708 // burn item709 assert_ok!(TemplateModule::burn_item(710 origin1.clone(),711 collection_id,712 TokenId(1),713 1714 ));715 716 // burn item again717 assert_noop!(718 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),719 CommonError::<Test>::TokenNotFound720 );721722 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);723 });724}725726#[test]727fn burn_fungible_item() {728 new_test_ext().execute_with(|| {729 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));730731 let origin1 = Origin::signed(1);732 assert_ok!(TemplateModule::add_collection_admin(733 origin1.clone(),734 collection_id,735 account(2)736 ));737738 let data = default_fungible_data();739 create_test_item(collection_id, &data.into());740741 // check balance (collection with id = 1, user id = 1)742 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);743744 // burn item745 assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(0), 5));746 assert_noop!(747 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),748 CommonError::<Test>::TokenValueTooLow749 );750751 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);752 });753}754755#[test]756fn burn_fungible_item_with_token_id() {757 new_test_ext().execute_with(|| {758 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));759760 let origin1 = Origin::signed(1);761 assert_ok!(TemplateModule::add_collection_admin(762 origin1.clone(),763 collection_id,764 account(2)765 ));766767 let data = default_fungible_data();768 create_test_item(collection_id, &data.into());769770 // check balance (collection with id = 1, user id = 1)771 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);772773 // Try to burn item using Token ID774 assert_noop!(775 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),776 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId777 );778 });779}780#[test]781fn burn_refungible_item() {782 new_test_ext().execute_with(|| {783 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));784 let origin1 = Origin::signed(1);785786 assert_ok!(TemplateModule::set_mint_permission(787 origin1.clone(),788 collection_id,789 true790 ));791 assert_ok!(TemplateModule::set_public_access_mode(792 origin1.clone(),793 collection_id,794 AccessMode::AllowList795 ));796 assert_ok!(TemplateModule::add_to_allow_list(797 origin1.clone(),798 collection_id,799 account(1)800 ));801802 assert_ok!(TemplateModule::add_collection_admin(803 origin1.clone(),804 collection_id,805 account(2)806 ));807808 let data = default_re_fungible_data();809 create_test_item(collection_id, &data.into());810811 // check balance (collection with id = 1, user id = 2)812 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);813 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);814815 // burn item816 assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));817 assert_noop!(818 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),819 CommonError::<Test>::TokenValueTooLow820 );821822 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);823 });824}825826#[test]827fn add_collection_admin() {828 new_test_ext().execute_with(|| {829 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));830 let origin1 = Origin::signed(1);831832 // Add collection admins833 assert_ok!(TemplateModule::add_collection_admin(834 origin1.clone(),835 collection1_id,836 account(2)837 ));838 assert_ok!(TemplateModule::add_collection_admin(839 origin1,840 collection1_id,841 account(3)842 ));843844 // Owner is not an admin by default845 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))), false);846 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));847 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));848 });849}850851#[test]852fn remove_collection_admin() {853 new_test_ext().execute_with(|| {854 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));855 let origin1 = Origin::signed(1);856 let origin2 = Origin::signed(2);857858 // Add collection admins 2 and 3859 assert_ok!(TemplateModule::add_collection_admin(860 origin1.clone(),861 collection1_id,862 account(2)863 ));864 assert_ok!(TemplateModule::add_collection_admin(865 origin1,866 collection1_id,867 account(3)868 ));869870 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));871 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));872873 // remove admin 3874 assert_ok!(TemplateModule::remove_collection_admin(875 origin2,876 CollectionId(1),877 account(3)878 ));879880 // 2 is still admin, 3 is not an admin anymore881 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));882 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))), false);883 });884}885886#[test]887fn balance_of() {888 new_test_ext().execute_with(|| {889 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));890 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));891 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));892893 // check balance before894 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);895 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);896 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);897898 let nft_data = default_nft_data();899 create_test_item(nft_collection_id, &nft_data.into());900901 let fungible_data = default_fungible_data();902 create_test_item(fungible_collection_id, &fungible_data.into());903904 let re_fungible_data = default_re_fungible_data();905 create_test_item(re_fungible_collection_id, &re_fungible_data.into());906907 // check balance (collection with id = 1, user id = 1)908 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);909 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);910 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1);911912 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);913 assert_eq!(<pallet_refungible::Owned<Test>>::get((re_fungible_collection_id, account(1), TokenId(1))), true);914 });915}916917#[test]918fn approve() {919 new_test_ext().execute_with(|| {920 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));921922 let data = default_nft_data();923 create_test_item(collection_id, &data.into());924925 let origin1 = Origin::signed(1);926927 // approve928 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));929 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));930 });931}932933#[test]934fn transfer_from() {935 new_test_ext().execute_with(|| {936 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));937 let origin1 = Origin::signed(1);938 let origin2 = Origin::signed(2);939940 let data = default_nft_data();941 create_test_item(collection_id, &data.into());942943 // approve944 assert_ok!(TemplateModule::approve(945 origin1.clone(),946 account(2),947 CollectionId(1),948 TokenId(1),949 1950 ));951 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));952953 assert_ok!(TemplateModule::set_mint_permission(954 origin1.clone(),955 CollectionId(1),956 true957 ));958 assert_ok!(TemplateModule::set_public_access_mode(959 origin1.clone(),960 CollectionId(1),961 AccessMode::AllowList962 ));963 assert_ok!(TemplateModule::add_to_allow_list(964 origin1.clone(),965 CollectionId(1),966 account(1)967 ));968 assert_ok!(TemplateModule::add_to_allow_list(969 origin1.clone(),970 CollectionId(1),971 account(2)972 ));973 assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));974975 assert_ok!(TemplateModule::transfer_from(976 origin2,977 account(1),978 account(2),979 CollectionId(1),980 TokenId(1),981 1982 ));983984 // after transfer985 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);986 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);987 });988}989990// #endregion991992// Coverage tests region993// #region994995#[test]996fn owner_can_add_address_to_allow_list() {997 new_test_ext().execute_with(|| {998 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9991000 let origin1 = Origin::signed(1);1001 assert_ok!(TemplateModule::add_to_allow_list(1002 origin1,1003 collection_id,1004 account(2)1005 ));1006 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1007 });1008}10091010#[test]1011fn admin_can_add_address_to_allow_list() {1012 new_test_ext().execute_with(|| {1013 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1014 let origin1 = Origin::signed(1);1015 let origin2 = Origin::signed(2);10161017 assert_ok!(TemplateModule::add_collection_admin(1018 origin1,1019 collection_id,1020 account(2)1021 ));1022 assert_ok!(TemplateModule::add_to_allow_list(1023 origin2,1024 collection_id,1025 account(3)1026 ));1027 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1028 });1029}10301031#[test]1032fn nonprivileged_user_cannot_add_address_to_allow_list() {1033 new_test_ext().execute_with(|| {1034 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10351036 let origin2 = Origin::signed(2);1037 assert_noop!(1038 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1039 CommonError::<Test>::NoPermission1040 );1041 });1042}10431044#[test]1045fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1046 new_test_ext().execute_with(|| {1047 let origin1 = Origin::signed(1);10481049 assert_noop!(1050 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1051 CommonError::<Test>::CollectionNotFound1052 );1053 });1054}10551056#[test]1057fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1058 new_test_ext().execute_with(|| {1059 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10601061 let origin1 = Origin::signed(1);1062 assert_ok!(TemplateModule::destroy_collection(1063 origin1.clone(),1064 collection_id1065 ));1066 assert_noop!(1067 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1068 CommonError::<Test>::CollectionNotFound1069 );1070 });1071}10721073// If address is already added to allow list, nothing happens1074#[test]1075fn address_is_already_added_to_allow_list() {1076 new_test_ext().execute_with(|| {1077 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1078 let origin1 = Origin::signed(1);10791080 assert_ok!(TemplateModule::add_to_allow_list(1081 origin1.clone(),1082 collection_id,1083 account(2)1084 ));1085 assert_ok!(TemplateModule::add_to_allow_list(1086 origin1,1087 collection_id,1088 account(2)1089 ));1090 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1091 });1092}10931094#[test]1095fn owner_can_remove_address_from_allow_list() {1096 new_test_ext().execute_with(|| {1097 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10981099 let origin1 = Origin::signed(1);1100 assert_ok!(TemplateModule::add_to_allow_list(1101 origin1.clone(),1102 collection_id,1103 account(2)1104 ));1105 assert_ok!(TemplateModule::remove_from_allow_list(1106 origin1,1107 collection_id,1108 account(2)1109 ));1110 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1111 });1112}11131114#[test]1115fn admin_can_remove_address_from_allow_list() {1116 new_test_ext().execute_with(|| {1117 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1118 let origin1 = Origin::signed(1);1119 let origin2 = Origin::signed(2);11201121 // Owner adds admin1122 assert_ok!(TemplateModule::add_collection_admin(1123 origin1.clone(),1124 collection_id,1125 account(2)1126 ));11271128 // Owner adds address 3 to allow list1129 assert_ok!(TemplateModule::add_to_allow_list(1130 origin1,1131 collection_id,1132 account(3)1133 ));11341135 // Admin removes address 3 from allow list1136 assert_ok!(TemplateModule::remove_from_allow_list(1137 origin2,1138 collection_id,1139 account(3)1140 ));1141 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))), false);1142 });1143}11441145#[test]1146fn nonprivileged_user_cannot_remove_address_from_allow_list() {1147 new_test_ext().execute_with(|| {1148 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1149 let origin1 = Origin::signed(1);1150 let origin2 = Origin::signed(2);11511152 assert_ok!(TemplateModule::add_to_allow_list(1153 origin1,1154 collection_id,1155 account(2)1156 ));1157 assert_noop!(1158 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1159 CommonError::<Test>::NoPermission1160 );1161 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1162 });1163}11641165#[test]1166fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1167 new_test_ext().execute_with(|| {1168 let origin1 = Origin::signed(1);11691170 assert_noop!(1171 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1172 CommonError::<Test>::CollectionNotFound1173 );1174 });1175}11761177#[test]1178fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1179 new_test_ext().execute_with(|| {1180 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1181 let origin1 = Origin::signed(1);1182 let origin2 = Origin::signed(2);11831184 // Add account 2 to allow list1185 assert_ok!(TemplateModule::add_to_allow_list(1186 origin1.clone(),1187 collection_id,1188 account(2)1189 ));11901191 // Account 2 is in collection allow-list1192 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));11931194 // Destroy collection1195 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));11961197 // Attempt to remove account 2 from collection allow-list => error1198 assert_noop!(1199 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1200 CommonError::<Test>::CollectionNotFound1201 );12021203 // Account 2 is not found in collection allow-list anyway1204 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1205 });1206}12071208// If address is already removed from allow list, nothing happens1209#[test]1210fn address_is_already_removed_from_allow_list() {1211 new_test_ext().execute_with(|| {1212 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1213 let origin1 = Origin::signed(1);12141215 assert_ok!(TemplateModule::add_to_allow_list(1216 origin1.clone(),1217 collection_id,1218 account(2)1219 ));1220 assert_ok!(TemplateModule::remove_from_allow_list(1221 origin1.clone(),1222 collection_id,1223 account(2)1224 ));1225 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1226 assert_ok!(TemplateModule::remove_from_allow_list(1227 origin1,1228 collection_id,1229 account(2)1230 ));1231 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1232 });1233}12341235// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1236#[test]1237fn allow_list_test_1() {1238 new_test_ext().execute_with(|| {1239 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12401241 let origin1 = Origin::signed(1);12421243 let data = default_nft_data();1244 create_test_item(collection_id, &data.into());12451246 assert_ok!(TemplateModule::set_public_access_mode(1247 origin1.clone(),1248 collection_id,1249 AccessMode::AllowList1250 ));1251 assert_ok!(TemplateModule::add_to_allow_list(1252 origin1.clone(),1253 collection_id,1254 account(2)1255 ));12561257 assert_noop!(1258 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1259 CommonError::<Test>::AddressNotInAllowlist1260 );1261 });1262}12631264#[test]1265fn allow_list_test_2() {1266 new_test_ext().execute_with(|| {1267 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1268 let origin1 = Origin::signed(1);12691270 let data = default_nft_data();1271 create_test_item(collection_id, &data.into());12721273 assert_ok!(TemplateModule::set_public_access_mode(1274 origin1.clone(),1275 collection_id,1276 AccessMode::AllowList1277 ));1278 assert_ok!(TemplateModule::add_to_allow_list(1279 origin1.clone(),1280 collection_id,1281 account(1)1282 ));1283 assert_ok!(TemplateModule::add_to_allow_list(1284 origin1.clone(),1285 collection_id,1286 account(2)1287 ));12881289 // do approve1290 assert_ok!(TemplateModule::approve(1291 origin1.clone(),1292 account(1),1293 collection_id,1294 TokenId(1),1295 11296 ));1297 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12981299 assert_ok!(TemplateModule::remove_from_allow_list(1300 origin1.clone(),1301 collection_id,1302 account(1)1303 ));13041305 assert_noop!(1306 TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1307 CommonError::<Test>::AddressNotInAllowlist1308 );1309 });1310}13111312// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1313#[test]1314fn allow_list_test_3() {1315 new_test_ext().execute_with(|| {1316 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13171318 let origin1 = Origin::signed(1);13191320 let data = default_nft_data();1321 create_test_item(collection_id, &data.into());13221323 assert_ok!(TemplateModule::set_public_access_mode(1324 origin1.clone(),1325 collection_id,1326 AccessMode::AllowList1327 ));1328 assert_ok!(TemplateModule::add_to_allow_list(1329 origin1.clone(),1330 collection_id,1331 account(1)1332 ));13331334 assert_noop!(1335 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1336 CommonError::<Test>::AddressNotInAllowlist1337 );1338 });1339}13401341#[test]1342fn allow_list_test_4() {1343 new_test_ext().execute_with(|| {1344 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13451346 let origin1 = Origin::signed(1);13471348 let data = default_nft_data();1349 create_test_item(collection_id, &data.into());13501351 assert_ok!(TemplateModule::set_public_access_mode(1352 origin1.clone(),1353 collection_id,1354 AccessMode::AllowList1355 ));1356 assert_ok!(TemplateModule::add_to_allow_list(1357 origin1.clone(),1358 collection_id,1359 account(1)1360 ));1361 assert_ok!(TemplateModule::add_to_allow_list(1362 origin1.clone(),1363 collection_id,1364 account(2)1365 ));13661367 // do approve1368 assert_ok!(TemplateModule::approve(1369 origin1.clone(),1370 account(1),1371 collection_id,1372 TokenId(1),1373 11374 ));1375 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13761377 assert_ok!(TemplateModule::remove_from_allow_list(1378 origin1.clone(),1379 collection_id,1380 account(2)1381 ));13821383 assert_noop!(1384 TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1385 CommonError::<Test>::AddressNotInAllowlist1386 );1387 });1388}13891390// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1391#[test]1392fn allow_list_test_5() {1393 new_test_ext().execute_with(|| {1394 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13951396 let origin1 = Origin::signed(1);13971398 let data = default_nft_data();1399 create_test_item(collection_id, &data.into());14001401 assert_ok!(TemplateModule::set_public_access_mode(1402 origin1.clone(),1403 collection_id,1404 AccessMode::AllowList1405 ));1406 assert_noop!(1407 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1408 CommonError::<Test>::AddressNotInAllowlist1409 );1410 });1411}14121413// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1414#[test]1415fn allow_list_test_6() {1416 new_test_ext().execute_with(|| {1417 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14181419 let origin1 = Origin::signed(1);14201421 let data = default_nft_data();1422 create_test_item(collection_id, &data.into());14231424 assert_ok!(TemplateModule::set_public_access_mode(1425 origin1.clone(),1426 collection_id,1427 AccessMode::AllowList1428 ));14291430 // do approve1431 assert_noop!(1432 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1433 CommonError::<Test>::AddressNotInAllowlist1434 );1435 });1436}14371438// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1439// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1440#[test]1441fn allow_list_test_7() {1442 new_test_ext().execute_with(|| {1443 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14441445 let data = default_nft_data();1446 create_test_item(collection_id, &data.into());14471448 let origin1 = Origin::signed(1);14491450 assert_ok!(TemplateModule::set_public_access_mode(1451 origin1.clone(),1452 collection_id,1453 AccessMode::AllowList1454 ));1455 assert_ok!(TemplateModule::add_to_allow_list(1456 origin1.clone(),1457 collection_id,1458 account(1)1459 ));1460 assert_ok!(TemplateModule::add_to_allow_list(1461 origin1.clone(),1462 collection_id,1463 account(2)1464 ));14651466 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1467 });1468}14691470#[test]1471fn allow_list_test_8() {1472 new_test_ext().execute_with(|| {1473 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14741475 // Create NFT for account 11476 let data = default_nft_data();1477 create_test_item(collection_id, &data.into());14781479 let origin1 = Origin::signed(1);14801481 // Toggle Allow List mode and add accounts 1 and 21482 assert_ok!(TemplateModule::set_public_access_mode(1483 origin1.clone(),1484 collection_id,1485 AccessMode::AllowList1486 ));1487 assert_ok!(TemplateModule::add_to_allow_list(1488 origin1.clone(),1489 collection_id,1490 account(1)1491 ));1492 assert_ok!(TemplateModule::add_to_allow_list(1493 origin1.clone(),1494 collection_id,1495 account(2)1496 ));14971498 // Sself-approve account 1 for NFT 11499 assert_ok!(TemplateModule::approve(1500 origin1.clone(),1501 account(1),1502 CollectionId(1), 1503 TokenId(1),1504 11505 ));1506 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));15071508 // Transfer from 1 to 21509 assert_ok!(TemplateModule::transfer_from(1510 origin1,1511 account(1),1512 account(2),1513 CollectionId(1), 1514 TokenId(1),1515 11516 ));1517 });1518}15191520// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1521#[test]1522fn allow_list_test_9() {1523 new_test_ext().execute_with(|| {1524 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1525 let origin1 = Origin::signed(1);15261527 assert_ok!(TemplateModule::set_public_access_mode(1528 origin1.clone(),1529 collection_id,1530 AccessMode::AllowList1531 ));1532 assert_ok!(TemplateModule::set_mint_permission(1533 origin1,1534 collection_id,1535 false1536 ));15371538 let data = default_nft_data();1539 create_test_item(collection_id, &data.into());1540 });1541}15421543// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1544#[test]1545fn allow_list_test_10() {1546 new_test_ext().execute_with(|| {1547 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15481549 let origin1 = Origin::signed(1);1550 let origin2 = Origin::signed(2);15511552 assert_ok!(TemplateModule::set_public_access_mode(1553 origin1.clone(),1554 collection_id,1555 AccessMode::AllowList1556 ));1557 assert_ok!(TemplateModule::set_mint_permission(1558 origin1.clone(),1559 collection_id,1560 false1561 ));15621563 assert_ok!(TemplateModule::add_collection_admin(1564 origin1,1565 collection_id,1566 account(2)1567 ));15681569 assert_ok!(TemplateModule::create_item(1570 origin2,1571 collection_id,1572 account(2),1573 default_nft_data().into()1574 ));1575 });1576}15771578// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.1579#[test]1580fn allow_list_test_11() {1581 new_test_ext().execute_with(|| {1582 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15831584 let origin1 = Origin::signed(1);1585 let origin2 = Origin::signed(2);15861587 assert_ok!(TemplateModule::set_public_access_mode(1588 origin1.clone(),1589 collection_id,1590 AccessMode::AllowList1591 ));1592 assert_ok!(TemplateModule::set_mint_permission(1593 origin1.clone(),1594 collection_id,1595 false1596 ));1597 assert_ok!(TemplateModule::add_to_allow_list(1598 origin1,1599 collection_id,1600 account(2)1601 ));16021603 assert_noop!(1604 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1605 CommonError::<Test>::PublicMintingNotAllowed1606 );1607 });1608}16091610// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.1611#[test]1612fn allow_list_test_12() {1613 new_test_ext().execute_with(|| {1614 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16151616 let origin1 = Origin::signed(1);1617 let origin2 = Origin::signed(2);16181619 assert_ok!(TemplateModule::set_public_access_mode(1620 origin1.clone(),1621 collection_id,1622 AccessMode::AllowList1623 ));1624 assert_ok!(TemplateModule::set_mint_permission(1625 origin1,1626 collection_id,1627 false1628 ));16291630 assert_noop!(1631 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1632 CommonError::<Test>::PublicMintingNotAllowed1633 );1634 });1635}16361637// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1638#[test]1639fn allow_list_test_13() {1640 new_test_ext().execute_with(|| {1641 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16421643 let origin1 = Origin::signed(1);16441645 assert_ok!(TemplateModule::set_public_access_mode(1646 origin1.clone(),1647 collection_id,1648 AccessMode::AllowList1649 ));1650 assert_ok!(TemplateModule::set_mint_permission(1651 origin1,1652 collection_id,1653 true1654 ));16551656 let data = default_nft_data();1657 create_test_item(collection_id, &data.into());1658 });1659}16601661// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1662#[test]1663fn allow_list_test_14() {1664 new_test_ext().execute_with(|| {1665 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16661667 let origin1 = Origin::signed(1);1668 let origin2 = Origin::signed(2);16691670 assert_ok!(TemplateModule::set_public_access_mode(1671 origin1.clone(),1672 collection_id,1673 AccessMode::AllowList1674 ));1675 assert_ok!(TemplateModule::set_mint_permission(1676 origin1.clone(),1677 collection_id,1678 true1679 ));16801681 assert_ok!(TemplateModule::add_collection_admin(1682 origin1,1683 collection_id,1684 account(2)1685 ));16861687 assert_ok!(TemplateModule::create_item(1688 origin2,1689 collection_id,1690 account(2),1691 default_nft_data().into()1692 ));1693 });1694}16951696// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.1697#[test]1698fn allow_list_test_15() {1699 new_test_ext().execute_with(|| {1700 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17011702 let origin1 = Origin::signed(1);1703 let origin2 = Origin::signed(2);17041705 assert_ok!(TemplateModule::set_public_access_mode(1706 origin1.clone(),1707 collection_id,1708 AccessMode::AllowList1709 ));1710 assert_ok!(TemplateModule::set_mint_permission(1711 origin1,1712 collection_id,1713 true1714 ));17151716 assert_noop!(1717 TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()).map_err(|e| e.error),1718 CommonError::<Test>::AddressNotInAllowlist1719 );1720 });1721}17221723// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.1724#[test]1725fn allow_list_test_16() {1726 new_test_ext().execute_with(|| {1727 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17281729 let origin1 = Origin::signed(1);1730 let origin2 = Origin::signed(2);17311732 assert_ok!(TemplateModule::set_public_access_mode(1733 origin1.clone(),1734 collection_id,1735 AccessMode::AllowList1736 ));1737 assert_ok!(TemplateModule::set_mint_permission(1738 origin1.clone(),1739 collection_id,1740 true1741 ));1742 assert_ok!(TemplateModule::add_to_allow_list(1743 origin1,1744 collection_id,1745 account(2)1746 ));17471748 assert_ok!(TemplateModule::create_item(1749 origin2,1750 collection_id,1751 account(2),1752 default_nft_data().into()1753 ));1754 });1755}17561757// Total number of collections. Positive test1758#[test]1759fn total_number_collections_bound() {1760 new_test_ext().execute_with(|| {1761 create_test_collection(&CollectionMode::NFT, CollectionId(1));1762 });1763}17641765#[test]1766fn create_max_collections() {1767 new_test_ext().execute_with(|| {1768 for i in 1..=COLLECTION_NUMBER_LIMIT {1769 create_test_collection(&CollectionMode::NFT, CollectionId(i));1770 }1771 });1772}17731774// Total number of collections. Negative test1775#[test]1776fn total_number_collections_bound_neg() {1777 new_test_ext().execute_with(|| {1778 let origin1 = Origin::signed(1);17791780 for i in 1..=COLLECTION_NUMBER_LIMIT {1781 create_test_collection(&CollectionMode::NFT, CollectionId(i));1782 }17831784 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1785 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1786 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17871788 // 11-th collection in chain. Expects error1789 assert_noop!(1790 TemplateModule::create_collection(1791 origin1,1792 col_name1,1793 col_desc1,1794 token_prefix1,1795 CollectionMode::NFT1796 ),1797 CommonError::<Test>::TotalCollectionsLimitExceeded1798 );1799 });1800}18011802// Owned tokens by a single address. Positive test1803#[test]1804fn owned_tokens_bound() {1805 new_test_ext().execute_with(|| {1806 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18071808 let data = default_nft_data();1809 create_test_item(collection_id, &data.clone().into());1810 create_test_item(collection_id, &data.into());1811 });1812}18131814// Owned tokens by a single address. Negotive test1815#[test]1816fn owned_tokens_bound_neg() {1817 new_test_ext().execute_with(|| {1818 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18191820 let origin1 = Origin::signed(1);18211822 for _ in 1..=MAX_TOKEN_OWNERSHIP {1823 let data = default_nft_data();1824 create_test_item(collection_id, &data.clone().into());1825 }18261827 let data = default_nft_data();1828 assert_noop!(1829 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()).map_err(|e| e.error),1830 CommonError::<Test>::AccountTokenLimitExceeded1831 );1832 });1833}18341835// Number of collection admins. Positive test1836#[test]1837fn collection_admins_bound() {1838 new_test_ext().execute_with(|| {1839 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18401841 let origin1 = Origin::signed(1);18421843 assert_ok!(TemplateModule::add_collection_admin(1844 origin1.clone(),1845 collection_id,1846 account(2)1847 ));1848 assert_ok!(TemplateModule::add_collection_admin(1849 origin1,1850 collection_id,1851 account(3)1852 ));1853 });1854}18551856// Number of collection admins. Negotive test1857#[test]1858fn collection_admins_bound_neg() {1859 new_test_ext().execute_with(|| {1860 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18611862 let origin1 = Origin::signed(1);18631864 for i in 0..COLLECTION_ADMINS_LIMIT {1865 assert_ok!(TemplateModule::add_collection_admin(1866 origin1.clone(),1867 collection_id,1868 account((2 + i).into())1869 ));1870 }1871 assert_noop!(1872 TemplateModule::add_collection_admin(1873 origin1,1874 collection_id,1875 account((3 + COLLECTION_ADMINS_LIMIT).into())1876 ),1877 CommonError::<Test>::CollectionAdminCountExceeded1878 );1879 });1880}1881// #endregion18821883#[test]1884fn set_const_on_chain_schema() {1885 new_test_ext().execute_with(|| {1886 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18871888 let origin1 = Origin::signed(1);1889 assert_ok!(TemplateModule::set_const_on_chain_schema(1890 origin1,1891 collection_id,1892 b"test const on chain schema".to_vec()1893 ));18941895 assert_eq!(1896 <pallet_common::CollectionById<Test>>::get(collection_id)1897 .unwrap()1898 .const_on_chain_schema,1899 b"test const on chain schema".to_vec()1900 );1901 assert_eq!(1902 <pallet_common::CollectionById<Test>>::get(collection_id)1903 .unwrap()1904 .variable_on_chain_schema,1905 b"".to_vec()1906 );1907 });1908}19091910#[test]1911fn set_variable_on_chain_schema() {1912 new_test_ext().execute_with(|| {1913 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19141915 let origin1 = Origin::signed(1);1916 assert_ok!(TemplateModule::set_variable_on_chain_schema(1917 origin1,1918 collection_id,1919 b"test variable on chain schema".to_vec()1920 ));19211922 assert_eq!(1923 <pallet_common::CollectionById<Test>>::get(collection_id)1924 .unwrap()1925 .const_on_chain_schema,1926 b"".to_vec()1927 );1928 assert_eq!(1929 <pallet_common::CollectionById<Test>>::get(collection_id)1930 .unwrap()1931 .variable_on_chain_schema,1932 b"test variable on chain schema".to_vec()1933 );1934 });1935}19361937#[test]1938fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1939 new_test_ext().execute_with(|| {1940 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19411942 let origin1 = Origin::signed(1);19431944 let data = default_nft_data();1945 create_test_item(CollectionId(1), &data.into());19461947 let variable_data = b"test data".to_vec();1948 assert_ok!(TemplateModule::set_variable_meta_data(1949 origin1,1950 collection_id,1951 TokenId(1),1952 variable_data.clone()1953 ));19541955 assert_eq!(1956 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1957 .unwrap()1958 .variable_data,1959 variable_data1960 );1961 });1962}19631964#[test]1965fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1966 new_test_ext().execute_with(|| {1967 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19681969 let origin1 = Origin::signed(1);19701971 let data = default_re_fungible_data();1972 create_test_item(collection_id, &data.into());19731974 let variable_data = b"test data".to_vec();1975 assert_ok!(TemplateModule::set_variable_meta_data(1976 origin1,1977 collection_id,1978 TokenId(1),1979 variable_data.clone()1980 ));19811982 assert_eq!(1983 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1984 .variable_data,1985 variable_data1986 );1987 });1988}19891990#[test]1991fn set_variable_meta_data_on_fungible_token_fails() {1992 new_test_ext().execute_with(|| {1993 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));19941995 let origin1 = Origin::signed(1);19961997 let data = default_fungible_data();1998 create_test_item(collection_id, &data.into());19992000 let variable_data = b"test data".to_vec();2001 assert_noop!(2002 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(0), variable_data).map_err(|e| e.error),2003 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2004 );2005 });2006}20072008#[test]2009fn set_variable_meta_data_on_fungible_token_with_token_id_fails() {2010 new_test_ext().execute_with(|| {2011 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20122013 let origin1 = Origin::signed(1);20142015 let data = default_fungible_data();2016 create_test_item(collection_id, &data.into());20172018 let variable_data = b"test data".to_vec();2019 assert_noop!(2020 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2021 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId2022 );2023 });2024}20252026#[test]2027fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2028 new_test_ext().execute_with(|| {2029 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20302031 let origin1 = Origin::signed(1);20322033 let data = default_nft_data();2034 create_test_item(collection_id, &data.into());20352036 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2037 assert_noop!(2038 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2039 CommonError::<Test>::TokenVariableDataLimitExceeded2040 );2041 });2042}20432044#[test]2045fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2046 new_test_ext().execute_with(|| {2047 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20482049 let origin1 = Origin::signed(1);20502051 let data = default_re_fungible_data();2052 create_test_item(collection_id, &data.into());20532054 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2055 assert_noop!(2056 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2057 CommonError::<Test>::TokenVariableDataLimitExceeded2058 );2059 });2060}20612062#[test]2063fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2064 new_test_ext().execute_with(|| {2065 //default_limits();20662067 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20682069 let origin1 = Origin::signed(1);20702071 let data = default_nft_data();2072 create_test_item(collection_id, &data.into());20732074 assert_ok!(TemplateModule::set_meta_update_permission_flag(2075 origin1.clone(),2076 collection_id,2077 MetaUpdatePermission::ItemOwner,2078 ));20792080 let variable_data = b"ten chars.".to_vec();2081 assert_ok!(TemplateModule::set_variable_meta_data(2082 origin1,2083 collection_id,2084 TokenId(1),2085 variable_data.clone()2086 ));20872088 assert_eq!(2089 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2090 .unwrap()2091 .variable_data,2092 variable_data2093 );2094 });2095}20962097#[test]2098fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2099 new_test_ext().execute_with(|| {2100 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));21012102 let origin1 = Origin::signed(1);21032104 assert_ok!(TemplateModule::set_mint_permission(2105 origin1.clone(),2106 collection_id,2107 true2108 ));2109 assert_ok!(TemplateModule::add_to_allow_list(2110 origin1.clone(),2111 collection_id,2112 account(1)2113 ));21142115 let data = default_nft_data();2116 create_test_item(collection_id, &data.into());21172118 assert_ok!(TemplateModule::set_meta_update_permission_flag(2119 origin1.clone(),2120 collection_id,2121 MetaUpdatePermission::ItemOwner,2122 ));21232124 let variable_data = b"1234567890123".to_vec();2125 assert_noop!(2126 TemplateModule::set_variable_meta_data(2127 origin1,2128 collection_id,2129 TokenId(1),2130 variable_data.clone()2131 ).map_err(|e| e.error),2132 CommonError::<Test>::TokenVariableDataLimitExceeded2133 );2134 })2135}21362137#[test]2138fn collection_transfer_flag_works() {2139 new_test_ext().execute_with(|| {2140 let origin1 = Origin::signed(1);21412142 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2143 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21442145 let data = default_nft_data();2146 create_test_item(collection_id, &data.into());2147 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2148 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21492150 let origin1 = Origin::signed(1);21512152 // default scenario2153 assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2154 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2155 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2156 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2157 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2158 });2159}21602161#[test]2162fn set_variable_meta_data_on_nft_with_admin_flag() {2163 new_test_ext().execute_with(|| {2164 // default_limits();21652166 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21672168 let origin1 = Origin::signed(1);2169 let origin2 = Origin::signed(2);21702171 assert_ok!(TemplateModule::set_mint_permission(2172 origin2.clone(),2173 collection_id,2174 true2175 ));2176 assert_ok!(TemplateModule::add_to_allow_list(2177 origin2.clone(),2178 collection_id,2179 account(1)2180 ));21812182 assert_ok!(TemplateModule::add_collection_admin(2183 origin2.clone(),2184 collection_id,2185 account(1)2186 ));21872188 let data = default_nft_data();2189 create_test_item(collection_id, &data.into());21902191 assert_ok!(TemplateModule::set_meta_update_permission_flag(2192 origin2.clone(),2193 collection_id,2194 MetaUpdatePermission::Admin,2195 ));21962197 let variable_data = b"test.".to_vec();2198 assert_ok!(TemplateModule::set_variable_meta_data(2199 origin1,2200 collection_id,2201 TokenId(1),2202 variable_data.clone()2203 ));22042205 assert_eq!(2206 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2207 .unwrap()2208 .variable_data,2209 variable_data2210 );2211 });2212}22132214#[test]2215fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2216 new_test_ext().execute_with(|| {2217 // default_limits();22182219 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22202221 let origin1 = Origin::signed(1);2222 let origin2 = Origin::signed(2);22232224 assert_ok!(TemplateModule::set_mint_permission(2225 origin2.clone(),2226 collection_id,2227 true2228 ));2229 assert_ok!(TemplateModule::add_to_allow_list(2230 origin2.clone(),2231 collection_id,2232 account(1)2233 ));22342235 let data = default_nft_data();2236 create_test_item(collection_id, &data.into());22372238 assert_ok!(TemplateModule::set_meta_update_permission_flag(2239 origin2.clone(),2240 collection_id,2241 MetaUpdatePermission::Admin,2242 ));22432244 let variable_data = b"test.".to_vec();2245 assert_noop!(2246 TemplateModule::set_variable_meta_data(2247 origin1,2248 collection_id,2249 TokenId(1),2250 variable_data.clone()2251 ).map_err(|e| e.error),2252 CommonError::<Test>::NoPermission2253 );2254 });2255}22562257#[test]2258fn set_variable_meta_flag_after_freeze() {2259 new_test_ext().execute_with(|| {2260 // default_limits();22612262 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22632264 let origin2 = Origin::signed(2);22652266 assert_ok!(TemplateModule::set_meta_update_permission_flag(2267 origin2.clone(),2268 collection_id,2269 MetaUpdatePermission::None,2270 ));2271 assert_noop!(2272 TemplateModule::set_meta_update_permission_flag(2273 origin2.clone(),2274 collection_id,2275 MetaUpdatePermission::Admin2276 ),2277 CommonError::<Test>::MetadataFlagFrozen2278 );2279 });2280}22812282#[test]2283fn set_variable_meta_data_on_nft_with_none_flag_neg() {2284 new_test_ext().execute_with(|| {2285 // default_limits();22862287 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2288 let origin1 = Origin::signed(1);22892290 let data = default_nft_data();2291 create_test_item(collection_id, &data.into());22922293 assert_ok!(TemplateModule::set_meta_update_permission_flag(2294 origin1.clone(),2295 collection_id,2296 MetaUpdatePermission::None,2297 ));22982299 let variable_data = b"test.".to_vec();2300 assert_noop!(2301 TemplateModule::set_variable_meta_data(2302 origin1.clone(),2303 collection_id,2304 TokenId(1),2305 variable_data.clone()2306 ).map_err(|e| e.error),2307 CommonError::<Test>::NoPermission2308 );2309 });2310}23112312#[test]2313fn collection_transfer_flag_works_neg() {2314 new_test_ext().execute_with(|| {2315 let origin1 = Origin::signed(1);23162317 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2318 assert_ok!(TemplateModule::set_transfers_enabled_flag(2319 origin1, collection_id, false2320 ));23212322 let data = default_nft_data();2323 create_test_item(collection_id, &data.into());2324 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2325 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23262327 let origin1 = Origin::signed(1);23282329 // default scenario2330 assert_noop!(2331 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2332 CommonError::<Test>::TransferNotAllowed2333 );2334 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2335 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2336 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2337 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2338 });2339}