difftreelog
Fix formatting
in: master
3 files changed
pallets/inflation/src/lib.rsdiffbeforeafterboth--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -46,8 +46,8 @@
pub type BalanceOf<T> =
<<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
-// pub const YEAR: u32 = 5_259_600; // 6-second block
-pub const YEAR: u32 = 2_629_800; // 12-second block
+// pub const YEAR: u32 = 5_259_600; // 6-second block
+pub const YEAR: u32 = 2_629_800; // 12-second block
pub const TOTAL_YEARS_UNTIL_FLAT: u32 = 9;
pub const START_INFLATION_PERCENT: u32 = 10;
pub const END_INFLATION_PERCENT: u32 = 4;
pallets/scheduler/src/lib.rsdiffbeforeafterboth--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -738,9 +738,7 @@
use super::*;
use frame_support::{
- ord_parameter_types, parameter_types,
- traits::Contains,
- weights::constants::RocksDbWeight,
+ ord_parameter_types, parameter_types, traits::Contains, weights::constants::RocksDbWeight,
};
use sp_core::H256;
use sp_runtime::{
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};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_nft_token_fails_for_big_data() {2010 new_test_ext().execute_with(|| {2011 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20122013 let origin1 = Origin::signed(1);20142015 let data = default_nft_data();2016 create_test_item(collection_id, &data.into());20172018 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2019 assert_noop!(2020 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2021 CommonError::<Test>::TokenVariableDataLimitExceeded2022 );2023 });2024}20252026#[test]2027fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2028 new_test_ext().execute_with(|| {2029 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20302031 let origin1 = Origin::signed(1);20322033 let data = default_re_fungible_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_nft_with_item_owner_permission_flag() {2046 new_test_ext().execute_with(|| {2047 //default_limits();20482049 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20502051 let origin1 = Origin::signed(1);20522053 let data = default_nft_data();2054 create_test_item(collection_id, &data.into());20552056 assert_ok!(TemplateModule::set_meta_update_permission_flag(2057 origin1.clone(),2058 collection_id,2059 MetaUpdatePermission::ItemOwner,2060 ));20612062 let variable_data = b"ten chars.".to_vec();2063 assert_ok!(TemplateModule::set_variable_meta_data(2064 origin1,2065 collection_id,2066 TokenId(1),2067 variable_data.clone()2068 ));20692070 assert_eq!(2071 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2072 .unwrap()2073 .variable_data,2074 variable_data2075 );2076 });2077}20782079#[test]2080fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2081 new_test_ext().execute_with(|| {2082 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));20832084 let origin1 = Origin::signed(1);20852086 assert_ok!(TemplateModule::set_mint_permission(2087 origin1.clone(),2088 collection_id,2089 true2090 ));2091 assert_ok!(TemplateModule::add_to_allow_list(2092 origin1.clone(),2093 collection_id,2094 account(1)2095 ));20962097 let data = default_nft_data();2098 create_test_item(collection_id, &data.into());20992100 assert_ok!(TemplateModule::set_meta_update_permission_flag(2101 origin1.clone(),2102 collection_id,2103 MetaUpdatePermission::ItemOwner,2104 ));21052106 let variable_data = b"1234567890123".to_vec();2107 assert_noop!(2108 TemplateModule::set_variable_meta_data(2109 origin1,2110 collection_id,2111 TokenId(1),2112 variable_data.clone()2113 ).map_err(|e| e.error),2114 CommonError::<Test>::TokenVariableDataLimitExceeded2115 );2116 })2117}21182119#[test]2120fn collection_transfer_flag_works() {2121 new_test_ext().execute_with(|| {2122 let origin1 = Origin::signed(1);21232124 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2125 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21262127 let data = default_nft_data();2128 create_test_item(collection_id, &data.into());2129 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2130 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21312132 let origin1 = Origin::signed(1);21332134 // default scenario2135 assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2136 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2137 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2138 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2139 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2140 });2141}21422143#[test]2144fn set_variable_meta_data_on_nft_with_admin_flag() {2145 new_test_ext().execute_with(|| {2146 // default_limits();21472148 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21492150 let origin1 = Origin::signed(1);2151 let origin2 = Origin::signed(2);21522153 assert_ok!(TemplateModule::set_mint_permission(2154 origin2.clone(),2155 collection_id,2156 true2157 ));2158 assert_ok!(TemplateModule::add_to_allow_list(2159 origin2.clone(),2160 collection_id,2161 account(1)2162 ));21632164 assert_ok!(TemplateModule::add_collection_admin(2165 origin2.clone(),2166 collection_id,2167 account(1)2168 ));21692170 let data = default_nft_data();2171 create_test_item(collection_id, &data.into());21722173 assert_ok!(TemplateModule::set_meta_update_permission_flag(2174 origin2.clone(),2175 collection_id,2176 MetaUpdatePermission::Admin,2177 ));21782179 let variable_data = b"test.".to_vec();2180 assert_ok!(TemplateModule::set_variable_meta_data(2181 origin1,2182 collection_id,2183 TokenId(1),2184 variable_data.clone()2185 ));21862187 assert_eq!(2188 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2189 .unwrap()2190 .variable_data,2191 variable_data2192 );2193 });2194}21952196#[test]2197fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2198 new_test_ext().execute_with(|| {2199 // default_limits();22002201 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22022203 let origin1 = Origin::signed(1);2204 let origin2 = Origin::signed(2);22052206 assert_ok!(TemplateModule::set_mint_permission(2207 origin2.clone(),2208 collection_id,2209 true2210 ));2211 assert_ok!(TemplateModule::add_to_allow_list(2212 origin2.clone(),2213 collection_id,2214 account(1)2215 ));22162217 let data = default_nft_data();2218 create_test_item(collection_id, &data.into());22192220 assert_ok!(TemplateModule::set_meta_update_permission_flag(2221 origin2.clone(),2222 collection_id,2223 MetaUpdatePermission::Admin,2224 ));22252226 let variable_data = b"test.".to_vec();2227 assert_noop!(2228 TemplateModule::set_variable_meta_data(2229 origin1,2230 collection_id,2231 TokenId(1),2232 variable_data.clone()2233 ).map_err(|e| e.error),2234 CommonError::<Test>::NoPermission2235 );2236 });2237}22382239#[test]2240fn set_variable_meta_flag_after_freeze() {2241 new_test_ext().execute_with(|| {2242 // default_limits();22432244 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22452246 let origin2 = Origin::signed(2);22472248 assert_ok!(TemplateModule::set_meta_update_permission_flag(2249 origin2.clone(),2250 collection_id,2251 MetaUpdatePermission::None,2252 ));2253 assert_noop!(2254 TemplateModule::set_meta_update_permission_flag(2255 origin2.clone(),2256 collection_id,2257 MetaUpdatePermission::Admin2258 ),2259 CommonError::<Test>::MetadataFlagFrozen2260 );2261 });2262}22632264#[test]2265fn set_variable_meta_data_on_nft_with_none_flag_neg() {2266 new_test_ext().execute_with(|| {2267 // default_limits();22682269 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2270 let origin1 = Origin::signed(1);22712272 let data = default_nft_data();2273 create_test_item(collection_id, &data.into());22742275 assert_ok!(TemplateModule::set_meta_update_permission_flag(2276 origin1.clone(),2277 collection_id,2278 MetaUpdatePermission::None,2279 ));22802281 let variable_data = b"test.".to_vec();2282 assert_noop!(2283 TemplateModule::set_variable_meta_data(2284 origin1.clone(),2285 collection_id,2286 TokenId(1),2287 variable_data.clone()2288 ).map_err(|e| e.error),2289 CommonError::<Test>::NoPermission2290 );2291 });2292}22932294#[test]2295fn collection_transfer_flag_works_neg() {2296 new_test_ext().execute_with(|| {2297 let origin1 = Origin::signed(1);22982299 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2300 assert_ok!(TemplateModule::set_transfers_enabled_flag(2301 origin1, collection_id, false2302 ));23032304 let data = default_nft_data();2305 create_test_item(collection_id, &data.into());2306 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2307 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23082309 let origin1 = Origin::signed(1);23102311 // default scenario2312 assert_noop!(2313 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2314 CommonError::<Test>::TransferNotAllowed2315 );2316 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2317 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2318 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2319 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2320 });2321}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use up_data_structs::{6 COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,7 CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, MetaUpdatePermission,8 TokenId,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!(54 <pallet_common::CollectionById<Test>>::get(id)55 .unwrap()56 .owner,57 owner58 );59 assert_eq!(60 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,61 saved_col_name62 );63 assert_eq!(64 <pallet_common::CollectionById<Test>>::get(id).unwrap().mode,65 *mode66 );67 assert_eq!(68 <pallet_common::CollectionById<Test>>::get(id)69 .unwrap()70 .description,71 saved_description72 );73 assert_eq!(74 <pallet_common::CollectionById<Test>>::get(id)75 .unwrap()76 .token_prefix,77 saved_prefix78 );79 id80}8182fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {83 create_test_collection_for_owner(&mode, 1, id)84}8586fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {87 let origin1 = Origin::signed(1);88 assert_ok!(TemplateModule::create_item(89 origin1,90 collection_id,91 account(1),92 data.clone()93 ));94}9596fn account(sub: u64) -> TestCrossAccountId {97 TestCrossAccountId::from_sub(sub)98}99100// Use cases tests region101// #region102103#[test]104fn set_version_schema() {105 new_test_ext().execute_with(|| {106 let origin1 = Origin::signed(1);107 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));108109 assert_ok!(TemplateModule::set_schema_version(110 origin1,111 collection_id,112 SchemaVersion::Unique113 ));114 assert_eq!(115 <pallet_common::CollectionById<Test>>::get(collection_id)116 .unwrap()117 .schema_version,118 SchemaVersion::Unique119 );120 });121}122123#[test]124fn create_fungible_collection_fails_with_large_decimal_numbers() {125 new_test_ext().execute_with(|| {126 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();127 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();128 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();129130 let origin1 = Origin::signed(1);131 assert_noop!(132 TemplateModule::create_collection(133 origin1,134 col_name1,135 col_desc1,136 token_prefix1,137 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)138 ),139 Error::<Test>::CollectionDecimalPointLimitExceeded140 );141 });142}143144#[test]145fn create_nft_item() {146 new_test_ext().execute_with(|| {147 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));148149 let data = default_nft_data();150 create_test_item(collection_id, &data.clone().into());151152 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();153 assert_eq!(item.const_data, data.const_data.into_inner());154 assert_eq!(item.variable_data, data.variable_data.into_inner());155 });156}157158// Use cases tests region159// #region160#[test]161fn create_nft_multiple_items() {162 new_test_ext().execute_with(|| {163 create_test_collection(&CollectionMode::NFT, CollectionId(1));164165 let origin1 = Origin::signed(1);166167 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];168169 assert_ok!(TemplateModule::create_multiple_items(170 origin1,171 CollectionId(1),172 account(1),173 items_data174 .clone()175 .into_iter()176 .map(|d| { d.into() })177 .collect()178 ));179 for (index, data) in items_data.into_iter().enumerate() {180 let item = <pallet_nonfungible::TokenData<Test>>::get((181 CollectionId(1),182 TokenId((index + 1) as u32),183 ))184 .unwrap();185 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());186 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());187 }188 });189}190191#[test]192fn create_refungible_item() {193 new_test_ext().execute_with(|| {194 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));195196 let data = default_re_fungible_data();197 create_test_item(collection_id, &data.clone().into());198 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));199 let balance =200 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));201 assert_eq!(item.const_data, data.const_data.into_inner());202 assert_eq!(item.variable_data, data.variable_data.into_inner());203 assert_eq!(balance, 1023);204 });205}206207#[test]208fn create_multiple_refungible_items() {209 new_test_ext().execute_with(|| {210 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));211212 let origin1 = Origin::signed(1);213214 let items_data = vec![215 default_re_fungible_data(),216 default_re_fungible_data(),217 default_re_fungible_data(),218 ];219220 assert_ok!(TemplateModule::create_multiple_items(221 origin1,222 CollectionId(1),223 account(1),224 items_data225 .clone()226 .into_iter()227 .map(|d| { d.into() })228 .collect()229 ));230 for (index, data) in items_data.into_iter().enumerate() {231 let item = <pallet_refungible::TokenData<Test>>::get((232 CollectionId(1),233 TokenId((index + 1) as u32),234 ));235 let balance =236 <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));237 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());238 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());239 assert_eq!(balance, 1023);240 }241 });242}243244#[test]245fn create_fungible_item() {246 new_test_ext().execute_with(|| {247 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));248249 let data = default_fungible_data();250 create_test_item(collection_id, &data.into());251252 assert_eq!(253 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),254 5255 );256 });257}258259//#[test]260// fn create_multiple_fungible_items() {261// new_test_ext().execute_with(|| {262// default_limits();263264// create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));265266// let origin1 = Origin::signed(1);267268// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];269270// assert_ok!(TemplateModule::create_multiple_items(271// origin1.clone(),272// 1,273// 1,274// items_data.clone().into_iter().map(|d| { d.into() }).collect()275// ));276277// for (index, _) in items_data.iter().enumerate() {278// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);279// }280// assert_eq!(TemplateModule::balance_count(1, 1), 3000);281// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);282// });283// }284285#[test]286fn transfer_fungible_item() {287 new_test_ext().execute_with(|| {288 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));289290 let origin1 = Origin::signed(1);291 let origin2 = Origin::signed(2);292293 let data = default_fungible_data();294 create_test_item(collection_id, &data.into());295296 assert_eq!(297 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),298 5299 );300301 // change owner scenario302 assert_ok!(TemplateModule::transfer(303 origin1,304 account(2),305 CollectionId(1),306 TokenId(0),307 5308 ));309 assert_eq!(310 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),311 0312 );313314 // split item scenario315 assert_ok!(TemplateModule::transfer(316 origin2.clone(),317 account(3),318 CollectionId(1),319 TokenId(0),320 3321 ));322323 // split item and new owner has account scenario324 assert_ok!(TemplateModule::transfer(325 origin2,326 account(3),327 CollectionId(1),328 TokenId(0),329 1330 ));331 assert_eq!(332 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),333 1334 );335 assert_eq!(336 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),337 4338 );339 });340}341342#[test]343fn transfer_refungible_item() {344 new_test_ext().execute_with(|| {345 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));346347 // Create RFT 1 in 1023 pieces for account 1348 let data = default_re_fungible_data();349 create_test_item(collection_id, &data.clone().into());350 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));351 assert_eq!(item.const_data, data.const_data.into_inner());352 assert_eq!(item.variable_data, data.variable_data.into_inner());353 assert_eq!(354 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),355 1356 );357 assert_eq!(358 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),359 1023360 );361 assert_eq!(362 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),363 true364 );365366 // Account 1 transfers all 1023 pieces of RFT 1 to account 2367 let origin1 = Origin::signed(1);368 let origin2 = Origin::signed(2);369 assert_ok!(TemplateModule::transfer(370 origin1,371 account(2),372 CollectionId(1),373 TokenId(1),374 1023375 ));376 assert_eq!(377 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),378 1023379 );380 assert_eq!(381 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),382 0383 );384 assert_eq!(385 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),386 1387 );388 assert_eq!(389 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),390 false391 );392 assert_eq!(393 <pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),394 true395 );396397 // Account 2 transfers 500 pieces of RFT 1 to account 3398 assert_ok!(TemplateModule::transfer(399 origin2.clone(),400 account(3),401 CollectionId(1),402 TokenId(1),403 500404 ));405 assert_eq!(406 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),407 523408 );409 assert_eq!(410 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),411 500412 );413 assert_eq!(414 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),415 1416 );417 assert_eq!(418 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),419 1420 );421 assert_eq!(422 <pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),423 true424 );425 assert_eq!(426 <pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),427 true428 );429430 // Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance431 assert_ok!(TemplateModule::transfer(432 origin2,433 account(3),434 CollectionId(1),435 TokenId(1),436 200437 ));438 assert_eq!(439 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),440 323441 );442 assert_eq!(443 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),444 700445 );446 assert_eq!(447 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),448 1449 );450 assert_eq!(451 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),452 1453 );454 assert_eq!(455 <pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),456 true457 );458 assert_eq!(459 <pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),460 true461 );462 });463}464465#[test]466fn transfer_nft_item() {467 new_test_ext().execute_with(|| {468 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));469470 let data = default_nft_data();471 create_test_item(collection_id, &data.into());472 assert_eq!(473 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),474 1475 );476 assert_eq!(477 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),478 true479 );480481 let origin1 = Origin::signed(1);482 // default scenario483 assert_ok!(TemplateModule::transfer(484 origin1,485 account(2),486 CollectionId(1),487 TokenId(1),488 1489 ));490 assert_eq!(491 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),492 0493 );494 assert_eq!(495 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),496 1497 );498 assert_eq!(499 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),500 false501 );502 assert_eq!(503 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),504 true505 );506 });507}508509#[test]510fn transfer_nft_item_wrong_value() {511 new_test_ext().execute_with(|| {512 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));513514 let data = default_nft_data();515 create_test_item(collection_id, &data.into());516 assert_eq!(517 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),518 1519 );520 assert_eq!(521 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),522 true523 );524525 let origin1 = Origin::signed(1);526527 assert_noop!(528 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)529 .map_err(|e| e.error),530 <pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount531 );532 });533}534535#[test]536fn transfer_nft_item_zero_value() {537 new_test_ext().execute_with(|| {538 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));539540 let data = default_nft_data();541 create_test_item(collection_id, &data.into());542 assert_eq!(543 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),544 1545 );546 assert_eq!(547 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),548 true549 );550551 let origin1 = Origin::signed(1);552553 // Transferring 0 amount works on NFT...554 assert_ok!(TemplateModule::transfer(555 origin1,556 account(2),557 CollectionId(1),558 TokenId(1),559 0560 ));561 // ... and results in no transfer562 assert_eq!(563 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),564 1565 );566 assert_eq!(567 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),568 true569 );570 });571}572573#[test]574fn nft_approve_and_transfer_from() {575 new_test_ext().execute_with(|| {576 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));577578 let data = default_nft_data();579 create_test_item(collection_id, &data.into());580581 let origin1 = Origin::signed(1);582 let origin2 = Origin::signed(2);583584 assert_eq!(585 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),586 1587 );588 assert_eq!(589 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),590 true591 );592593 // neg transfer_from594 assert_noop!(595 TemplateModule::transfer_from(596 origin2.clone(),597 account(1),598 account(2),599 CollectionId(1),600 TokenId(1),601 1602 )603 .map_err(|e| e.error),604 CommonError::<Test>::TokenValueNotEnough605 );606607 // do approve608 assert_ok!(TemplateModule::approve(609 origin1,610 account(2),611 CollectionId(1),612 TokenId(1),613 1614 ));615 assert_eq!(616 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),617 account(2)618 );619620 assert_ok!(TemplateModule::transfer_from(621 origin2,622 account(1),623 account(3),624 CollectionId(1),625 TokenId(1),626 1627 ));628 assert!(629 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()630 );631 });632}633634#[test]635fn nft_approve_and_transfer_from_allow_list() {636 new_test_ext().execute_with(|| {637 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));638639 let origin1 = Origin::signed(1);640 let origin2 = Origin::signed(2);641642 // Create NFT 1 for account 1643 let data = default_nft_data();644 create_test_item(collection_id, &data.clone().into());645 assert_eq!(646 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))647 .unwrap()648 .const_data,649 &data.const_data.into_inner()650 );651 assert_eq!(652 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),653 1654 );655 assert_eq!(656 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),657 true658 );659660 // Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list661 assert_ok!(TemplateModule::set_mint_permission(662 origin1.clone(),663 CollectionId(1),664 true665 ));666 assert_ok!(TemplateModule::set_public_access_mode(667 origin1.clone(),668 CollectionId(1),669 AccessMode::AllowList670 ));671 assert_ok!(TemplateModule::add_to_allow_list(672 origin1.clone(),673 CollectionId(1),674 account(1)675 ));676 assert_ok!(TemplateModule::add_to_allow_list(677 origin1.clone(),678 CollectionId(1),679 account(2)680 ));681 assert_ok!(TemplateModule::add_to_allow_list(682 origin1.clone(),683 CollectionId(1),684 account(3)685 ));686687 // Account 1 approves account 2 for NFT 1688 assert_ok!(TemplateModule::approve(689 origin1.clone(),690 account(2),691 CollectionId(1),692 TokenId(1),693 1694 ));695 assert_eq!(696 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),697 account(2)698 );699700 // Account 2 transfers NFT 1 from account 1 to account 3701 assert_ok!(TemplateModule::transfer_from(702 origin2,703 account(1),704 account(3),705 CollectionId(1),706 TokenId(1),707 1708 ));709 assert!(710 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()711 );712 });713}714715#[test]716fn refungible_approve_and_transfer_from() {717 new_test_ext().execute_with(|| {718 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));719720 let origin1 = Origin::signed(1);721 let origin2 = Origin::signed(2);722723 // Create RFT 1 in 1023 pieces for account 1724 let data = default_re_fungible_data();725 create_test_item(collection_id, &data.into());726727 assert_eq!(728 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),729 1730 );731 assert_eq!(732 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),733 1023734 );735 assert_eq!(736 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),737 true738 );739740 // Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list741 assert_ok!(TemplateModule::set_mint_permission(742 origin1.clone(),743 CollectionId(1),744 true745 ));746 assert_ok!(TemplateModule::set_public_access_mode(747 origin1.clone(),748 CollectionId(1),749 AccessMode::AllowList750 ));751 assert_ok!(TemplateModule::add_to_allow_list(752 origin1.clone(),753 CollectionId(1),754 account(1)755 ));756 assert_ok!(TemplateModule::add_to_allow_list(757 origin1.clone(),758 CollectionId(1),759 account(2)760 ));761 assert_ok!(TemplateModule::add_to_allow_list(762 origin1.clone(),763 CollectionId(1),764 account(3)765 ));766767 // Account 1 approves account 2 for 1023 pieces of RFT 1768 assert_ok!(TemplateModule::approve(769 origin1,770 account(2),771 CollectionId(1),772 TokenId(1),773 1023774 ));775 assert_eq!(776 <pallet_refungible::Allowance<Test>>::get((777 CollectionId(1),778 TokenId(1),779 account(1),780 account(2)781 )),782 1023783 );784785 // Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3786 assert_ok!(TemplateModule::transfer_from(787 origin2,788 account(1),789 account(3),790 CollectionId(1),791 TokenId(1),792 100793 ));794 assert_eq!(795 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),796 1797 );798 assert_eq!(799 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),800 1801 );802 assert_eq!(803 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),804 923805 );806 assert_eq!(807 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),808 100809 );810 assert_eq!(811 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),812 true813 );814 assert_eq!(815 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),816 true817 );818 assert_eq!(819 <pallet_refungible::Allowance<Test>>::get((820 CollectionId(1),821 TokenId(1),822 account(1),823 account(2)824 )),825 923826 );827 });828}829830#[test]831fn fungible_approve_and_transfer_from() {832 new_test_ext().execute_with(|| {833 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));834835 let data = default_fungible_data();836 create_test_item(collection_id, &data.into());837838 let origin1 = Origin::signed(1);839 let origin2 = Origin::signed(2);840841 assert_ok!(TemplateModule::set_mint_permission(842 origin1.clone(),843 CollectionId(1),844 true845 ));846 assert_ok!(TemplateModule::set_public_access_mode(847 origin1.clone(),848 CollectionId(1),849 AccessMode::AllowList850 ));851 assert_ok!(TemplateModule::add_to_allow_list(852 origin1.clone(),853 CollectionId(1),854 account(1)855 ));856 assert_ok!(TemplateModule::add_to_allow_list(857 origin1.clone(),858 CollectionId(1),859 account(2)860 ));861 assert_ok!(TemplateModule::add_to_allow_list(862 origin1.clone(),863 CollectionId(1),864 account(3)865 ));866867 // do approve868 assert_ok!(TemplateModule::approve(869 origin1.clone(),870 account(2),871 CollectionId(1),872 TokenId(0),873 5874 ));875 assert_eq!(876 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),877 5878 );879 assert_ok!(TemplateModule::approve(880 origin1,881 account(3),882 CollectionId(1),883 TokenId(0),884 5885 ));886 assert_eq!(887 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),888 5889 );890 assert_eq!(891 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),892 5893 );894895 assert_ok!(TemplateModule::transfer_from(896 origin2.clone(),897 account(1),898 account(3),899 CollectionId(1),900 TokenId(0),901 4902 ));903904 assert_eq!(905 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),906 1907 );908909 assert_noop!(910 TemplateModule::transfer_from(911 origin2,912 account(1),913 account(3),914 CollectionId(1),915 TokenId(0),916 4917 )918 .map_err(|e| e.error),919 CommonError::<Test>::TokenValueNotEnough920 );921 });922}923924#[test]925fn change_collection_owner() {926 new_test_ext().execute_with(|| {927 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));928929 let origin1 = Origin::signed(1);930 assert_ok!(TemplateModule::change_collection_owner(931 origin1,932 collection_id,933 2934 ));935 assert_eq!(936 <pallet_common::CollectionById<Test>>::get(collection_id)937 .unwrap()938 .owner,939 2940 );941 });942}943944#[test]945fn destroy_collection() {946 new_test_ext().execute_with(|| {947 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));948949 let origin1 = Origin::signed(1);950 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));951 });952}953954#[test]955fn burn_nft_item() {956 new_test_ext().execute_with(|| {957 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));958959 let origin1 = Origin::signed(1);960961 let data = default_nft_data();962 create_test_item(collection_id, &data.into());963964 // check balance (collection with id = 1, user id = 1)965 assert_eq!(966 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),967 1968 );969970 // burn item971 assert_ok!(TemplateModule::burn_item(972 origin1.clone(),973 collection_id,974 TokenId(1),975 1976 ));977 assert_eq!(978 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),979 0980 );981 });982}983984#[test]985fn burn_same_nft_item_twice() {986 new_test_ext().execute_with(|| {987 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));988989 let origin1 = Origin::signed(1);990991 let data = default_nft_data();992 create_test_item(collection_id, &data.into());993994 // check balance (collection with id = 1, user id = 1)995 assert_eq!(996 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),997 1998 );9991000 // burn item1001 assert_ok!(TemplateModule::burn_item(1002 origin1.clone(),1003 collection_id,1004 TokenId(1),1005 11006 ));10071008 // burn item again1009 assert_noop!(1010 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1011 CommonError::<Test>::TokenNotFound1012 );10131014 assert_eq!(1015 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1016 01017 );1018 });1019}10201021#[test]1022fn burn_fungible_item() {1023 new_test_ext().execute_with(|| {1024 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10251026 let origin1 = Origin::signed(1);1027 assert_ok!(TemplateModule::add_collection_admin(1028 origin1.clone(),1029 collection_id,1030 account(2)1031 ));10321033 let data = default_fungible_data();1034 create_test_item(collection_id, &data.into());10351036 // check balance (collection with id = 1, user id = 1)1037 assert_eq!(1038 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1039 51040 );10411042 // burn item1043 assert_ok!(TemplateModule::burn_item(1044 origin1.clone(),1045 CollectionId(1),1046 TokenId(0),1047 51048 ));1049 assert_noop!(1050 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1051 CommonError::<Test>::TokenValueTooLow1052 );10531054 assert_eq!(1055 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1056 01057 );1058 });1059}10601061#[test]1062fn burn_fungible_item_with_token_id() {1063 new_test_ext().execute_with(|| {1064 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10651066 let origin1 = Origin::signed(1);1067 assert_ok!(TemplateModule::add_collection_admin(1068 origin1.clone(),1069 collection_id,1070 account(2)1071 ));10721073 let data = default_fungible_data();1074 create_test_item(collection_id, &data.into());10751076 // check balance (collection with id = 1, user id = 1)1077 assert_eq!(1078 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1079 51080 );10811082 // Try to burn item using Token ID1083 assert_noop!(1084 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1085 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1086 );1087 });1088}1089#[test]1090fn burn_refungible_item() {1091 new_test_ext().execute_with(|| {1092 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1093 let origin1 = Origin::signed(1);10941095 assert_ok!(TemplateModule::set_mint_permission(1096 origin1.clone(),1097 collection_id,1098 true1099 ));1100 assert_ok!(TemplateModule::set_public_access_mode(1101 origin1.clone(),1102 collection_id,1103 AccessMode::AllowList1104 ));1105 assert_ok!(TemplateModule::add_to_allow_list(1106 origin1.clone(),1107 collection_id,1108 account(1)1109 ));11101111 assert_ok!(TemplateModule::add_collection_admin(1112 origin1.clone(),1113 collection_id,1114 account(2)1115 ));11161117 let data = default_re_fungible_data();1118 create_test_item(collection_id, &data.into());11191120 // check balance (collection with id = 1, user id = 2)1121 assert_eq!(1122 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1123 11124 );1125 assert_eq!(1126 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1127 10231128 );11291130 // burn item1131 assert_ok!(TemplateModule::burn_item(1132 origin1.clone(),1133 collection_id,1134 TokenId(1),1135 10231136 ));1137 assert_noop!(1138 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023)1139 .map_err(|e| e.error),1140 CommonError::<Test>::TokenValueTooLow1141 );11421143 assert_eq!(1144 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1145 01146 );1147 });1148}11491150#[test]1151fn add_collection_admin() {1152 new_test_ext().execute_with(|| {1153 let collection1_id =1154 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1155 let origin1 = Origin::signed(1);11561157 // Add collection admins1158 assert_ok!(TemplateModule::add_collection_admin(1159 origin1.clone(),1160 collection1_id,1161 account(2)1162 ));1163 assert_ok!(TemplateModule::add_collection_admin(1164 origin1,1165 collection1_id,1166 account(3)1167 ));11681169 // Owner is not an admin by default1170 assert_eq!(1171 <pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1172 false1173 );1174 assert!(<pallet_common::IsAdmin<Test>>::get((1175 CollectionId(1),1176 account(2)1177 )));1178 assert!(<pallet_common::IsAdmin<Test>>::get((1179 CollectionId(1),1180 account(3)1181 )));1182 });1183}11841185#[test]1186fn remove_collection_admin() {1187 new_test_ext().execute_with(|| {1188 let collection1_id =1189 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1190 let origin1 = Origin::signed(1);1191 let origin2 = Origin::signed(2);11921193 // Add collection admins 2 and 31194 assert_ok!(TemplateModule::add_collection_admin(1195 origin1.clone(),1196 collection1_id,1197 account(2)1198 ));1199 assert_ok!(TemplateModule::add_collection_admin(1200 origin1,1201 collection1_id,1202 account(3)1203 ));12041205 assert!(<pallet_common::IsAdmin<Test>>::get((1206 CollectionId(1),1207 account(2)1208 )));1209 assert!(<pallet_common::IsAdmin<Test>>::get((1210 CollectionId(1),1211 account(3)1212 )));12131214 // remove admin 31215 assert_ok!(TemplateModule::remove_collection_admin(1216 origin2,1217 CollectionId(1),1218 account(3)1219 ));12201221 // 2 is still admin, 3 is not an admin anymore1222 assert!(<pallet_common::IsAdmin<Test>>::get((1223 CollectionId(1),1224 account(2)1225 )));1226 assert_eq!(1227 <pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1228 false1229 );1230 });1231}12321233#[test]1234fn balance_of() {1235 new_test_ext().execute_with(|| {1236 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1237 let fungible_collection_id =1238 create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1239 let re_fungible_collection_id =1240 create_test_collection(&CollectionMode::ReFungible, CollectionId(3));12411242 // check balance before1243 assert_eq!(1244 <pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1245 01246 );1247 assert_eq!(1248 <pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1249 01250 );1251 assert_eq!(1252 <pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1253 01254 );12551256 let nft_data = default_nft_data();1257 create_test_item(nft_collection_id, &nft_data.into());12581259 let fungible_data = default_fungible_data();1260 create_test_item(fungible_collection_id, &fungible_data.into());12611262 let re_fungible_data = default_re_fungible_data();1263 create_test_item(re_fungible_collection_id, &re_fungible_data.into());12641265 // check balance (collection with id = 1, user id = 1)1266 assert_eq!(1267 <pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1268 11269 );1270 assert_eq!(1271 <pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1272 51273 );1274 assert_eq!(1275 <pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1276 11277 );12781279 assert_eq!(1280 <pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1281 true1282 );1283 assert_eq!(1284 <pallet_refungible::Owned<Test>>::get((1285 re_fungible_collection_id,1286 account(1),1287 TokenId(1)1288 )),1289 true1290 );1291 });1292}12931294#[test]1295fn approve() {1296 new_test_ext().execute_with(|| {1297 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12981299 let data = default_nft_data();1300 create_test_item(collection_id, &data.into());13011302 let origin1 = Origin::signed(1);13031304 // approve1305 assert_ok!(TemplateModule::approve(1306 origin1,1307 account(2),1308 CollectionId(1),1309 TokenId(1),1310 11311 ));1312 assert_eq!(1313 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1314 account(2)1315 );1316 });1317}13181319#[test]1320fn transfer_from() {1321 new_test_ext().execute_with(|| {1322 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1323 let origin1 = Origin::signed(1);1324 let origin2 = Origin::signed(2);13251326 let data = default_nft_data();1327 create_test_item(collection_id, &data.into());13281329 // approve1330 assert_ok!(TemplateModule::approve(1331 origin1.clone(),1332 account(2),1333 CollectionId(1),1334 TokenId(1),1335 11336 ));1337 assert_eq!(1338 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1339 account(2)1340 );13411342 assert_ok!(TemplateModule::set_mint_permission(1343 origin1.clone(),1344 CollectionId(1),1345 true1346 ));1347 assert_ok!(TemplateModule::set_public_access_mode(1348 origin1.clone(),1349 CollectionId(1),1350 AccessMode::AllowList1351 ));1352 assert_ok!(TemplateModule::add_to_allow_list(1353 origin1.clone(),1354 CollectionId(1),1355 account(1)1356 ));1357 assert_ok!(TemplateModule::add_to_allow_list(1358 origin1.clone(),1359 CollectionId(1),1360 account(2)1361 ));1362 assert_ok!(TemplateModule::add_to_allow_list(1363 origin1,1364 CollectionId(1),1365 account(3)1366 ));13671368 assert_ok!(TemplateModule::transfer_from(1369 origin2,1370 account(1),1371 account(2),1372 CollectionId(1),1373 TokenId(1),1374 11375 ));13761377 // after transfer1378 assert_eq!(1379 <pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1380 01381 );1382 assert_eq!(1383 <pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1384 11385 );1386 });1387}13881389// #endregion13901391// Coverage tests region1392// #region13931394#[test]1395fn owner_can_add_address_to_allow_list() {1396 new_test_ext().execute_with(|| {1397 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13981399 let origin1 = Origin::signed(1);1400 assert_ok!(TemplateModule::add_to_allow_list(1401 origin1,1402 collection_id,1403 account(2)1404 ));1405 assert!(<pallet_common::Allowlist<Test>>::get((1406 collection_id,1407 account(2)1408 )));1409 });1410}14111412#[test]1413fn admin_can_add_address_to_allow_list() {1414 new_test_ext().execute_with(|| {1415 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1416 let origin1 = Origin::signed(1);1417 let origin2 = Origin::signed(2);14181419 assert_ok!(TemplateModule::add_collection_admin(1420 origin1,1421 collection_id,1422 account(2)1423 ));1424 assert_ok!(TemplateModule::add_to_allow_list(1425 origin2,1426 collection_id,1427 account(3)1428 ));1429 assert!(<pallet_common::Allowlist<Test>>::get((1430 collection_id,1431 account(3)1432 )));1433 });1434}14351436#[test]1437fn nonprivileged_user_cannot_add_address_to_allow_list() {1438 new_test_ext().execute_with(|| {1439 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14401441 let origin2 = Origin::signed(2);1442 assert_noop!(1443 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1444 CommonError::<Test>::NoPermission1445 );1446 });1447}14481449#[test]1450fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1451 new_test_ext().execute_with(|| {1452 let origin1 = Origin::signed(1);14531454 assert_noop!(1455 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1456 CommonError::<Test>::CollectionNotFound1457 );1458 });1459}14601461#[test]1462fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1463 new_test_ext().execute_with(|| {1464 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14651466 let origin1 = Origin::signed(1);1467 assert_ok!(TemplateModule::destroy_collection(1468 origin1.clone(),1469 collection_id1470 ));1471 assert_noop!(1472 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1473 CommonError::<Test>::CollectionNotFound1474 );1475 });1476}14771478// If address is already added to allow list, nothing happens1479#[test]1480fn address_is_already_added_to_allow_list() {1481 new_test_ext().execute_with(|| {1482 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1483 let origin1 = Origin::signed(1);14841485 assert_ok!(TemplateModule::add_to_allow_list(1486 origin1.clone(),1487 collection_id,1488 account(2)1489 ));1490 assert_ok!(TemplateModule::add_to_allow_list(1491 origin1,1492 collection_id,1493 account(2)1494 ));1495 assert!(<pallet_common::Allowlist<Test>>::get((1496 collection_id,1497 account(2)1498 )));1499 });1500}15011502#[test]1503fn owner_can_remove_address_from_allow_list() {1504 new_test_ext().execute_with(|| {1505 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15061507 let origin1 = Origin::signed(1);1508 assert_ok!(TemplateModule::add_to_allow_list(1509 origin1.clone(),1510 collection_id,1511 account(2)1512 ));1513 assert_ok!(TemplateModule::remove_from_allow_list(1514 origin1,1515 collection_id,1516 account(2)1517 ));1518 assert_eq!(1519 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1520 false1521 );1522 });1523}15241525#[test]1526fn admin_can_remove_address_from_allow_list() {1527 new_test_ext().execute_with(|| {1528 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1529 let origin1 = Origin::signed(1);1530 let origin2 = Origin::signed(2);15311532 // Owner adds admin1533 assert_ok!(TemplateModule::add_collection_admin(1534 origin1.clone(),1535 collection_id,1536 account(2)1537 ));15381539 // Owner adds address 3 to allow list1540 assert_ok!(TemplateModule::add_to_allow_list(1541 origin1,1542 collection_id,1543 account(3)1544 ));15451546 // Admin removes address 3 from allow list1547 assert_ok!(TemplateModule::remove_from_allow_list(1548 origin2,1549 collection_id,1550 account(3)1551 ));1552 assert_eq!(1553 <pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1554 false1555 );1556 });1557}15581559#[test]1560fn nonprivileged_user_cannot_remove_address_from_allow_list() {1561 new_test_ext().execute_with(|| {1562 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1563 let origin1 = Origin::signed(1);1564 let origin2 = Origin::signed(2);15651566 assert_ok!(TemplateModule::add_to_allow_list(1567 origin1,1568 collection_id,1569 account(2)1570 ));1571 assert_noop!(1572 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1573 CommonError::<Test>::NoPermission1574 );1575 assert!(<pallet_common::Allowlist<Test>>::get((1576 collection_id,1577 account(2)1578 )));1579 });1580}15811582#[test]1583fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1584 new_test_ext().execute_with(|| {1585 let origin1 = Origin::signed(1);15861587 assert_noop!(1588 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1589 CommonError::<Test>::CollectionNotFound1590 );1591 });1592}15931594#[test]1595fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1596 new_test_ext().execute_with(|| {1597 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1598 let origin1 = Origin::signed(1);1599 let origin2 = Origin::signed(2);16001601 // Add account 2 to allow list1602 assert_ok!(TemplateModule::add_to_allow_list(1603 origin1.clone(),1604 collection_id,1605 account(2)1606 ));16071608 // Account 2 is in collection allow-list1609 assert!(<pallet_common::Allowlist<Test>>::get((1610 collection_id,1611 account(2)1612 )));16131614 // Destroy collection1615 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));16161617 // Attempt to remove account 2 from collection allow-list => error1618 assert_noop!(1619 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1620 CommonError::<Test>::CollectionNotFound1621 );16221623 // Account 2 is not found in collection allow-list anyway1624 assert_eq!(1625 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1626 false1627 );1628 });1629}16301631// If address is already removed from allow list, nothing happens1632#[test]1633fn address_is_already_removed_from_allow_list() {1634 new_test_ext().execute_with(|| {1635 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1636 let origin1 = Origin::signed(1);16371638 assert_ok!(TemplateModule::add_to_allow_list(1639 origin1.clone(),1640 collection_id,1641 account(2)1642 ));1643 assert_ok!(TemplateModule::remove_from_allow_list(1644 origin1.clone(),1645 collection_id,1646 account(2)1647 ));1648 assert_eq!(1649 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1650 false1651 );1652 assert_ok!(TemplateModule::remove_from_allow_list(1653 origin1,1654 collection_id,1655 account(2)1656 ));1657 assert_eq!(1658 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1659 false1660 );1661 });1662}16631664// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1665#[test]1666fn allow_list_test_1() {1667 new_test_ext().execute_with(|| {1668 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16691670 let origin1 = Origin::signed(1);16711672 let data = default_nft_data();1673 create_test_item(collection_id, &data.into());16741675 assert_ok!(TemplateModule::set_public_access_mode(1676 origin1.clone(),1677 collection_id,1678 AccessMode::AllowList1679 ));1680 assert_ok!(TemplateModule::add_to_allow_list(1681 origin1.clone(),1682 collection_id,1683 account(2)1684 ));16851686 assert_noop!(1687 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1688 .map_err(|e| e.error),1689 CommonError::<Test>::AddressNotInAllowlist1690 );1691 });1692}16931694#[test]1695fn allow_list_test_2() {1696 new_test_ext().execute_with(|| {1697 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1698 let origin1 = Origin::signed(1);16991700 let data = default_nft_data();1701 create_test_item(collection_id, &data.into());17021703 assert_ok!(TemplateModule::set_public_access_mode(1704 origin1.clone(),1705 collection_id,1706 AccessMode::AllowList1707 ));1708 assert_ok!(TemplateModule::add_to_allow_list(1709 origin1.clone(),1710 collection_id,1711 account(1)1712 ));1713 assert_ok!(TemplateModule::add_to_allow_list(1714 origin1.clone(),1715 collection_id,1716 account(2)1717 ));17181719 // do approve1720 assert_ok!(TemplateModule::approve(1721 origin1.clone(),1722 account(1),1723 collection_id,1724 TokenId(1),1725 11726 ));1727 assert_eq!(1728 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1729 account(1)1730 );17311732 assert_ok!(TemplateModule::remove_from_allow_list(1733 origin1.clone(),1734 collection_id,1735 account(1)1736 ));17371738 assert_noop!(1739 TemplateModule::transfer_from(1740 origin1,1741 account(1),1742 account(3),1743 CollectionId(1),1744 TokenId(1),1745 11746 )1747 .map_err(|e| e.error),1748 CommonError::<Test>::AddressNotInAllowlist1749 );1750 });1751}17521753// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1754#[test]1755fn allow_list_test_3() {1756 new_test_ext().execute_with(|| {1757 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17581759 let origin1 = Origin::signed(1);17601761 let data = default_nft_data();1762 create_test_item(collection_id, &data.into());17631764 assert_ok!(TemplateModule::set_public_access_mode(1765 origin1.clone(),1766 collection_id,1767 AccessMode::AllowList1768 ));1769 assert_ok!(TemplateModule::add_to_allow_list(1770 origin1.clone(),1771 collection_id,1772 account(1)1773 ));17741775 assert_noop!(1776 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1)1777 .map_err(|e| e.error),1778 CommonError::<Test>::AddressNotInAllowlist1779 );1780 });1781}17821783#[test]1784fn allow_list_test_4() {1785 new_test_ext().execute_with(|| {1786 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17871788 let origin1 = Origin::signed(1);17891790 let data = default_nft_data();1791 create_test_item(collection_id, &data.into());17921793 assert_ok!(TemplateModule::set_public_access_mode(1794 origin1.clone(),1795 collection_id,1796 AccessMode::AllowList1797 ));1798 assert_ok!(TemplateModule::add_to_allow_list(1799 origin1.clone(),1800 collection_id,1801 account(1)1802 ));1803 assert_ok!(TemplateModule::add_to_allow_list(1804 origin1.clone(),1805 collection_id,1806 account(2)1807 ));18081809 // do approve1810 assert_ok!(TemplateModule::approve(1811 origin1.clone(),1812 account(1),1813 collection_id,1814 TokenId(1),1815 11816 ));1817 assert_eq!(1818 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1819 account(1)1820 );18211822 assert_ok!(TemplateModule::remove_from_allow_list(1823 origin1.clone(),1824 collection_id,1825 account(2)1826 ));18271828 assert_noop!(1829 TemplateModule::transfer_from(1830 origin1,1831 account(1),1832 account(3),1833 collection_id,1834 TokenId(1),1835 11836 )1837 .map_err(|e| e.error),1838 CommonError::<Test>::AddressNotInAllowlist1839 );1840 });1841}18421843// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1844#[test]1845fn allow_list_test_5() {1846 new_test_ext().execute_with(|| {1847 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18481849 let origin1 = Origin::signed(1);18501851 let data = default_nft_data();1852 create_test_item(collection_id, &data.into());18531854 assert_ok!(TemplateModule::set_public_access_mode(1855 origin1.clone(),1856 collection_id,1857 AccessMode::AllowList1858 ));1859 assert_noop!(1860 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1)1861 .map_err(|e| e.error),1862 CommonError::<Test>::AddressNotInAllowlist1863 );1864 });1865}18661867// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1868#[test]1869fn allow_list_test_6() {1870 new_test_ext().execute_with(|| {1871 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18721873 let origin1 = Origin::signed(1);18741875 let data = default_nft_data();1876 create_test_item(collection_id, &data.into());18771878 assert_ok!(TemplateModule::set_public_access_mode(1879 origin1.clone(),1880 collection_id,1881 AccessMode::AllowList1882 ));18831884 // do approve1885 assert_noop!(1886 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1887 .map_err(|e| e.error),1888 CommonError::<Test>::AddressNotInAllowlist1889 );1890 });1891}18921893// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1894// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1895#[test]1896fn allow_list_test_7() {1897 new_test_ext().execute_with(|| {1898 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18991900 let data = default_nft_data();1901 create_test_item(collection_id, &data.into());19021903 let origin1 = Origin::signed(1);19041905 assert_ok!(TemplateModule::set_public_access_mode(1906 origin1.clone(),1907 collection_id,1908 AccessMode::AllowList1909 ));1910 assert_ok!(TemplateModule::add_to_allow_list(1911 origin1.clone(),1912 collection_id,1913 account(1)1914 ));1915 assert_ok!(TemplateModule::add_to_allow_list(1916 origin1.clone(),1917 collection_id,1918 account(2)1919 ));19201921 assert_ok!(TemplateModule::transfer(1922 origin1,1923 account(2),1924 CollectionId(1),1925 TokenId(1),1926 11927 ));1928 });1929}19301931#[test]1932fn allow_list_test_8() {1933 new_test_ext().execute_with(|| {1934 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19351936 // Create NFT for account 11937 let data = default_nft_data();1938 create_test_item(collection_id, &data.into());19391940 let origin1 = Origin::signed(1);19411942 // Toggle Allow List mode and add accounts 1 and 21943 assert_ok!(TemplateModule::set_public_access_mode(1944 origin1.clone(),1945 collection_id,1946 AccessMode::AllowList1947 ));1948 assert_ok!(TemplateModule::add_to_allow_list(1949 origin1.clone(),1950 collection_id,1951 account(1)1952 ));1953 assert_ok!(TemplateModule::add_to_allow_list(1954 origin1.clone(),1955 collection_id,1956 account(2)1957 ));19581959 // Sself-approve account 1 for NFT 11960 assert_ok!(TemplateModule::approve(1961 origin1.clone(),1962 account(1),1963 CollectionId(1),1964 TokenId(1),1965 11966 ));1967 assert_eq!(1968 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1969 account(1)1970 );19711972 // Transfer from 1 to 21973 assert_ok!(TemplateModule::transfer_from(1974 origin1,1975 account(1),1976 account(2),1977 CollectionId(1),1978 TokenId(1),1979 11980 ));1981 });1982}19831984// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1985#[test]1986fn allow_list_test_9() {1987 new_test_ext().execute_with(|| {1988 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1989 let origin1 = Origin::signed(1);19901991 assert_ok!(TemplateModule::set_public_access_mode(1992 origin1.clone(),1993 collection_id,1994 AccessMode::AllowList1995 ));1996 assert_ok!(TemplateModule::set_mint_permission(1997 origin1,1998 collection_id,1999 false2000 ));20012002 let data = default_nft_data();2003 create_test_item(collection_id, &data.into());2004 });2005}20062007// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2008#[test]2009fn allow_list_test_10() {2010 new_test_ext().execute_with(|| {2011 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20122013 let origin1 = Origin::signed(1);2014 let origin2 = Origin::signed(2);20152016 assert_ok!(TemplateModule::set_public_access_mode(2017 origin1.clone(),2018 collection_id,2019 AccessMode::AllowList2020 ));2021 assert_ok!(TemplateModule::set_mint_permission(2022 origin1.clone(),2023 collection_id,2024 false2025 ));20262027 assert_ok!(TemplateModule::add_collection_admin(2028 origin1,2029 collection_id,2030 account(2)2031 ));20322033 assert_ok!(TemplateModule::create_item(2034 origin2,2035 collection_id,2036 account(2),2037 default_nft_data().into()2038 ));2039 });2040}20412042// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.2043#[test]2044fn allow_list_test_11() {2045 new_test_ext().execute_with(|| {2046 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20472048 let origin1 = Origin::signed(1);2049 let origin2 = Origin::signed(2);20502051 assert_ok!(TemplateModule::set_public_access_mode(2052 origin1.clone(),2053 collection_id,2054 AccessMode::AllowList2055 ));2056 assert_ok!(TemplateModule::set_mint_permission(2057 origin1.clone(),2058 collection_id,2059 false2060 ));2061 assert_ok!(TemplateModule::add_to_allow_list(2062 origin1,2063 collection_id,2064 account(2)2065 ));20662067 assert_noop!(2068 TemplateModule::create_item(2069 origin2,2070 CollectionId(1),2071 account(2),2072 default_nft_data().into()2073 )2074 .map_err(|e| e.error),2075 CommonError::<Test>::PublicMintingNotAllowed2076 );2077 });2078}20792080// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.2081#[test]2082fn allow_list_test_12() {2083 new_test_ext().execute_with(|| {2084 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20852086 let origin1 = Origin::signed(1);2087 let origin2 = Origin::signed(2);20882089 assert_ok!(TemplateModule::set_public_access_mode(2090 origin1.clone(),2091 collection_id,2092 AccessMode::AllowList2093 ));2094 assert_ok!(TemplateModule::set_mint_permission(2095 origin1,2096 collection_id,2097 false2098 ));20992100 assert_noop!(2101 TemplateModule::create_item(2102 origin2,2103 CollectionId(1),2104 account(2),2105 default_nft_data().into()2106 )2107 .map_err(|e| e.error),2108 CommonError::<Test>::PublicMintingNotAllowed2109 );2110 });2111}21122113// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2114#[test]2115fn allow_list_test_13() {2116 new_test_ext().execute_with(|| {2117 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21182119 let origin1 = Origin::signed(1);21202121 assert_ok!(TemplateModule::set_public_access_mode(2122 origin1.clone(),2123 collection_id,2124 AccessMode::AllowList2125 ));2126 assert_ok!(TemplateModule::set_mint_permission(2127 origin1,2128 collection_id,2129 true2130 ));21312132 let data = default_nft_data();2133 create_test_item(collection_id, &data.into());2134 });2135}21362137// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2138#[test]2139fn allow_list_test_14() {2140 new_test_ext().execute_with(|| {2141 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21422143 let origin1 = Origin::signed(1);2144 let origin2 = Origin::signed(2);21452146 assert_ok!(TemplateModule::set_public_access_mode(2147 origin1.clone(),2148 collection_id,2149 AccessMode::AllowList2150 ));2151 assert_ok!(TemplateModule::set_mint_permission(2152 origin1.clone(),2153 collection_id,2154 true2155 ));21562157 assert_ok!(TemplateModule::add_collection_admin(2158 origin1,2159 collection_id,2160 account(2)2161 ));21622163 assert_ok!(TemplateModule::create_item(2164 origin2,2165 collection_id,2166 account(2),2167 default_nft_data().into()2168 ));2169 });2170}21712172// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.2173#[test]2174fn allow_list_test_15() {2175 new_test_ext().execute_with(|| {2176 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21772178 let origin1 = Origin::signed(1);2179 let origin2 = Origin::signed(2);21802181 assert_ok!(TemplateModule::set_public_access_mode(2182 origin1.clone(),2183 collection_id,2184 AccessMode::AllowList2185 ));2186 assert_ok!(TemplateModule::set_mint_permission(2187 origin1,2188 collection_id,2189 true2190 ));21912192 assert_noop!(2193 TemplateModule::create_item(2194 origin2,2195 collection_id,2196 account(2),2197 default_nft_data().into()2198 )2199 .map_err(|e| e.error),2200 CommonError::<Test>::AddressNotInAllowlist2201 );2202 });2203}22042205// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.2206#[test]2207fn allow_list_test_16() {2208 new_test_ext().execute_with(|| {2209 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22102211 let origin1 = Origin::signed(1);2212 let origin2 = Origin::signed(2);22132214 assert_ok!(TemplateModule::set_public_access_mode(2215 origin1.clone(),2216 collection_id,2217 AccessMode::AllowList2218 ));2219 assert_ok!(TemplateModule::set_mint_permission(2220 origin1.clone(),2221 collection_id,2222 true2223 ));2224 assert_ok!(TemplateModule::add_to_allow_list(2225 origin1,2226 collection_id,2227 account(2)2228 ));22292230 assert_ok!(TemplateModule::create_item(2231 origin2,2232 collection_id,2233 account(2),2234 default_nft_data().into()2235 ));2236 });2237}22382239// Total number of collections. Positive test2240#[test]2241fn total_number_collections_bound() {2242 new_test_ext().execute_with(|| {2243 create_test_collection(&CollectionMode::NFT, CollectionId(1));2244 });2245}22462247#[test]2248fn create_max_collections() {2249 new_test_ext().execute_with(|| {2250 for i in 1..=COLLECTION_NUMBER_LIMIT {2251 create_test_collection(&CollectionMode::NFT, CollectionId(i));2252 }2253 });2254}22552256// Total number of collections. Negative test2257#[test]2258fn total_number_collections_bound_neg() {2259 new_test_ext().execute_with(|| {2260 let origin1 = Origin::signed(1);22612262 for i in 1..=COLLECTION_NUMBER_LIMIT {2263 create_test_collection(&CollectionMode::NFT, CollectionId(i));2264 }22652266 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();22692270 // 11-th collection in chain. Expects error2271 assert_noop!(2272 TemplateModule::create_collection(2273 origin1,2274 col_name1,2275 col_desc1,2276 token_prefix1,2277 CollectionMode::NFT2278 ),2279 CommonError::<Test>::TotalCollectionsLimitExceeded2280 );2281 });2282}22832284// Owned tokens by a single address. Positive test2285#[test]2286fn owned_tokens_bound() {2287 new_test_ext().execute_with(|| {2288 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22892290 let data = default_nft_data();2291 create_test_item(collection_id, &data.clone().into());2292 create_test_item(collection_id, &data.into());2293 });2294}22952296// Owned tokens by a single address. Negotive test2297#[test]2298fn owned_tokens_bound_neg() {2299 new_test_ext().execute_with(|| {2300 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23012302 let origin1 = Origin::signed(1);23032304 for _ in 1..=MAX_TOKEN_OWNERSHIP {2305 let data = default_nft_data();2306 create_test_item(collection_id, &data.clone().into());2307 }23082309 let data = default_nft_data();2310 assert_noop!(2311 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into())2312 .map_err(|e| e.error),2313 CommonError::<Test>::AccountTokenLimitExceeded2314 );2315 });2316}23172318// Number of collection admins. Positive test2319#[test]2320fn collection_admins_bound() {2321 new_test_ext().execute_with(|| {2322 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23232324 let origin1 = Origin::signed(1);23252326 assert_ok!(TemplateModule::add_collection_admin(2327 origin1.clone(),2328 collection_id,2329 account(2)2330 ));2331 assert_ok!(TemplateModule::add_collection_admin(2332 origin1,2333 collection_id,2334 account(3)2335 ));2336 });2337}23382339// Number of collection admins. Negotive test2340#[test]2341fn collection_admins_bound_neg() {2342 new_test_ext().execute_with(|| {2343 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23442345 let origin1 = Origin::signed(1);23462347 for i in 0..COLLECTION_ADMINS_LIMIT {2348 assert_ok!(TemplateModule::add_collection_admin(2349 origin1.clone(),2350 collection_id,2351 account((2 + i).into())2352 ));2353 }2354 assert_noop!(2355 TemplateModule::add_collection_admin(2356 origin1,2357 collection_id,2358 account((3 + COLLECTION_ADMINS_LIMIT).into())2359 ),2360 CommonError::<Test>::CollectionAdminCountExceeded2361 );2362 });2363}2364// #endregion23652366#[test]2367fn set_const_on_chain_schema() {2368 new_test_ext().execute_with(|| {2369 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23702371 let origin1 = Origin::signed(1);2372 assert_ok!(TemplateModule::set_const_on_chain_schema(2373 origin1,2374 collection_id,2375 b"test const on chain schema".to_vec()2376 ));23772378 assert_eq!(2379 <pallet_common::CollectionById<Test>>::get(collection_id)2380 .unwrap()2381 .const_on_chain_schema,2382 b"test const on chain schema".to_vec()2383 );2384 assert_eq!(2385 <pallet_common::CollectionById<Test>>::get(collection_id)2386 .unwrap()2387 .variable_on_chain_schema,2388 b"".to_vec()2389 );2390 });2391}23922393#[test]2394fn set_variable_on_chain_schema() {2395 new_test_ext().execute_with(|| {2396 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23972398 let origin1 = Origin::signed(1);2399 assert_ok!(TemplateModule::set_variable_on_chain_schema(2400 origin1,2401 collection_id,2402 b"test variable on chain schema".to_vec()2403 ));24042405 assert_eq!(2406 <pallet_common::CollectionById<Test>>::get(collection_id)2407 .unwrap()2408 .const_on_chain_schema,2409 b"".to_vec()2410 );2411 assert_eq!(2412 <pallet_common::CollectionById<Test>>::get(collection_id)2413 .unwrap()2414 .variable_on_chain_schema,2415 b"test variable on chain schema".to_vec()2416 );2417 });2418}24192420#[test]2421fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2422 new_test_ext().execute_with(|| {2423 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24242425 let origin1 = Origin::signed(1);24262427 let data = default_nft_data();2428 create_test_item(CollectionId(1), &data.into());24292430 let variable_data = b"test data".to_vec();2431 assert_ok!(TemplateModule::set_variable_meta_data(2432 origin1,2433 collection_id,2434 TokenId(1),2435 variable_data.clone()2436 ));24372438 assert_eq!(2439 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2440 .unwrap()2441 .variable_data,2442 variable_data2443 );2444 });2445}24462447#[test]2448fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2449 new_test_ext().execute_with(|| {2450 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));24512452 let origin1 = Origin::signed(1);24532454 let data = default_re_fungible_data();2455 create_test_item(collection_id, &data.into());24562457 let variable_data = b"test data".to_vec();2458 assert_ok!(TemplateModule::set_variable_meta_data(2459 origin1,2460 collection_id,2461 TokenId(1),2462 variable_data.clone()2463 ));24642465 assert_eq!(2466 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1))).variable_data,2467 variable_data2468 );2469 });2470}24712472#[test]2473fn set_variable_meta_data_on_fungible_token_fails() {2474 new_test_ext().execute_with(|| {2475 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));24762477 let origin1 = Origin::signed(1);24782479 let data = default_fungible_data();2480 create_test_item(collection_id, &data.into());24812482 let variable_data = b"test data".to_vec();2483 assert_noop!(2484 TemplateModule::set_variable_meta_data(2485 origin1,2486 collection_id,2487 TokenId(0),2488 variable_data2489 )2490 .map_err(|e| e.error),2491 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2492 );2493 });2494}24952496#[test]2497fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2498 new_test_ext().execute_with(|| {2499 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25002501 let origin1 = Origin::signed(1);25022503 let data = default_nft_data();2504 create_test_item(collection_id, &data.into());25052506 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2507 assert_noop!(2508 TemplateModule::set_variable_meta_data(2509 origin1,2510 collection_id,2511 TokenId(1),2512 variable_data2513 )2514 .map_err(|e| e.error),2515 CommonError::<Test>::TokenVariableDataLimitExceeded2516 );2517 });2518}25192520#[test]2521fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2522 new_test_ext().execute_with(|| {2523 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));25242525 let origin1 = Origin::signed(1);25262527 let data = default_re_fungible_data();2528 create_test_item(collection_id, &data.into());25292530 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2531 assert_noop!(2532 TemplateModule::set_variable_meta_data(2533 origin1,2534 collection_id,2535 TokenId(1),2536 variable_data2537 )2538 .map_err(|e| e.error),2539 CommonError::<Test>::TokenVariableDataLimitExceeded2540 );2541 });2542}25432544#[test]2545fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2546 new_test_ext().execute_with(|| {2547 //default_limits();25482549 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25502551 let origin1 = Origin::signed(1);25522553 let data = default_nft_data();2554 create_test_item(collection_id, &data.into());25552556 assert_ok!(TemplateModule::set_meta_update_permission_flag(2557 origin1.clone(),2558 collection_id,2559 MetaUpdatePermission::ItemOwner,2560 ));25612562 let variable_data = b"ten chars.".to_vec();2563 assert_ok!(TemplateModule::set_variable_meta_data(2564 origin1,2565 collection_id,2566 TokenId(1),2567 variable_data.clone()2568 ));25692570 assert_eq!(2571 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2572 .unwrap()2573 .variable_data,2574 variable_data2575 );2576 });2577}25782579#[test]2580fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2581 new_test_ext().execute_with(|| {2582 let collection_id =2583 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));25842585 let origin1 = Origin::signed(1);25862587 assert_ok!(TemplateModule::set_mint_permission(2588 origin1.clone(),2589 collection_id,2590 true2591 ));2592 assert_ok!(TemplateModule::add_to_allow_list(2593 origin1.clone(),2594 collection_id,2595 account(1)2596 ));25972598 let data = default_nft_data();2599 create_test_item(collection_id, &data.into());26002601 assert_ok!(TemplateModule::set_meta_update_permission_flag(2602 origin1.clone(),2603 collection_id,2604 MetaUpdatePermission::ItemOwner,2605 ));26062607 let variable_data = b"1234567890123".to_vec();2608 assert_noop!(2609 TemplateModule::set_variable_meta_data(2610 origin1,2611 collection_id,2612 TokenId(1),2613 variable_data.clone()2614 )2615 .map_err(|e| e.error),2616 CommonError::<Test>::TokenVariableDataLimitExceeded2617 );2618 })2619}26202621#[test]2622fn collection_transfer_flag_works() {2623 new_test_ext().execute_with(|| {2624 let origin1 = Origin::signed(1);26252626 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2627 assert_ok!(TemplateModule::set_transfers_enabled_flag(2628 origin1,2629 collection_id,2630 true2631 ));26322633 let data = default_nft_data();2634 create_test_item(collection_id, &data.into());2635 assert_eq!(2636 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2637 12638 );2639 assert_eq!(2640 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2641 true2642 );26432644 let origin1 = Origin::signed(1);26452646 // default scenario2647 assert_ok!(TemplateModule::transfer(2648 origin1,2649 account(2),2650 collection_id,2651 TokenId(1),2652 12653 ));2654 assert_eq!(2655 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2656 false2657 );2658 assert_eq!(2659 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2660 true2661 );2662 assert_eq!(2663 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2664 02665 );2666 assert_eq!(2667 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2668 12669 );2670 });2671}26722673#[test]2674fn set_variable_meta_data_on_nft_with_admin_flag() {2675 new_test_ext().execute_with(|| {2676 // default_limits();26772678 let collection_id =2679 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));26802681 let origin1 = Origin::signed(1);2682 let origin2 = Origin::signed(2);26832684 assert_ok!(TemplateModule::set_mint_permission(2685 origin2.clone(),2686 collection_id,2687 true2688 ));2689 assert_ok!(TemplateModule::add_to_allow_list(2690 origin2.clone(),2691 collection_id,2692 account(1)2693 ));26942695 assert_ok!(TemplateModule::add_collection_admin(2696 origin2.clone(),2697 collection_id,2698 account(1)2699 ));27002701 let data = default_nft_data();2702 create_test_item(collection_id, &data.into());27032704 assert_ok!(TemplateModule::set_meta_update_permission_flag(2705 origin2.clone(),2706 collection_id,2707 MetaUpdatePermission::Admin,2708 ));27092710 let variable_data = b"test.".to_vec();2711 assert_ok!(TemplateModule::set_variable_meta_data(2712 origin1,2713 collection_id,2714 TokenId(1),2715 variable_data.clone()2716 ));27172718 assert_eq!(2719 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2720 .unwrap()2721 .variable_data,2722 variable_data2723 );2724 });2725}27262727#[test]2728fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2729 new_test_ext().execute_with(|| {2730 // default_limits();27312732 let collection_id =2733 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));27342735 let origin1 = Origin::signed(1);2736 let origin2 = Origin::signed(2);27372738 assert_ok!(TemplateModule::set_mint_permission(2739 origin2.clone(),2740 collection_id,2741 true2742 ));2743 assert_ok!(TemplateModule::add_to_allow_list(2744 origin2.clone(),2745 collection_id,2746 account(1)2747 ));27482749 let data = default_nft_data();2750 create_test_item(collection_id, &data.into());27512752 assert_ok!(TemplateModule::set_meta_update_permission_flag(2753 origin2.clone(),2754 collection_id,2755 MetaUpdatePermission::Admin,2756 ));27572758 let variable_data = b"test.".to_vec();2759 assert_noop!(2760 TemplateModule::set_variable_meta_data(2761 origin1,2762 collection_id,2763 TokenId(1),2764 variable_data.clone()2765 )2766 .map_err(|e| e.error),2767 CommonError::<Test>::NoPermission2768 );2769 });2770}27712772#[test]2773fn set_variable_meta_flag_after_freeze() {2774 new_test_ext().execute_with(|| {2775 // default_limits();27762777 let collection_id =2778 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));27792780 let origin2 = Origin::signed(2);27812782 assert_ok!(TemplateModule::set_meta_update_permission_flag(2783 origin2.clone(),2784 collection_id,2785 MetaUpdatePermission::None,2786 ));2787 assert_noop!(2788 TemplateModule::set_meta_update_permission_flag(2789 origin2.clone(),2790 collection_id,2791 MetaUpdatePermission::Admin2792 ),2793 CommonError::<Test>::MetadataFlagFrozen2794 );2795 });2796}27972798#[test]2799fn set_variable_meta_data_on_nft_with_none_flag_neg() {2800 new_test_ext().execute_with(|| {2801 // default_limits();28022803 let collection_id =2804 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2805 let origin1 = Origin::signed(1);28062807 let data = default_nft_data();2808 create_test_item(collection_id, &data.into());28092810 assert_ok!(TemplateModule::set_meta_update_permission_flag(2811 origin1.clone(),2812 collection_id,2813 MetaUpdatePermission::None,2814 ));28152816 let variable_data = b"test.".to_vec();2817 assert_noop!(2818 TemplateModule::set_variable_meta_data(2819 origin1.clone(),2820 collection_id,2821 TokenId(1),2822 variable_data.clone()2823 )2824 .map_err(|e| e.error),2825 CommonError::<Test>::NoPermission2826 );2827 });2828}28292830#[test]2831fn collection_transfer_flag_works_neg() {2832 new_test_ext().execute_with(|| {2833 let origin1 = Origin::signed(1);28342835 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2836 assert_ok!(TemplateModule::set_transfers_enabled_flag(2837 origin1,2838 collection_id,2839 false2840 ));28412842 let data = default_nft_data();2843 create_test_item(collection_id, &data.into());2844 assert_eq!(2845 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2846 12847 );2848 assert_eq!(2849 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2850 true2851 );28522853 let origin1 = Origin::signed(1);28542855 // default scenario2856 assert_noop!(2857 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2858 .map_err(|e| e.error),2859 CommonError::<Test>::TransferNotAllowed2860 );2861 assert_eq!(2862 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2863 12864 );2865 assert_eq!(2866 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2867 02868 );2869 assert_eq!(2870 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2871 true2872 );2873 assert_eq!(2874 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2875 false2876 );2877 });2878}