difftreelog
Fix all unit test execution
in: master
6 files changed
pallets/inflation/src/lib.rsdiffbeforeafterboth--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -46,7 +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;
+// 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/inflation/src/tests.rsdiffbeforeafterboth--- a/pallets/inflation/src/tests.rs
+++ b/pallets/inflation/src/tests.rs
@@ -18,7 +18,7 @@
type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
type Block = frame_system::mocking::MockBlock<Test>;
-const YEAR: u64 = 5_259_600;
+const YEAR: u64 = 2_629_800;
parameter_types! {
pub const ExistentialDeposit: u64 = 1;
@@ -112,8 +112,8 @@
// first inflation deposit should be equal to BlockInflation
Inflation::on_initialize(1);
- // SBP M2 review: Verify expected block inflation for year 1
- assert_eq!(Inflation::block_inflation(), 1901);
+ // Expected 100-block inflation for year 1 is 100 * 100_000_000 / YEAR = 3803
+ assert_eq!(Inflation::block_inflation(), 3803);
assert_eq!(
Balances::free_balance(1234) - initial_issuance,
Inflation::block_inflation()
@@ -158,26 +158,21 @@
let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
assert_eq!(Balances::free_balance(1234), initial_issuance);
Inflation::on_initialize(1);
- let block_inflation_year_0 = Inflation::block_inflation();
- // SBP M2 review: go through all the block inflations for year 1,
+ // Go through all the block inflations for year 1,
// total issuance will be updated accordingly
for block in (100..YEAR).step_by(100) {
Inflation::on_initialize(block);
}
assert_eq!(
- initial_issuance + (1901 * (YEAR / 100)),
+ initial_issuance + (3803 * (YEAR / 100)),
<Balances as Currency<_>>::total_issuance()
);
Inflation::on_initialize(YEAR);
let block_inflation_year_1 = Inflation::block_inflation();
- // SBP M2 review: Verify expected block inflation for year 2
- assert_eq!(block_inflation_year_1, 1952);
-
- // SBP M2 review: this is actually not true
- // Assert that year 1 inflation is less than year 0
- // assert!(block_inflation_year_0 > block_inflation_year_1);
+ // Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR = 3904
+ assert_eq!(block_inflation_year_1, 3904);
});
}
pallets/nft/src/mock.rsdiffbeforeafterboth--- a/pallets/nft/src/mock.rs
+++ b/pallets/nft/src/mock.rs
@@ -27,6 +27,10 @@
System: frame_system::{Pallet, Call, Config, Storage, Event<T>},
TemplateModule: pallet_template::{Pallet, Call, Storage},
Balances: pallet_balances::{Pallet, Call, Storage},
+ Common: pallet_common::{Pallet, Storage, Event<T>},
+ Fungible: pallet_fungible::{Pallet, Storage},
+ Refungible: pallet_refungible::{Pallet, Storage},
+ Nonfungible: pallet_nonfungible::{Pallet, Storage},
}
);
@@ -151,7 +155,6 @@
Self::from_sub(0)
}
}
-
pub struct TestEtheremTransactionSender;
impl pallet_ethereum::EthereumTransactionSender for TestEtheremTransactionSender {
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use nft_data_structs::{6 COLLECTION_NUMBER_LIMIT, Collection, CollectionId, CreateItemData, CreateFungibleData, 7 CreateNftData, CreateReFungibleData, ExistenceRequirement, MAX_COLLECTION_DESCRIPTION_LENGTH, 8 MAX_COLLECTION_NAME_LENGTH, MAX_DECIMAL_POINTS, MAX_TOKEN_PREFIX_LENGTH, COLLECTION_ADMINS_LIMIT, 9 MetaUpdatePermission, Pays, PostDispatchInfo, TokenId, Weight, WithdrawReasons,10};1112use frame_support::{assert_noop, assert_ok};13use sp_std::convert::TryInto;1415fn default_nft_data() -> CreateNftData {16 CreateNftData {17 const_data: vec![1, 2, 3].try_into().unwrap(),18 variable_data: vec![3, 2, 1].try_into().unwrap(),19 }20}2122fn default_fungible_data() -> CreateFungibleData {23 CreateFungibleData { value: 5 }24}2526fn default_re_fungible_data() -> CreateReFungibleData {27 CreateReFungibleData {28 const_data: vec![1, 2, 3].try_into().unwrap(),29 variable_data: vec![3, 2, 1].try_into().unwrap(),30 pieces: 1023,31 }32}3334fn create_test_collection_for_owner(35 mode: &CollectionMode,36 owner: u64,37 id: CollectionId,38) -> CollectionId {39 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243 let origin1 = Origin::signed(owner);44 assert_ok!(TemplateModule::create_collection(45 origin1,46 col_name1,47 col_desc1,48 token_prefix1,49 mode.clone()50 ));5152 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();53 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();54 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();55 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);56 assert_eq!(57 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,58 saved_col_name59 );60 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);61 assert_eq!(62 <pallet_common::CollectionById<Test>>::get(id).unwrap().description,63 saved_description64 );65 assert_eq!(66 <pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,67 saved_prefix68 );69 id70}7172fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {73 create_test_collection_for_owner(&mode, 1, id)74}7576fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {77 let origin1 = Origin::signed(1);78 assert_ok!(TemplateModule::create_item(79 origin1,80 collection_id,81 account(1),82 data.clone()83 ));84}8586fn account(sub: u64) -> TestCrossAccountId {87 TestCrossAccountId::from_sub(sub)88}8990// Use cases tests region91// #region9293#[test]94fn set_version_schema() {95 new_test_ext().execute_with(|| {96 let origin1 = Origin::signed(1);97 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9899 assert_ok!(TemplateModule::set_schema_version(100 origin1,101 collection_id,102 SchemaVersion::Unique103 ));104 assert_eq!(105 <pallet_common::CollectionById<Test>>::get(collection_id)106 .unwrap()107 .schema_version,108 SchemaVersion::Unique109 );110 });111}112113#[test]114fn create_fungible_collection_fails_with_large_decimal_numbers() {115 new_test_ext().execute_with(|| {116 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();117 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();118 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();119120 let origin1 = Origin::signed(1);121 assert_noop!(122 TemplateModule::create_collection(123 origin1,124 col_name1,125 col_desc1,126 token_prefix1,127 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)128 ),129 Error::<Test>::CollectionDecimalPointLimitExceeded130 );131 });132}133134#[test]135fn create_nft_item() {136 new_test_ext().execute_with(|| {137 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));138139 let data = default_nft_data();140 create_test_item(collection_id, &data.clone().into());141142 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();143 assert_eq!(item.const_data, data.const_data.into_inner());144 assert_eq!(item.variable_data, data.variable_data.into_inner());145 });146}147148// Use cases tests region149// #region150#[test]151fn create_nft_multiple_items() {152 new_test_ext().execute_with(|| {153 create_test_collection(&CollectionMode::NFT, CollectionId(1));154155 let origin1 = Origin::signed(1);156157 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];158159 assert_ok!(TemplateModule::create_multiple_items(160 origin1,161 CollectionId(1),162 account(1),163 items_data164 .clone()165 .into_iter()166 .map(|d| { d.into() })167 .collect()168 ));169 for (index, data) in items_data.into_iter().enumerate() {170 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();171 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());172 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());173 }174 });175}176177#[test]178fn create_refungible_item() {179 new_test_ext().execute_with(|| {180 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));181182 let data = default_re_fungible_data();183 create_test_item(collection_id, &data.clone().into());184 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));185 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));186 assert_eq!(item.const_data, data.const_data.into_inner());187 assert_eq!(item.variable_data, data.variable_data.into_inner());188 assert_eq!(balance, 1023);189 });190}191192#[test]193fn create_multiple_refungible_items() {194 new_test_ext().execute_with(|| {195 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));196197 let origin1 = Origin::signed(1);198199 let items_data = vec![200 default_re_fungible_data(),201 default_re_fungible_data(),202 default_re_fungible_data(),203 ];204205 assert_ok!(TemplateModule::create_multiple_items(206 origin1,207 CollectionId(1),208 account(1),209 items_data210 .clone()211 .into_iter()212 .map(|d| { d.into() })213 .collect()214 ));215 for (index, data) in items_data.into_iter().enumerate() {216 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();217 let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));218 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());219 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());220 assert_eq!(balance, 1023);221 }222 });223}224225#[test]226fn create_fungible_item() {227 new_test_ext().execute_with(|| {228 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));229230 let data = default_fungible_data();231 create_test_item(collection_id, &data.into());232233 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);234 });235}236237//#[test]238// fn create_multiple_fungible_items() {239// new_test_ext().execute_with(|| {240// default_limits();241242// create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));243244// let origin1 = Origin::signed(1);245246// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];247248// assert_ok!(TemplateModule::create_multiple_items(249// origin1.clone(),250// 1,251// 1,252// items_data.clone().into_iter().map(|d| { d.into() }).collect()253// ));254255// for (index, _) in items_data.iter().enumerate() {256// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);257// }258// assert_eq!(TemplateModule::balance_count(1, 1), 3000);259// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);260// });261// }262263#[test]264fn transfer_fungible_item() {265 new_test_ext().execute_with(|| {266 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));267268 let origin1 = Origin::signed(1);269 let origin2 = Origin::signed(2);270271 let data = default_fungible_data();272 create_test_item(collection_id, &data.into());273274 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);275276 // change owner scenario277 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 5));278 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);279280 // split item scenario281 assert_ok!(TemplateModule::transfer(282 origin2.clone(),283 account(3),284 CollectionId(1),285 TokenId(1),286 3287 ));288289 // split item and new owner has account scenario290 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 1));291 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);292 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);293 });294}295296#[test]297fn transfer_refungible_item() {298 new_test_ext().execute_with(|| {299 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));300301 let data = default_re_fungible_data();302 create_test_item(collection_id, &data.clone().into());303304 let origin1 = Origin::signed(1);305 let origin2 = Origin::signed(2);306 {307 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));308 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));309 assert_eq!(item.const_data, data.const_data.into_inner());310 assert_eq!(item.variable_data, data.variable_data.into_inner());311 assert_eq!(balance, 1023);312 }313 314 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);315 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);316317 // change owner scenario318 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));319320 let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));321 assert_eq!(balance2, 1023);322 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);323 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1023);324 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);325 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);326327 // split item scenario328 assert_ok!(TemplateModule::transfer(329 origin2.clone(),330 account(3),331 CollectionId(1),332 TokenId(1),333 500334 ));335 {336 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId(1)));337 let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));338 let balance3 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3)));339 assert_eq!(balance2, 523);340 assert_eq!(balance3, 500);341 }342 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 523);343 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 500);344 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);345 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);346347 // split item and new owner has account scenario348 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));349 {350 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId(1)));351 let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));352 let balance3 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3)));353 assert_eq!(balance2, 323);354 assert_eq!(balance3, 700);355 }356 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 323);357 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 700);358 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);359 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);360 });361}362363#[test]364fn transfer_nft_item() {365 new_test_ext().execute_with(|| {366 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));367368 let data = default_nft_data();369 create_test_item(collection_id, &data.into());370 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);371 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);372373374 let origin1 = Origin::signed(1);375 // default scenario376 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1000));377 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);378 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);379 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);380 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);381 });382}383384#[test]385fn nft_approve_and_transfer_from() {386 new_test_ext().execute_with(|| {387 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));388389 let data = default_nft_data();390 create_test_item(collection_id, &data.into());391392 let origin1 = Origin::signed(1);393 let origin2 = Origin::signed(2);394395 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);396 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);397398 // neg transfer399 assert_noop!(400 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1),401 CommonError::<Test>::NoPermission402 );403404 // do approve405 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 5));406 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));407408 assert_ok!(TemplateModule::transfer_from(409 origin2,410 account(1),411 account(3),412 CollectionId(1),413 TokenId(1),414 1415 ));416 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());417 });418}419420#[test]421fn nft_approve_and_transfer_from_allow_list() {422 new_test_ext().execute_with(|| {423 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));424425 let origin1 = Origin::signed(1);426 let origin2 = Origin::signed(2);427428 let data = default_nft_data();429 create_test_item(collection_id, &data.clone().into());430431 assert_eq!(432 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,433 &data.const_data.into_inner()434 );435 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);436 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);437438 assert_ok!(TemplateModule::set_mint_permission(439 origin1.clone(),440 CollectionId(1),441 true442 ));443 assert_ok!(TemplateModule::set_public_access_mode(444 origin1.clone(),445 CollectionId(1),446 AccessMode::AllowList447 ));448 assert_ok!(TemplateModule::add_to_allow_list(449 origin1.clone(),450 CollectionId(1),451 account(1)452 ));453 assert_ok!(TemplateModule::add_to_allow_list(454 origin1.clone(),455 CollectionId(1),456 account(2)457 ));458 assert_ok!(TemplateModule::add_to_allow_list(459 origin1.clone(),460 CollectionId(1),461 account(3)462 ));463464 // do approve465 assert_ok!(TemplateModule::approve(466 origin1.clone(),467 account(2),468 CollectionId(1),469 TokenId(1),470 5471 ));472 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));473 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(1), 5));474 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(3));475476 assert_ok!(TemplateModule::transfer_from(477 origin2,478 account(1),479 account(3),480 CollectionId(1),481 TokenId(1),482 1483 ));484 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());485 });486}487488#[test]489fn refungible_approve_and_transfer_from() {490 new_test_ext().execute_with(|| {491 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));492493 let origin1 = Origin::signed(1);494 let origin2 = Origin::signed(2);495496 let data = default_re_fungible_data();497 create_test_item(collection_id, &data.into());498499 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);500 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);501502 assert_ok!(TemplateModule::set_mint_permission(503 origin1.clone(),504 CollectionId(1),505 true506 ));507 assert_ok!(TemplateModule::set_public_access_mode(508 origin1.clone(),509 CollectionId(1),510 AccessMode::AllowList511 ));512 assert_ok!(TemplateModule::add_to_allow_list(513 origin1.clone(),514 CollectionId(1),515 account(1)516 ));517 assert_ok!(TemplateModule::add_to_allow_list(518 origin1.clone(),519 CollectionId(1),520 account(2)521 ));522 assert_ok!(TemplateModule::add_to_allow_list(523 origin1.clone(),524 CollectionId(1),525 account(3)526 ));527528 // do approve529 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));530 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);531532 assert_ok!(TemplateModule::transfer_from(533 origin2,534 account(1),535 account(3),536 CollectionId(1),537 TokenId(1),538 100539 ));540 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 923);541 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 100);542 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);543 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(3))), true);544 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);545 });546}547548#[test]549fn fungible_approve_and_transfer_from() {550 new_test_ext().execute_with(|| {551 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));552553 let data = default_fungible_data();554 create_test_item(collection_id, &data.into());555556 let origin1 = Origin::signed(1);557 let origin2 = Origin::signed(2);558559 assert_ok!(TemplateModule::set_mint_permission(560 origin1.clone(),561 CollectionId(1),562 true563 ));564 assert_ok!(TemplateModule::set_public_access_mode(565 origin1.clone(),566 CollectionId(1),567 AccessMode::AllowList568 ));569 assert_ok!(TemplateModule::add_to_allow_list(570 origin1.clone(),571 CollectionId(1),572 account(1)573 ));574 assert_ok!(TemplateModule::add_to_allow_list(575 origin1.clone(),576 CollectionId(1),577 account(2)578 ));579 assert_ok!(TemplateModule::add_to_allow_list(580 origin1.clone(),581 CollectionId(1),582 account(3)583 ));584585 // do approve586 assert_ok!(TemplateModule::approve(587 origin1.clone(),588 account(2),589 CollectionId(1),590 TokenId(1),591 5592 ));593 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);594 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(1), 5));595 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);596 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);597598 assert_ok!(TemplateModule::transfer_from(599 origin2.clone(),600 account(1),601 account(3),602 CollectionId(1),603 TokenId(1),604 4605 ));606607 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);608609 assert_noop!(610 TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(1), 4),611 CommonError::<Test>::NoPermission612 );613 });614}615616#[test]617fn change_collection_owner() {618 new_test_ext().execute_with(|| {619 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));620621 let origin1 = Origin::signed(1);622 assert_ok!(TemplateModule::change_collection_owner(623 origin1,624 collection_id,625 2626 ));627 assert_eq!(628 <pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,629 2630 );631 });632}633634#[test]635fn destroy_collection() {636 new_test_ext().execute_with(|| {637 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));638639 let origin1 = Origin::signed(1);640 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));641 });642}643644#[test]645fn burn_nft_item() {646 new_test_ext().execute_with(|| {647 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));648649 let origin1 = Origin::signed(1);650 assert_ok!(TemplateModule::add_collection_admin(651 origin1.clone(),652 collection_id,653 account(2)654 ));655656 let data = default_nft_data();657 create_test_item(collection_id, &data.into());658659 // check balance (collection with id = 1, user id = 1)660 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);661662 // burn item663 assert_ok!(TemplateModule::burn_item(664 origin1.clone(),665 collection_id,666 TokenId(1),667 1668 ));669 assert_noop!(670 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1),671 CommonError::<Test>::TokenNotFound672 );673674 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);675 });676}677678#[test]679fn burn_fungible_item() {680 new_test_ext().execute_with(|| {681 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));682683 let origin1 = Origin::signed(1);684 assert_ok!(TemplateModule::add_collection_admin(685 origin1.clone(),686 collection_id,687 account(2)688 ));689690 let data = default_fungible_data();691 create_test_item(collection_id, &data.into());692693 // check balance (collection with id = 1, user id = 1)694 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);695696 // burn item697 assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 5));698 assert_noop!(699 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5),700 CommonError::<Test>::TokenValueNotEnough701 );702703 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);704 });705}706707#[test]708fn burn_refungible_item() {709 new_test_ext().execute_with(|| {710 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));711 let origin1 = Origin::signed(1);712713 assert_ok!(TemplateModule::set_mint_permission(714 origin1.clone(),715 collection_id,716 true717 ));718 assert_ok!(TemplateModule::set_public_access_mode(719 origin1.clone(),720 collection_id,721 AccessMode::AllowList722 ));723 assert_ok!(TemplateModule::add_to_allow_list(724 origin1.clone(),725 collection_id,726 account(1)727 ));728729 assert_ok!(TemplateModule::add_collection_admin(730 origin1.clone(),731 collection_id,732 account(2)733 ));734735 let data = default_re_fungible_data();736 create_test_item(collection_id, &data.into());737738 // check balance (collection with id = 1, user id = 2)739 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);740 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);741742 // burn item743 assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));744 assert_noop!(745 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023),746 CommonError::<Test>::TokenNotFound747 );748749 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);750 });751}752753#[test]754fn add_collection_admin() {755 new_test_ext().execute_with(|| {756 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));757 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(2));758 create_test_collection_for_owner(&CollectionMode::NFT, 3, CollectionId(3));759760 let origin1 = Origin::signed(1);761762 // collection admin763 assert_ok!(TemplateModule::add_collection_admin(764 origin1.clone(),765 collection1_id,766 account(2)767 ));768 assert_ok!(TemplateModule::add_collection_admin(769 origin1,770 collection1_id,771 account(3)772 ));773774 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))));775 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));776 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));777 });778}779780#[test]781fn remove_collection_admin() {782 new_test_ext().execute_with(|| {783 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));784 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(2));785 create_test_collection_for_owner(&CollectionMode::NFT, 3, CollectionId(3));786787 let origin1 = Origin::signed(1);788 let origin2 = Origin::signed(2);789790 // collection admin791 assert_ok!(TemplateModule::add_collection_admin(792 origin1.clone(),793 collection1_id,794 account(2)795 ));796 assert_ok!(TemplateModule::add_collection_admin(797 origin1,798 collection1_id,799 account(3)800 ));801802 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));803 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));804805 // remove admin806 assert_ok!(TemplateModule::remove_collection_admin(807 origin2,808 CollectionId(1),809 account(3)810 ));811 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));812 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))), false);813 });814}815816#[test]817fn balance_of() {818 new_test_ext().execute_with(|| {819 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));820 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));821 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));822823 // check balance before824 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);825 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);826 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);827828 let nft_data = default_nft_data();829 create_test_item(nft_collection_id, &nft_data.into());830831 let fungible_data = default_fungible_data();832 create_test_item(fungible_collection_id, &fungible_data.into());833834 let re_fungible_data = default_re_fungible_data();835 create_test_item(re_fungible_collection_id, &re_fungible_data.into());836837 // check balance (collection with id = 1, user id = 1)838 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);839 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);840 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1023);841842 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);843 assert_eq!(<pallet_refungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);844 });845}846847#[test]848fn approve() {849 new_test_ext().execute_with(|| {850 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));851852 let data = default_nft_data();853 create_test_item(collection_id, &data.into());854855 let origin1 = Origin::signed(1);856857 // approve858 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));859 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));860 });861}862863#[test]864fn transfer_from() {865 new_test_ext().execute_with(|| {866 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));867 let origin1 = Origin::signed(1);868 let origin2 = Origin::signed(2);869870 let data = default_nft_data();871 create_test_item(collection_id, &data.into());872873 // approve874 assert_ok!(TemplateModule::approve(875 origin1.clone(),876 account(2),877 CollectionId(1),878 TokenId(1),879 1880 ));881 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));882883 assert_ok!(TemplateModule::set_mint_permission(884 origin1.clone(),885 CollectionId(1),886 true887 ));888 assert_ok!(TemplateModule::set_public_access_mode(889 origin1.clone(),890 CollectionId(1),891 AccessMode::AllowList892 ));893 assert_ok!(TemplateModule::add_to_allow_list(894 origin1.clone(),895 CollectionId(1),896 account(1)897 ));898 assert_ok!(TemplateModule::add_to_allow_list(899 origin1.clone(),900 CollectionId(1),901 account(2)902 ));903 assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));904905 assert_ok!(TemplateModule::transfer_from(906 origin2,907 account(1),908 account(2),909 CollectionId(1),910 TokenId(1),911 1912 ));913914 // after transfer915 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);916 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);917 });918}919920// #endregion921922// Coverage tests region923// #region924925#[test]926fn owner_can_add_address_to_allow_list() {927 new_test_ext().execute_with(|| {928 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));929930 let origin1 = Origin::signed(1);931 assert_ok!(TemplateModule::add_to_allow_list(932 origin1,933 collection_id,934 account(2)935 ));936 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));937 });938}939940#[test]941fn admin_can_add_address_to_allow_list() {942 new_test_ext().execute_with(|| {943 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));944 let origin1 = Origin::signed(1);945 let origin2 = Origin::signed(2);946947 assert_ok!(TemplateModule::add_collection_admin(948 origin1,949 collection_id,950 account(2)951 ));952 assert_ok!(TemplateModule::add_to_allow_list(953 origin2,954 collection_id,955 account(3)956 ));957 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));958 });959}960961#[test]962fn nonprivileged_user_cannot_add_address_to_allow_list() {963 new_test_ext().execute_with(|| {964 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));965966 let origin2 = Origin::signed(2);967 assert_noop!(968 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),969 CommonError::<Test>::NoPermission970 );971 });972}973974#[test]975fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {976 new_test_ext().execute_with(|| {977 let origin1 = Origin::signed(1);978979 assert_noop!(980 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),981 CommonError::<Test>::CollectionNotFound982 );983 });984}985986#[test]987fn nobody_can_add_address_to_allow_list_of_deleted_collection() {988 new_test_ext().execute_with(|| {989 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));990991 let origin1 = Origin::signed(1);992 assert_ok!(TemplateModule::destroy_collection(993 origin1.clone(),994 collection_id995 ));996 assert_noop!(997 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),998 CommonError::<Test>::CollectionNotFound999 );1000 });1001}10021003// If address is already added to allow list, nothing happens1004#[test]1005fn address_is_already_added_to_allow_list() {1006 new_test_ext().execute_with(|| {1007 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1008 let origin1 = Origin::signed(1);10091010 assert_ok!(TemplateModule::add_to_allow_list(1011 origin1.clone(),1012 collection_id,1013 account(2)1014 ));1015 assert_ok!(TemplateModule::add_to_allow_list(1016 origin1,1017 collection_id,1018 account(2)1019 ));1020 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1021 });1022}10231024#[test]1025fn owner_can_remove_address_from_allow_list() {1026 new_test_ext().execute_with(|| {1027 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10281029 let origin1 = Origin::signed(1);1030 assert_ok!(TemplateModule::add_to_allow_list(1031 origin1.clone(),1032 collection_id,1033 account(2)1034 ));1035 assert_ok!(TemplateModule::remove_from_allow_list(1036 origin1,1037 collection_id,1038 account(2)1039 ));1040 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1041 });1042}10431044#[test]1045fn admin_can_remove_address_from_allow_list() {1046 new_test_ext().execute_with(|| {1047 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1048 let origin1 = Origin::signed(1);1049 let origin2 = Origin::signed(2);10501051 assert_ok!(TemplateModule::add_collection_admin(1052 origin1.clone(),1053 collection_id,1054 account(2)1055 ));10561057 assert_ok!(TemplateModule::add_to_allow_list(1058 origin1,1059 collection_id,1060 account(3)1061 ));1062 assert_ok!(TemplateModule::remove_from_allow_list(1063 origin2,1064 collection_id,1065 account(3)1066 ));1067 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1068 });1069}10701071#[test]1072fn nonprivileged_user_cannot_remove_address_from_allow_list() {1073 new_test_ext().execute_with(|| {1074 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1075 let origin1 = Origin::signed(1);1076 let origin2 = Origin::signed(2);10771078 assert_ok!(TemplateModule::add_to_allow_list(1079 origin1,1080 collection_id,1081 account(2)1082 ));1083 assert_noop!(1084 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1085 CommonError::<Test>::NoPermission1086 );1087 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1088 });1089}10901091#[test]1092fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1093 new_test_ext().execute_with(|| {1094 let origin1 = Origin::signed(1);10951096 assert_noop!(1097 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1098 CommonError::<Test>::CollectionNotFound1099 );1100 });1101}11021103#[test]1104fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1105 new_test_ext().execute_with(|| {1106 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1107 let origin1 = Origin::signed(1);1108 let origin2 = Origin::signed(2);11091110 assert_ok!(TemplateModule::add_to_allow_list(1111 origin1.clone(),1112 collection_id,1113 account(2)1114 ));1115 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1116 assert_noop!(1117 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1118 CommonError::<Test>::CollectionNotFound1119 );1120 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1121 });1122}11231124// If address is already removed from allow list, nothing happens1125#[test]1126fn address_is_already_removed_from_allow_list() {1127 new_test_ext().execute_with(|| {1128 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1129 let origin1 = Origin::signed(1);11301131 assert_ok!(TemplateModule::add_to_allow_list(1132 origin1.clone(),1133 collection_id,1134 account(2)1135 ));1136 assert_ok!(TemplateModule::remove_from_allow_list(1137 origin1.clone(),1138 collection_id,1139 account(2)1140 ));1141 assert_ok!(TemplateModule::remove_from_allow_list(1142 origin1,1143 collection_id,1144 account(2)1145 ));1146 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1147 });1148}11491150// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1151#[test]1152fn allow_list_test_1() {1153 new_test_ext().execute_with(|| {1154 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));11551156 let origin1 = Origin::signed(1);11571158 let data = default_nft_data();1159 create_test_item(collection_id, &data.into());11601161 assert_ok!(TemplateModule::set_public_access_mode(1162 origin1.clone(),1163 collection_id,1164 AccessMode::AllowList1165 ));1166 assert_ok!(TemplateModule::add_to_allow_list(1167 origin1.clone(),1168 collection_id,1169 account(2)1170 ));11711172 assert_noop!(1173 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1),1174 CommonError::<Test>::AddressNotInAllowlist1175 );1176 });1177}11781179#[test]1180fn allow_list_test_2() {1181 new_test_ext().execute_with(|| {1182 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1183 let origin1 = Origin::signed(1);11841185 let data = default_nft_data();1186 create_test_item(collection_id, &data.into());11871188 assert_ok!(TemplateModule::set_public_access_mode(1189 origin1.clone(),1190 collection_id,1191 AccessMode::AllowList1192 ));1193 assert_ok!(TemplateModule::add_to_allow_list(1194 origin1.clone(),1195 collection_id,1196 account(1)1197 ));1198 assert_ok!(TemplateModule::add_to_allow_list(1199 origin1.clone(),1200 collection_id,1201 account(2)1202 ));12031204 // do approve1205 assert_ok!(TemplateModule::approve(1206 origin1.clone(),1207 account(1),1208 collection_id,1209 TokenId(1),1210 11211 ));1212 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12131214 assert_ok!(TemplateModule::remove_from_allow_list(1215 origin1.clone(),1216 collection_id,1217 account(1)1218 ));12191220 assert_noop!(1221 TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1),1222 CommonError::<Test>::AddressNotInAllowlist1223 );1224 });1225}12261227// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1228#[test]1229fn allow_list_test_3() {1230 new_test_ext().execute_with(|| {1231 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12321233 let origin1 = Origin::signed(1);12341235 let data = default_nft_data();1236 create_test_item(collection_id, &data.into());12371238 assert_ok!(TemplateModule::set_public_access_mode(1239 origin1.clone(),1240 collection_id,1241 AccessMode::AllowList1242 ));1243 assert_ok!(TemplateModule::add_to_allow_list(1244 origin1.clone(),1245 collection_id,1246 account(1)1247 ));12481249 assert_noop!(1250 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1),1251 CommonError::<Test>::AddressNotInAllowlist1252 );1253 });1254}12551256#[test]1257fn allow_list_test_4() {1258 new_test_ext().execute_with(|| {1259 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12601261 let origin1 = Origin::signed(1);12621263 let data = default_nft_data();1264 create_test_item(collection_id, &data.into());12651266 assert_ok!(TemplateModule::set_public_access_mode(1267 origin1.clone(),1268 collection_id,1269 AccessMode::AllowList1270 ));1271 assert_ok!(TemplateModule::add_to_allow_list(1272 origin1.clone(),1273 collection_id,1274 account(1)1275 ));1276 assert_ok!(TemplateModule::add_to_allow_list(1277 origin1.clone(),1278 collection_id,1279 account(2)1280 ));12811282 // do approve1283 assert_ok!(TemplateModule::approve(1284 origin1.clone(),1285 account(1),1286 collection_id,1287 TokenId(1),1288 11289 ));1290 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12911292 assert_ok!(TemplateModule::remove_from_allow_list(1293 origin1.clone(),1294 collection_id,1295 account(2)1296 ));12971298 assert_noop!(1299 TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1),1300 CommonError::<Test>::AddressNotInAllowlist1301 );1302 });1303}13041305// 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)1306#[test]1307fn allow_list_test_5() {1308 new_test_ext().execute_with(|| {1309 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13101311 let origin1 = Origin::signed(1);13121313 let data = default_nft_data();1314 create_test_item(collection_id, &data.into());13151316 assert_ok!(TemplateModule::set_public_access_mode(1317 origin1.clone(),1318 collection_id,1319 AccessMode::AllowList1320 ));1321 assert_noop!(1322 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 5),1323 CommonError::<Test>::AddressNotInAllowlist1324 );1325 });1326}13271328// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1329#[test]1330fn allow_list_test_6() {1331 new_test_ext().execute_with(|| {1332 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13331334 let origin1 = Origin::signed(1);13351336 let data = default_nft_data();1337 create_test_item(collection_id, &data.into());13381339 assert_ok!(TemplateModule::set_public_access_mode(1340 origin1.clone(),1341 collection_id,1342 AccessMode::AllowList1343 ));13441345 // do approve1346 assert_noop!(1347 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 5),1348 CommonError::<Test>::AddressNotInAllowlist1349 );1350 });1351}13521353// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1354// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1355#[test]1356fn allow_list_test_7() {1357 new_test_ext().execute_with(|| {1358 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13591360 let data = default_nft_data();1361 create_test_item(collection_id, &data.into());13621363 let origin1 = Origin::signed(1);13641365 assert_ok!(TemplateModule::set_public_access_mode(1366 origin1.clone(),1367 collection_id,1368 AccessMode::AllowList1369 ));1370 assert_ok!(TemplateModule::add_to_allow_list(1371 origin1.clone(),1372 collection_id,1373 account(1)1374 ));1375 assert_ok!(TemplateModule::add_to_allow_list(1376 origin1.clone(),1377 collection_id,1378 account(2)1379 ));13801381 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1382 });1383}13841385#[test]1386fn allow_list_test_8() {1387 new_test_ext().execute_with(|| {1388 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13891390 let data = default_nft_data();1391 create_test_item(collection_id, &data.into());13921393 let origin1 = Origin::signed(1);13941395 assert_ok!(TemplateModule::set_public_access_mode(1396 origin1.clone(),1397 collection_id,1398 AccessMode::AllowList1399 ));1400 assert_ok!(TemplateModule::add_to_allow_list(1401 origin1.clone(),1402 collection_id,1403 account(1)1404 ));1405 assert_ok!(TemplateModule::add_to_allow_list(1406 origin1.clone(),1407 collection_id,1408 account(2)1409 ));14101411 // do approve1412 assert_ok!(TemplateModule::approve(1413 origin1.clone(),1414 account(1),1415 CollectionId(1), 1416 TokenId(1),1417 51418 ));1419 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));14201421 assert_ok!(TemplateModule::transfer_from(1422 origin1,1423 account(1),1424 account(2),1425 CollectionId(1), 1426 TokenId(1),1427 11428 ));1429 });1430}14311432// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1433#[test]1434fn allow_list_test_9() {1435 new_test_ext().execute_with(|| {1436 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1437 let origin1 = Origin::signed(1);14381439 assert_ok!(TemplateModule::set_public_access_mode(1440 origin1.clone(),1441 collection_id,1442 AccessMode::AllowList1443 ));1444 assert_ok!(TemplateModule::set_mint_permission(1445 origin1,1446 collection_id,1447 false1448 ));14491450 let data = default_nft_data();1451 create_test_item(collection_id, &data.into());1452 });1453}14541455// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1456#[test]1457fn allow_list_test_10() {1458 new_test_ext().execute_with(|| {1459 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14601461 let origin1 = Origin::signed(1);1462 let origin2 = Origin::signed(2);14631464 assert_ok!(TemplateModule::set_public_access_mode(1465 origin1.clone(),1466 collection_id,1467 AccessMode::AllowList1468 ));1469 assert_ok!(TemplateModule::set_mint_permission(1470 origin1.clone(),1471 collection_id,1472 false1473 ));14741475 assert_ok!(TemplateModule::add_collection_admin(1476 origin1,1477 collection_id,1478 account(2)1479 ));14801481 assert_ok!(TemplateModule::create_item(1482 origin2,1483 collection_id,1484 account(2),1485 default_nft_data().into()1486 ));1487 });1488}14891490// 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.1491#[test]1492fn allow_list_test_11() {1493 new_test_ext().execute_with(|| {1494 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14951496 let origin1 = Origin::signed(1);1497 let origin2 = Origin::signed(2);14981499 assert_ok!(TemplateModule::set_public_access_mode(1500 origin1.clone(),1501 collection_id,1502 AccessMode::AllowList1503 ));1504 assert_ok!(TemplateModule::set_mint_permission(1505 origin1.clone(),1506 collection_id,1507 false1508 ));1509 assert_ok!(TemplateModule::add_to_allow_list(1510 origin1,1511 collection_id,1512 account(2)1513 ));15141515 assert_noop!(1516 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()),1517 CommonError::<Test>::PublicMintingNotAllowed1518 );1519 });1520}15211522// 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.1523#[test]1524fn allow_list_test_12() {1525 new_test_ext().execute_with(|| {1526 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15271528 let origin1 = Origin::signed(1);1529 let origin2 = Origin::signed(2);15301531 assert_ok!(TemplateModule::set_public_access_mode(1532 origin1.clone(),1533 collection_id,1534 AccessMode::AllowList1535 ));1536 assert_ok!(TemplateModule::set_mint_permission(1537 origin1,1538 collection_id,1539 false1540 ));15411542 assert_noop!(1543 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()),1544 CommonError::<Test>::PublicMintingNotAllowed1545 );1546 });1547}15481549// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1550#[test]1551fn allow_list_test_13() {1552 new_test_ext().execute_with(|| {1553 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15541555 let origin1 = Origin::signed(1);15561557 assert_ok!(TemplateModule::set_public_access_mode(1558 origin1.clone(),1559 collection_id,1560 AccessMode::AllowList1561 ));1562 assert_ok!(TemplateModule::set_mint_permission(1563 origin1,1564 collection_id,1565 true1566 ));15671568 let data = default_nft_data();1569 create_test_item(collection_id, &data.into());1570 });1571}15721573// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1574#[test]1575fn allow_list_test_14() {1576 new_test_ext().execute_with(|| {1577 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15781579 let origin1 = Origin::signed(1);1580 let origin2 = Origin::signed(2);15811582 assert_ok!(TemplateModule::set_public_access_mode(1583 origin1.clone(),1584 collection_id,1585 AccessMode::AllowList1586 ));1587 assert_ok!(TemplateModule::set_mint_permission(1588 origin1.clone(),1589 collection_id,1590 true1591 ));15921593 assert_ok!(TemplateModule::add_collection_admin(1594 origin1,1595 collection_id,1596 account(2)1597 ));15981599 assert_ok!(TemplateModule::create_item(1600 origin2,1601 collection_id,1602 account(2),1603 default_nft_data().into()1604 ));1605 });1606}16071608// 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.1609#[test]1610fn allow_list_test_15() {1611 new_test_ext().execute_with(|| {1612 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16131614 let origin1 = Origin::signed(1);1615 let origin2 = Origin::signed(2);16161617 assert_ok!(TemplateModule::set_public_access_mode(1618 origin1.clone(),1619 collection_id,1620 AccessMode::AllowList1621 ));1622 assert_ok!(TemplateModule::set_mint_permission(1623 origin1,1624 collection_id,1625 true1626 ));16271628 assert_noop!(1629 TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()),1630 CommonError::<Test>::AddressNotInAllowlist1631 );1632 });1633}16341635// 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.1636#[test]1637fn allow_list_test_16() {1638 new_test_ext().execute_with(|| {1639 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16401641 let origin1 = Origin::signed(1);1642 let origin2 = Origin::signed(2);16431644 assert_ok!(TemplateModule::set_public_access_mode(1645 origin1.clone(),1646 collection_id,1647 AccessMode::AllowList1648 ));1649 assert_ok!(TemplateModule::set_mint_permission(1650 origin1.clone(),1651 collection_id,1652 true1653 ));1654 assert_ok!(TemplateModule::add_to_allow_list(1655 origin1,1656 collection_id,1657 account(2)1658 ));16591660 assert_ok!(TemplateModule::create_item(1661 origin2,1662 collection_id,1663 account(2),1664 default_nft_data().into()1665 ));1666 });1667}16681669// Total number of collections. Positive test1670#[test]1671fn total_number_collections_bound() {1672 new_test_ext().execute_with(|| {1673 create_test_collection(&CollectionMode::NFT, CollectionId(1));1674 });1675}16761677// Total number of collections. Negotive test1678#[test]1679fn total_number_collections_bound_neg() {1680 new_test_ext().execute_with(|| {1681 let origin1 = Origin::signed(1);16821683 for i in 0..COLLECTION_NUMBER_LIMIT {1684 create_test_collection(&CollectionMode::NFT, CollectionId(i + 1));1685 }16861687 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1688 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1689 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16901691 // 11-th collection in chain. Expects error1692 assert_noop!(1693 TemplateModule::create_collection(1694 origin1,1695 col_name1,1696 col_desc1,1697 token_prefix1,1698 CollectionMode::NFT1699 ),1700 CommonError::<Test>::TotalCollectionsLimitExceeded1701 );1702 });1703}17041705// Owned tokens by a single address. Positive test1706#[test]1707fn owned_tokens_bound() {1708 new_test_ext().execute_with(|| {1709 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17101711 let data = default_nft_data();1712 create_test_item(collection_id, &data.clone().into());1713 create_test_item(collection_id, &data.into());1714 });1715}17161717// Owned tokens by a single address. Negotive test1718#[test]1719fn owned_tokens_bound_neg() {1720 new_test_ext().execute_with(|| {1721 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17221723 let origin1 = Origin::signed(1);17241725 for _ in 0..MAX_TOKEN_OWNERSHIP {1726 let data = default_nft_data();1727 create_test_item(collection_id, &data.clone().into());1728 }17291730 let data = default_nft_data();1731 assert_noop!(1732 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()),1733 CommonError::<Test>::AccountTokenLimitExceeded1734 );1735 });1736}17371738// Number of collection admins. Positive test1739#[test]1740fn collection_admins_bound() {1741 new_test_ext().execute_with(|| {1742 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17431744 let origin1 = Origin::signed(1);17451746 assert_ok!(TemplateModule::add_collection_admin(1747 origin1.clone(),1748 collection_id,1749 account(2)1750 ));1751 assert_ok!(TemplateModule::add_collection_admin(1752 origin1,1753 collection_id,1754 account(3)1755 ));1756 });1757}17581759// Number of collection admins. Negotive test1760#[test]1761fn collection_admins_bound_neg() {1762 new_test_ext().execute_with(|| {1763 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17641765 let origin1 = Origin::signed(1);17661767 for i in 0..COLLECTION_ADMINS_LIMIT {1768 assert_ok!(TemplateModule::add_collection_admin(1769 origin1.clone(),1770 collection_id,1771 account((2 + i).into())1772 ));1773 }1774 assert_noop!(1775 TemplateModule::add_collection_admin(1776 origin1,1777 collection_id,1778 account((3 + COLLECTION_ADMINS_LIMIT).into())1779 ),1780 CommonError::<Test>::CollectionAdminCountExceeded1781 );1782 });1783}1784// #endregion17851786#[test]1787fn set_const_on_chain_schema() {1788 new_test_ext().execute_with(|| {1789 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17901791 let origin1 = Origin::signed(1);1792 assert_ok!(TemplateModule::set_const_on_chain_schema(1793 origin1,1794 collection_id,1795 b"test const on chain schema".to_vec()1796 ));17971798 assert_eq!(1799 <pallet_common::CollectionById<Test>>::get(collection_id)1800 .unwrap()1801 .const_on_chain_schema,1802 b"test const on chain schema".to_vec()1803 );1804 assert_eq!(1805 <pallet_common::CollectionById<Test>>::get(collection_id)1806 .unwrap()1807 .variable_on_chain_schema,1808 b"".to_vec()1809 );1810 });1811}18121813#[test]1814fn set_variable_on_chain_schema() {1815 new_test_ext().execute_with(|| {1816 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18171818 let origin1 = Origin::signed(1);1819 assert_ok!(TemplateModule::set_variable_on_chain_schema(1820 origin1,1821 collection_id,1822 b"test variable on chain schema".to_vec()1823 ));18241825 assert_eq!(1826 <pallet_common::CollectionById<Test>>::get(collection_id)1827 .unwrap()1828 .const_on_chain_schema,1829 b"".to_vec()1830 );1831 assert_eq!(1832 <pallet_common::CollectionById<Test>>::get(collection_id)1833 .unwrap()1834 .variable_on_chain_schema,1835 b"test variable on chain schema".to_vec()1836 );1837 });1838}18391840#[test]1841fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1842 new_test_ext().execute_with(|| {1843 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18441845 let origin1 = Origin::signed(1);18461847 let data = default_nft_data();1848 create_test_item(CollectionId(1), &data.into());18491850 let variable_data = b"test data".to_vec();1851 assert_ok!(TemplateModule::set_variable_meta_data(1852 origin1,1853 collection_id,1854 TokenId(1),1855 variable_data.clone()1856 ));18571858 assert_eq!(1859 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1860 .unwrap()1861 .variable_data,1862 variable_data1863 );1864 });1865}18661867#[test]1868fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1869 new_test_ext().execute_with(|| {1870 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));18711872 let origin1 = Origin::signed(1);18731874 let data = default_re_fungible_data();1875 create_test_item(collection_id, &data.into());18761877 let variable_data = b"test data".to_vec();1878 assert_ok!(TemplateModule::set_variable_meta_data(1879 origin1,1880 collection_id,1881 TokenId(1),1882 variable_data.clone()1883 ));18841885 assert_eq!(1886 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1887 .variable_data,1888 variable_data1889 );1890 });1891}18921893#[test]1894fn set_variable_meta_data_on_fungible_token_fails() {1895 new_test_ext().execute_with(|| {1896 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));18971898 let origin1 = Origin::signed(1);18991900 let data = default_fungible_data();1901 create_test_item(collection_id, &data.into());19021903 let variable_data = b"test data".to_vec();1904 assert_noop!(1905 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1906 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData1907 );1908 });1909}19101911#[test]1912fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1913 new_test_ext().execute_with(|| {1914 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19151916 let origin1 = Origin::signed(1);19171918 let data = default_nft_data();1919 create_test_item(collection_id, &data.into());19201921 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1922 assert_noop!(1923 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1924 CommonError::<Test>::TokenVariableDataLimitExceeded1925 );1926 });1927}19281929#[test]1930fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1931 new_test_ext().execute_with(|| {1932 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19331934 let origin1 = Origin::signed(1);19351936 let data = default_re_fungible_data();1937 create_test_item(collection_id, &data.into());19381939 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1940 assert_noop!(1941 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1942 CommonError::<Test>::TokenVariableDataLimitExceeded1943 );1944 });1945}19461947#[test]1948fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {1949 new_test_ext().execute_with(|| {1950 //default_limits();19511952 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19531954 let origin1 = Origin::signed(1);19551956 let data = default_nft_data();1957 create_test_item(collection_id, &data.into());19581959 assert_ok!(TemplateModule::set_meta_update_permission_flag(1960 origin1.clone(),1961 collection_id,1962 MetaUpdatePermission::ItemOwner,1963 ));19641965 let variable_data = b"ten chars.".to_vec();1966 assert_ok!(TemplateModule::set_variable_meta_data(1967 origin1,1968 collection_id,1969 TokenId(1),1970 variable_data.clone()1971 ));19721973 assert_eq!(1974 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))1975 .unwrap()1976 .variable_data,1977 variable_data1978 );1979 });1980}19811982#[test]1983fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {1984 new_test_ext().execute_with(|| {1985 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));19861987 let origin1 = Origin::signed(1);19881989 assert_ok!(TemplateModule::set_mint_permission(1990 origin1.clone(),1991 collection_id,1992 true1993 ));1994 assert_ok!(TemplateModule::add_to_allow_list(1995 origin1.clone(),1996 collection_id,1997 account(1)1998 ));19992000 let data = default_nft_data();2001 create_test_item(collection_id, &data.into());20022003 assert_ok!(TemplateModule::set_meta_update_permission_flag(2004 origin1.clone(),2005 collection_id,2006 MetaUpdatePermission::ItemOwner,2007 ));20082009 let variable_data = b"1234567890123".to_vec();2010 assert_noop!(2011 TemplateModule::set_variable_meta_data(2012 origin1,2013 collection_id,2014 TokenId(1),2015 variable_data.clone()2016 ),2017 CommonError::<Test>::TokenVariableDataLimitExceeded2018 );2019 })2020}20212022#[test]2023fn collection_transfer_flag_works() {2024 new_test_ext().execute_with(|| {2025 let origin1 = Origin::signed(1);20262027 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2028 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));20292030 let data = default_nft_data();2031 create_test_item(collection_id, &data.into());2032 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2033 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);20342035 let origin1 = Origin::signed(1);20362037 // default scenario2038 assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1000));2039 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2040 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2041 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2042 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2043 });2044}20452046#[test]2047fn set_variable_meta_data_on_nft_with_admin_flag() {2048 new_test_ext().execute_with(|| {2049 // default_limits();20502051 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));20522053 let origin1 = Origin::signed(1);2054 let origin2 = Origin::signed(2);20552056 assert_ok!(TemplateModule::set_mint_permission(2057 origin2.clone(),2058 collection_id,2059 true2060 ));2061 assert_ok!(TemplateModule::add_to_allow_list(2062 origin2.clone(),2063 collection_id,2064 account(1)2065 ));20662067 assert_ok!(TemplateModule::add_collection_admin(2068 origin2.clone(),2069 collection_id,2070 account(1)2071 ));20722073 let data = default_nft_data();2074 create_test_item(collection_id, &data.into());20752076 assert_ok!(TemplateModule::set_meta_update_permission_flag(2077 origin2.clone(),2078 collection_id,2079 MetaUpdatePermission::Admin,2080 ));20812082 let variable_data = b"test.".to_vec();2083 assert_ok!(TemplateModule::set_variable_meta_data(2084 origin1,2085 collection_id,2086 TokenId(1),2087 variable_data.clone()2088 ));20892090 assert_eq!(2091 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2092 .unwrap()2093 .variable_data,2094 variable_data2095 );2096 });2097}20982099#[test]2100fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2101 new_test_ext().execute_with(|| {2102 // default_limits();21032104 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21052106 let origin1 = Origin::signed(1);2107 let origin2 = Origin::signed(2);21082109 assert_ok!(TemplateModule::set_mint_permission(2110 origin2.clone(),2111 collection_id,2112 true2113 ));2114 assert_ok!(TemplateModule::add_to_allow_list(2115 origin2.clone(),2116 collection_id,2117 account(1)2118 ));21192120 let data = default_nft_data();2121 create_test_item(collection_id, &data.into());21222123 assert_ok!(TemplateModule::set_meta_update_permission_flag(2124 origin2.clone(),2125 collection_id,2126 MetaUpdatePermission::Admin,2127 ));21282129 let variable_data = b"test.".to_vec();2130 assert_noop!(2131 TemplateModule::set_variable_meta_data(2132 origin1,2133 collection_id,2134 TokenId(1),2135 variable_data.clone()2136 ),2137 CommonError::<Test>::NoPermission2138 );2139 });2140}21412142#[test]2143fn set_variable_meta_flag_after_freeze() {2144 new_test_ext().execute_with(|| {2145 // default_limits();21462147 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21482149 let origin2 = Origin::signed(2);21502151 assert_ok!(TemplateModule::set_meta_update_permission_flag(2152 origin2.clone(),2153 collection_id,2154 MetaUpdatePermission::None,2155 ));2156 assert_noop!(2157 TemplateModule::set_meta_update_permission_flag(2158 origin2.clone(),2159 collection_id,2160 MetaUpdatePermission::Admin2161 ),2162 CommonError::<Test>::MetadataFlagFrozen2163 );2164 });2165}21662167#[test]2168fn set_variable_meta_data_on_nft_with_none_flag_neg() {2169 new_test_ext().execute_with(|| {2170 // default_limits();21712172 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2173 let origin1 = Origin::signed(1);21742175 let data = default_nft_data();2176 create_test_item(collection_id, &data.into());21772178 assert_ok!(TemplateModule::set_meta_update_permission_flag(2179 origin1.clone(),2180 collection_id,2181 MetaUpdatePermission::None,2182 ));21832184 let variable_data = b"test.".to_vec();2185 assert_noop!(2186 TemplateModule::set_variable_meta_data(2187 origin1.clone(),2188 collection_id,2189 TokenId(1),2190 variable_data.clone()2191 ),2192 CommonError::<Test>::NoPermission2193 );2194 });2195}21962197#[test]2198fn collection_transfer_flag_works_neg() {2199 new_test_ext().execute_with(|| {2200 let origin1 = Origin::signed(1);22012202 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2203 assert_ok!(TemplateModule::set_transfers_enabled_flag(2204 origin1, collection_id, false2205 ));22062207 let data = default_nft_data();2208 create_test_item(collection_id, &data.into());2209 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2210 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);22112212 let origin1 = Origin::signed(1);22132214 // default scenario2215 assert_noop!(2216 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1000),2217 CommonError::<Test>::TransferNotAllowed2218 );2219 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2220 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2221 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2222 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2223 });2224}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use nft_data_structs::{6 COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, 7 CreateNftData, CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, 8 MetaUpdatePermission, TokenId,9};1011use frame_support::{assert_noop, assert_ok};12use sp_std::convert::TryInto;1314fn default_nft_data() -> CreateNftData {15 CreateNftData {16 const_data: vec![1, 2, 3].try_into().unwrap(),17 variable_data: vec![3, 2, 1].try_into().unwrap(),18 }19}2021fn default_fungible_data() -> CreateFungibleData {22 CreateFungibleData { value: 5 }23}2425fn default_re_fungible_data() -> CreateReFungibleData {26 CreateReFungibleData {27 const_data: vec![1, 2, 3].try_into().unwrap(),28 variable_data: vec![3, 2, 1].try_into().unwrap(),29 pieces: 1023,30 }31}3233fn create_test_collection_for_owner(34 mode: &CollectionMode,35 owner: u64,36 id: CollectionId,37) -> CollectionId {38 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();39 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();40 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4142 let origin1 = Origin::signed(owner);43 assert_ok!(TemplateModule::create_collection(44 origin1,45 col_name1,46 col_desc1,47 token_prefix1,48 mode.clone()49 ));5051 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();52 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();53 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();54 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);55 assert_eq!(56 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,57 saved_col_name58 );59 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);60 assert_eq!(61 <pallet_common::CollectionById<Test>>::get(id).unwrap().description,62 saved_description63 );64 assert_eq!(65 <pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,66 saved_prefix67 );68 id69}7071fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {72 create_test_collection_for_owner(&mode, 1, id)73}7475fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {76 let origin1 = Origin::signed(1);77 assert_ok!(TemplateModule::create_item(78 origin1,79 collection_id,80 account(1),81 data.clone()82 ));83}8485fn account(sub: u64) -> TestCrossAccountId {86 TestCrossAccountId::from_sub(sub)87}8889// Use cases tests region90// #region9192#[test]93fn set_version_schema() {94 new_test_ext().execute_with(|| {95 let origin1 = Origin::signed(1);96 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9798 assert_ok!(TemplateModule::set_schema_version(99 origin1,100 collection_id,101 SchemaVersion::Unique102 ));103 assert_eq!(104 <pallet_common::CollectionById<Test>>::get(collection_id)105 .unwrap()106 .schema_version,107 SchemaVersion::Unique108 );109 });110}111112#[test]113fn create_fungible_collection_fails_with_large_decimal_numbers() {114 new_test_ext().execute_with(|| {115 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();116 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();117 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();118119 let origin1 = Origin::signed(1);120 assert_noop!(121 TemplateModule::create_collection(122 origin1,123 col_name1,124 col_desc1,125 token_prefix1,126 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)127 ),128 Error::<Test>::CollectionDecimalPointLimitExceeded129 );130 });131}132133#[test]134fn create_nft_item() {135 new_test_ext().execute_with(|| {136 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));137138 let data = default_nft_data();139 create_test_item(collection_id, &data.clone().into());140141 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();142 assert_eq!(item.const_data, data.const_data.into_inner());143 assert_eq!(item.variable_data, data.variable_data.into_inner());144 });145}146147// Use cases tests region148// #region149#[test]150fn create_nft_multiple_items() {151 new_test_ext().execute_with(|| {152 create_test_collection(&CollectionMode::NFT, CollectionId(1));153154 let origin1 = Origin::signed(1);155156 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];157158 assert_ok!(TemplateModule::create_multiple_items(159 origin1,160 CollectionId(1),161 account(1),162 items_data163 .clone()164 .into_iter()165 .map(|d| { d.into() })166 .collect()167 ));168 for (index, data) in items_data.into_iter().enumerate() {169 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();170 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());171 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());172 }173 });174}175176#[test]177fn create_refungible_item() {178 new_test_ext().execute_with(|| {179 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));180181 let data = default_re_fungible_data();182 create_test_item(collection_id, &data.clone().into());183 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));184 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));185 assert_eq!(item.const_data, data.const_data.into_inner());186 assert_eq!(item.variable_data, data.variable_data.into_inner());187 assert_eq!(balance, 1023);188 });189}190191#[test]192fn create_multiple_refungible_items() {193 new_test_ext().execute_with(|| {194 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));195196 let origin1 = Origin::signed(1);197198 let items_data = vec![199 default_re_fungible_data(),200 default_re_fungible_data(),201 default_re_fungible_data(),202 ];203204 assert_ok!(TemplateModule::create_multiple_items(205 origin1,206 CollectionId(1),207 account(1),208 items_data209 .clone()210 .into_iter()211 .map(|d| { d.into() })212 .collect()213 ));214 for (index, data) in items_data.into_iter().enumerate() {215 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32)));216 let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));217 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());218 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());219 assert_eq!(balance, 1023);220 }221 });222}223224#[test]225fn create_fungible_item() {226 new_test_ext().execute_with(|| {227 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));228229 let data = default_fungible_data();230 create_test_item(collection_id, &data.into());231232 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);233 });234}235236//#[test]237// fn create_multiple_fungible_items() {238// new_test_ext().execute_with(|| {239// default_limits();240241// create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));242243// let origin1 = Origin::signed(1);244245// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];246247// assert_ok!(TemplateModule::create_multiple_items(248// origin1.clone(),249// 1,250// 1,251// items_data.clone().into_iter().map(|d| { d.into() }).collect()252// ));253254// for (index, _) in items_data.iter().enumerate() {255// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);256// }257// assert_eq!(TemplateModule::balance_count(1, 1), 3000);258// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);259// });260// }261262#[test]263fn transfer_fungible_item() {264 new_test_ext().execute_with(|| {265 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));266267 let origin1 = Origin::signed(1);268 let origin2 = Origin::signed(2);269270 let data = default_fungible_data();271 create_test_item(collection_id, &data.into());272273 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);274275 // change owner scenario276 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(0), 5));277 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);278279 // split item scenario280 assert_ok!(TemplateModule::transfer(281 origin2.clone(),282 account(3),283 CollectionId(1),284 TokenId(0),285 3286 ));287288 // split item and new owner has account scenario289 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(0), 1));290 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);291 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);292 });293}294295#[test]296fn transfer_refungible_item() {297 new_test_ext().execute_with(|| {298 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));299300 // Create RFT 1 in 1023 pieces for account 1301 let data = default_re_fungible_data();302 create_test_item(collection_id, &data.clone().into());303 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));304 assert_eq!(item.const_data, data.const_data.into_inner());305 assert_eq!(item.variable_data, data.variable_data.into_inner());306 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);307 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);308 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);309310 // Account 1 transfers all 1023 pieces of RFT 1 to account 2311 let origin1 = Origin::signed(1);312 let origin2 = Origin::signed(2);313 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));314 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 1023);315 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);316 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);317 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);318 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);319320 // Account 2 transfers 500 pieces of RFT 1 to account 3321 assert_ok!(TemplateModule::transfer(322 origin2.clone(),323 account(3),324 CollectionId(1),325 TokenId(1),326 500327 ));328 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 523);329 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 500);330 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);331 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);332 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);333 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);334335 // Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance336 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));337 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))), 323);338 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 700);339 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);340 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);341 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);342 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);343 });344}345346#[test]347fn transfer_nft_item() {348 new_test_ext().execute_with(|| {349 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));350351 let data = default_nft_data();352 create_test_item(collection_id, &data.into());353 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);354 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);355356357 let origin1 = Origin::signed(1);358 // default scenario359 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));360 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);361 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);362 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);363 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);364 });365}366367#[test]368fn transfer_nft_item_wrong_value() {369 new_test_ext().execute_with(|| {370 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));371372 let data = default_nft_data();373 create_test_item(collection_id, &data.into());374 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);375 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);376377 let origin1 = Origin::signed(1);378379 assert_noop!(380 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2).map_err(|e| e.error),381 <pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount382 );383 });384}385386#[test]387fn transfer_nft_item_zero_value() {388 new_test_ext().execute_with(|| {389 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));390391 let data = default_nft_data();392 create_test_item(collection_id, &data.into());393 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);394 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);395396 let origin1 = Origin::signed(1);397398 // Transferring 0 amount works on NFT...399 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 0));400 // ... and results in no transfer401 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);402 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);403 });404}405406#[test]407fn nft_approve_and_transfer_from() {408 new_test_ext().execute_with(|| {409 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));410411 let data = default_nft_data();412 create_test_item(collection_id, &data.into());413414 let origin1 = Origin::signed(1);415 let origin2 = Origin::signed(2);416417 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);418 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);419420 // neg transfer_from421 assert_noop!(422 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),423 CommonError::<Test>::TokenValueNotEnough424 );425426 // do approve427 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));428 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));429430 assert_ok!(TemplateModule::transfer_from(431 origin2,432 account(1),433 account(3),434 CollectionId(1),435 TokenId(1),436 1437 ));438 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());439 });440}441442#[test]443fn nft_approve_and_transfer_from_allow_list() {444 new_test_ext().execute_with(|| {445 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));446447 let origin1 = Origin::signed(1);448 let origin2 = Origin::signed(2);449450 // Create NFT 1 for account 1451 let data = default_nft_data();452 create_test_item(collection_id, &data.clone().into());453 assert_eq!(454 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,455 &data.const_data.into_inner()456 );457 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);458 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);459460 // Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list461 assert_ok!(TemplateModule::set_mint_permission(462 origin1.clone(),463 CollectionId(1),464 true465 ));466 assert_ok!(TemplateModule::set_public_access_mode(467 origin1.clone(),468 CollectionId(1),469 AccessMode::AllowList470 ));471 assert_ok!(TemplateModule::add_to_allow_list(472 origin1.clone(),473 CollectionId(1),474 account(1)475 ));476 assert_ok!(TemplateModule::add_to_allow_list(477 origin1.clone(),478 CollectionId(1),479 account(2)480 ));481 assert_ok!(TemplateModule::add_to_allow_list(482 origin1.clone(),483 CollectionId(1),484 account(3)485 ));486487 // Account 1 approves account 2 for NFT 1 488 assert_ok!(TemplateModule::approve(489 origin1.clone(),490 account(2),491 CollectionId(1),492 TokenId(1),493 1494 ));495 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));496497 // Account 2 transfers NFT 1 from account 1 to account 3498 assert_ok!(TemplateModule::transfer_from(499 origin2,500 account(1),501 account(3),502 CollectionId(1),503 TokenId(1),504 1505 ));506 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());507 });508}509510#[test]511fn refungible_approve_and_transfer_from() {512 new_test_ext().execute_with(|| {513 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));514515 let origin1 = Origin::signed(1);516 let origin2 = Origin::signed(2);517518 // Create RFT 1 in 1023 pieces for account 1519 let data = default_re_fungible_data();520 create_test_item(collection_id, &data.into());521522 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);523 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);524 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);525526 // Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list527 assert_ok!(TemplateModule::set_mint_permission(528 origin1.clone(),529 CollectionId(1),530 true531 ));532 assert_ok!(TemplateModule::set_public_access_mode(533 origin1.clone(),534 CollectionId(1),535 AccessMode::AllowList536 ));537 assert_ok!(TemplateModule::add_to_allow_list(538 origin1.clone(),539 CollectionId(1),540 account(1)541 ));542 assert_ok!(TemplateModule::add_to_allow_list(543 origin1.clone(),544 CollectionId(1),545 account(2)546 ));547 assert_ok!(TemplateModule::add_to_allow_list(548 origin1.clone(),549 CollectionId(1),550 account(3)551 ));552553 // Account 1 approves account 2 for 1023 pieces of RFT 1554 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));555 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);556557 // Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3558 assert_ok!(TemplateModule::transfer_from(559 origin2,560 account(1),561 account(3),562 CollectionId(1),563 TokenId(1),564 100565 ));566 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);567 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 1);568 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 923);569 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))), 100);570 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);571 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);572 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);573 });574}575576#[test]577fn fungible_approve_and_transfer_from() {578 new_test_ext().execute_with(|| {579 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));580581 let data = default_fungible_data();582 create_test_item(collection_id, &data.into());583584 let origin1 = Origin::signed(1);585 let origin2 = Origin::signed(2);586587 assert_ok!(TemplateModule::set_mint_permission(588 origin1.clone(),589 CollectionId(1),590 true591 ));592 assert_ok!(TemplateModule::set_public_access_mode(593 origin1.clone(),594 CollectionId(1),595 AccessMode::AllowList596 ));597 assert_ok!(TemplateModule::add_to_allow_list(598 origin1.clone(),599 CollectionId(1),600 account(1)601 ));602 assert_ok!(TemplateModule::add_to_allow_list(603 origin1.clone(),604 CollectionId(1),605 account(2)606 ));607 assert_ok!(TemplateModule::add_to_allow_list(608 origin1.clone(),609 CollectionId(1),610 account(3)611 ));612613 // do approve614 assert_ok!(TemplateModule::approve(615 origin1.clone(),616 account(2),617 CollectionId(1),618 TokenId(0),619 5620 ));621 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);622 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(0), 5));623 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);624 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);625626 assert_ok!(TemplateModule::transfer_from(627 origin2.clone(),628 account(1),629 account(3),630 CollectionId(1),631 TokenId(0),632 4633 ));634635 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);636637 assert_noop!(638 TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(0), 4).map_err(|e| e.error),639 CommonError::<Test>::TokenValueNotEnough640 );641 });642}643644#[test]645fn change_collection_owner() {646 new_test_ext().execute_with(|| {647 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));648649 let origin1 = Origin::signed(1);650 assert_ok!(TemplateModule::change_collection_owner(651 origin1,652 collection_id,653 2654 ));655 assert_eq!(656 <pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,657 2658 );659 });660}661662#[test]663fn destroy_collection() {664 new_test_ext().execute_with(|| {665 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));666667 let origin1 = Origin::signed(1);668 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));669 });670}671672#[test]673fn burn_nft_item() {674 new_test_ext().execute_with(|| {675 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));676677 let origin1 = Origin::signed(1);678679 let data = default_nft_data();680 create_test_item(collection_id, &data.into());681682 // check balance (collection with id = 1, user id = 1)683 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);684685 // burn item686 assert_ok!(TemplateModule::burn_item(687 origin1.clone(),688 collection_id,689 TokenId(1),690 1691 ));692 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);693 });694}695696#[test]697fn burn_same_nft_item_twice() {698 new_test_ext().execute_with(|| {699 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));700701 let origin1 = Origin::signed(1);702703 let data = default_nft_data();704 create_test_item(collection_id, &data.into());705706 // check balance (collection with id = 1, user id = 1)707 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);708709 // burn item710 assert_ok!(TemplateModule::burn_item(711 origin1.clone(),712 collection_id,713 TokenId(1),714 1715 ));716 717 // burn item again718 assert_noop!(719 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),720 CommonError::<Test>::TokenNotFound721 );722723 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);724 });725}726727#[test]728fn burn_fungible_item() {729 new_test_ext().execute_with(|| {730 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));731732 let origin1 = Origin::signed(1);733 assert_ok!(TemplateModule::add_collection_admin(734 origin1.clone(),735 collection_id,736 account(2)737 ));738739 let data = default_fungible_data();740 create_test_item(collection_id, &data.into());741742 // check balance (collection with id = 1, user id = 1)743 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);744745 // burn item746 assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(0), 5));747 assert_noop!(748 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),749 CommonError::<Test>::TokenValueTooLow750 );751752 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);753 });754}755756#[test]757fn burn_fungible_item_with_token_id() {758 new_test_ext().execute_with(|| {759 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));760761 let origin1 = Origin::signed(1);762 assert_ok!(TemplateModule::add_collection_admin(763 origin1.clone(),764 collection_id,765 account(2)766 ));767768 let data = default_fungible_data();769 create_test_item(collection_id, &data.into());770771 // check balance (collection with id = 1, user id = 1)772 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);773774 // Try to burn item using Token ID775 assert_noop!(776 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),777 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId778 );779 });780}781#[test]782fn burn_refungible_item() {783 new_test_ext().execute_with(|| {784 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));785 let origin1 = Origin::signed(1);786787 assert_ok!(TemplateModule::set_mint_permission(788 origin1.clone(),789 collection_id,790 true791 ));792 assert_ok!(TemplateModule::set_public_access_mode(793 origin1.clone(),794 collection_id,795 AccessMode::AllowList796 ));797 assert_ok!(TemplateModule::add_to_allow_list(798 origin1.clone(),799 collection_id,800 account(1)801 ));802803 assert_ok!(TemplateModule::add_collection_admin(804 origin1.clone(),805 collection_id,806 account(2)807 ));808809 let data = default_re_fungible_data();810 create_test_item(collection_id, &data.into());811812 // check balance (collection with id = 1, user id = 2)813 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);814 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);815816 // burn item817 assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));818 assert_noop!(819 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),820 CommonError::<Test>::TokenValueTooLow821 );822823 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);824 });825}826827#[test]828fn add_collection_admin() {829 new_test_ext().execute_with(|| {830 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));831 let origin1 = Origin::signed(1);832833 // Add collection admins834 assert_ok!(TemplateModule::add_collection_admin(835 origin1.clone(),836 collection1_id,837 account(2)838 ));839 assert_ok!(TemplateModule::add_collection_admin(840 origin1,841 collection1_id,842 account(3)843 ));844845 // Owner is not an admin by default846 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))), false);847 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));848 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));849 });850}851852#[test]853fn remove_collection_admin() {854 new_test_ext().execute_with(|| {855 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));856 let origin1 = Origin::signed(1);857 let origin2 = Origin::signed(2);858859 // Add collection admins 2 and 3860 assert_ok!(TemplateModule::add_collection_admin(861 origin1.clone(),862 collection1_id,863 account(2)864 ));865 assert_ok!(TemplateModule::add_collection_admin(866 origin1,867 collection1_id,868 account(3)869 ));870871 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));872 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));873874 // remove admin 3875 assert_ok!(TemplateModule::remove_collection_admin(876 origin2,877 CollectionId(1),878 account(3)879 ));880881 // 2 is still admin, 3 is not an admin anymore882 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));883 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))), false);884 });885}886887#[test]888fn balance_of() {889 new_test_ext().execute_with(|| {890 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));891 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));892 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));893894 // check balance before895 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);896 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);897 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);898899 let nft_data = default_nft_data();900 create_test_item(nft_collection_id, &nft_data.into());901902 let fungible_data = default_fungible_data();903 create_test_item(fungible_collection_id, &fungible_data.into());904905 let re_fungible_data = default_re_fungible_data();906 create_test_item(re_fungible_collection_id, &re_fungible_data.into());907908 // check balance (collection with id = 1, user id = 1)909 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);910 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);911 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1);912913 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);914 assert_eq!(<pallet_refungible::Owned<Test>>::get((re_fungible_collection_id, account(1), TokenId(1))), true);915 });916}917918#[test]919fn approve() {920 new_test_ext().execute_with(|| {921 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));922923 let data = default_nft_data();924 create_test_item(collection_id, &data.into());925926 let origin1 = Origin::signed(1);927928 // approve929 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));930 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));931 });932}933934#[test]935fn transfer_from() {936 new_test_ext().execute_with(|| {937 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));938 let origin1 = Origin::signed(1);939 let origin2 = Origin::signed(2);940941 let data = default_nft_data();942 create_test_item(collection_id, &data.into());943944 // approve945 assert_ok!(TemplateModule::approve(946 origin1.clone(),947 account(2),948 CollectionId(1),949 TokenId(1),950 1951 ));952 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));953954 assert_ok!(TemplateModule::set_mint_permission(955 origin1.clone(),956 CollectionId(1),957 true958 ));959 assert_ok!(TemplateModule::set_public_access_mode(960 origin1.clone(),961 CollectionId(1),962 AccessMode::AllowList963 ));964 assert_ok!(TemplateModule::add_to_allow_list(965 origin1.clone(),966 CollectionId(1),967 account(1)968 ));969 assert_ok!(TemplateModule::add_to_allow_list(970 origin1.clone(),971 CollectionId(1),972 account(2)973 ));974 assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));975976 assert_ok!(TemplateModule::transfer_from(977 origin2,978 account(1),979 account(2),980 CollectionId(1),981 TokenId(1),982 1983 ));984985 // after transfer986 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);987 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);988 });989}990991// #endregion992993// Coverage tests region994// #region995996#[test]997fn owner_can_add_address_to_allow_list() {998 new_test_ext().execute_with(|| {999 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10001001 let origin1 = Origin::signed(1);1002 assert_ok!(TemplateModule::add_to_allow_list(1003 origin1,1004 collection_id,1005 account(2)1006 ));1007 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1008 });1009}10101011#[test]1012fn admin_can_add_address_to_allow_list() {1013 new_test_ext().execute_with(|| {1014 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1015 let origin1 = Origin::signed(1);1016 let origin2 = Origin::signed(2);10171018 assert_ok!(TemplateModule::add_collection_admin(1019 origin1,1020 collection_id,1021 account(2)1022 ));1023 assert_ok!(TemplateModule::add_to_allow_list(1024 origin2,1025 collection_id,1026 account(3)1027 ));1028 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1029 });1030}10311032#[test]1033fn nonprivileged_user_cannot_add_address_to_allow_list() {1034 new_test_ext().execute_with(|| {1035 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10361037 let origin2 = Origin::signed(2);1038 assert_noop!(1039 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1040 CommonError::<Test>::NoPermission1041 );1042 });1043}10441045#[test]1046fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1047 new_test_ext().execute_with(|| {1048 let origin1 = Origin::signed(1);10491050 assert_noop!(1051 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1052 CommonError::<Test>::CollectionNotFound1053 );1054 });1055}10561057#[test]1058fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1059 new_test_ext().execute_with(|| {1060 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10611062 let origin1 = Origin::signed(1);1063 assert_ok!(TemplateModule::destroy_collection(1064 origin1.clone(),1065 collection_id1066 ));1067 assert_noop!(1068 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1069 CommonError::<Test>::CollectionNotFound1070 );1071 });1072}10731074// If address is already added to allow list, nothing happens1075#[test]1076fn address_is_already_added_to_allow_list() {1077 new_test_ext().execute_with(|| {1078 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1079 let origin1 = Origin::signed(1);10801081 assert_ok!(TemplateModule::add_to_allow_list(1082 origin1.clone(),1083 collection_id,1084 account(2)1085 ));1086 assert_ok!(TemplateModule::add_to_allow_list(1087 origin1,1088 collection_id,1089 account(2)1090 ));1091 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1092 });1093}10941095#[test]1096fn owner_can_remove_address_from_allow_list() {1097 new_test_ext().execute_with(|| {1098 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10991100 let origin1 = Origin::signed(1);1101 assert_ok!(TemplateModule::add_to_allow_list(1102 origin1.clone(),1103 collection_id,1104 account(2)1105 ));1106 assert_ok!(TemplateModule::remove_from_allow_list(1107 origin1,1108 collection_id,1109 account(2)1110 ));1111 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1112 });1113}11141115#[test]1116fn admin_can_remove_address_from_allow_list() {1117 new_test_ext().execute_with(|| {1118 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1119 let origin1 = Origin::signed(1);1120 let origin2 = Origin::signed(2);11211122 // Owner adds admin1123 assert_ok!(TemplateModule::add_collection_admin(1124 origin1.clone(),1125 collection_id,1126 account(2)1127 ));11281129 // Owner adds address 3 to allow list1130 assert_ok!(TemplateModule::add_to_allow_list(1131 origin1,1132 collection_id,1133 account(3)1134 ));11351136 // Admin removes address 3 from allow list1137 assert_ok!(TemplateModule::remove_from_allow_list(1138 origin2,1139 collection_id,1140 account(3)1141 ));1142 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))), false);1143 });1144}11451146#[test]1147fn nonprivileged_user_cannot_remove_address_from_allow_list() {1148 new_test_ext().execute_with(|| {1149 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1150 let origin1 = Origin::signed(1);1151 let origin2 = Origin::signed(2);11521153 assert_ok!(TemplateModule::add_to_allow_list(1154 origin1,1155 collection_id,1156 account(2)1157 ));1158 assert_noop!(1159 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1160 CommonError::<Test>::NoPermission1161 );1162 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1163 });1164}11651166#[test]1167fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1168 new_test_ext().execute_with(|| {1169 let origin1 = Origin::signed(1);11701171 assert_noop!(1172 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1173 CommonError::<Test>::CollectionNotFound1174 );1175 });1176}11771178#[test]1179fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1180 new_test_ext().execute_with(|| {1181 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1182 let origin1 = Origin::signed(1);1183 let origin2 = Origin::signed(2);11841185 // Add account 2 to allow list1186 assert_ok!(TemplateModule::add_to_allow_list(1187 origin1.clone(),1188 collection_id,1189 account(2)1190 ));11911192 // Account 2 is in collection allow-list1193 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));11941195 // Destroy collection1196 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));11971198 // Attempt to remove account 2 from collection allow-list => error1199 assert_noop!(1200 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1201 CommonError::<Test>::CollectionNotFound1202 );12031204 // Account 2 is not found in collection allow-list anyway1205 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1206 });1207}12081209// If address is already removed from allow list, nothing happens1210#[test]1211fn address_is_already_removed_from_allow_list() {1212 new_test_ext().execute_with(|| {1213 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1214 let origin1 = Origin::signed(1);12151216 assert_ok!(TemplateModule::add_to_allow_list(1217 origin1.clone(),1218 collection_id,1219 account(2)1220 ));1221 assert_ok!(TemplateModule::remove_from_allow_list(1222 origin1.clone(),1223 collection_id,1224 account(2)1225 ));1226 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1227 assert_ok!(TemplateModule::remove_from_allow_list(1228 origin1,1229 collection_id,1230 account(2)1231 ));1232 assert_eq!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))), false);1233 });1234}12351236// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1237#[test]1238fn allow_list_test_1() {1239 new_test_ext().execute_with(|| {1240 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12411242 let origin1 = Origin::signed(1);12431244 let data = default_nft_data();1245 create_test_item(collection_id, &data.into());12461247 assert_ok!(TemplateModule::set_public_access_mode(1248 origin1.clone(),1249 collection_id,1250 AccessMode::AllowList1251 ));1252 assert_ok!(TemplateModule::add_to_allow_list(1253 origin1.clone(),1254 collection_id,1255 account(2)1256 ));12571258 assert_noop!(1259 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1260 CommonError::<Test>::AddressNotInAllowlist1261 );1262 });1263}12641265#[test]1266fn allow_list_test_2() {1267 new_test_ext().execute_with(|| {1268 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1269 let origin1 = Origin::signed(1);12701271 let data = default_nft_data();1272 create_test_item(collection_id, &data.into());12731274 assert_ok!(TemplateModule::set_public_access_mode(1275 origin1.clone(),1276 collection_id,1277 AccessMode::AllowList1278 ));1279 assert_ok!(TemplateModule::add_to_allow_list(1280 origin1.clone(),1281 collection_id,1282 account(1)1283 ));1284 assert_ok!(TemplateModule::add_to_allow_list(1285 origin1.clone(),1286 collection_id,1287 account(2)1288 ));12891290 // do approve1291 assert_ok!(TemplateModule::approve(1292 origin1.clone(),1293 account(1),1294 collection_id,1295 TokenId(1),1296 11297 ));1298 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12991300 assert_ok!(TemplateModule::remove_from_allow_list(1301 origin1.clone(),1302 collection_id,1303 account(1)1304 ));13051306 assert_noop!(1307 TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1308 CommonError::<Test>::AddressNotInAllowlist1309 );1310 });1311}13121313// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1314#[test]1315fn allow_list_test_3() {1316 new_test_ext().execute_with(|| {1317 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13181319 let origin1 = Origin::signed(1);13201321 let data = default_nft_data();1322 create_test_item(collection_id, &data.into());13231324 assert_ok!(TemplateModule::set_public_access_mode(1325 origin1.clone(),1326 collection_id,1327 AccessMode::AllowList1328 ));1329 assert_ok!(TemplateModule::add_to_allow_list(1330 origin1.clone(),1331 collection_id,1332 account(1)1333 ));13341335 assert_noop!(1336 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1337 CommonError::<Test>::AddressNotInAllowlist1338 );1339 });1340}13411342#[test]1343fn allow_list_test_4() {1344 new_test_ext().execute_with(|| {1345 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13461347 let origin1 = Origin::signed(1);13481349 let data = default_nft_data();1350 create_test_item(collection_id, &data.into());13511352 assert_ok!(TemplateModule::set_public_access_mode(1353 origin1.clone(),1354 collection_id,1355 AccessMode::AllowList1356 ));1357 assert_ok!(TemplateModule::add_to_allow_list(1358 origin1.clone(),1359 collection_id,1360 account(1)1361 ));1362 assert_ok!(TemplateModule::add_to_allow_list(1363 origin1.clone(),1364 collection_id,1365 account(2)1366 ));13671368 // do approve1369 assert_ok!(TemplateModule::approve(1370 origin1.clone(),1371 account(1),1372 collection_id,1373 TokenId(1),1374 11375 ));1376 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));13771378 assert_ok!(TemplateModule::remove_from_allow_list(1379 origin1.clone(),1380 collection_id,1381 account(2)1382 ));13831384 assert_noop!(1385 TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1).map_err(|e| e.error),1386 CommonError::<Test>::AddressNotInAllowlist1387 );1388 });1389}13901391// 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)1392#[test]1393fn allow_list_test_5() {1394 new_test_ext().execute_with(|| {1395 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13961397 let origin1 = Origin::signed(1);13981399 let data = default_nft_data();1400 create_test_item(collection_id, &data.into());14011402 assert_ok!(TemplateModule::set_public_access_mode(1403 origin1.clone(),1404 collection_id,1405 AccessMode::AllowList1406 ));1407 assert_noop!(1408 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1409 CommonError::<Test>::AddressNotInAllowlist1410 );1411 });1412}14131414// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1415#[test]1416fn allow_list_test_6() {1417 new_test_ext().execute_with(|| {1418 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14191420 let origin1 = Origin::signed(1);14211422 let data = default_nft_data();1423 create_test_item(collection_id, &data.into());14241425 assert_ok!(TemplateModule::set_public_access_mode(1426 origin1.clone(),1427 collection_id,1428 AccessMode::AllowList1429 ));14301431 // do approve1432 assert_noop!(1433 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1434 CommonError::<Test>::AddressNotInAllowlist1435 );1436 });1437}14381439// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1440// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1441#[test]1442fn allow_list_test_7() {1443 new_test_ext().execute_with(|| {1444 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14451446 let data = default_nft_data();1447 create_test_item(collection_id, &data.into());14481449 let origin1 = Origin::signed(1);14501451 assert_ok!(TemplateModule::set_public_access_mode(1452 origin1.clone(),1453 collection_id,1454 AccessMode::AllowList1455 ));1456 assert_ok!(TemplateModule::add_to_allow_list(1457 origin1.clone(),1458 collection_id,1459 account(1)1460 ));1461 assert_ok!(TemplateModule::add_to_allow_list(1462 origin1.clone(),1463 collection_id,1464 account(2)1465 ));14661467 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1468 });1469}14701471#[test]1472fn allow_list_test_8() {1473 new_test_ext().execute_with(|| {1474 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14751476 // Create NFT for account 11477 let data = default_nft_data();1478 create_test_item(collection_id, &data.into());14791480 let origin1 = Origin::signed(1);14811482 // Toggle Allow List mode and add accounts 1 and 21483 assert_ok!(TemplateModule::set_public_access_mode(1484 origin1.clone(),1485 collection_id,1486 AccessMode::AllowList1487 ));1488 assert_ok!(TemplateModule::add_to_allow_list(1489 origin1.clone(),1490 collection_id,1491 account(1)1492 ));1493 assert_ok!(TemplateModule::add_to_allow_list(1494 origin1.clone(),1495 collection_id,1496 account(2)1497 ));14981499 // Sself-approve account 1 for NFT 11500 assert_ok!(TemplateModule::approve(1501 origin1.clone(),1502 account(1),1503 CollectionId(1), 1504 TokenId(1),1505 11506 ));1507 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));15081509 // Transfer from 1 to 21510 assert_ok!(TemplateModule::transfer_from(1511 origin1,1512 account(1),1513 account(2),1514 CollectionId(1), 1515 TokenId(1),1516 11517 ));1518 });1519}15201521// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1522#[test]1523fn allow_list_test_9() {1524 new_test_ext().execute_with(|| {1525 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1526 let origin1 = Origin::signed(1);15271528 assert_ok!(TemplateModule::set_public_access_mode(1529 origin1.clone(),1530 collection_id,1531 AccessMode::AllowList1532 ));1533 assert_ok!(TemplateModule::set_mint_permission(1534 origin1,1535 collection_id,1536 false1537 ));15381539 let data = default_nft_data();1540 create_test_item(collection_id, &data.into());1541 });1542}15431544// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1545#[test]1546fn allow_list_test_10() {1547 new_test_ext().execute_with(|| {1548 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15491550 let origin1 = Origin::signed(1);1551 let origin2 = Origin::signed(2);15521553 assert_ok!(TemplateModule::set_public_access_mode(1554 origin1.clone(),1555 collection_id,1556 AccessMode::AllowList1557 ));1558 assert_ok!(TemplateModule::set_mint_permission(1559 origin1.clone(),1560 collection_id,1561 false1562 ));15631564 assert_ok!(TemplateModule::add_collection_admin(1565 origin1,1566 collection_id,1567 account(2)1568 ));15691570 assert_ok!(TemplateModule::create_item(1571 origin2,1572 collection_id,1573 account(2),1574 default_nft_data().into()1575 ));1576 });1577}15781579// 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.1580#[test]1581fn allow_list_test_11() {1582 new_test_ext().execute_with(|| {1583 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15841585 let origin1 = Origin::signed(1);1586 let origin2 = Origin::signed(2);15871588 assert_ok!(TemplateModule::set_public_access_mode(1589 origin1.clone(),1590 collection_id,1591 AccessMode::AllowList1592 ));1593 assert_ok!(TemplateModule::set_mint_permission(1594 origin1.clone(),1595 collection_id,1596 false1597 ));1598 assert_ok!(TemplateModule::add_to_allow_list(1599 origin1,1600 collection_id,1601 account(2)1602 ));16031604 assert_noop!(1605 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1606 CommonError::<Test>::PublicMintingNotAllowed1607 );1608 });1609}16101611// 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.1612#[test]1613fn allow_list_test_12() {1614 new_test_ext().execute_with(|| {1615 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16161617 let origin1 = Origin::signed(1);1618 let origin2 = Origin::signed(2);16191620 assert_ok!(TemplateModule::set_public_access_mode(1621 origin1.clone(),1622 collection_id,1623 AccessMode::AllowList1624 ));1625 assert_ok!(TemplateModule::set_mint_permission(1626 origin1,1627 collection_id,1628 false1629 ));16301631 assert_noop!(1632 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()).map_err(|e| e.error),1633 CommonError::<Test>::PublicMintingNotAllowed1634 );1635 });1636}16371638// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1639#[test]1640fn allow_list_test_13() {1641 new_test_ext().execute_with(|| {1642 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16431644 let origin1 = Origin::signed(1);16451646 assert_ok!(TemplateModule::set_public_access_mode(1647 origin1.clone(),1648 collection_id,1649 AccessMode::AllowList1650 ));1651 assert_ok!(TemplateModule::set_mint_permission(1652 origin1,1653 collection_id,1654 true1655 ));16561657 let data = default_nft_data();1658 create_test_item(collection_id, &data.into());1659 });1660}16611662// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1663#[test]1664fn allow_list_test_14() {1665 new_test_ext().execute_with(|| {1666 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16671668 let origin1 = Origin::signed(1);1669 let origin2 = Origin::signed(2);16701671 assert_ok!(TemplateModule::set_public_access_mode(1672 origin1.clone(),1673 collection_id,1674 AccessMode::AllowList1675 ));1676 assert_ok!(TemplateModule::set_mint_permission(1677 origin1.clone(),1678 collection_id,1679 true1680 ));16811682 assert_ok!(TemplateModule::add_collection_admin(1683 origin1,1684 collection_id,1685 account(2)1686 ));16871688 assert_ok!(TemplateModule::create_item(1689 origin2,1690 collection_id,1691 account(2),1692 default_nft_data().into()1693 ));1694 });1695}16961697// 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.1698#[test]1699fn allow_list_test_15() {1700 new_test_ext().execute_with(|| {1701 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17021703 let origin1 = Origin::signed(1);1704 let origin2 = Origin::signed(2);17051706 assert_ok!(TemplateModule::set_public_access_mode(1707 origin1.clone(),1708 collection_id,1709 AccessMode::AllowList1710 ));1711 assert_ok!(TemplateModule::set_mint_permission(1712 origin1,1713 collection_id,1714 true1715 ));17161717 assert_noop!(1718 TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()).map_err(|e| e.error),1719 CommonError::<Test>::AddressNotInAllowlist1720 );1721 });1722}17231724// 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.1725#[test]1726fn allow_list_test_16() {1727 new_test_ext().execute_with(|| {1728 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17291730 let origin1 = Origin::signed(1);1731 let origin2 = Origin::signed(2);17321733 assert_ok!(TemplateModule::set_public_access_mode(1734 origin1.clone(),1735 collection_id,1736 AccessMode::AllowList1737 ));1738 assert_ok!(TemplateModule::set_mint_permission(1739 origin1.clone(),1740 collection_id,1741 true1742 ));1743 assert_ok!(TemplateModule::add_to_allow_list(1744 origin1,1745 collection_id,1746 account(2)1747 ));17481749 assert_ok!(TemplateModule::create_item(1750 origin2,1751 collection_id,1752 account(2),1753 default_nft_data().into()1754 ));1755 });1756}17571758// Total number of collections. Positive test1759#[test]1760fn total_number_collections_bound() {1761 new_test_ext().execute_with(|| {1762 create_test_collection(&CollectionMode::NFT, CollectionId(1));1763 });1764}17651766#[test]1767fn create_max_collections() {1768 new_test_ext().execute_with(|| {1769 for i in 1..=COLLECTION_NUMBER_LIMIT {1770 create_test_collection(&CollectionMode::NFT, CollectionId(i));1771 }1772 });1773}17741775// Total number of collections. Negative test1776#[test]1777fn total_number_collections_bound_neg() {1778 new_test_ext().execute_with(|| {1779 let origin1 = Origin::signed(1);17801781 for i in 1..=COLLECTION_NUMBER_LIMIT {1782 create_test_collection(&CollectionMode::NFT, CollectionId(i));1783 }17841785 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1786 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1787 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17881789 // 11-th collection in chain. Expects error1790 assert_noop!(1791 TemplateModule::create_collection(1792 origin1,1793 col_name1,1794 col_desc1,1795 token_prefix1,1796 CollectionMode::NFT1797 ),1798 CommonError::<Test>::TotalCollectionsLimitExceeded1799 );1800 });1801}18021803// Owned tokens by a single address. Positive test1804#[test]1805fn owned_tokens_bound() {1806 new_test_ext().execute_with(|| {1807 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18081809 let data = default_nft_data();1810 create_test_item(collection_id, &data.clone().into());1811 create_test_item(collection_id, &data.into());1812 });1813}18141815// Owned tokens by a single address. Negotive test1816#[test]1817fn owned_tokens_bound_neg() {1818 new_test_ext().execute_with(|| {1819 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18201821 let origin1 = Origin::signed(1);18221823 for _ in 1..=MAX_TOKEN_OWNERSHIP {1824 let data = default_nft_data();1825 create_test_item(collection_id, &data.clone().into());1826 }18271828 let data = default_nft_data();1829 assert_noop!(1830 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()).map_err(|e| e.error),1831 CommonError::<Test>::AccountTokenLimitExceeded1832 );1833 });1834}18351836// Number of collection admins. Positive test1837#[test]1838fn collection_admins_bound() {1839 new_test_ext().execute_with(|| {1840 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18411842 let origin1 = Origin::signed(1);18431844 assert_ok!(TemplateModule::add_collection_admin(1845 origin1.clone(),1846 collection_id,1847 account(2)1848 ));1849 assert_ok!(TemplateModule::add_collection_admin(1850 origin1,1851 collection_id,1852 account(3)1853 ));1854 });1855}18561857// Number of collection admins. Negotive test1858#[test]1859fn collection_admins_bound_neg() {1860 new_test_ext().execute_with(|| {1861 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18621863 let origin1 = Origin::signed(1);18641865 for i in 0..COLLECTION_ADMINS_LIMIT {1866 assert_ok!(TemplateModule::add_collection_admin(1867 origin1.clone(),1868 collection_id,1869 account((2 + i).into())1870 ));1871 }1872 assert_noop!(1873 TemplateModule::add_collection_admin(1874 origin1,1875 collection_id,1876 account((3 + COLLECTION_ADMINS_LIMIT).into())1877 ),1878 CommonError::<Test>::CollectionAdminCountExceeded1879 );1880 });1881}1882// #endregion18831884#[test]1885fn set_const_on_chain_schema() {1886 new_test_ext().execute_with(|| {1887 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18881889 let origin1 = Origin::signed(1);1890 assert_ok!(TemplateModule::set_const_on_chain_schema(1891 origin1,1892 collection_id,1893 b"test const on chain schema".to_vec()1894 ));18951896 assert_eq!(1897 <pallet_common::CollectionById<Test>>::get(collection_id)1898 .unwrap()1899 .const_on_chain_schema,1900 b"test const on chain schema".to_vec()1901 );1902 assert_eq!(1903 <pallet_common::CollectionById<Test>>::get(collection_id)1904 .unwrap()1905 .variable_on_chain_schema,1906 b"".to_vec()1907 );1908 });1909}19101911#[test]1912fn set_variable_on_chain_schema() {1913 new_test_ext().execute_with(|| {1914 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19151916 let origin1 = Origin::signed(1);1917 assert_ok!(TemplateModule::set_variable_on_chain_schema(1918 origin1,1919 collection_id,1920 b"test variable on chain schema".to_vec()1921 ));19221923 assert_eq!(1924 <pallet_common::CollectionById<Test>>::get(collection_id)1925 .unwrap()1926 .const_on_chain_schema,1927 b"".to_vec()1928 );1929 assert_eq!(1930 <pallet_common::CollectionById<Test>>::get(collection_id)1931 .unwrap()1932 .variable_on_chain_schema,1933 b"test variable on chain schema".to_vec()1934 );1935 });1936}19371938#[test]1939fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1940 new_test_ext().execute_with(|| {1941 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19421943 let origin1 = Origin::signed(1);19441945 let data = default_nft_data();1946 create_test_item(CollectionId(1), &data.into());19471948 let variable_data = b"test data".to_vec();1949 assert_ok!(TemplateModule::set_variable_meta_data(1950 origin1,1951 collection_id,1952 TokenId(1),1953 variable_data.clone()1954 ));19551956 assert_eq!(1957 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1958 .unwrap()1959 .variable_data,1960 variable_data1961 );1962 });1963}19641965#[test]1966fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1967 new_test_ext().execute_with(|| {1968 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19691970 let origin1 = Origin::signed(1);19711972 let data = default_re_fungible_data();1973 create_test_item(collection_id, &data.into());19741975 let variable_data = b"test data".to_vec();1976 assert_ok!(TemplateModule::set_variable_meta_data(1977 origin1,1978 collection_id,1979 TokenId(1),1980 variable_data.clone()1981 ));19821983 assert_eq!(1984 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1985 .variable_data,1986 variable_data1987 );1988 });1989}19901991#[test]1992fn set_variable_meta_data_on_fungible_token_fails() {1993 new_test_ext().execute_with(|| {1994 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));19951996 let origin1 = Origin::signed(1);19971998 let data = default_fungible_data();1999 create_test_item(collection_id, &data.into());20002001 let variable_data = b"test data".to_vec();2002 assert_noop!(2003 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(0), variable_data).map_err(|e| e.error),2004 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2005 );2006 });2007}20082009#[test]2010fn set_variable_meta_data_on_fungible_token_with_token_id_fails() {2011 new_test_ext().execute_with(|| {2012 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));20132014 let origin1 = Origin::signed(1);20152016 let data = default_fungible_data();2017 create_test_item(collection_id, &data.into());20182019 let variable_data = b"test data".to_vec();2020 assert_noop!(2021 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2022 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId2023 );2024 });2025}20262027#[test]2028fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2029 new_test_ext().execute_with(|| {2030 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20312032 let origin1 = Origin::signed(1);20332034 let data = default_nft_data();2035 create_test_item(collection_id, &data.into());20362037 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2038 assert_noop!(2039 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2040 CommonError::<Test>::TokenVariableDataLimitExceeded2041 );2042 });2043}20442045#[test]2046fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2047 new_test_ext().execute_with(|| {2048 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));20492050 let origin1 = Origin::signed(1);20512052 let data = default_re_fungible_data();2053 create_test_item(collection_id, &data.into());20542055 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2056 assert_noop!(2057 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data).map_err(|e| e.error),2058 CommonError::<Test>::TokenVariableDataLimitExceeded2059 );2060 });2061}20622063#[test]2064fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2065 new_test_ext().execute_with(|| {2066 //default_limits();20672068 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20692070 let origin1 = Origin::signed(1);20712072 let data = default_nft_data();2073 create_test_item(collection_id, &data.into());20742075 assert_ok!(TemplateModule::set_meta_update_permission_flag(2076 origin1.clone(),2077 collection_id,2078 MetaUpdatePermission::ItemOwner,2079 ));20802081 let variable_data = b"ten chars.".to_vec();2082 assert_ok!(TemplateModule::set_variable_meta_data(2083 origin1,2084 collection_id,2085 TokenId(1),2086 variable_data.clone()2087 ));20882089 assert_eq!(2090 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2091 .unwrap()2092 .variable_data,2093 variable_data2094 );2095 });2096}20972098#[test]2099fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2100 new_test_ext().execute_with(|| {2101 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));21022103 let origin1 = Origin::signed(1);21042105 assert_ok!(TemplateModule::set_mint_permission(2106 origin1.clone(),2107 collection_id,2108 true2109 ));2110 assert_ok!(TemplateModule::add_to_allow_list(2111 origin1.clone(),2112 collection_id,2113 account(1)2114 ));21152116 let data = default_nft_data();2117 create_test_item(collection_id, &data.into());21182119 assert_ok!(TemplateModule::set_meta_update_permission_flag(2120 origin1.clone(),2121 collection_id,2122 MetaUpdatePermission::ItemOwner,2123 ));21242125 let variable_data = b"1234567890123".to_vec();2126 assert_noop!(2127 TemplateModule::set_variable_meta_data(2128 origin1,2129 collection_id,2130 TokenId(1),2131 variable_data.clone()2132 ).map_err(|e| e.error),2133 CommonError::<Test>::TokenVariableDataLimitExceeded2134 );2135 })2136}21372138#[test]2139fn collection_transfer_flag_works() {2140 new_test_ext().execute_with(|| {2141 let origin1 = Origin::signed(1);21422143 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2144 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));21452146 let data = default_nft_data();2147 create_test_item(collection_id, &data.into());2148 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2149 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);21502151 let origin1 = Origin::signed(1);21522153 // default scenario2154 assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1));2155 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2156 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2157 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2158 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2159 });2160}21612162#[test]2163fn set_variable_meta_data_on_nft_with_admin_flag() {2164 new_test_ext().execute_with(|| {2165 // default_limits();21662167 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21682169 let origin1 = Origin::signed(1);2170 let origin2 = Origin::signed(2);21712172 assert_ok!(TemplateModule::set_mint_permission(2173 origin2.clone(),2174 collection_id,2175 true2176 ));2177 assert_ok!(TemplateModule::add_to_allow_list(2178 origin2.clone(),2179 collection_id,2180 account(1)2181 ));21822183 assert_ok!(TemplateModule::add_collection_admin(2184 origin2.clone(),2185 collection_id,2186 account(1)2187 ));21882189 let data = default_nft_data();2190 create_test_item(collection_id, &data.into());21912192 assert_ok!(TemplateModule::set_meta_update_permission_flag(2193 origin2.clone(),2194 collection_id,2195 MetaUpdatePermission::Admin,2196 ));21972198 let variable_data = b"test.".to_vec();2199 assert_ok!(TemplateModule::set_variable_meta_data(2200 origin1,2201 collection_id,2202 TokenId(1),2203 variable_data.clone()2204 ));22052206 assert_eq!(2207 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2208 .unwrap()2209 .variable_data,2210 variable_data2211 );2212 });2213}22142215#[test]2216fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2217 new_test_ext().execute_with(|| {2218 // default_limits();22192220 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22212222 let origin1 = Origin::signed(1);2223 let origin2 = Origin::signed(2);22242225 assert_ok!(TemplateModule::set_mint_permission(2226 origin2.clone(),2227 collection_id,2228 true2229 ));2230 assert_ok!(TemplateModule::add_to_allow_list(2231 origin2.clone(),2232 collection_id,2233 account(1)2234 ));22352236 let data = default_nft_data();2237 create_test_item(collection_id, &data.into());22382239 assert_ok!(TemplateModule::set_meta_update_permission_flag(2240 origin2.clone(),2241 collection_id,2242 MetaUpdatePermission::Admin,2243 ));22442245 let variable_data = b"test.".to_vec();2246 assert_noop!(2247 TemplateModule::set_variable_meta_data(2248 origin1,2249 collection_id,2250 TokenId(1),2251 variable_data.clone()2252 ).map_err(|e| e.error),2253 CommonError::<Test>::NoPermission2254 );2255 });2256}22572258#[test]2259fn set_variable_meta_flag_after_freeze() {2260 new_test_ext().execute_with(|| {2261 // default_limits();22622263 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));22642265 let origin2 = Origin::signed(2);22662267 assert_ok!(TemplateModule::set_meta_update_permission_flag(2268 origin2.clone(),2269 collection_id,2270 MetaUpdatePermission::None,2271 ));2272 assert_noop!(2273 TemplateModule::set_meta_update_permission_flag(2274 origin2.clone(),2275 collection_id,2276 MetaUpdatePermission::Admin2277 ),2278 CommonError::<Test>::MetadataFlagFrozen2279 );2280 });2281}22822283#[test]2284fn set_variable_meta_data_on_nft_with_none_flag_neg() {2285 new_test_ext().execute_with(|| {2286 // default_limits();22872288 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2289 let origin1 = Origin::signed(1);22902291 let data = default_nft_data();2292 create_test_item(collection_id, &data.into());22932294 assert_ok!(TemplateModule::set_meta_update_permission_flag(2295 origin1.clone(),2296 collection_id,2297 MetaUpdatePermission::None,2298 ));22992300 let variable_data = b"test.".to_vec();2301 assert_noop!(2302 TemplateModule::set_variable_meta_data(2303 origin1.clone(),2304 collection_id,2305 TokenId(1),2306 variable_data.clone()2307 ).map_err(|e| e.error),2308 CommonError::<Test>::NoPermission2309 );2310 });2311}23122313#[test]2314fn collection_transfer_flag_works_neg() {2315 new_test_ext().execute_with(|| {2316 let origin1 = Origin::signed(1);23172318 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2319 assert_ok!(TemplateModule::set_transfers_enabled_flag(2320 origin1, collection_id, false2321 ));23222323 let data = default_nft_data();2324 create_test_item(collection_id, &data.into());2325 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2326 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);23272328 let origin1 = Origin::signed(1);23292330 // default scenario2331 assert_noop!(2332 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),2333 CommonError::<Test>::TransferNotAllowed2334 );2335 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2336 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2337 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2338 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2339 });2340}pallets/scheduler/src/lib.rsdiffbeforeafterboth--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -795,8 +795,8 @@
use super::*;
use frame_support::{
- Hashable, assert_err, assert_noop, assert_ok, ord_parameter_types, parameter_types,
- traits::{Contains, OnFinalize, OnInitialize},
+ ord_parameter_types, parameter_types,
+ traits::Contains,
weights::constants::RocksDbWeight,
};
use sp_core::H256;
@@ -806,7 +806,6 @@
traits::{BlakeTwo256, IdentityLookup},
};
use frame_system::{EnsureOneOf, EnsureRoot, EnsureSignedBy};
- use substrate_test_utils::assert_eq_uvec;
use crate as scheduler;
mod logger {
@@ -815,9 +814,6 @@
thread_local! {
static LOG: RefCell<Vec<(OriginCaller, u32)>> = RefCell::new(Vec::new());
- }
- pub fn log() -> Vec<(OriginCaller, u32)> {
- LOG.with(|log| log.borrow().clone())
}
pub trait Config: system::Config {
type Event: From<Event> + Into<<Self as system::Config>::Event>;
@@ -928,24 +924,5 @@
type MaxScheduledPerBlock = MaxScheduledPerBlock;
type WeightInfo = ();
type SponsorshipHandler = ();
- }
-
- pub fn new_test_ext() -> sp_io::TestExternalities {
- let t = system::GenesisConfig::default()
- .build_storage::<Test>()
- .unwrap();
- t.into()
- }
-
- fn run_to_block(n: u64) {
- while System::block_number() < n {
- Scheduler::on_finalize(System::block_number());
- System::set_block_number(System::block_number() + 1);
- Scheduler::on_initialize(System::block_number());
- }
- }
-
- fn root() -> OriginCaller {
- system::RawOrigin::Root.into()
}
}
primitives/nft/src/lib.rsdiffbeforeafterboth--- a/primitives/nft/src/lib.rs
+++ b/primitives/nft/src/lib.rs
@@ -29,10 +29,14 @@
pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
pub const MAX_REFUNGIBLE_PIECES: u128 = 1_000_000_000_000_000_000_000;
pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;
-pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;
+pub const MAX_TOKEN_OWNERSHIP: u32 = if cfg!(not(feature = "limit-testing")) {
+ 10_000_000
+} else {
+ 10
+};
pub const COLLECTION_NUMBER_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
- 100000
+ 100_000
} else {
10
};
@@ -44,7 +48,7 @@
pub const COLLECTION_ADMINS_LIMIT: u32 = 5;
pub const COLLECTION_TOKEN_LIMIT: u32 = u32::MAX;
pub const ACCOUNT_TOKEN_OWNERSHIP_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
- 1000000
+ 1_000_000
} else {
10
};