difftreelog
NFTPAR-164. Schema version
in: master
4 files changed
node/Cargo.tomldiffbeforeafterboth--- a/node/Cargo.toml
+++ b/node/Cargo.toml
@@ -23,6 +23,7 @@
[dependencies]
futures = '0.3.4'
log = '0.4.8'
+flexi_logger = "0.15.7"
parking_lot = '0.10.0'
structopt = '0.3.8'
jsonrpc-core = '15.0.0'
node/src/chain_spec.rsdiffbeforeafterboth--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -167,7 +167,8 @@
description: vec![],
token_prefix: vec![],
mint_mode: false,
- offchain_schema: vec![],
+ offchain_schema: vec![],
+ schema_version: SchemaVersion::default(),
sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
const_on_chain_schema: vec![],
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -1,3 +1,5 @@
+#![recursion_limit = "1024"]
+
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "std")]
@@ -54,7 +56,6 @@
pub type CollectionId = u32;
pub type TokenId = u32;
-
pub type DecimalPoints = u8;
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
@@ -97,6 +98,18 @@
}
}
+#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub enum SchemaVersion {
+ ImageURL,
+ Unique,
+}
+impl Default for SchemaVersion {
+ fn default() -> Self {
+ Self::ImageURL
+ }
+}
+
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct Ownership<AccountId> {
@@ -116,6 +129,7 @@
pub token_prefix: Vec<u8>, // 16 include null escape char
pub mint_mode: bool,
pub offchain_schema: Vec<u8>,
+ pub schema_version: SchemaVersion,
pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender
pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship
pub limits: CollectionLimits, // Collection private restrictions
@@ -258,7 +272,7 @@
pub enum CreateItemData {
NFT(CreateNftData),
Fungible(CreateFungibleData),
- ReFungible(CreateReFungibleData)
+ ReFungible(CreateReFungibleData),
}
impl CreateItemData {
@@ -570,6 +584,7 @@
decimal_points: decimal_points,
token_prefix: prefix,
offchain_schema: Vec::new(),
+ schema_version: SchemaVersion::ImageURL,
sponsor: T::AccountId::default(),
unconfirmed_sponsor: T::AccountId::default(),
variable_on_chain_schema: Vec::new(),
@@ -1200,7 +1215,6 @@
Ok(())
}
- ///
#[weight = 0]
pub fn safe_transfer_from(origin, collection_id: CollectionId, item_id: TokenId, new_owner: T::AccountId) -> DispatchResult {
@@ -1259,7 +1273,35 @@
Ok(())
}
-
+
+ /// Set schema standard
+ /// ImageURL
+ /// Unique
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: SchemaVersion: enum
+ #[weight = 0]
+ pub fn set_schema_version(
+ origin,
+ collection_id: CollectionId,
+ version: SchemaVersion
+ ) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
+ Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
+ let mut target_collection = <Collection<T>>::get(collection_id);
+ target_collection.schema_version = version;
+ <Collection<T>>::insert(collection_id, target_collection);
+
+ Ok(())
+ }
/// Set off-chain data schema.
///
@@ -1458,7 +1500,7 @@
impl<T: Trait> Module<T> {
fn is_correct_transfer(collection_id: CollectionId, collection: &CollectionType<T::AccountId>, recipient: &T::AccountId) -> DispatchResult {
-
+
// check token limit and account token limit
let account_items: u32 = <AddressTokens<T>>::get(collection_id, recipient).len() as u32;
ensure!(collection.limits.account_token_ownership_limit > account_items, Error::<T>::AccountTokenLimitExceeded);
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5 Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6 CollectionId, TokenId, MAX_DECIMAL_POINTS};7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11 1012}1314fn default_limits() {15 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16 collection_numbers_limit: default_collection_numbers_limit(),17 account_token_ownership_limit: 10,18 collections_admins_limit: 5,19 custom_data_limit: 2048,20 nft_sponsor_transfer_timeout: 15,21 fungible_sponsor_transfer_timeout: 15,22 refungible_sponsor_transfer_timeout: 15, 23 }));24}2526fn default_nft_data() -> CreateNftData {27 CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31 CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> 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.clone(),46 col_name1.clone(),47 col_desc1.clone(),48 token_prefix1.clone(),49 mode.clone()50 ));5152 let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53 let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54 let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55 assert_eq!(TemplateModule::collection(id).owner, owner);56 assert_eq!(TemplateModule::collection(id).name, saved_col_name);57 assert_eq!(TemplateModule::collection(id).mode, *mode);58 assert_eq!(TemplateModule::collection(id).description, saved_description);59 assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60 id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64 create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68 let origin1 = Origin::signed(1);69 assert_ok!(TemplateModule::create_item(70 origin1.clone(),71 collection_id,72 1,73 data.clone()74 ));7576}7778// Use cases tests region79// #region80#[test]81fn create_fungible_collection_fails_with_large_decimal_numbers() {82 new_test_ext().execute_with(|| {83 default_limits();8485 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();86 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();87 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();8889 let origin1 = Origin::signed(1);90 assert_noop!(TemplateModule::create_collection(91 origin1,92 col_name1,93 col_desc1,94 token_prefix1,95 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)96 ), Error::<Test>::CollectionDecimalPointLimitExceeded);97 }); 98}99100#[test]101fn create_re_fungible_collection_fails_with_large_decimal_numbers() {102 new_test_ext().execute_with(|| {103 default_limits();104105 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();106 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();107 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();108109 let origin1 = Origin::signed(1);110 assert_noop!(TemplateModule::create_collection(111 origin1,112 col_name1,113 col_desc1,114 token_prefix1,115 CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)116 ), Error::<Test>::CollectionDecimalPointLimitExceeded);117 });118}119120#[test]121fn create_nft_item() {122 new_test_ext().execute_with(|| {123 default_limits();124 let collection_id = create_test_collection(&CollectionMode::NFT, 1);125 126 let data = default_nft_data();127 create_test_item(collection_id, &data.clone().into());128 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);129 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);130 });131}132133// Use cases tests region134// #region135#[test]136fn create_nft_multiple_items() {137 new_test_ext().execute_with(|| {138 default_limits();139 140 create_test_collection(&CollectionMode::NFT, 1);141142 let origin1 = Origin::signed(1);143144 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];145146 assert_ok!(TemplateModule::create_multiple_items(147 origin1.clone(),148 1,149 1,150 items_data.clone().into_iter().map(|d| { d.into() }).collect()151 ));152 for (index, data) in items_data.iter().enumerate() {153 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);154 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);155 }156 });157}158159#[test]160fn create_refungible_item() {161 new_test_ext().execute_with(|| {162 default_limits();163 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);164165 let data = default_re_fungible_data();166 create_test_item(collection_id, &data.clone().into());167 assert_eq!(168 TemplateModule::refungible_item_id(collection_id, 1).const_data,169 data.const_data170 );171 assert_eq!(172 TemplateModule::refungible_item_id(collection_id, 1).variable_data,173 data.variable_data174 );175 assert_eq!(176 TemplateModule::refungible_item_id(collection_id, 1).owner[0],177 Ownership {178 owner: 1,179 fraction: 1000180 }181 );182 });183}184185#[test]186fn create_multiple_refungible_items() {187 new_test_ext().execute_with(|| {188 default_limits();189 190 create_test_collection(&CollectionMode::ReFungible(3), 1);191192 let origin1 = Origin::signed(1);193194 let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];195196 assert_ok!(TemplateModule::create_multiple_items(197 origin1.clone(),198 1,199 1,200 items_data.clone().into_iter().map(|d| { d.into() }).collect()201 ));202 for (index, data) in items_data.iter().enumerate() {203204 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);205 assert_eq!(item.const_data.to_vec(), data.const_data);206 assert_eq!(item.variable_data.to_vec(), data.variable_data);207 assert_eq!(208 item.owner[0],209 Ownership {210 owner: 1,211 fraction: 1000212 }213 );214 }215 });216}217218#[test]219fn create_fungible_item() {220 new_test_ext().execute_with(|| {221 default_limits();222 223 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);224225 let data = default_fungible_data();226 create_test_item(collection_id, &data.into());227228 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);229 });230}231232#[test]233fn create_multiple_fungible_items() {234 new_test_ext().execute_with(|| {235 default_limits();236237 create_test_collection(&CollectionMode::Fungible(3), 1);238239 let origin1 = Origin::signed(1);240241 let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];242243 assert_ok!(TemplateModule::create_multiple_items(244 origin1.clone(),245 1,246 1,247 items_data.clone().into_iter().map(|d| { d.into() }).collect()248 ));249 250 for (index, _) in items_data.iter().enumerate() {251 assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);252 }253 assert_eq!(TemplateModule::balance_count(1, 1), 3000);254 assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);255 });256}257258#[test]259fn transfer_fungible_item() {260 new_test_ext().execute_with(|| {261 default_limits();262 263 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);264265 let origin1 = Origin::signed(1);266 let origin2 = Origin::signed(2);267268 let data = default_fungible_data();269 create_test_item(collection_id, &data.into());270271 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);272 assert_eq!(TemplateModule::balance_count(1, 1), 1000);273 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);274275 // change owner scenario276 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));277 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);278 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);279 assert_eq!(TemplateModule::balance_count(1, 1), 0);280 assert_eq!(TemplateModule::balance_count(1, 2), 1000);281 // assert_eq!(TemplateModule::address_tokens(1, 1), []);282 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);283284 // split item scenario285 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));286 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);287 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);288 assert_eq!(TemplateModule::balance_count(1, 2), 500);289 assert_eq!(TemplateModule::balance_count(1, 3), 500);290 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);291 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);292293 // split item and new owner has account scenario294 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));295 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);296 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);297 assert_eq!(TemplateModule::balance_count(1, 2), 300);298 assert_eq!(TemplateModule::balance_count(1, 3), 700);299 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);300 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);301 });302}303304#[test]305fn transfer_refungible_item() {306 new_test_ext().execute_with(|| {307 default_limits();308 309 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);310311 let data = default_re_fungible_data();312 create_test_item(collection_id, &data.clone().into());313314 let origin1 = Origin::signed(1);315 let origin2 = Origin::signed(2);316 assert_eq!(317 TemplateModule::refungible_item_id(collection_id, 1).const_data,318 data.const_data319 );320 assert_eq!(321 TemplateModule::refungible_item_id(collection_id, 1).variable_data,322 data.variable_data323 );324 assert_eq!(325 TemplateModule::refungible_item_id(collection_id, 1).owner[0],326 Ownership {327 owner: 1,328 fraction: 1000329 }330 );331 assert_eq!(TemplateModule::balance_count(1, 1), 1000);332 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);333334 // change owner scenario335 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));336 assert_eq!(337 TemplateModule::refungible_item_id(1, 1).owner[0],338 Ownership {339 owner: 2,340 fraction: 1000341 }342 );343 assert_eq!(TemplateModule::balance_count(1, 1), 0);344 assert_eq!(TemplateModule::balance_count(1, 2), 1000);345 // assert_eq!(TemplateModule::address_tokens(1, 1), []);346 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347348 // split item scenario349 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));350 assert_eq!(351 TemplateModule::refungible_item_id(1, 1).owner[0],352 Ownership {353 owner: 2,354 fraction: 500355 }356 );357 assert_eq!(358 TemplateModule::refungible_item_id(1, 1).owner[1],359 Ownership {360 owner: 3,361 fraction: 500362 }363 );364 assert_eq!(TemplateModule::balance_count(1, 2), 500);365 assert_eq!(TemplateModule::balance_count(1, 3), 500);366 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);367 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);368369 // split item and new owner has account scenario370 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));371 assert_eq!(372 TemplateModule::refungible_item_id(1, 1).owner[0],373 Ownership {374 owner: 2,375 fraction: 300376 }377 );378 assert_eq!(379 TemplateModule::refungible_item_id(1, 1).owner[1],380 Ownership {381 owner: 3,382 fraction: 700383 }384 );385 assert_eq!(TemplateModule::balance_count(1, 2), 300);386 assert_eq!(TemplateModule::balance_count(1, 3), 700);387 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);388 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);389 });390}391392#[test]393fn transfer_nft_item() {394 new_test_ext().execute_with(|| {395 default_limits();396 397 let collection_id = create_test_collection(&CollectionMode::NFT, 1);398399 let data = default_nft_data();400 create_test_item(collection_id, &data.into());401 assert_eq!(TemplateModule::balance_count(1, 1), 1);402 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);403404 let origin1 = Origin::signed(1);405 // default scenario406 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));407 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);408 assert_eq!(TemplateModule::balance_count(1, 1), 0);409 assert_eq!(TemplateModule::balance_count(1, 2), 1);410 // assert_eq!(TemplateModule::address_tokens(1, 1), []);411 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);412 });413}414415#[test]416fn nft_approve_and_transfer_from() {417 new_test_ext().execute_with(|| {418 default_limits();419 420 let collection_id = create_test_collection(&CollectionMode::NFT, 1);421422 let data = default_nft_data();423 create_test_item(collection_id, &data.into());424425 let origin1 = Origin::signed(1);426 let origin2 = Origin::signed(2);427428 assert_eq!(TemplateModule::balance_count(1, 1), 1);429 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);430431 // neg transfer432 assert_noop!(TemplateModule::transfer_from(433 origin2.clone(),434 1,435 2,436 1,437 1,438 1), Error::<Test>::NoPermission);439440 // do approve441 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));442 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);443 assert_eq!(444 TemplateModule::approved(1, (1, 1))[0],445 ApprovePermissions {446 approved: 2,447 amount: 100000000448 }449 );450451 assert_ok!(TemplateModule::transfer_from(452 origin2.clone(),453 1,454 2,455 1,456 1,457 1458 ));459 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);460 });461}462463#[test]464fn nft_approve_and_transfer_from_white_list() {465 new_test_ext().execute_with(|| {466 default_limits();467 468 let collection_id = create_test_collection(&CollectionMode::NFT, 1);469470 let origin1 = Origin::signed(1);471 let origin2 = Origin::signed(2);472473 let data = default_nft_data();474 create_test_item(collection_id, &data.clone().into());475476 assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);477 assert_eq!(TemplateModule::balance_count(1, 1), 1);478 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480 assert_ok!(TemplateModule::set_mint_permission(481 origin1.clone(),482 1,483 true484 ));485 assert_ok!(TemplateModule::set_public_access_mode(486 origin1.clone(),487 1,488 AccessMode::WhiteList489 ));490 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));491 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));492 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));493494 // do approve495 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));496 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);497 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));498 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);499 assert_eq!(500 TemplateModule::approved(1, (1, 1))[0],501 ApprovePermissions {502 approved: 2,503 amount: 100000000504 }505 );506507 assert_ok!(TemplateModule::transfer_from(508 origin2.clone(),509 1,510 3,511 1,512 1,513 1514 ));515 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);516 });517}518519#[test]520fn refungible_approve_and_transfer_from() {521 new_test_ext().execute_with(|| {522 default_limits();523 524 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);525 526 let origin1 = Origin::signed(1);527 let origin2 = Origin::signed(2);528529 let data = default_re_fungible_data();530 create_test_item(collection_id, &data.into());531532 assert_eq!(TemplateModule::balance_count(1, 1), 1000);533 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);534535 assert_ok!(TemplateModule::set_mint_permission(536 origin1.clone(),537 1,538 true539 ));540 assert_ok!(TemplateModule::set_public_access_mode(541 origin1.clone(),542 1,543 AccessMode::WhiteList544 ));545 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));546 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));547 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));548549 // do approve550 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));551 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);552 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));553 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);554 assert_eq!(555 TemplateModule::approved(1, (1, 1))[0],556 ApprovePermissions {557 approved: 2,558 amount: 100000000559 }560 );561562 assert_ok!(TemplateModule::transfer_from(563 origin2.clone(),564 1,565 3,566 1,567 1,568 100569 ));570 assert_eq!(TemplateModule::balance_count(1, 1), 900);571 assert_eq!(TemplateModule::balance_count(1, 3), 100);572 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);573 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);574575 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);576 assert_eq!(577 TemplateModule::approved(1, (1, 1))[0],578 ApprovePermissions {579 approved: 3,580 amount: 100000000581 }582 );583 });584}585586#[test]587fn fungible_approve_and_transfer_from() {588 new_test_ext().execute_with(|| {589 default_limits();590 591 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);592 593 let data = default_fungible_data();594 create_test_item(collection_id, &data.into());595596 let origin1 = Origin::signed(1);597 let origin2 = Origin::signed(2);598599 assert_eq!(TemplateModule::balance_count(1, 1), 1000);600 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);601602 assert_ok!(TemplateModule::set_mint_permission(603 origin1.clone(),604 1,605 true606 ));607 assert_ok!(TemplateModule::set_public_access_mode(608 origin1.clone(),609 1,610 AccessMode::WhiteList611 ));612 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));613 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));614 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));615616 // do approve617 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));618 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);619 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));620 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);621 assert_eq!(622 TemplateModule::approved(1, (1, 1))[0],623 ApprovePermissions {624 approved: 2,625 amount: 100000000626 }627 );628629 assert_ok!(TemplateModule::transfer_from(630 origin2.clone(),631 1,632 3,633 1,634 1,635 100636 ));637 assert_eq!(TemplateModule::balance_count(1, 1), 900);638 assert_eq!(TemplateModule::balance_count(1, 3), 100);639 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);640 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);641642 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);643 assert_eq!(644 TemplateModule::approved(1, (1, 1))[0],645 ApprovePermissions {646 approved: 3,647 amount: 100000000648 }649 );650651 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));652 assert_ok!(TemplateModule::transfer_from(653 origin2.clone(),654 1,655 3,656 1,657 1,658 900659 ));660 assert_eq!(TemplateModule::balance_count(1, 1), 0);661 assert_eq!(TemplateModule::balance_count(1, 3), 1000);662 // assert_eq!(TemplateModule::address_tokens(1, 1), []);663 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);664665 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);666 });667}668669#[test]670fn change_collection_owner() {671 new_test_ext().execute_with(|| {672 default_limits();673 674 let collection_id = create_test_collection(&CollectionMode::NFT, 1);675 676 let origin1 = Origin::signed(1);677 assert_ok!(TemplateModule::change_collection_owner(678 origin1.clone(),679 collection_id,680 2681 ));682 assert_eq!(TemplateModule::collection(collection_id).owner, 2);683 });684}685686#[test]687fn destroy_collection() {688 new_test_ext().execute_with(|| {689 default_limits();690 691 let collection_id = create_test_collection(&CollectionMode::NFT, 1);692 693 let origin1 = Origin::signed(1);694 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));695 });696}697698#[test]699fn burn_nft_item() {700 new_test_ext().execute_with(|| {701 default_limits();702 703 let collection_id = create_test_collection(&CollectionMode::NFT, 1);704705 let origin1 = Origin::signed(1);706 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));707 708 let data = default_nft_data();709 create_test_item(collection_id, &data.into());710711 // check balance (collection with id = 1, user id = 1)712 assert_eq!(TemplateModule::balance_count(1, 1), 1);713714 // burn item715 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));716 assert_noop!(717 TemplateModule::burn_item(origin1.clone(), 1, 1),718 Error::<Test>::TokenNotFound719 );720721 assert_eq!(TemplateModule::balance_count(1, 1), 0);722 });723}724725#[test]726fn burn_fungible_item() {727 new_test_ext().execute_with(|| {728 default_limits();729 730 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);731 732 let origin1 = Origin::signed(1);733 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));734 735 let data = default_fungible_data();736 create_test_item(collection_id, &data.into());737738 // check balance (collection with id = 1, user id = 1)739 assert_eq!(TemplateModule::balance_count(1, 1), 1000);740741 // burn item742 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));743 assert_noop!(744 TemplateModule::burn_item(origin1.clone(), 1, 1),745 Error::<Test>::TokenNotFound746 );747748 assert_eq!(TemplateModule::balance_count(1, 1), 0);749 });750}751752#[test]753fn burn_refungible_item() {754 new_test_ext().execute_with(|| {755 default_limits();756 757 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);758 let origin1 = Origin::signed(1);759760 assert_ok!(TemplateModule::set_mint_permission(761 origin1.clone(),762 collection_id,763 true764 ));765 assert_ok!(TemplateModule::set_public_access_mode(766 origin1.clone(),767 collection_id,768 AccessMode::WhiteList769 ));770 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));771772 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));773 774 let data = default_re_fungible_data();775 create_test_item(collection_id, &data.into());776777 // check balance (collection with id = 1, user id = 2)778 assert_eq!(TemplateModule::balance_count(1, 1), 1000);779780 // burn item781 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));782 assert_noop!(783 TemplateModule::burn_item(origin1.clone(), 1, 1),784 Error::<Test>::TokenNotFound785 );786787 assert_eq!(TemplateModule::balance_count(1, 1), 0);788 });789}790791#[test]792fn add_collection_admin() {793 new_test_ext().execute_with(|| {794 default_limits();795 796 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);797 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);798 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);799 800 let origin1 = Origin::signed(1);801802 // collection admin803 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));804 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));805806 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);807 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);808 });809}810811#[test]812fn remove_collection_admin() {813 new_test_ext().execute_with(|| {814 default_limits();815 816 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);817 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);818 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);819820 let origin1 = Origin::signed(1);821 let origin2 = Origin::signed(2);822823 // collection admin824 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));825 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));826827 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);828 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);829830 // remove admin831 assert_ok!(TemplateModule::remove_collection_admin(832 origin2.clone(),833 1,834 3835 ));836 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);837 });838}839840#[test]841fn balance_of() {842 new_test_ext().execute_with(|| {843 default_limits();844 845 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);846 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);847 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);848 849 // check balance before850 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);851 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);852 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);853854 let nft_data = default_nft_data();855 create_test_item(nft_collection_id, &nft_data.into());856 857 let fungible_data = default_fungible_data();858 create_test_item(fungible_collection_id, &fungible_data.into());859 860 let re_fungible_data = default_re_fungible_data();861 create_test_item(re_fungible_collection_id, &re_fungible_data.into());862863 // check balance (collection with id = 1, user id = 1)864 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);865 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);866 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);867 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);868 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);869 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);870 });871}872873#[test]874fn approve() {875 new_test_ext().execute_with(|| {876 default_limits();877 878 let collection_id = create_test_collection(&CollectionMode::NFT, 1);879 880 let data = default_nft_data();881 create_test_item(collection_id, &data.into());882883 let origin1 = Origin::signed(1);884 885 // approve886 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));887 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);888 });889}890891#[test]892fn transfer_from() {893 new_test_ext().execute_with(|| {894 default_limits();895 896 let collection_id = create_test_collection(&CollectionMode::NFT, 1);897 let origin1 = Origin::signed(1);898 let origin2 = Origin::signed(2);899900 let data = default_nft_data();901 create_test_item(collection_id, &data.into());902903 // approve904 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));905 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);906907 assert_ok!(TemplateModule::set_mint_permission(908 origin1.clone(),909 1,910 true911 ));912 assert_ok!(TemplateModule::set_public_access_mode(913 origin1.clone(),914 1,915 AccessMode::WhiteList916 ));917 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));918 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));919 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));920921 assert_ok!(TemplateModule::transfer_from(922 origin2.clone(),923 1,924 2,925 1,926 1,927 1928 ));929930 // after transfer931 assert_eq!(TemplateModule::balance_count(1, 1), 0);932 assert_eq!(TemplateModule::balance_count(1, 2), 1);933 });934}935936// #endregion937938// Coverage tests region939// #region940941#[test]942fn owner_can_add_address_to_white_list() {943 new_test_ext().execute_with(|| {944 default_limits();945 946 let collection_id = create_test_collection(&CollectionMode::NFT, 1);947948 let origin1 = Origin::signed(1);949 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));950 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);951 });952}953954#[test]955fn admin_can_add_address_to_white_list() {956 new_test_ext().execute_with(|| {957 default_limits();958 959 let collection_id = create_test_collection(&CollectionMode::NFT, 1);960 let origin1 = Origin::signed(1);961 let origin2 = Origin::signed(2);962963 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));964 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));965 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);966 });967}968969#[test]970fn nonprivileged_user_cannot_add_address_to_white_list() {971 new_test_ext().execute_with(|| {972 default_limits();973 974 let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976 let origin2 = Origin::signed(2);977 assert_noop!(978 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),979 Error::<Test>::NoPermission980 );981 });982}983984#[test]985fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {986 new_test_ext().execute_with(|| {987 default_limits();988989 let origin1 = Origin::signed(1);990991 assert_noop!(992 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),993 Error::<Test>::CollectionNotFound994 );995 });996}997998#[test]999fn nobody_can_add_address_to_white_list_of_deleted_collection() {1000 new_test_ext().execute_with(|| {1001 default_limits();1002 1003 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10041005 let origin1 = Origin::signed(1);1006 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1007 assert_noop!(1008 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1009 Error::<Test>::CollectionNotFound1010 );1011 });1012}10131014// If address is already added to white list, nothing happens1015#[test]1016fn address_is_already_added_to_white_list() {1017 new_test_ext().execute_with(|| {1018 default_limits();1019 1020 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1021 let origin1 = Origin::signed(1);1022 1023 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1024 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1025 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1026 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1027 });1028}10291030#[test]1031fn owner_can_remove_address_from_white_list() {1032 new_test_ext().execute_with(|| {1033 default_limits();1034 1035 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10361037 let origin1 = Origin::signed(1);1038 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1039 assert_ok!(TemplateModule::remove_from_white_list(1040 origin1.clone(),1041 collection_id,1042 21043 ));1044 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1045 });1046}10471048#[test]1049fn admin_can_remove_address_from_white_list() {1050 new_test_ext().execute_with(|| {1051 default_limits();1052 1053 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1054 let origin1 = Origin::signed(1);1055 let origin2 = Origin::signed(2);10561057 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10581059 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1060 assert_ok!(TemplateModule::remove_from_white_list(1061 origin2.clone(),1062 collection_id,1063 31064 ));1065 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1066 });1067}10681069#[test]1070fn nonprivileged_user_cannot_remove_address_from_white_list() {1071 new_test_ext().execute_with(|| {1072 default_limits();1073 1074 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1075 let origin1 = Origin::signed(1);1076 let origin2 = Origin::signed(2);10771078 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1079 assert_noop!(1080 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1081 Error::<Test>::NoPermission1082 );1083 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1084 });1085}10861087#[test]1088fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1089 new_test_ext().execute_with(|| {1090 default_limits();1091 let origin1 = Origin::signed(1);10921093 assert_noop!(1094 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1095 Error::<Test>::CollectionNotFound1096 );1097 });1098}10991100#[test]1101fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1102 new_test_ext().execute_with(|| {1103 default_limits();1104 1105 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1106 let origin1 = Origin::signed(1);1107 let origin2 = Origin::signed(2);11081109 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1110 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1111 assert_noop!(1112 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1113 Error::<Test>::CollectionNotFound1114 );1115 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1116 });1117}11181119// If address is already removed from white list, nothing happens1120#[test]1121fn address_is_already_removed_from_white_list() {1122 new_test_ext().execute_with(|| {1123 default_limits();1124 1125 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1126 let origin1 = Origin::signed(1);11271128 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1129 assert_ok!(TemplateModule::remove_from_white_list(1130 origin1.clone(),1131 collection_id,1132 21133 ));1134 assert_ok!(TemplateModule::remove_from_white_list(1135 origin1.clone(),1136 collection_id,1137 21138 ));1139 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1140 });1141}11421143// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1144#[test]1145fn white_list_test_1() {1146 new_test_ext().execute_with(|| {1147 default_limits();1148 1149 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11501151 let origin1 = Origin::signed(1);1152 1153 let data = default_nft_data();1154 create_test_item(collection_id, &data.into());11551156 assert_ok!(TemplateModule::set_public_access_mode(1157 origin1.clone(),1158 collection_id,1159 AccessMode::WhiteList1160 ));1161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11621163 assert_noop!(1164 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1165 Error::<Test>::AddresNotInWhiteList1166 );1167 });1168}11691170#[test]1171fn white_list_test_2() {1172 new_test_ext().execute_with(|| {1173 default_limits();1174 1175 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1176 let origin1 = Origin::signed(1);1177 1178 let data = default_nft_data();1179 create_test_item(collection_id, &data.into());11801181 assert_ok!(TemplateModule::set_public_access_mode(1182 origin1.clone(),1183 collection_id,1184 AccessMode::WhiteList1185 ));1186 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1187 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11881189 // do approve1190 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1191 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11921193 assert_ok!(TemplateModule::remove_from_white_list(1194 origin1.clone(),1195 1,1196 11197 ));11981199 assert_noop!(1200 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1201 Error::<Test>::AddresNotInWhiteList1202 );1203 });1204}12051206// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1207#[test]1208fn white_list_test_3() {1209 new_test_ext().execute_with(|| {1210 default_limits();1211 1212 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12131214 let origin1 = Origin::signed(1);1215 1216 let data = default_nft_data();1217 create_test_item(collection_id, &data.into());12181219 assert_ok!(TemplateModule::set_public_access_mode(1220 origin1.clone(),1221 collection_id,1222 AccessMode::WhiteList1223 ));1224 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12251226 assert_noop!(1227 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1228 Error::<Test>::AddresNotInWhiteList1229 );1230 });1231}12321233#[test]1234fn white_list_test_4() {1235 new_test_ext().execute_with(|| {1236 default_limits();1237 1238 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12391240 let origin1 = Origin::signed(1);12411242 let data = default_nft_data();1243 create_test_item(collection_id, &data.into());12441245 assert_ok!(TemplateModule::set_public_access_mode(1246 origin1.clone(),1247 collection_id,1248 AccessMode::WhiteList1249 ));1250 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1251 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12521253 // do approve1254 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1255 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12561257 assert_ok!(TemplateModule::remove_from_white_list(1258 origin1.clone(),1259 collection_id,1260 21261 ));12621263 assert_noop!(1264 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1265 Error::<Test>::AddresNotInWhiteList1266 );1267 });1268}12691270// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1271#[test]1272fn white_list_test_5() {1273 new_test_ext().execute_with(|| {1274 default_limits();1275 1276 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12771278 let origin1 = Origin::signed(1);12791280 let data = default_nft_data();1281 create_test_item(collection_id, &data.into());12821283 assert_ok!(TemplateModule::set_public_access_mode(1284 origin1.clone(),1285 collection_id,1286 AccessMode::WhiteList1287 ));1288 assert_noop!(1289 TemplateModule::burn_item(origin1.clone(), 1, 1),1290 Error::<Test>::AddresNotInWhiteList1291 );1292 });1293}12941295// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1296#[test]1297fn white_list_test_6() {1298 new_test_ext().execute_with(|| {1299 default_limits();1300 1301 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13021303 let origin1 = Origin::signed(1);1304 assert_ok!(TemplateModule::set_public_access_mode(1305 origin1.clone(),1306 collection_id,1307 AccessMode::WhiteList1308 ));13091310 // do approve1311 assert_noop!(1312 TemplateModule::approve(origin1.clone(), 1, 1, 1),1313 Error::<Test>::AddresNotInWhiteList1314 );1315 });1316}13171318// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1319// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1320#[test]1321fn white_list_test_7() {1322 new_test_ext().execute_with(|| {1323 default_limits();1324 1325 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13261327 let data = default_nft_data();1328 create_test_item(collection_id, &data.into());1329 1330 let origin1 = Origin::signed(1);13311332 assert_ok!(TemplateModule::set_public_access_mode(1333 origin1.clone(),1334 collection_id,1335 AccessMode::WhiteList1336 ));1337 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1338 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13391340 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1341 });1342}13431344#[test]1345fn white_list_test_8() {1346 new_test_ext().execute_with(|| {1347 default_limits();1348 1349 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13501351 let data = default_nft_data();1352 create_test_item(collection_id, &data.into());1353 1354 let origin1 = Origin::signed(1);13551356 assert_ok!(TemplateModule::set_public_access_mode(1357 origin1.clone(),1358 collection_id,1359 AccessMode::WhiteList1360 ));1361 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1362 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13631364 // do approve1365 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1366 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13671368 assert_ok!(TemplateModule::transfer_from(1369 origin1.clone(),1370 1,1371 2,1372 1,1373 1,1374 11375 ));1376 });1377}13781379// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1380#[test]1381fn white_list_test_9() {1382 new_test_ext().execute_with(|| {1383 default_limits();1384 1385 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1386 let origin1 = Origin::signed(1);13871388 assert_ok!(TemplateModule::set_public_access_mode(1389 origin1.clone(),1390 collection_id,1391 AccessMode::WhiteList1392 ));1393 assert_ok!(TemplateModule::set_mint_permission(1394 origin1.clone(),1395 collection_id,1396 false1397 ));13981399 let data = default_nft_data();1400 create_test_item(collection_id, &data.into());1401 });1402}14031404// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1405#[test]1406fn white_list_test_10() {1407 new_test_ext().execute_with(|| {1408 default_limits();1409 1410 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14111412 let origin1 = Origin::signed(1);1413 let origin2 = Origin::signed(2);14141415 assert_ok!(TemplateModule::set_public_access_mode(1416 origin1.clone(),1417 collection_id,1418 AccessMode::WhiteList1419 ));1420 assert_ok!(TemplateModule::set_mint_permission(1421 origin1.clone(),1422 collection_id,1423 false1424 ));14251426 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14271428 assert_ok!(TemplateModule::create_item(1429 origin2.clone(),1430 collection_id,1431 2,1432 default_nft_data().into()1433 ));1434 });1435}14361437// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1438#[test]1439fn white_list_test_11() {1440 new_test_ext().execute_with(|| {1441 default_limits();1442 1443 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14441445 let origin1 = Origin::signed(1);1446 let origin2 = Origin::signed(2);14471448 assert_ok!(TemplateModule::set_public_access_mode(1449 origin1.clone(),1450 collection_id,1451 AccessMode::WhiteList1452 ));1453 assert_ok!(TemplateModule::set_mint_permission(1454 origin1.clone(),1455 collection_id,1456 false1457 ));1458 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14591460 assert_noop!(1461 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1462 Error::<Test>::PublicMintingNotAllowed1463 );1464 });1465}14661467// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1468#[test]1469fn white_list_test_12() {1470 new_test_ext().execute_with(|| {1471 default_limits();1472 1473 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14741475 let origin1 = Origin::signed(1);1476 let origin2 = Origin::signed(2);14771478 assert_ok!(TemplateModule::set_public_access_mode(1479 origin1.clone(),1480 collection_id,1481 AccessMode::WhiteList1482 ));1483 assert_ok!(TemplateModule::set_mint_permission(1484 origin1.clone(),1485 collection_id,1486 false1487 ));14881489 assert_noop!(1490 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1491 Error::<Test>::PublicMintingNotAllowed1492 );1493 });1494}14951496// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1497#[test]1498fn white_list_test_13() {1499 new_test_ext().execute_with(|| {1500 default_limits();1501 1502 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15031504 let origin1 = Origin::signed(1);15051506 assert_ok!(TemplateModule::set_public_access_mode(1507 origin1.clone(),1508 collection_id,1509 AccessMode::WhiteList1510 ));1511 assert_ok!(TemplateModule::set_mint_permission(1512 origin1.clone(),1513 collection_id,1514 true1515 ));15161517 let data = default_nft_data();1518 create_test_item(collection_id, &data.into());1519 });1520}15211522// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1523#[test]1524fn white_list_test_14() {1525 new_test_ext().execute_with(|| {1526 default_limits();1527 1528 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15291530 let origin1 = Origin::signed(1);1531 let origin2 = Origin::signed(2);15321533 assert_ok!(TemplateModule::set_public_access_mode(1534 origin1.clone(),1535 collection_id,1536 AccessMode::WhiteList1537 ));1538 assert_ok!(TemplateModule::set_mint_permission(1539 origin1.clone(),1540 collection_id,1541 true1542 ));15431544 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15451546 assert_ok!(TemplateModule::create_item(1547 origin2.clone(),1548 1,1549 2,1550 default_nft_data().into()1551 ));1552 });1553}15541555// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1556#[test]1557fn white_list_test_15() {1558 new_test_ext().execute_with(|| {1559 default_limits();1560 1561 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15621563 let origin1 = Origin::signed(1);1564 let origin2 = Origin::signed(2);15651566 assert_ok!(TemplateModule::set_public_access_mode(1567 origin1.clone(),1568 collection_id,1569 AccessMode::WhiteList1570 ));1571 assert_ok!(TemplateModule::set_mint_permission(1572 origin1.clone(),1573 collection_id,1574 true1575 ));15761577 assert_noop!(1578 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1579 Error::<Test>::AddresNotInWhiteList1580 );1581 });1582}15831584// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1585#[test]1586fn white_list_test_16() {1587 new_test_ext().execute_with(|| {1588 default_limits();1589 1590 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15911592 let origin1 = Origin::signed(1);1593 let origin2 = Origin::signed(2);15941595 assert_ok!(TemplateModule::set_public_access_mode(1596 origin1.clone(),1597 collection_id,1598 AccessMode::WhiteList1599 ));1600 assert_ok!(TemplateModule::set_mint_permission(1601 origin1.clone(),1602 collection_id,1603 true1604 ));1605 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16061607 assert_ok!(TemplateModule::create_item(1608 origin2.clone(),1609 1,1610 2,1611 default_nft_data().into()1612 ));1613 });1614}16151616// Total number of collections. Positive test1617#[test]1618fn total_number_collections_bound() {1619 new_test_ext().execute_with(|| {1620 default_limits();1621 1622 create_test_collection(&CollectionMode::NFT, 1);1623 });1624}16251626// Total number of collections. Negotive test1627#[test]1628fn total_number_collections_bound_neg() {1629 new_test_ext().execute_with(|| {1630 default_limits();16311632 let origin1 = Origin::signed(1);16331634 for i in 0..default_collection_numbers_limit() {1635 create_test_collection(&CollectionMode::NFT, i + 1);1636 }16371638 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1639 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1640 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16411642 // 11-th collection in chain. Expects error1643 assert_noop!(TemplateModule::create_collection(1644 origin1.clone(),1645 col_name1.clone(),1646 col_desc1.clone(),1647 token_prefix1.clone(),1648 CollectionMode::NFT1649 ), Error::<Test>::TotalCollectionsLimitExceeded);1650 });1651}16521653// Owned tokens by a single address. Positive test1654#[test]1655fn owned_tokens_bound() {1656 new_test_ext().execute_with(|| {1657 default_limits();1658 1659 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16601661 let data = default_nft_data();1662 create_test_item(collection_id, &data.clone().into());1663 create_test_item(collection_id, &data.into());1664 });1665}16661667// Owned tokens by a single address. Negotive test1668#[test]1669fn owned_tokens_bound_neg() {1670 new_test_ext().execute_with(|| {1671 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1672 collection_numbers_limit: 10,1673 account_token_ownership_limit: 1,1674 collections_admins_limit: 5,1675 custom_data_limit: 2048,1676 nft_sponsor_transfer_timeout: 15,1677 fungible_sponsor_transfer_timeout: 15,1678 refungible_sponsor_transfer_timeout: 15, 1679 }));1680 1681 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16821683 let origin1 = Origin::signed(1);1684 let data = default_nft_data();1685 create_test_item(collection_id, &data.clone().into());16861687 assert_noop!(TemplateModule::create_item(1688 origin1.clone(),1689 1,1690 1,1691 data.into()1692 ), Error::<Test>::AddressOwnershipLimitExceeded);1693 });1694}16951696// Number of collection admins. Positive test1697#[test]1698fn collection_admins_bound() {1699 new_test_ext().execute_with(|| {1700 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1701 collection_numbers_limit: 10,1702 account_token_ownership_limit: 10,1703 collections_admins_limit: 2,1704 custom_data_limit: 2048,1705 nft_sponsor_transfer_timeout: 15,1706 fungible_sponsor_transfer_timeout: 15,1707 refungible_sponsor_transfer_timeout: 15, 1708 }));1709 1710 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17111712 let origin1 = Origin::signed(1);1713 1714 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1715 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1716 });1717}17181719// Number of collection admins. Negotive test1720#[test]1721fn collection_admins_bound_neg() {1722 new_test_ext().execute_with(|| {1723 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1724 collection_numbers_limit: 10,1725 account_token_ownership_limit: 1,1726 collections_admins_limit: 1,1727 custom_data_limit: 2048,1728 nft_sponsor_transfer_timeout: 15,1729 fungible_sponsor_transfer_timeout: 15,1730 refungible_sponsor_transfer_timeout: 15, 1731 }));1732 1733 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17341735 let origin1 = Origin::signed(1);17361737 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1738 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1739 });1740}17411742// NFT custom data size. Negative test const_data.1743#[test]1744fn custom_data_size_nft_const_data_bound_neg() {1745 new_test_ext().execute_with(|| {1746 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1747 collection_numbers_limit: 10,1748 account_token_ownership_limit: 10,1749 collections_admins_limit: 5,1750 custom_data_limit: 2,1751 nft_sponsor_transfer_timeout: 15,1752 fungible_sponsor_transfer_timeout: 15,1753 refungible_sponsor_transfer_timeout: 15, 1754 }));1755 1756 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17571758 let origin1 = Origin::signed(1);1759 let too_big_const_data = CreateItemData::NFT(CreateNftData{1760 const_data: vec![1, 2, 3, 4],1761 variable_data: vec![]1762 });17631764 assert_noop!(TemplateModule::create_item(1765 origin1.clone(),1766 collection_id,1767 1,1768 too_big_const_data1769 ), Error::<Test>::TokenConstDataLimitExceeded);1770 });1771}17721773// NFT custom data size. Negative test variable_data.1774#[test]1775fn custom_data_size_nft_variable_data_bound_neg() {1776 new_test_ext().execute_with(|| {1777 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1778 collection_numbers_limit: 10,1779 account_token_ownership_limit: 10,1780 collections_admins_limit: 5,1781 custom_data_limit: 2,1782 nft_sponsor_transfer_timeout: 15,1783 fungible_sponsor_transfer_timeout: 15,1784 refungible_sponsor_transfer_timeout: 15, 1785 }));17861787 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17881789 let origin1 = Origin::signed(1);1790 let too_big_const_data = CreateItemData::NFT(CreateNftData{1791 const_data: vec![],1792 variable_data: vec![1, 2, 3, 4]1793 });17941795 assert_noop!(TemplateModule::create_item(1796 origin1.clone(),1797 collection_id,1798 1,1799 too_big_const_data1800 ), Error::<Test>::TokenVariableDataLimitExceeded);1801 });1802}18031804// Re fungible custom data size. Negative test const_data.1805#[test]1806fn custom_data_size_re_fungible_const_data_bound_neg() {1807 new_test_ext().execute_with(|| {1808 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1809 collection_numbers_limit: 10,1810 account_token_ownership_limit: 10,1811 collections_admins_limit: 5,1812 custom_data_limit: 2,1813 nft_sponsor_transfer_timeout: 15,1814 fungible_sponsor_transfer_timeout: 15,1815 refungible_sponsor_transfer_timeout: 15, 1816 }));18171818 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18191820 let origin1 = Origin::signed(1);1821 let too_big_const_data = CreateItemData::NFT(CreateNftData{1822 const_data: vec![1, 2, 3, 4],1823 variable_data: vec![]1824 });18251826 assert_noop!(TemplateModule::create_item(1827 origin1.clone(),1828 collection_id,1829 1,1830 too_big_const_data1831 ), Error::<Test>::TokenConstDataLimitExceeded);1832 });1833}18341835// Re fungible custom data size. Negative test variable_data.1836#[test]1837fn custom_data_size_re_fungible_variable_data_bound_neg() {1838 new_test_ext().execute_with(|| {1839 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1840 collection_numbers_limit: 10,1841 account_token_ownership_limit: 10,1842 collections_admins_limit: 5,1843 custom_data_limit: 2,1844 nft_sponsor_transfer_timeout: 15,1845 fungible_sponsor_transfer_timeout: 15,1846 refungible_sponsor_transfer_timeout: 15, 1847 }));18481849 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18501851 let origin1 = Origin::signed(1);1852 let too_big_const_data = CreateItemData::NFT(CreateNftData{1853 const_data: vec![],1854 variable_data: vec![1, 2, 3, 4]1855 });18561857 assert_noop!(TemplateModule::create_item(1858 origin1.clone(),1859 collection_id,1860 1,1861 too_big_const_data1862 ), Error::<Test>::TokenVariableDataLimitExceeded);1863 });1864}1865// #endregion18661867#[test]1868fn set_const_on_chain_schema() {1869 new_test_ext().execute_with(|| {1870 default_limits();18711872 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18731874 let origin1 = Origin::signed(1);1875 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18761877 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1878 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1879 });1880}18811882#[test]1883fn set_variable_on_chain_schema() {1884 new_test_ext().execute_with(|| {1885 default_limits();1886 1887 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18881889 let origin1 = Origin::signed(1);1890 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18911892 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1893 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1894 });1895}18961897#[test]1898fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1899 new_test_ext().execute_with(|| {1900 default_limits();19011902 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19031904 let origin1 = Origin::signed(1);1905 1906 let data = default_nft_data();1907 create_test_item(1, &data.into());1908 1909 let variable_data = b"test set_variable_meta_data method.".to_vec();1910 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19111912 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1913 });1914}19151916#[test]1917fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1918 new_test_ext().execute_with(|| {1919 default_limits();19201921 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19221923 let origin1 = Origin::signed(1);19241925 let data = default_re_fungible_data();1926 create_test_item(1, &data.into());19271928 let variable_data = b"test set_variable_meta_data method.".to_vec();1929 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19301931 assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1932 });1933}193419351936#[test]1937fn set_variable_meta_data_on_fungible_token_fails() {1938 new_test_ext().execute_with(|| {1939 default_limits();19401941 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19421943 let origin1 = Origin::signed(1);19441945 let data = default_fungible_data();1946 create_test_item(1, &data.into());19471948 let variable_data = b"test set_variable_meta_data method.".to_vec();1949 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1950 });1951}19521953#[test]1954fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1955 new_test_ext().execute_with(|| {1956 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1957 collection_numbers_limit: default_collection_numbers_limit(),1958 account_token_ownership_limit: 10,1959 collections_admins_limit: 5,1960 custom_data_limit: 10,1961 nft_sponsor_transfer_timeout: 15,1962 fungible_sponsor_transfer_timeout: 15,1963 refungible_sponsor_transfer_timeout: 15, 1964 }));19651966 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19671968 let origin1 = Origin::signed(1);19691970 let data = default_nft_data();1971 create_test_item(1, &data.into());19721973 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1974 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1975 });1976}19771978#[test]1979fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1980 new_test_ext().execute_with(|| {1981 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1982 collection_numbers_limit: default_collection_numbers_limit(),1983 account_token_ownership_limit: 10,1984 collections_admins_limit: 5,1985 custom_data_limit: 10,1986 nft_sponsor_transfer_timeout: 15,1987 fungible_sponsor_transfer_timeout: 15,1988 refungible_sponsor_transfer_timeout: 15, 1989 }));199019911992 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19931994 let origin1 = Origin::signed(1);19951996 let data = default_re_fungible_data();1997 create_test_item(1, &data.into());19981999 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2000 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2001 });2002}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5 Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6 CollectionId, TokenId, MAX_DECIMAL_POINTS};7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11 1012}1314fn default_limits() {15 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16 collection_numbers_limit: default_collection_numbers_limit(),17 account_token_ownership_limit: 10,18 collections_admins_limit: 5,19 custom_data_limit: 2048,20 nft_sponsor_transfer_timeout: 15,21 fungible_sponsor_transfer_timeout: 15,22 refungible_sponsor_transfer_timeout: 15, 23 }));24}2526fn default_nft_data() -> CreateNftData {27 CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31 CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> 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.clone(),46 col_name1.clone(),47 col_desc1.clone(),48 token_prefix1.clone(),49 mode.clone()50 ));5152 let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53 let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54 let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55 assert_eq!(TemplateModule::collection(id).owner, owner);56 assert_eq!(TemplateModule::collection(id).name, saved_col_name);57 assert_eq!(TemplateModule::collection(id).mode, *mode);58 assert_eq!(TemplateModule::collection(id).description, saved_description);59 assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60 id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64 create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68 let origin1 = Origin::signed(1);69 assert_ok!(TemplateModule::create_item(70 origin1.clone(),71 collection_id,72 1,73 data.clone()74 ));7576}7778// Use cases tests region79// #region8081#[test]82fn set_version_schema() {83 new_test_ext().execute_with(|| {84 default_limits();85 let origin1 = Origin::signed(1);86 let collection_id = create_test_collection(&CollectionMode::NFT, 1);87 88 assert_ok!(TemplateModule::set_schema_version(origin1, collection_id, SchemaVersion::Unique));89 assert_eq!(TemplateModule::collection(collection_id).schema_version, SchemaVersion::Unique);90 });91}9293#[test]94fn create_fungible_collection_fails_with_large_decimal_numbers() {95 new_test_ext().execute_with(|| {96 default_limits();9798 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();99 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();101102 let origin1 = Origin::signed(1);103 assert_noop!(TemplateModule::create_collection(104 origin1,105 col_name1,106 col_desc1,107 token_prefix1,108 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)109 ), Error::<Test>::CollectionDecimalPointLimitExceeded);110 }); 111}112113#[test]114fn create_re_fungible_collection_fails_with_large_decimal_numbers() {115 new_test_ext().execute_with(|| {116 default_limits();117118 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();119 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();120 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();121122 let origin1 = Origin::signed(1);123 assert_noop!(TemplateModule::create_collection(124 origin1,125 col_name1,126 col_desc1,127 token_prefix1,128 CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)129 ), Error::<Test>::CollectionDecimalPointLimitExceeded);130 });131}132133#[test]134fn create_nft_item() {135 new_test_ext().execute_with(|| {136 default_limits();137 let collection_id = create_test_collection(&CollectionMode::NFT, 1);138 139 let data = default_nft_data();140 create_test_item(collection_id, &data.clone().into());141 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);142 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);143 });144}145146// Use cases tests region147// #region148#[test]149fn create_nft_multiple_items() {150 new_test_ext().execute_with(|| {151 default_limits();152 153 create_test_collection(&CollectionMode::NFT, 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.clone(),161 1,162 1,163 items_data.clone().into_iter().map(|d| { d.into() }).collect()164 ));165 for (index, data) in items_data.iter().enumerate() {166 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);167 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);168 }169 });170}171172#[test]173fn create_refungible_item() {174 new_test_ext().execute_with(|| {175 default_limits();176 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);177178 let data = default_re_fungible_data();179 create_test_item(collection_id, &data.clone().into());180 assert_eq!(181 TemplateModule::refungible_item_id(collection_id, 1).const_data,182 data.const_data183 );184 assert_eq!(185 TemplateModule::refungible_item_id(collection_id, 1).variable_data,186 data.variable_data187 );188 assert_eq!(189 TemplateModule::refungible_item_id(collection_id, 1).owner[0],190 Ownership {191 owner: 1,192 fraction: 1000193 }194 );195 });196}197198#[test]199fn create_multiple_refungible_items() {200 new_test_ext().execute_with(|| {201 default_limits();202 203 create_test_collection(&CollectionMode::ReFungible(3), 1);204205 let origin1 = Origin::signed(1);206207 let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];208209 assert_ok!(TemplateModule::create_multiple_items(210 origin1.clone(),211 1,212 1,213 items_data.clone().into_iter().map(|d| { d.into() }).collect()214 ));215 for (index, data) in items_data.iter().enumerate() {216217 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);218 assert_eq!(item.const_data.to_vec(), data.const_data);219 assert_eq!(item.variable_data.to_vec(), data.variable_data);220 assert_eq!(221 item.owner[0],222 Ownership {223 owner: 1,224 fraction: 1000225 }226 );227 }228 });229}230231#[test]232fn create_fungible_item() {233 new_test_ext().execute_with(|| {234 default_limits();235 236 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);237238 let data = default_fungible_data();239 create_test_item(collection_id, &data.into());240241 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);242 });243}244245#[test]246fn create_multiple_fungible_items() {247 new_test_ext().execute_with(|| {248 default_limits();249250 create_test_collection(&CollectionMode::Fungible(3), 1);251252 let origin1 = Origin::signed(1);253254 let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];255256 assert_ok!(TemplateModule::create_multiple_items(257 origin1.clone(),258 1,259 1,260 items_data.clone().into_iter().map(|d| { d.into() }).collect()261 ));262 263 for (index, _) in items_data.iter().enumerate() {264 assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);265 }266 assert_eq!(TemplateModule::balance_count(1, 1), 3000);267 assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);268 });269}270271#[test]272fn transfer_fungible_item() {273 new_test_ext().execute_with(|| {274 default_limits();275 276 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);277278 let origin1 = Origin::signed(1);279 let origin2 = Origin::signed(2);280281 let data = default_fungible_data();282 create_test_item(collection_id, &data.into());283284 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);285 assert_eq!(TemplateModule::balance_count(1, 1), 1000);286 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);287288 // change owner scenario289 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));290 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);291 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);292 assert_eq!(TemplateModule::balance_count(1, 1), 0);293 assert_eq!(TemplateModule::balance_count(1, 2), 1000);294 // assert_eq!(TemplateModule::address_tokens(1, 1), []);295 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);296297 // split item scenario298 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));299 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);300 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);301 assert_eq!(TemplateModule::balance_count(1, 2), 500);302 assert_eq!(TemplateModule::balance_count(1, 3), 500);303 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);304 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);305306 // split item and new owner has account scenario307 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));308 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);309 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);310 assert_eq!(TemplateModule::balance_count(1, 2), 300);311 assert_eq!(TemplateModule::balance_count(1, 3), 700);312 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);313 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);314 });315}316317#[test]318fn transfer_refungible_item() {319 new_test_ext().execute_with(|| {320 default_limits();321 322 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);323324 let data = default_re_fungible_data();325 create_test_item(collection_id, &data.clone().into());326327 let origin1 = Origin::signed(1);328 let origin2 = Origin::signed(2);329 assert_eq!(330 TemplateModule::refungible_item_id(collection_id, 1).const_data,331 data.const_data332 );333 assert_eq!(334 TemplateModule::refungible_item_id(collection_id, 1).variable_data,335 data.variable_data336 );337 assert_eq!(338 TemplateModule::refungible_item_id(collection_id, 1).owner[0],339 Ownership {340 owner: 1,341 fraction: 1000342 }343 );344 assert_eq!(TemplateModule::balance_count(1, 1), 1000);345 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);346347 // change owner scenario348 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));349 assert_eq!(350 TemplateModule::refungible_item_id(1, 1).owner[0],351 Ownership {352 owner: 2,353 fraction: 1000354 }355 );356 assert_eq!(TemplateModule::balance_count(1, 1), 0);357 assert_eq!(TemplateModule::balance_count(1, 2), 1000);358 // assert_eq!(TemplateModule::address_tokens(1, 1), []);359 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);360361 // split item scenario362 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));363 assert_eq!(364 TemplateModule::refungible_item_id(1, 1).owner[0],365 Ownership {366 owner: 2,367 fraction: 500368 }369 );370 assert_eq!(371 TemplateModule::refungible_item_id(1, 1).owner[1],372 Ownership {373 owner: 3,374 fraction: 500375 }376 );377 assert_eq!(TemplateModule::balance_count(1, 2), 500);378 assert_eq!(TemplateModule::balance_count(1, 3), 500);379 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);380 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);381382 // split item and new owner has account scenario383 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));384 assert_eq!(385 TemplateModule::refungible_item_id(1, 1).owner[0],386 Ownership {387 owner: 2,388 fraction: 300389 }390 );391 assert_eq!(392 TemplateModule::refungible_item_id(1, 1).owner[1],393 Ownership {394 owner: 3,395 fraction: 700396 }397 );398 assert_eq!(TemplateModule::balance_count(1, 2), 300);399 assert_eq!(TemplateModule::balance_count(1, 3), 700);400 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);401 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);402 });403}404405#[test]406fn transfer_nft_item() {407 new_test_ext().execute_with(|| {408 default_limits();409 410 let collection_id = create_test_collection(&CollectionMode::NFT, 1);411412 let data = default_nft_data();413 create_test_item(collection_id, &data.into());414 assert_eq!(TemplateModule::balance_count(1, 1), 1);415 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);416417 let origin1 = Origin::signed(1);418 // default scenario419 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));420 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);421 assert_eq!(TemplateModule::balance_count(1, 1), 0);422 assert_eq!(TemplateModule::balance_count(1, 2), 1);423 // assert_eq!(TemplateModule::address_tokens(1, 1), []);424 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);425 });426}427428#[test]429fn nft_approve_and_transfer_from() {430 new_test_ext().execute_with(|| {431 default_limits();432 433 let collection_id = create_test_collection(&CollectionMode::NFT, 1);434435 let data = default_nft_data();436 create_test_item(collection_id, &data.into());437438 let origin1 = Origin::signed(1);439 let origin2 = Origin::signed(2);440441 assert_eq!(TemplateModule::balance_count(1, 1), 1);442 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);443444 // neg transfer445 assert_noop!(TemplateModule::transfer_from(446 origin2.clone(),447 1,448 2,449 1,450 1,451 1), Error::<Test>::NoPermission);452453 // do approve454 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));455 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);456 assert_eq!(457 TemplateModule::approved(1, (1, 1))[0],458 ApprovePermissions {459 approved: 2,460 amount: 100000000461 }462 );463464 assert_ok!(TemplateModule::transfer_from(465 origin2.clone(),466 1,467 2,468 1,469 1,470 1471 ));472 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);473 });474}475476#[test]477fn nft_approve_and_transfer_from_white_list() {478 new_test_ext().execute_with(|| {479 default_limits();480 481 let collection_id = create_test_collection(&CollectionMode::NFT, 1);482483 let origin1 = Origin::signed(1);484 let origin2 = Origin::signed(2);485486 let data = default_nft_data();487 create_test_item(collection_id, &data.clone().into());488489 assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);490 assert_eq!(TemplateModule::balance_count(1, 1), 1);491 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);492493 assert_ok!(TemplateModule::set_mint_permission(494 origin1.clone(),495 1,496 true497 ));498 assert_ok!(TemplateModule::set_public_access_mode(499 origin1.clone(),500 1,501 AccessMode::WhiteList502 ));503 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));504 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));505 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));506507 // do approve508 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));509 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);510 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));511 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);512 assert_eq!(513 TemplateModule::approved(1, (1, 1))[0],514 ApprovePermissions {515 approved: 2,516 amount: 100000000517 }518 );519520 assert_ok!(TemplateModule::transfer_from(521 origin2.clone(),522 1,523 3,524 1,525 1,526 1527 ));528 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);529 });530}531532#[test]533fn refungible_approve_and_transfer_from() {534 new_test_ext().execute_with(|| {535 default_limits();536 537 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);538 539 let origin1 = Origin::signed(1);540 let origin2 = Origin::signed(2);541542 let data = default_re_fungible_data();543 create_test_item(collection_id, &data.into());544545 assert_eq!(TemplateModule::balance_count(1, 1), 1000);546 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);547548 assert_ok!(TemplateModule::set_mint_permission(549 origin1.clone(),550 1,551 true552 ));553 assert_ok!(TemplateModule::set_public_access_mode(554 origin1.clone(),555 1,556 AccessMode::WhiteList557 ));558 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));559 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));560 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));561562 // do approve563 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));564 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);565 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));566 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);567 assert_eq!(568 TemplateModule::approved(1, (1, 1))[0],569 ApprovePermissions {570 approved: 2,571 amount: 100000000572 }573 );574575 assert_ok!(TemplateModule::transfer_from(576 origin2.clone(),577 1,578 3,579 1,580 1,581 100582 ));583 assert_eq!(TemplateModule::balance_count(1, 1), 900);584 assert_eq!(TemplateModule::balance_count(1, 3), 100);585 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);586 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);587588 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);589 assert_eq!(590 TemplateModule::approved(1, (1, 1))[0],591 ApprovePermissions {592 approved: 3,593 amount: 100000000594 }595 );596 });597}598599#[test]600fn fungible_approve_and_transfer_from() {601 new_test_ext().execute_with(|| {602 default_limits();603 604 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);605 606 let data = default_fungible_data();607 create_test_item(collection_id, &data.into());608609 let origin1 = Origin::signed(1);610 let origin2 = Origin::signed(2);611612 assert_eq!(TemplateModule::balance_count(1, 1), 1000);613 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);614615 assert_ok!(TemplateModule::set_mint_permission(616 origin1.clone(),617 1,618 true619 ));620 assert_ok!(TemplateModule::set_public_access_mode(621 origin1.clone(),622 1,623 AccessMode::WhiteList624 ));625 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));626 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));627 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));628629 // do approve630 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));631 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);632 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));633 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);634 assert_eq!(635 TemplateModule::approved(1, (1, 1))[0],636 ApprovePermissions {637 approved: 2,638 amount: 100000000639 }640 );641642 assert_ok!(TemplateModule::transfer_from(643 origin2.clone(),644 1,645 3,646 1,647 1,648 100649 ));650 assert_eq!(TemplateModule::balance_count(1, 1), 900);651 assert_eq!(TemplateModule::balance_count(1, 3), 100);652 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);653 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);654655 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);656 assert_eq!(657 TemplateModule::approved(1, (1, 1))[0],658 ApprovePermissions {659 approved: 3,660 amount: 100000000661 }662 );663664 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));665 assert_ok!(TemplateModule::transfer_from(666 origin2.clone(),667 1,668 3,669 1,670 1,671 900672 ));673 assert_eq!(TemplateModule::balance_count(1, 1), 0);674 assert_eq!(TemplateModule::balance_count(1, 3), 1000);675 // assert_eq!(TemplateModule::address_tokens(1, 1), []);676 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);677678 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);679 });680}681682#[test]683fn change_collection_owner() {684 new_test_ext().execute_with(|| {685 default_limits();686 687 let collection_id = create_test_collection(&CollectionMode::NFT, 1);688 689 let origin1 = Origin::signed(1);690 assert_ok!(TemplateModule::change_collection_owner(691 origin1.clone(),692 collection_id,693 2694 ));695 assert_eq!(TemplateModule::collection(collection_id).owner, 2);696 });697}698699#[test]700fn destroy_collection() {701 new_test_ext().execute_with(|| {702 default_limits();703 704 let collection_id = create_test_collection(&CollectionMode::NFT, 1);705 706 let origin1 = Origin::signed(1);707 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));708 });709}710711#[test]712fn burn_nft_item() {713 new_test_ext().execute_with(|| {714 default_limits();715 716 let collection_id = create_test_collection(&CollectionMode::NFT, 1);717718 let origin1 = Origin::signed(1);719 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));720 721 let data = default_nft_data();722 create_test_item(collection_id, &data.into());723724 // check balance (collection with id = 1, user id = 1)725 assert_eq!(TemplateModule::balance_count(1, 1), 1);726727 // burn item728 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));729 assert_noop!(730 TemplateModule::burn_item(origin1.clone(), 1, 1),731 Error::<Test>::TokenNotFound732 );733734 assert_eq!(TemplateModule::balance_count(1, 1), 0);735 });736}737738#[test]739fn burn_fungible_item() {740 new_test_ext().execute_with(|| {741 default_limits();742 743 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);744 745 let origin1 = Origin::signed(1);746 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));747 748 let data = default_fungible_data();749 create_test_item(collection_id, &data.into());750751 // check balance (collection with id = 1, user id = 1)752 assert_eq!(TemplateModule::balance_count(1, 1), 1000);753754 // burn item755 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));756 assert_noop!(757 TemplateModule::burn_item(origin1.clone(), 1, 1),758 Error::<Test>::TokenNotFound759 );760761 assert_eq!(TemplateModule::balance_count(1, 1), 0);762 });763}764765#[test]766fn burn_refungible_item() {767 new_test_ext().execute_with(|| {768 default_limits();769 770 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);771 let origin1 = Origin::signed(1);772773 assert_ok!(TemplateModule::set_mint_permission(774 origin1.clone(),775 collection_id,776 true777 ));778 assert_ok!(TemplateModule::set_public_access_mode(779 origin1.clone(),780 collection_id,781 AccessMode::WhiteList782 ));783 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));784785 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));786 787 let data = default_re_fungible_data();788 create_test_item(collection_id, &data.into());789790 // check balance (collection with id = 1, user id = 2)791 assert_eq!(TemplateModule::balance_count(1, 1), 1000);792793 // burn item794 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));795 assert_noop!(796 TemplateModule::burn_item(origin1.clone(), 1, 1),797 Error::<Test>::TokenNotFound798 );799800 assert_eq!(TemplateModule::balance_count(1, 1), 0);801 });802}803804#[test]805fn add_collection_admin() {806 new_test_ext().execute_with(|| {807 default_limits();808 809 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);810 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);811 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);812 813 let origin1 = Origin::signed(1);814815 // collection admin816 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));817 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));818819 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);820 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);821 });822}823824#[test]825fn remove_collection_admin() {826 new_test_ext().execute_with(|| {827 default_limits();828 829 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);830 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);831 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);832833 let origin1 = Origin::signed(1);834 let origin2 = Origin::signed(2);835836 // collection admin837 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));838 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));839840 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);841 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);842843 // remove admin844 assert_ok!(TemplateModule::remove_collection_admin(845 origin2.clone(),846 1,847 3848 ));849 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);850 });851}852853#[test]854fn balance_of() {855 new_test_ext().execute_with(|| {856 default_limits();857 858 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);859 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);860 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);861 862 // check balance before863 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);864 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);865 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);866867 let nft_data = default_nft_data();868 create_test_item(nft_collection_id, &nft_data.into());869 870 let fungible_data = default_fungible_data();871 create_test_item(fungible_collection_id, &fungible_data.into());872 873 let re_fungible_data = default_re_fungible_data();874 create_test_item(re_fungible_collection_id, &re_fungible_data.into());875876 // check balance (collection with id = 1, user id = 1)877 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);878 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);879 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);880 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);881 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);882 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);883 });884}885886#[test]887fn approve() {888 new_test_ext().execute_with(|| {889 default_limits();890 891 let collection_id = create_test_collection(&CollectionMode::NFT, 1);892 893 let data = default_nft_data();894 create_test_item(collection_id, &data.into());895896 let origin1 = Origin::signed(1);897 898 // approve899 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));900 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);901 });902}903904#[test]905fn transfer_from() {906 new_test_ext().execute_with(|| {907 default_limits();908 909 let collection_id = create_test_collection(&CollectionMode::NFT, 1);910 let origin1 = Origin::signed(1);911 let origin2 = Origin::signed(2);912913 let data = default_nft_data();914 create_test_item(collection_id, &data.into());915916 // approve917 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));918 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);919920 assert_ok!(TemplateModule::set_mint_permission(921 origin1.clone(),922 1,923 true924 ));925 assert_ok!(TemplateModule::set_public_access_mode(926 origin1.clone(),927 1,928 AccessMode::WhiteList929 ));930 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));931 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));932 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));933934 assert_ok!(TemplateModule::transfer_from(935 origin2.clone(),936 1,937 2,938 1,939 1,940 1941 ));942943 // after transfer944 assert_eq!(TemplateModule::balance_count(1, 1), 0);945 assert_eq!(TemplateModule::balance_count(1, 2), 1);946 });947}948949// #endregion950951// Coverage tests region952// #region953954#[test]955fn owner_can_add_address_to_white_list() {956 new_test_ext().execute_with(|| {957 default_limits();958 959 let collection_id = create_test_collection(&CollectionMode::NFT, 1);960961 let origin1 = Origin::signed(1);962 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));963 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);964 });965}966967#[test]968fn admin_can_add_address_to_white_list() {969 new_test_ext().execute_with(|| {970 default_limits();971 972 let collection_id = create_test_collection(&CollectionMode::NFT, 1);973 let origin1 = Origin::signed(1);974 let origin2 = Origin::signed(2);975976 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));977 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));978 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);979 });980}981982#[test]983fn nonprivileged_user_cannot_add_address_to_white_list() {984 new_test_ext().execute_with(|| {985 default_limits();986 987 let collection_id = create_test_collection(&CollectionMode::NFT, 1);988989 let origin2 = Origin::signed(2);990 assert_noop!(991 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),992 Error::<Test>::NoPermission993 );994 });995}996997#[test]998fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {999 new_test_ext().execute_with(|| {1000 default_limits();10011002 let origin1 = Origin::signed(1);10031004 assert_noop!(1005 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1006 Error::<Test>::CollectionNotFound1007 );1008 });1009}10101011#[test]1012fn nobody_can_add_address_to_white_list_of_deleted_collection() {1013 new_test_ext().execute_with(|| {1014 default_limits();1015 1016 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10171018 let origin1 = Origin::signed(1);1019 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1020 assert_noop!(1021 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1022 Error::<Test>::CollectionNotFound1023 );1024 });1025}10261027// If address is already added to white list, nothing happens1028#[test]1029fn address_is_already_added_to_white_list() {1030 new_test_ext().execute_with(|| {1031 default_limits();1032 1033 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1034 let origin1 = Origin::signed(1);1035 1036 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1037 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1038 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1039 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1040 });1041}10421043#[test]1044fn owner_can_remove_address_from_white_list() {1045 new_test_ext().execute_with(|| {1046 default_limits();1047 1048 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10491050 let origin1 = Origin::signed(1);1051 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1052 assert_ok!(TemplateModule::remove_from_white_list(1053 origin1.clone(),1054 collection_id,1055 21056 ));1057 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1058 });1059}10601061#[test]1062fn admin_can_remove_address_from_white_list() {1063 new_test_ext().execute_with(|| {1064 default_limits();1065 1066 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1067 let origin1 = Origin::signed(1);1068 let origin2 = Origin::signed(2);10691070 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10711072 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1073 assert_ok!(TemplateModule::remove_from_white_list(1074 origin2.clone(),1075 collection_id,1076 31077 ));1078 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1079 });1080}10811082#[test]1083fn nonprivileged_user_cannot_remove_address_from_white_list() {1084 new_test_ext().execute_with(|| {1085 default_limits();1086 1087 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1088 let origin1 = Origin::signed(1);1089 let origin2 = Origin::signed(2);10901091 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1092 assert_noop!(1093 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1094 Error::<Test>::NoPermission1095 );1096 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1097 });1098}10991100#[test]1101fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1102 new_test_ext().execute_with(|| {1103 default_limits();1104 let origin1 = Origin::signed(1);11051106 assert_noop!(1107 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1108 Error::<Test>::CollectionNotFound1109 );1110 });1111}11121113#[test]1114fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1115 new_test_ext().execute_with(|| {1116 default_limits();1117 1118 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1119 let origin1 = Origin::signed(1);1120 let origin2 = Origin::signed(2);11211122 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1123 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1124 assert_noop!(1125 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1126 Error::<Test>::CollectionNotFound1127 );1128 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1129 });1130}11311132// If address is already removed from white list, nothing happens1133#[test]1134fn address_is_already_removed_from_white_list() {1135 new_test_ext().execute_with(|| {1136 default_limits();1137 1138 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1139 let origin1 = Origin::signed(1);11401141 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1142 assert_ok!(TemplateModule::remove_from_white_list(1143 origin1.clone(),1144 collection_id,1145 21146 ));1147 assert_ok!(TemplateModule::remove_from_white_list(1148 origin1.clone(),1149 collection_id,1150 21151 ));1152 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1153 });1154}11551156// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1157#[test]1158fn white_list_test_1() {1159 new_test_ext().execute_with(|| {1160 default_limits();1161 1162 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11631164 let origin1 = Origin::signed(1);1165 1166 let data = default_nft_data();1167 create_test_item(collection_id, &data.into());11681169 assert_ok!(TemplateModule::set_public_access_mode(1170 origin1.clone(),1171 collection_id,1172 AccessMode::WhiteList1173 ));1174 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11751176 assert_noop!(1177 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1178 Error::<Test>::AddresNotInWhiteList1179 );1180 });1181}11821183#[test]1184fn white_list_test_2() {1185 new_test_ext().execute_with(|| {1186 default_limits();1187 1188 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1189 let origin1 = Origin::signed(1);1190 1191 let data = default_nft_data();1192 create_test_item(collection_id, &data.into());11931194 assert_ok!(TemplateModule::set_public_access_mode(1195 origin1.clone(),1196 collection_id,1197 AccessMode::WhiteList1198 ));1199 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1200 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));12011202 // do approve1203 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1204 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12051206 assert_ok!(TemplateModule::remove_from_white_list(1207 origin1.clone(),1208 1,1209 11210 ));12111212 assert_noop!(1213 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1214 Error::<Test>::AddresNotInWhiteList1215 );1216 });1217}12181219// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1220#[test]1221fn white_list_test_3() {1222 new_test_ext().execute_with(|| {1223 default_limits();1224 1225 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12261227 let origin1 = Origin::signed(1);1228 1229 let data = default_nft_data();1230 create_test_item(collection_id, &data.into());12311232 assert_ok!(TemplateModule::set_public_access_mode(1233 origin1.clone(),1234 collection_id,1235 AccessMode::WhiteList1236 ));1237 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12381239 assert_noop!(1240 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1241 Error::<Test>::AddresNotInWhiteList1242 );1243 });1244}12451246#[test]1247fn white_list_test_4() {1248 new_test_ext().execute_with(|| {1249 default_limits();1250 1251 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12521253 let origin1 = Origin::signed(1);12541255 let data = default_nft_data();1256 create_test_item(collection_id, &data.into());12571258 assert_ok!(TemplateModule::set_public_access_mode(1259 origin1.clone(),1260 collection_id,1261 AccessMode::WhiteList1262 ));1263 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1264 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12651266 // do approve1267 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1268 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12691270 assert_ok!(TemplateModule::remove_from_white_list(1271 origin1.clone(),1272 collection_id,1273 21274 ));12751276 assert_noop!(1277 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1278 Error::<Test>::AddresNotInWhiteList1279 );1280 });1281}12821283// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1284#[test]1285fn white_list_test_5() {1286 new_test_ext().execute_with(|| {1287 default_limits();1288 1289 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12901291 let origin1 = Origin::signed(1);12921293 let data = default_nft_data();1294 create_test_item(collection_id, &data.into());12951296 assert_ok!(TemplateModule::set_public_access_mode(1297 origin1.clone(),1298 collection_id,1299 AccessMode::WhiteList1300 ));1301 assert_noop!(1302 TemplateModule::burn_item(origin1.clone(), 1, 1),1303 Error::<Test>::AddresNotInWhiteList1304 );1305 });1306}13071308// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1309#[test]1310fn white_list_test_6() {1311 new_test_ext().execute_with(|| {1312 default_limits();1313 1314 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13151316 let origin1 = Origin::signed(1);1317 assert_ok!(TemplateModule::set_public_access_mode(1318 origin1.clone(),1319 collection_id,1320 AccessMode::WhiteList1321 ));13221323 // do approve1324 assert_noop!(1325 TemplateModule::approve(origin1.clone(), 1, 1, 1),1326 Error::<Test>::AddresNotInWhiteList1327 );1328 });1329}13301331// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1332// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1333#[test]1334fn white_list_test_7() {1335 new_test_ext().execute_with(|| {1336 default_limits();1337 1338 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13391340 let data = default_nft_data();1341 create_test_item(collection_id, &data.into());1342 1343 let origin1 = Origin::signed(1);13441345 assert_ok!(TemplateModule::set_public_access_mode(1346 origin1.clone(),1347 collection_id,1348 AccessMode::WhiteList1349 ));1350 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1351 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13521353 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1354 });1355}13561357#[test]1358fn white_list_test_8() {1359 new_test_ext().execute_with(|| {1360 default_limits();1361 1362 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13631364 let data = default_nft_data();1365 create_test_item(collection_id, &data.into());1366 1367 let origin1 = Origin::signed(1);13681369 assert_ok!(TemplateModule::set_public_access_mode(1370 origin1.clone(),1371 collection_id,1372 AccessMode::WhiteList1373 ));1374 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1375 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13761377 // do approve1378 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1379 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13801381 assert_ok!(TemplateModule::transfer_from(1382 origin1.clone(),1383 1,1384 2,1385 1,1386 1,1387 11388 ));1389 });1390}13911392// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1393#[test]1394fn white_list_test_9() {1395 new_test_ext().execute_with(|| {1396 default_limits();1397 1398 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1399 let origin1 = Origin::signed(1);14001401 assert_ok!(TemplateModule::set_public_access_mode(1402 origin1.clone(),1403 collection_id,1404 AccessMode::WhiteList1405 ));1406 assert_ok!(TemplateModule::set_mint_permission(1407 origin1.clone(),1408 collection_id,1409 false1410 ));14111412 let data = default_nft_data();1413 create_test_item(collection_id, &data.into());1414 });1415}14161417// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1418#[test]1419fn white_list_test_10() {1420 new_test_ext().execute_with(|| {1421 default_limits();1422 1423 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14241425 let origin1 = Origin::signed(1);1426 let origin2 = Origin::signed(2);14271428 assert_ok!(TemplateModule::set_public_access_mode(1429 origin1.clone(),1430 collection_id,1431 AccessMode::WhiteList1432 ));1433 assert_ok!(TemplateModule::set_mint_permission(1434 origin1.clone(),1435 collection_id,1436 false1437 ));14381439 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14401441 assert_ok!(TemplateModule::create_item(1442 origin2.clone(),1443 collection_id,1444 2,1445 default_nft_data().into()1446 ));1447 });1448}14491450// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1451#[test]1452fn white_list_test_11() {1453 new_test_ext().execute_with(|| {1454 default_limits();1455 1456 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14571458 let origin1 = Origin::signed(1);1459 let origin2 = Origin::signed(2);14601461 assert_ok!(TemplateModule::set_public_access_mode(1462 origin1.clone(),1463 collection_id,1464 AccessMode::WhiteList1465 ));1466 assert_ok!(TemplateModule::set_mint_permission(1467 origin1.clone(),1468 collection_id,1469 false1470 ));1471 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14721473 assert_noop!(1474 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1475 Error::<Test>::PublicMintingNotAllowed1476 );1477 });1478}14791480// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1481#[test]1482fn white_list_test_12() {1483 new_test_ext().execute_with(|| {1484 default_limits();1485 1486 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14871488 let origin1 = Origin::signed(1);1489 let origin2 = Origin::signed(2);14901491 assert_ok!(TemplateModule::set_public_access_mode(1492 origin1.clone(),1493 collection_id,1494 AccessMode::WhiteList1495 ));1496 assert_ok!(TemplateModule::set_mint_permission(1497 origin1.clone(),1498 collection_id,1499 false1500 ));15011502 assert_noop!(1503 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1504 Error::<Test>::PublicMintingNotAllowed1505 );1506 });1507}15081509// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1510#[test]1511fn white_list_test_13() {1512 new_test_ext().execute_with(|| {1513 default_limits();1514 1515 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15161517 let origin1 = Origin::signed(1);15181519 assert_ok!(TemplateModule::set_public_access_mode(1520 origin1.clone(),1521 collection_id,1522 AccessMode::WhiteList1523 ));1524 assert_ok!(TemplateModule::set_mint_permission(1525 origin1.clone(),1526 collection_id,1527 true1528 ));15291530 let data = default_nft_data();1531 create_test_item(collection_id, &data.into());1532 });1533}15341535// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1536#[test]1537fn white_list_test_14() {1538 new_test_ext().execute_with(|| {1539 default_limits();1540 1541 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15421543 let origin1 = Origin::signed(1);1544 let origin2 = Origin::signed(2);15451546 assert_ok!(TemplateModule::set_public_access_mode(1547 origin1.clone(),1548 collection_id,1549 AccessMode::WhiteList1550 ));1551 assert_ok!(TemplateModule::set_mint_permission(1552 origin1.clone(),1553 collection_id,1554 true1555 ));15561557 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15581559 assert_ok!(TemplateModule::create_item(1560 origin2.clone(),1561 1,1562 2,1563 default_nft_data().into()1564 ));1565 });1566}15671568// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1569#[test]1570fn white_list_test_15() {1571 new_test_ext().execute_with(|| {1572 default_limits();1573 1574 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15751576 let origin1 = Origin::signed(1);1577 let origin2 = Origin::signed(2);15781579 assert_ok!(TemplateModule::set_public_access_mode(1580 origin1.clone(),1581 collection_id,1582 AccessMode::WhiteList1583 ));1584 assert_ok!(TemplateModule::set_mint_permission(1585 origin1.clone(),1586 collection_id,1587 true1588 ));15891590 assert_noop!(1591 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1592 Error::<Test>::AddresNotInWhiteList1593 );1594 });1595}15961597// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1598#[test]1599fn white_list_test_16() {1600 new_test_ext().execute_with(|| {1601 default_limits();1602 1603 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16041605 let origin1 = Origin::signed(1);1606 let origin2 = Origin::signed(2);16071608 assert_ok!(TemplateModule::set_public_access_mode(1609 origin1.clone(),1610 collection_id,1611 AccessMode::WhiteList1612 ));1613 assert_ok!(TemplateModule::set_mint_permission(1614 origin1.clone(),1615 collection_id,1616 true1617 ));1618 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16191620 assert_ok!(TemplateModule::create_item(1621 origin2.clone(),1622 1,1623 2,1624 default_nft_data().into()1625 ));1626 });1627}16281629// Total number of collections. Positive test1630#[test]1631fn total_number_collections_bound() {1632 new_test_ext().execute_with(|| {1633 default_limits();1634 1635 create_test_collection(&CollectionMode::NFT, 1);1636 });1637}16381639// Total number of collections. Negotive test1640#[test]1641fn total_number_collections_bound_neg() {1642 new_test_ext().execute_with(|| {1643 default_limits();16441645 let origin1 = Origin::signed(1);16461647 for i in 0..default_collection_numbers_limit() {1648 create_test_collection(&CollectionMode::NFT, i + 1);1649 }16501651 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1652 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1653 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16541655 // 11-th collection in chain. Expects error1656 assert_noop!(TemplateModule::create_collection(1657 origin1.clone(),1658 col_name1.clone(),1659 col_desc1.clone(),1660 token_prefix1.clone(),1661 CollectionMode::NFT1662 ), Error::<Test>::TotalCollectionsLimitExceeded);1663 });1664}16651666// Owned tokens by a single address. Positive test1667#[test]1668fn owned_tokens_bound() {1669 new_test_ext().execute_with(|| {1670 default_limits();1671 1672 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16731674 let data = default_nft_data();1675 create_test_item(collection_id, &data.clone().into());1676 create_test_item(collection_id, &data.into());1677 });1678}16791680// Owned tokens by a single address. Negotive test1681#[test]1682fn owned_tokens_bound_neg() {1683 new_test_ext().execute_with(|| {1684 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1685 collection_numbers_limit: 10,1686 account_token_ownership_limit: 1,1687 collections_admins_limit: 5,1688 custom_data_limit: 2048,1689 nft_sponsor_transfer_timeout: 15,1690 fungible_sponsor_transfer_timeout: 15,1691 refungible_sponsor_transfer_timeout: 15, 1692 }));1693 1694 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16951696 let origin1 = Origin::signed(1);1697 let data = default_nft_data();1698 create_test_item(collection_id, &data.clone().into());16991700 assert_noop!(TemplateModule::create_item(1701 origin1.clone(),1702 1,1703 1,1704 data.into()1705 ), Error::<Test>::AddressOwnershipLimitExceeded);1706 });1707}17081709// Number of collection admins. Positive test1710#[test]1711fn collection_admins_bound() {1712 new_test_ext().execute_with(|| {1713 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1714 collection_numbers_limit: 10,1715 account_token_ownership_limit: 10,1716 collections_admins_limit: 2,1717 custom_data_limit: 2048,1718 nft_sponsor_transfer_timeout: 15,1719 fungible_sponsor_transfer_timeout: 15,1720 refungible_sponsor_transfer_timeout: 15, 1721 }));1722 1723 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17241725 let origin1 = Origin::signed(1);1726 1727 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1728 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1729 });1730}17311732// Number of collection admins. Negotive test1733#[test]1734fn collection_admins_bound_neg() {1735 new_test_ext().execute_with(|| {1736 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1737 collection_numbers_limit: 10,1738 account_token_ownership_limit: 1,1739 collections_admins_limit: 1,1740 custom_data_limit: 2048,1741 nft_sponsor_transfer_timeout: 15,1742 fungible_sponsor_transfer_timeout: 15,1743 refungible_sponsor_transfer_timeout: 15, 1744 }));1745 1746 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748 let origin1 = Origin::signed(1);17491750 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1751 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1752 });1753}17541755// NFT custom data size. Negative test const_data.1756#[test]1757fn custom_data_size_nft_const_data_bound_neg() {1758 new_test_ext().execute_with(|| {1759 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1760 collection_numbers_limit: 10,1761 account_token_ownership_limit: 10,1762 collections_admins_limit: 5,1763 custom_data_limit: 2,1764 nft_sponsor_transfer_timeout: 15,1765 fungible_sponsor_transfer_timeout: 15,1766 refungible_sponsor_transfer_timeout: 15, 1767 }));1768 1769 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17701771 let origin1 = Origin::signed(1);1772 let too_big_const_data = CreateItemData::NFT(CreateNftData{1773 const_data: vec![1, 2, 3, 4],1774 variable_data: vec![]1775 });17761777 assert_noop!(TemplateModule::create_item(1778 origin1.clone(),1779 collection_id,1780 1,1781 too_big_const_data1782 ), Error::<Test>::TokenConstDataLimitExceeded);1783 });1784}17851786// NFT custom data size. Negative test variable_data.1787#[test]1788fn custom_data_size_nft_variable_data_bound_neg() {1789 new_test_ext().execute_with(|| {1790 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1791 collection_numbers_limit: 10,1792 account_token_ownership_limit: 10,1793 collections_admins_limit: 5,1794 custom_data_limit: 2,1795 nft_sponsor_transfer_timeout: 15,1796 fungible_sponsor_transfer_timeout: 15,1797 refungible_sponsor_transfer_timeout: 15, 1798 }));17991800 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18011802 let origin1 = Origin::signed(1);1803 let too_big_const_data = CreateItemData::NFT(CreateNftData{1804 const_data: vec![],1805 variable_data: vec![1, 2, 3, 4]1806 });18071808 assert_noop!(TemplateModule::create_item(1809 origin1.clone(),1810 collection_id,1811 1,1812 too_big_const_data1813 ), Error::<Test>::TokenVariableDataLimitExceeded);1814 });1815}18161817// Re fungible custom data size. Negative test const_data.1818#[test]1819fn custom_data_size_re_fungible_const_data_bound_neg() {1820 new_test_ext().execute_with(|| {1821 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1822 collection_numbers_limit: 10,1823 account_token_ownership_limit: 10,1824 collections_admins_limit: 5,1825 custom_data_limit: 2,1826 nft_sponsor_transfer_timeout: 15,1827 fungible_sponsor_transfer_timeout: 15,1828 refungible_sponsor_transfer_timeout: 15, 1829 }));18301831 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18321833 let origin1 = Origin::signed(1);1834 let too_big_const_data = CreateItemData::NFT(CreateNftData{1835 const_data: vec![1, 2, 3, 4],1836 variable_data: vec![]1837 });18381839 assert_noop!(TemplateModule::create_item(1840 origin1.clone(),1841 collection_id,1842 1,1843 too_big_const_data1844 ), Error::<Test>::TokenConstDataLimitExceeded);1845 });1846}18471848// Re fungible custom data size. Negative test variable_data.1849#[test]1850fn custom_data_size_re_fungible_variable_data_bound_neg() {1851 new_test_ext().execute_with(|| {1852 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1853 collection_numbers_limit: 10,1854 account_token_ownership_limit: 10,1855 collections_admins_limit: 5,1856 custom_data_limit: 2,1857 nft_sponsor_transfer_timeout: 15,1858 fungible_sponsor_transfer_timeout: 15,1859 refungible_sponsor_transfer_timeout: 15, 1860 }));18611862 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18631864 let origin1 = Origin::signed(1);1865 let too_big_const_data = CreateItemData::NFT(CreateNftData{1866 const_data: vec![],1867 variable_data: vec![1, 2, 3, 4]1868 });18691870 assert_noop!(TemplateModule::create_item(1871 origin1.clone(),1872 collection_id,1873 1,1874 too_big_const_data1875 ), Error::<Test>::TokenVariableDataLimitExceeded);1876 });1877}1878// #endregion18791880#[test]1881fn set_const_on_chain_schema() {1882 new_test_ext().execute_with(|| {1883 default_limits();18841885 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18861887 let origin1 = Origin::signed(1);1888 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18891890 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1891 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1892 });1893}18941895#[test]1896fn set_variable_on_chain_schema() {1897 new_test_ext().execute_with(|| {1898 default_limits();1899 1900 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19011902 let origin1 = Origin::signed(1);1903 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));19041905 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1906 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1907 });1908}19091910#[test]1911fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1912 new_test_ext().execute_with(|| {1913 default_limits();19141915 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19161917 let origin1 = Origin::signed(1);1918 1919 let data = default_nft_data();1920 create_test_item(1, &data.into());1921 1922 let variable_data = b"test set_variable_meta_data method.".to_vec();1923 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19241925 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1926 });1927}19281929#[test]1930fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1931 new_test_ext().execute_with(|| {1932 default_limits();19331934 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19351936 let origin1 = Origin::signed(1);19371938 let data = default_re_fungible_data();1939 create_test_item(1, &data.into());19401941 let variable_data = b"test set_variable_meta_data method.".to_vec();1942 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19431944 assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1945 });1946}194719481949#[test]1950fn set_variable_meta_data_on_fungible_token_fails() {1951 new_test_ext().execute_with(|| {1952 default_limits();19531954 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19551956 let origin1 = Origin::signed(1);19571958 let data = default_fungible_data();1959 create_test_item(1, &data.into());19601961 let variable_data = b"test set_variable_meta_data method.".to_vec();1962 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1963 });1964}19651966#[test]1967fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1968 new_test_ext().execute_with(|| {1969 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1970 collection_numbers_limit: default_collection_numbers_limit(),1971 account_token_ownership_limit: 10,1972 collections_admins_limit: 5,1973 custom_data_limit: 10,1974 nft_sponsor_transfer_timeout: 15,1975 fungible_sponsor_transfer_timeout: 15,1976 refungible_sponsor_transfer_timeout: 15, 1977 }));19781979 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19801981 let origin1 = Origin::signed(1);19821983 let data = default_nft_data();1984 create_test_item(1, &data.into());19851986 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1987 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1988 });1989}19901991#[test]1992fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1993 new_test_ext().execute_with(|| {1994 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1995 collection_numbers_limit: default_collection_numbers_limit(),1996 account_token_ownership_limit: 10,1997 collections_admins_limit: 5,1998 custom_data_limit: 10,1999 nft_sponsor_transfer_timeout: 15,2000 fungible_sponsor_transfer_timeout: 15,2001 refungible_sponsor_transfer_timeout: 15, 2002 }));200320042005 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);20062007 let origin1 = Origin::signed(1);20082009 let data = default_re_fungible_data();2010 create_test_item(1, &data.into());20112012 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2013 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2014 });2015}