difftreelog
fix cargo fmt
in: master
1 file changed
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, CreateItemData};5use nft_data_structs::{6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7 MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use sp_std::convert::TryInto;1112fn default_nft_data() -> CreateNftData {13 CreateNftData {14 const_data: vec![1, 2, 3].try_into().unwrap(),15 variable_data: vec![3, 2, 1].try_into().unwrap(),16 }17}1819fn default_fungible_data() -> CreateFungibleData {20 CreateFungibleData { value: 5 }21}2223fn default_re_fungible_data() -> CreateReFungibleData {24 CreateReFungibleData {25 const_data: vec![1, 2, 3].try_into().unwrap(),26 variable_data: vec![3, 2, 1].try_into().unwrap(),27 pieces: 1023,28 }29}3031fn create_test_collection_for_owner(32 mode: &CollectionMode,33 owner: u64,34 id: CollectionId,35) -> CollectionId {36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();37 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();38 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3940 let origin1 = Origin::signed(owner);41 assert_ok!(TemplateModule::create_collection(42 origin1,43 col_name1,44 col_desc1,45 token_prefix1,46 mode.clone()47 ));4849 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();50 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();51 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();52 assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);53 assert_eq!(54 TemplateModule::collection_id(id).unwrap().name,55 saved_col_name56 );57 assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);58 assert_eq!(59 TemplateModule::collection_id(id).unwrap().description,60 saved_description61 );62 assert_eq!(63 TemplateModule::collection_id(id).unwrap().token_prefix,64 saved_prefix65 );66 id67}6869fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {70 create_test_collection_for_owner(&mode, 1, id)71}7273fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {74 let origin1 = Origin::signed(1);75 assert_ok!(TemplateModule::create_item(76 origin1,77 collection_id,78 account(1),79 data.clone()80 ));81}8283fn account(sub: u64) -> TestCrossAccountId {84 TestCrossAccountId::from_sub(sub)85}8687// Use cases tests region88// #region8990#[test]91fn set_version_schema() {92 new_test_ext().execute_with(|| {93 let origin1 = Origin::signed(1);94 let collection_id = create_test_collection(&CollectionMode::NFT, 1);9596 assert_ok!(TemplateModule::set_schema_version(97 origin1,98 collection_id,99 SchemaVersion::Unique100 ));101 assert_eq!(102 TemplateModule::collection_id(collection_id)103 .unwrap()104 .schema_version,105 SchemaVersion::Unique106 );107 });108}109110#[test]111fn create_fungible_collection_fails_with_large_decimal_numbers() {112 new_test_ext().execute_with(|| {113 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();114 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();115 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();116117 let origin1 = Origin::signed(1);118 assert_noop!(119 TemplateModule::create_collection(120 origin1,121 col_name1,122 col_desc1,123 token_prefix1,124 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)125 ),126 Error::<Test>::CollectionDecimalPointLimitExceeded127 );128 });129}130131#[test]132fn create_nft_item() {133 new_test_ext().execute_with(|| {134 let collection_id = create_test_collection(&CollectionMode::NFT, 1);135136 let data = default_nft_data();137 create_test_item(collection_id, &data.clone().into());138 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();139 assert_eq!(item.const_data, data.const_data.into_inner());140 assert_eq!(item.variable_data, data.variable_data.into_inner());141 });142}143144// Use cases tests region145// #region146#[test]147fn create_nft_multiple_items() {148 new_test_ext().execute_with(|| {149 create_test_collection(&CollectionMode::NFT, 1);150151 let origin1 = Origin::signed(1);152153 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];154155 assert_ok!(TemplateModule::create_multiple_items(156 origin1,157 1,158 account(1),159 items_data160 .clone()161 .into_iter()162 .map(|d| { d.into() })163 .collect()164 ));165 for (index, data) in items_data.into_iter().enumerate() {166 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();167 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());168 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());169 }170 });171}172173#[test]174fn create_refungible_item() {175 new_test_ext().execute_with(|| {176 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);177178 let data = default_re_fungible_data();179 create_test_item(collection_id, &data.clone().into());180 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();181 assert_eq!(item.const_data, data.const_data.into_inner());182 assert_eq!(item.variable_data, data.variable_data.into_inner());183 assert_eq!(184 item.owner[0],185 Ownership {186 owner: account(1),187 fraction: 1023188 }189 );190 });191}192193#[test]194fn create_multiple_refungible_items() {195 new_test_ext().execute_with(|| {196 create_test_collection(&CollectionMode::ReFungible, 1);197198 let origin1 = Origin::signed(1);199200 let items_data = vec![201 default_re_fungible_data(),202 default_re_fungible_data(),203 default_re_fungible_data(),204 ];205206 assert_ok!(TemplateModule::create_multiple_items(207 origin1,208 1,209 account(1),210 items_data211 .clone()212 .into_iter()213 .map(|d| { d.into() })214 .collect()215 ));216 for (index, data) in items_data.into_iter().enumerate() {217 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();218 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());219 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());220 assert_eq!(221 item.owner[0],222 Ownership {223 owner: account(1),224 fraction: 1023225 }226 );227 }228 });229}230231#[test]232fn create_fungible_item() {233 new_test_ext().execute_with(|| {234 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);235236 let data = default_fungible_data();237 create_test_item(collection_id, &data.into());238239 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);240 });241}242243//#[test]244// fn create_multiple_fungible_items() {245// new_test_ext().execute_with(|| {246// default_limits();247248// create_test_collection(&CollectionMode::Fungible(3), 1);249250// let origin1 = Origin::signed(1);251252// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];253254// assert_ok!(TemplateModule::create_multiple_items(255// origin1.clone(),256// 1,257// 1,258// items_data.clone().into_iter().map(|d| { d.into() }).collect()259// ));260261// for (index, _) in items_data.iter().enumerate() {262// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);263// }264// assert_eq!(TemplateModule::balance_count(1, 1), 3000);265// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);266// });267// }268269#[test]270fn transfer_fungible_item() {271 new_test_ext().execute_with(|| {272 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);273274 let origin1 = Origin::signed(1);275 let origin2 = Origin::signed(2);276277 let data = default_fungible_data();278 create_test_item(collection_id, &data.into());279280 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);281 assert_eq!(TemplateModule::balance_count(1, 1), 5);282283 // change owner scenario284 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));285 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);286 assert_eq!(TemplateModule::balance_count(1, 1), 0);287 assert_eq!(TemplateModule::balance_count(1, 2), 5);288289 // split item scenario290 assert_ok!(TemplateModule::transfer(291 origin2.clone(),292 account(3),293 1,294 1,295 3296 ));297 assert_eq!(TemplateModule::balance_count(1, 2), 2);298 assert_eq!(TemplateModule::balance_count(1, 3), 3);299300 // split item and new owner has account scenario301 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));302 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);303 assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);304 assert_eq!(TemplateModule::balance_count(1, 2), 1);305 assert_eq!(TemplateModule::balance_count(1, 3), 4);306 });307}308309#[test]310fn transfer_refungible_item() {311 new_test_ext().execute_with(|| {312 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);313314 let data = default_re_fungible_data();315 create_test_item(collection_id, &data.clone().into());316317 let origin1 = Origin::signed(1);318 let origin2 = Origin::signed(2);319 {320 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();321 assert_eq!(item.const_data, data.const_data.into_inner());322 assert_eq!(item.variable_data, data.variable_data.into_inner());323 assert_eq!(324 item.owner[0],325 Ownership {326 owner: account(1),327 fraction: 1023328 }329 );330 }331 assert_eq!(TemplateModule::balance_count(1, 1), 1023);332 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);333334 // change owner scenario335 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));336 assert_eq!(337 TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],338 Ownership {339 owner: account(2),340 fraction: 1023341 }342 );343 assert_eq!(TemplateModule::balance_count(1, 1), 0);344 assert_eq!(TemplateModule::balance_count(1, 2), 1023);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(350 origin2.clone(),351 account(3),352 1,353 1,354 500355 ));356 {357 let item = TemplateModule::refungible_item_id(1, 1).unwrap();358 assert_eq!(359 item.owner[0],360 Ownership {361 owner: account(2),362 fraction: 523363 }364 );365 assert_eq!(366 item.owner[1],367 Ownership {368 owner: account(3),369 fraction: 500370 }371 );372 }373 assert_eq!(TemplateModule::balance_count(1, 2), 523);374 assert_eq!(TemplateModule::balance_count(1, 3), 500);375 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);376 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);377378 // split item and new owner has account scenario379 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));380 {381 let item = TemplateModule::refungible_item_id(1, 1).unwrap();382 assert_eq!(383 item.owner[0],384 Ownership {385 owner: account(2),386 fraction: 323387 }388 );389 assert_eq!(390 item.owner[1],391 Ownership {392 owner: account(3),393 fraction: 700394 }395 );396 }397 assert_eq!(TemplateModule::balance_count(1, 2), 323);398 assert_eq!(TemplateModule::balance_count(1, 3), 700);399 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);400 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);401 });402}403404#[test]405fn transfer_nft_item() {406 new_test_ext().execute_with(|| {407 let collection_id = create_test_collection(&CollectionMode::NFT, 1);408409 let data = default_nft_data();410 create_test_item(collection_id, &data.into());411 assert_eq!(TemplateModule::balance_count(1, 1), 1);412 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);413414 let origin1 = Origin::signed(1);415 // default scenario416 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));417 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));418 assert_eq!(TemplateModule::balance_count(1, 1), 0);419 assert_eq!(TemplateModule::balance_count(1, 2), 1);420 // assert_eq!(TemplateModule::address_tokens(1, 1), []);421 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);422 });423}424425#[test]426fn nft_approve_and_transfer_from() {427 new_test_ext().execute_with(|| {428 let collection_id = create_test_collection(&CollectionMode::NFT, 1);429430 let data = default_nft_data();431 create_test_item(collection_id, &data.into());432433 let origin1 = Origin::signed(1);434 let origin2 = Origin::signed(2);435436 assert_eq!(TemplateModule::balance_count(1, 1), 1);437 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);438439 // neg transfer440 assert_noop!(441 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),442 Error::<Test>::NoPermission443 );444445 // do approve446 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));447 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);448 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);449450 assert_ok!(TemplateModule::transfer_from(451 origin2,452 account(1),453 account(3),454 1,455 1,456 1457 ));458 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);459 });460}461462#[test]463fn nft_approve_and_transfer_from_white_list() {464 new_test_ext().execute_with(|| {465 let collection_id = create_test_collection(&CollectionMode::NFT, 1);466467 let origin1 = Origin::signed(1);468 let origin2 = Origin::signed(2);469470 let data = default_nft_data();471 create_test_item(collection_id, &data.clone().into());472473 assert_eq!(474 &TemplateModule::nft_item_id(1, 1).unwrap().const_data,475 &data.const_data.into_inner()476 );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(491 origin1.clone(),492 1,493 account(1)494 ));495 assert_ok!(TemplateModule::add_to_white_list(496 origin1.clone(),497 1,498 account(2)499 ));500 assert_ok!(TemplateModule::add_to_white_list(501 origin1.clone(),502 1,503 account(3)504 ));505506 // do approve507 assert_ok!(TemplateModule::approve(508 origin1.clone(),509 account(2),510 1,511 1,512 5513 ));514 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);515 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));516 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);517518 assert_ok!(TemplateModule::transfer_from(519 origin2,520 account(1),521 account(3),522 1,523 1,524 1525 ));526 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);527 });528}529530#[test]531fn refungible_approve_and_transfer_from() {532 new_test_ext().execute_with(|| {533 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);534535 let origin1 = Origin::signed(1);536 let origin2 = Origin::signed(2);537538 let data = default_re_fungible_data();539 create_test_item(collection_id, &data.into());540541 assert_eq!(TemplateModule::balance_count(1, 1), 1023);542 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);543544 assert_ok!(TemplateModule::set_mint_permission(545 origin1.clone(),546 1,547 true548 ));549 assert_ok!(TemplateModule::set_public_access_mode(550 origin1.clone(),551 1,552 AccessMode::WhiteList553 ));554 assert_ok!(TemplateModule::add_to_white_list(555 origin1.clone(),556 1,557 account(1)558 ));559 assert_ok!(TemplateModule::add_to_white_list(560 origin1.clone(),561 1,562 account(2)563 ));564 assert_ok!(TemplateModule::add_to_white_list(565 origin1.clone(),566 1,567 account(3)568 ));569570 // do approve571 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));572 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);573574 assert_ok!(TemplateModule::transfer_from(575 origin2,576 account(1),577 account(3),578 1,579 1,580 100581 ));582 assert_eq!(TemplateModule::balance_count(1, 1), 923);583 assert_eq!(TemplateModule::balance_count(1, 3), 100);584 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);585 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);586587 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);588 });589}590591#[test]592fn fungible_approve_and_transfer_from() {593 new_test_ext().execute_with(|| {594 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);595596 let data = default_fungible_data();597 create_test_item(collection_id, &data.into());598599 let origin1 = Origin::signed(1);600 let origin2 = Origin::signed(2);601602 assert_eq!(TemplateModule::balance_count(1, 1), 5);603604 assert_ok!(TemplateModule::set_mint_permission(605 origin1.clone(),606 1,607 true608 ));609 assert_ok!(TemplateModule::set_public_access_mode(610 origin1.clone(),611 1,612 AccessMode::WhiteList613 ));614 assert_ok!(TemplateModule::add_to_white_list(615 origin1.clone(),616 1,617 account(1)618 ));619 assert_ok!(TemplateModule::add_to_white_list(620 origin1.clone(),621 1,622 account(2)623 ));624 assert_ok!(TemplateModule::add_to_white_list(625 origin1.clone(),626 1,627 account(3)628 ));629630 // do approve631 assert_ok!(TemplateModule::approve(632 origin1.clone(),633 account(2),634 1,635 1,636 5637 ));638 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);639 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));640 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);641 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);642643 assert_ok!(TemplateModule::transfer_from(644 origin2.clone(),645 account(1),646 account(3),647 1,648 1,649 4650 ));651 assert_eq!(TemplateModule::balance_count(1, 1), 1);652 assert_eq!(TemplateModule::balance_count(1, 3), 4);653654 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);655656 assert_noop!(657 TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),658 Error::<Test>::NoPermission659 );660 });661}662663#[test]664fn change_collection_owner() {665 new_test_ext().execute_with(|| {666 let collection_id = create_test_collection(&CollectionMode::NFT, 1);667668 let origin1 = Origin::signed(1);669 assert_ok!(TemplateModule::change_collection_owner(670 origin1,671 collection_id,672 2673 ));674 assert_eq!(675 TemplateModule::collection_id(collection_id).unwrap().owner,676 2677 );678 });679}680681#[test]682fn destroy_collection() {683 new_test_ext().execute_with(|| {684 let collection_id = create_test_collection(&CollectionMode::NFT, 1);685686 let origin1 = Origin::signed(1);687 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));688 });689}690691#[test]692fn burn_nft_item() {693 new_test_ext().execute_with(|| {694 let collection_id = create_test_collection(&CollectionMode::NFT, 1);695696 let origin1 = Origin::signed(1);697 assert_ok!(TemplateModule::add_collection_admin(698 origin1.clone(),699 collection_id,700 account(2)701 ));702703 let data = default_nft_data();704 create_test_item(collection_id, &data.into());705706 // check balance (collection with id = 1, user id = 1)707 assert_eq!(TemplateModule::balance_count(1, 1), 1);708709 // burn item710 assert_ok!(TemplateModule::burn_item(711 origin1.clone(),712 collection_id,713 1,714 1715 ));716 assert_noop!(717 TemplateModule::burn_item(origin1, collection_id, 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 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);729730 let origin1 = Origin::signed(1);731 assert_ok!(TemplateModule::add_collection_admin(732 origin1.clone(),733 collection_id,734 account(2)735 ));736737 let data = default_fungible_data();738 create_test_item(collection_id, &data.into());739740 // check balance (collection with id = 1, user id = 1)741 assert_eq!(TemplateModule::balance_count(1, 1), 5);742743 // burn item744 assert_ok!(TemplateModule::burn_item(745 origin1.clone(),746 1,747 1,748 5749 ));750 assert_noop!(751 TemplateModule::burn_item(origin1, 1, 1, 5),752 Error::<Test>::TokenValueNotEnough753 );754755 assert_eq!(TemplateModule::balance_count(1, 1), 0);756 });757}758759#[test]760fn burn_refungible_item() {761 new_test_ext().execute_with(|| {762 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);763 let origin1 = Origin::signed(1);764765 assert_ok!(TemplateModule::set_mint_permission(766 origin1.clone(),767 collection_id,768 true769 ));770 assert_ok!(TemplateModule::set_public_access_mode(771 origin1.clone(),772 collection_id,773 AccessMode::WhiteList774 ));775 assert_ok!(TemplateModule::add_to_white_list(776 origin1.clone(),777 1,778 account(1)779 ));780781 assert_ok!(TemplateModule::add_collection_admin(782 origin1.clone(),783 1,784 account(2)785 ));786787 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), 1023);792793 // burn item794 assert_ok!(TemplateModule::burn_item(795 origin1.clone(),796 1,797 1,798 1023799 ));800 assert_noop!(801 TemplateModule::burn_item(origin1, 1, 1, 1023),802 Error::<Test>::TokenNotFound803 );804805 assert_eq!(TemplateModule::balance_count(1, 1), 0);806 });807}808809#[test]810fn add_collection_admin() {811 new_test_ext().execute_with(|| {812 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);813 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);814 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);815816 let origin1 = Origin::signed(1);817818 // collection admin819 assert_ok!(TemplateModule::add_collection_admin(820 origin1.clone(),821 collection1_id,822 account(2)823 ));824 assert_ok!(TemplateModule::add_collection_admin(825 origin1,826 collection1_id,827 account(3)828 ));829830 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);831 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);832 });833}834835#[test]836fn remove_collection_admin() {837 new_test_ext().execute_with(|| {838 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);839 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);840 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);841842 let origin1 = Origin::signed(1);843 let origin2 = Origin::signed(2);844845 // collection admin846 assert_ok!(TemplateModule::add_collection_admin(847 origin1.clone(),848 collection1_id,849 account(2)850 ));851 assert_ok!(TemplateModule::add_collection_admin(852 origin1,853 collection1_id,854 account(3)855 ));856857 assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);858 assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);859860 // remove admin861 assert_ok!(TemplateModule::remove_collection_admin(862 origin2,863 1,864 account(3)865 ));866 assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);867 });868}869870#[test]871fn balance_of() {872 new_test_ext().execute_with(|| {873 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);874 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);875 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);876877 // check balance before878 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);879 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);880 assert_eq!(881 TemplateModule::balance_count(re_fungible_collection_id, 1),882 0883 );884885 let nft_data = default_nft_data();886 create_test_item(nft_collection_id, &nft_data.into());887888 let fungible_data = default_fungible_data();889 create_test_item(fungible_collection_id, &fungible_data.into());890891 let re_fungible_data = default_re_fungible_data();892 create_test_item(re_fungible_collection_id, &re_fungible_data.into());893894 // check balance (collection with id = 1, user id = 1)895 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);896 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);897 assert_eq!(898 TemplateModule::balance_count(re_fungible_collection_id, 1),899 1023900 );901 assert_eq!(902 TemplateModule::nft_item_id(nft_collection_id, 1)903 .unwrap()904 .owner,905 account(1)906 );907 assert_eq!(908 TemplateModule::fungible_item_id(fungible_collection_id, 1).value,909 5910 );911 assert_eq!(912 TemplateModule::refungible_item_id(re_fungible_collection_id, 1)913 .unwrap()914 .owner[0]915 .owner,916 account(1)917 );918 });919}920921#[test]922fn approve() {923 new_test_ext().execute_with(|| {924 let collection_id = create_test_collection(&CollectionMode::NFT, 1);925926 let data = default_nft_data();927 create_test_item(collection_id, &data.into());928929 let origin1 = Origin::signed(1);930931 // approve932 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));933 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);934 });935}936937#[test]938fn transfer_from() {939 new_test_ext().execute_with(|| {940 let collection_id = create_test_collection(&CollectionMode::NFT, 1);941 let origin1 = Origin::signed(1);942 let origin2 = Origin::signed(2);943944 let data = default_nft_data();945 create_test_item(collection_id, &data.into());946947 // approve948 assert_ok!(TemplateModule::approve(949 origin1.clone(),950 account(2),951 1,952 1,953 1954 ));955 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);956957 assert_ok!(TemplateModule::set_mint_permission(958 origin1.clone(),959 1,960 true961 ));962 assert_ok!(TemplateModule::set_public_access_mode(963 origin1.clone(),964 1,965 AccessMode::WhiteList966 ));967 assert_ok!(TemplateModule::add_to_white_list(968 origin1.clone(),969 1,970 account(1)971 ));972 assert_ok!(TemplateModule::add_to_white_list(973 origin1.clone(),974 1,975 account(2)976 ));977 assert_ok!(TemplateModule::add_to_white_list(origin1, 1, account(3)));978979 assert_ok!(TemplateModule::transfer_from(980 origin2,981 account(1),982 account(2),983 1,984 1,985 1986 ));987988 // after transfer989 assert_eq!(TemplateModule::balance_count(1, 1), 0);990 assert_eq!(TemplateModule::balance_count(1, 2), 1);991 });992}993994// #endregion995996// Coverage tests region997// #region998999#[test]1000fn owner_can_add_address_to_white_list() {1001 new_test_ext().execute_with(|| {1002 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10031004 let origin1 = Origin::signed(1);1005 assert_ok!(TemplateModule::add_to_white_list(1006 origin1,1007 collection_id,1008 account(2)1009 ));1010 assert!(TemplateModule::white_list(collection_id, 2));1011 });1012}10131014#[test]1015fn admin_can_add_address_to_white_list() {1016 new_test_ext().execute_with(|| {1017 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1018 let origin1 = Origin::signed(1);1019 let origin2 = Origin::signed(2);10201021 assert_ok!(TemplateModule::add_collection_admin(1022 origin1,1023 collection_id,1024 account(2)1025 ));1026 assert_ok!(TemplateModule::add_to_white_list(1027 origin2,1028 collection_id,1029 account(3)1030 ));1031 assert!(TemplateModule::white_list(collection_id, 3));1032 });1033}10341035#[test]1036fn nonprivileged_user_cannot_add_address_to_white_list() {1037 new_test_ext().execute_with(|| {1038 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10391040 let origin2 = Origin::signed(2);1041 assert_noop!(1042 TemplateModule::add_to_white_list(origin2, collection_id, account(3)),1043 Error::<Test>::NoPermission1044 );1045 });1046}10471048#[test]1049fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1050 new_test_ext().execute_with(|| {1051 let origin1 = Origin::signed(1);10521053 assert_noop!(1054 TemplateModule::add_to_white_list(origin1, 1, account(2)),1055 Error::<Test>::CollectionNotFound1056 );1057 });1058}10591060#[test]1061fn nobody_can_add_address_to_white_list_of_deleted_collection() {1062 new_test_ext().execute_with(|| {1063 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10641065 let origin1 = Origin::signed(1);1066 assert_ok!(TemplateModule::destroy_collection(1067 origin1.clone(),1068 collection_id1069 ));1070 assert_noop!(1071 TemplateModule::add_to_white_list(origin1, collection_id, account(2)),1072 Error::<Test>::CollectionNotFound1073 );1074 });1075}10761077// If address is already added to white list, nothing happens1078#[test]1079fn address_is_already_added_to_white_list() {1080 new_test_ext().execute_with(|| {1081 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1082 let origin1 = Origin::signed(1);10831084 assert_ok!(TemplateModule::add_to_white_list(1085 origin1.clone(),1086 collection_id,1087 account(2)1088 ));1089 assert_ok!(TemplateModule::add_to_white_list(1090 origin1,1091 collection_id,1092 account(2)1093 ));1094 assert!(TemplateModule::white_list(collection_id, 2));1095 });1096}10971098#[test]1099fn owner_can_remove_address_from_white_list() {1100 new_test_ext().execute_with(|| {1101 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11021103 let origin1 = Origin::signed(1);1104 assert_ok!(TemplateModule::add_to_white_list(1105 origin1.clone(),1106 collection_id,1107 account(2)1108 ));1109 assert_ok!(TemplateModule::remove_from_white_list(1110 origin1,1111 collection_id,1112 account(2)1113 ));1114 assert!(!TemplateModule::white_list(collection_id, 2));1115 });1116}11171118#[test]1119fn admin_can_remove_address_from_white_list() {1120 new_test_ext().execute_with(|| {1121 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1122 let origin1 = Origin::signed(1);1123 let origin2 = Origin::signed(2);11241125 assert_ok!(TemplateModule::add_collection_admin(1126 origin1.clone(),1127 collection_id,1128 account(2)1129 ));11301131 assert_ok!(TemplateModule::add_to_white_list(1132 origin1,1133 collection_id,1134 account(3)1135 ));1136 assert_ok!(TemplateModule::remove_from_white_list(1137 origin2,1138 collection_id,1139 account(3)1140 ));1141 assert!(!TemplateModule::white_list(collection_id, 3));1142 });1143}11441145#[test]1146fn nonprivileged_user_cannot_remove_address_from_white_list() {1147 new_test_ext().execute_with(|| {1148 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1149 let origin1 = Origin::signed(1);1150 let origin2 = Origin::signed(2);11511152 assert_ok!(TemplateModule::add_to_white_list(1153 origin1,1154 collection_id,1155 account(2)1156 ));1157 assert_noop!(1158 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1159 Error::<Test>::NoPermission1160 );1161 assert!(TemplateModule::white_list(collection_id, 2));1162 });1163}11641165#[test]1166fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1167 new_test_ext().execute_with(|| {1168 let origin1 = Origin::signed(1);11691170 assert_noop!(1171 TemplateModule::remove_from_white_list(origin1, 1, account(2)),1172 Error::<Test>::CollectionNotFound1173 );1174 });1175}11761177#[test]1178fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1179 new_test_ext().execute_with(|| {1180 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1181 let origin1 = Origin::signed(1);1182 let origin2 = Origin::signed(2);11831184 assert_ok!(TemplateModule::add_to_white_list(1185 origin1.clone(),1186 collection_id,1187 account(2)1188 ));1189 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1190 assert_noop!(1191 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1192 Error::<Test>::CollectionNotFound1193 );1194 assert!(!TemplateModule::white_list(collection_id, 2));1195 });1196}11971198// If address is already removed from white list, nothing happens1199#[test]1200fn address_is_already_removed_from_white_list() {1201 new_test_ext().execute_with(|| {1202 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1203 let origin1 = Origin::signed(1);12041205 assert_ok!(TemplateModule::add_to_white_list(1206 origin1.clone(),1207 collection_id,1208 account(2)1209 ));1210 assert_ok!(TemplateModule::remove_from_white_list(1211 origin1.clone(),1212 collection_id,1213 account(2)1214 ));1215 assert_ok!(TemplateModule::remove_from_white_list(1216 origin1,1217 collection_id,1218 account(2)1219 ));1220 assert!(!TemplateModule::white_list(collection_id, 2));1221 });1222}12231224// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1225#[test]1226fn white_list_test_1() {1227 new_test_ext().execute_with(|| {1228 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12291230 let origin1 = Origin::signed(1);12311232 let data = default_nft_data();1233 create_test_item(collection_id, &data.into());12341235 assert_ok!(TemplateModule::set_public_access_mode(1236 origin1.clone(),1237 collection_id,1238 AccessMode::WhiteList1239 ));1240 assert_ok!(TemplateModule::add_to_white_list(1241 origin1.clone(),1242 collection_id,1243 account(2)1244 ));12451246 assert_noop!(1247 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1248 Error::<Test>::AddresNotInWhiteList1249 );1250 });1251}12521253#[test]1254fn white_list_test_2() {1255 new_test_ext().execute_with(|| {1256 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1257 let origin1 = Origin::signed(1);12581259 let data = default_nft_data();1260 create_test_item(collection_id, &data.into());12611262 assert_ok!(TemplateModule::set_public_access_mode(1263 origin1.clone(),1264 collection_id,1265 AccessMode::WhiteList1266 ));1267 assert_ok!(TemplateModule::add_to_white_list(1268 origin1.clone(),1269 1,1270 account(1)1271 ));1272 assert_ok!(TemplateModule::add_to_white_list(1273 origin1.clone(),1274 1,1275 account(2)1276 ));12771278 // do approve1279 assert_ok!(TemplateModule::approve(1280 origin1.clone(),1281 account(1),1282 1,1283 1,1284 11285 ));1286 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);12871288 assert_ok!(TemplateModule::remove_from_white_list(1289 origin1.clone(),1290 1,1291 account(1)1292 ));12931294 assert_noop!(1295 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1296 Error::<Test>::AddresNotInWhiteList1297 );1298 });1299}13001301// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1302#[test]1303fn white_list_test_3() {1304 new_test_ext().execute_with(|| {1305 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13061307 let origin1 = Origin::signed(1);13081309 let data = default_nft_data();1310 create_test_item(collection_id, &data.into());13111312 assert_ok!(TemplateModule::set_public_access_mode(1313 origin1.clone(),1314 collection_id,1315 AccessMode::WhiteList1316 ));1317 assert_ok!(TemplateModule::add_to_white_list(1318 origin1.clone(),1319 1,1320 account(1)1321 ));13221323 assert_noop!(1324 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1325 Error::<Test>::AddresNotInWhiteList1326 );1327 });1328}13291330#[test]1331fn white_list_test_4() {1332 new_test_ext().execute_with(|| {1333 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13341335 let origin1 = Origin::signed(1);13361337 let data = default_nft_data();1338 create_test_item(collection_id, &data.into());13391340 assert_ok!(TemplateModule::set_public_access_mode(1341 origin1.clone(),1342 collection_id,1343 AccessMode::WhiteList1344 ));1345 assert_ok!(TemplateModule::add_to_white_list(1346 origin1.clone(),1347 collection_id,1348 account(1)1349 ));1350 assert_ok!(TemplateModule::add_to_white_list(1351 origin1.clone(),1352 collection_id,1353 account(2)1354 ));13551356 // do approve1357 assert_ok!(TemplateModule::approve(1358 origin1.clone(),1359 account(1),1360 1,1361 1,1362 11363 ));1364 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13651366 assert_ok!(TemplateModule::remove_from_white_list(1367 origin1.clone(),1368 collection_id,1369 account(2)1370 ));13711372 assert_noop!(1373 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1374 Error::<Test>::AddresNotInWhiteList1375 );1376 });1377}13781379// 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)1380#[test]1381fn white_list_test_5() {1382 new_test_ext().execute_with(|| {1383 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13841385 let origin1 = Origin::signed(1);13861387 let data = default_nft_data();1388 create_test_item(collection_id, &data.into());13891390 assert_ok!(TemplateModule::set_public_access_mode(1391 origin1.clone(),1392 collection_id,1393 AccessMode::WhiteList1394 ));1395 assert_noop!(1396 TemplateModule::burn_item(origin1.clone(), 1, 1, 5),1397 Error::<Test>::AddresNotInWhiteList1398 );1399 });1400}14011402// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1403#[test]1404fn white_list_test_6() {1405 new_test_ext().execute_with(|| {1406 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14071408 let origin1 = Origin::signed(1);14091410 let data = default_nft_data();1411 create_test_item(collection_id, &data.into());14121413 assert_ok!(TemplateModule::set_public_access_mode(1414 origin1.clone(),1415 collection_id,1416 AccessMode::WhiteList1417 ));14181419 // do approve1420 assert_noop!(1421 TemplateModule::approve(origin1, account(1), 1, 1, 5),1422 Error::<Test>::AddresNotInWhiteList1423 );1424 });1425}14261427// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1428// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1429#[test]1430fn white_list_test_7() {1431 new_test_ext().execute_with(|| {1432 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14331434 let data = default_nft_data();1435 create_test_item(collection_id, &data.into());14361437 let origin1 = Origin::signed(1);14381439 assert_ok!(TemplateModule::set_public_access_mode(1440 origin1.clone(),1441 collection_id,1442 AccessMode::WhiteList1443 ));1444 assert_ok!(TemplateModule::add_to_white_list(1445 origin1.clone(),1446 collection_id,1447 account(1)1448 ));1449 assert_ok!(TemplateModule::add_to_white_list(1450 origin1.clone(),1451 collection_id,1452 account(2)1453 ));14541455 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1456 });1457}14581459#[test]1460fn white_list_test_8() {1461 new_test_ext().execute_with(|| {1462 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14631464 let data = default_nft_data();1465 create_test_item(collection_id, &data.into());14661467 let origin1 = Origin::signed(1);14681469 assert_ok!(TemplateModule::set_public_access_mode(1470 origin1.clone(),1471 collection_id,1472 AccessMode::WhiteList1473 ));1474 assert_ok!(TemplateModule::add_to_white_list(1475 origin1.clone(),1476 collection_id,1477 account(1)1478 ));1479 assert_ok!(TemplateModule::add_to_white_list(1480 origin1.clone(),1481 collection_id,1482 account(2)1483 ));14841485 // do approve1486 assert_ok!(TemplateModule::approve(1487 origin1.clone(),1488 account(1),1489 1,1490 1,1491 51492 ));1493 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);14941495 assert_ok!(TemplateModule::transfer_from(1496 origin1,1497 account(1),1498 account(2),1499 1,1500 1,1501 11502 ));1503 });1504}15051506// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1507#[test]1508fn white_list_test_9() {1509 new_test_ext().execute_with(|| {1510 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1511 let origin1 = Origin::signed(1);15121513 assert_ok!(TemplateModule::set_public_access_mode(1514 origin1.clone(),1515 collection_id,1516 AccessMode::WhiteList1517 ));1518 assert_ok!(TemplateModule::set_mint_permission(1519 origin1,1520 collection_id,1521 false1522 ));15231524 let data = default_nft_data();1525 create_test_item(collection_id, &data.into());1526 });1527}15281529// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1530#[test]1531fn white_list_test_10() {1532 new_test_ext().execute_with(|| {1533 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15341535 let origin1 = Origin::signed(1);1536 let origin2 = Origin::signed(2);15371538 assert_ok!(TemplateModule::set_public_access_mode(1539 origin1.clone(),1540 collection_id,1541 AccessMode::WhiteList1542 ));1543 assert_ok!(TemplateModule::set_mint_permission(1544 origin1.clone(),1545 collection_id,1546 false1547 ));15481549 assert_ok!(TemplateModule::add_collection_admin(1550 origin1,1551 collection_id,1552 account(2)1553 ));15541555 assert_ok!(TemplateModule::create_item(1556 origin2,1557 collection_id,1558 account(2),1559 default_nft_data().into()1560 ));1561 });1562}15631564// 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.1565#[test]1566fn white_list_test_11() {1567 new_test_ext().execute_with(|| {1568 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15691570 let origin1 = Origin::signed(1);1571 let origin2 = Origin::signed(2);15721573 assert_ok!(TemplateModule::set_public_access_mode(1574 origin1.clone(),1575 collection_id,1576 AccessMode::WhiteList1577 ));1578 assert_ok!(TemplateModule::set_mint_permission(1579 origin1.clone(),1580 collection_id,1581 false1582 ));1583 assert_ok!(TemplateModule::add_to_white_list(1584 origin1,1585 collection_id,1586 account(2)1587 ));15881589 assert_noop!(1590 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1591 Error::<Test>::PublicMintingNotAllowed1592 );1593 });1594}15951596// 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.1597#[test]1598fn white_list_test_12() {1599 new_test_ext().execute_with(|| {1600 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16011602 let origin1 = Origin::signed(1);1603 let origin2 = Origin::signed(2);16041605 assert_ok!(TemplateModule::set_public_access_mode(1606 origin1.clone(),1607 collection_id,1608 AccessMode::WhiteList1609 ));1610 assert_ok!(TemplateModule::set_mint_permission(1611 origin1,1612 collection_id,1613 false1614 ));16151616 assert_noop!(1617 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1618 Error::<Test>::PublicMintingNotAllowed1619 );1620 });1621}16221623// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1624#[test]1625fn white_list_test_13() {1626 new_test_ext().execute_with(|| {1627 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16281629 let origin1 = Origin::signed(1);16301631 assert_ok!(TemplateModule::set_public_access_mode(1632 origin1.clone(),1633 collection_id,1634 AccessMode::WhiteList1635 ));1636 assert_ok!(TemplateModule::set_mint_permission(1637 origin1,1638 collection_id,1639 true1640 ));16411642 let data = default_nft_data();1643 create_test_item(collection_id, &data.into());1644 });1645}16461647// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1648#[test]1649fn white_list_test_14() {1650 new_test_ext().execute_with(|| {1651 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16521653 let origin1 = Origin::signed(1);1654 let origin2 = Origin::signed(2);16551656 assert_ok!(TemplateModule::set_public_access_mode(1657 origin1.clone(),1658 collection_id,1659 AccessMode::WhiteList1660 ));1661 assert_ok!(TemplateModule::set_mint_permission(1662 origin1.clone(),1663 collection_id,1664 true1665 ));16661667 assert_ok!(TemplateModule::add_collection_admin(1668 origin1,1669 collection_id,1670 account(2)1671 ));16721673 assert_ok!(TemplateModule::create_item(1674 origin2,1675 1,1676 account(2),1677 default_nft_data().into()1678 ));1679 });1680}16811682// 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.1683#[test]1684fn white_list_test_15() {1685 new_test_ext().execute_with(|| {1686 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16871688 let origin1 = Origin::signed(1);1689 let origin2 = Origin::signed(2);16901691 assert_ok!(TemplateModule::set_public_access_mode(1692 origin1.clone(),1693 collection_id,1694 AccessMode::WhiteList1695 ));1696 assert_ok!(TemplateModule::set_mint_permission(1697 origin1,1698 collection_id,1699 true1700 ));17011702 assert_noop!(1703 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1704 Error::<Test>::AddresNotInWhiteList1705 );1706 });1707}17081709// 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.1710#[test]1711fn white_list_test_16() {1712 new_test_ext().execute_with(|| {1713 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17141715 let origin1 = Origin::signed(1);1716 let origin2 = Origin::signed(2);17171718 assert_ok!(TemplateModule::set_public_access_mode(1719 origin1.clone(),1720 collection_id,1721 AccessMode::WhiteList1722 ));1723 assert_ok!(TemplateModule::set_mint_permission(1724 origin1.clone(),1725 collection_id,1726 true1727 ));1728 assert_ok!(TemplateModule::add_to_white_list(1729 origin1,1730 collection_id,1731 account(2)1732 ));17331734 assert_ok!(TemplateModule::create_item(1735 origin2,1736 1,1737 account(2),1738 default_nft_data().into()1739 ));1740 });1741}17421743// Total number of collections. Positive test1744#[test]1745fn total_number_collections_bound() {1746 new_test_ext().execute_with(|| {1747 create_test_collection(&CollectionMode::NFT, 1);1748 });1749}17501751// Total number of collections. Negotive test1752#[test]1753fn total_number_collections_bound_neg() {1754 new_test_ext().execute_with(|| {1755 let origin1 = Origin::signed(1);17561757 for i in 0..COLLECTION_NUMBER_LIMIT {1758 create_test_collection(&CollectionMode::NFT, i + 1);1759 }17601761 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1762 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1763 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17641765 // 11-th collection in chain. Expects error1766 assert_noop!(1767 TemplateModule::create_collection(1768 origin1,1769 col_name1,1770 col_desc1,1771 token_prefix1,1772 CollectionMode::NFT1773 ),1774 Error::<Test>::TotalCollectionsLimitExceeded1775 );1776 });1777}17781779// Owned tokens by a single address. Positive test1780#[test]1781fn owned_tokens_bound() {1782 new_test_ext().execute_with(|| {1783 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17841785 let data = default_nft_data();1786 create_test_item(collection_id, &data.clone().into());1787 create_test_item(collection_id, &data.into());1788 });1789}17901791// Owned tokens by a single address. Negotive test1792#[test]1793fn owned_tokens_bound_neg() {1794 new_test_ext().execute_with(|| {1795 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17961797 let origin1 = Origin::signed(1);17981799 for _ in 0..ACCOUNT_TOKEN_OWNERSHIP_LIMIT {1800 let data = default_nft_data();1801 create_test_item(collection_id, &data.clone().into());1802 }18031804 let data = default_nft_data();1805 assert_noop!(1806 TemplateModule::create_item(origin1, 1, account(1), data.into()),1807 Error::<Test>::AccountTokenLimitExceeded1808 );1809 });1810}18111812// Number of collection admins. Positive test1813#[test]1814fn collection_admins_bound() {1815 new_test_ext().execute_with(|| {1816 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18171818 let origin1 = Origin::signed(1);18191820 assert_ok!(TemplateModule::add_collection_admin(1821 origin1.clone(),1822 collection_id,1823 account(2)1824 ));1825 assert_ok!(TemplateModule::add_collection_admin(1826 origin1,1827 collection_id,1828 account(3)1829 ));1830 });1831}18321833// Number of collection admins. Negotive test1834#[test]1835fn collection_admins_bound_neg() {1836 new_test_ext().execute_with(|| {1837 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18381839 let origin1 = Origin::signed(1);18401841 for i in 0..COLLECTION_ADMINS_LIMIT {1842 assert_ok!(TemplateModule::add_collection_admin(1843 origin1.clone(),1844 collection_id,1845 account(2 + i)1846 ));1847 }1848 assert_noop!(1849 TemplateModule::add_collection_admin(1850 origin1,1851 collection_id,1852 account(3 + COLLECTION_ADMINS_LIMIT)1853 ),1854 Error::<Test>::CollectionAdminsLimitExceeded1855 );1856 });1857}1858// #endregion18591860#[test]1861fn set_const_on_chain_schema() {1862 new_test_ext().execute_with(|| {1863 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18641865 let origin1 = Origin::signed(1);1866 assert_ok!(TemplateModule::set_const_on_chain_schema(1867 origin1,1868 collection_id,1869 b"test const on chain schema".to_vec()1870 ));18711872 assert_eq!(1873 TemplateModule::collection_id(collection_id)1874 .unwrap()1875 .const_on_chain_schema,1876 b"test const on chain schema".to_vec()1877 );1878 assert_eq!(1879 TemplateModule::collection_id(collection_id)1880 .unwrap()1881 .variable_on_chain_schema,1882 b"".to_vec()1883 );1884 });1885}18861887#[test]1888fn set_variable_on_chain_schema() {1889 new_test_ext().execute_with(|| {1890 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18911892 let origin1 = Origin::signed(1);1893 assert_ok!(TemplateModule::set_variable_on_chain_schema(1894 origin1,1895 collection_id,1896 b"test variable on chain schema".to_vec()1897 ));18981899 assert_eq!(1900 TemplateModule::collection_id(collection_id)1901 .unwrap()1902 .const_on_chain_schema,1903 b"".to_vec()1904 );1905 assert_eq!(1906 TemplateModule::collection_id(collection_id)1907 .unwrap()1908 .variable_on_chain_schema,1909 b"test variable on chain schema".to_vec()1910 );1911 });1912}19131914#[test]1915fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1916 new_test_ext().execute_with(|| {1917 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19181919 let origin1 = Origin::signed(1);19201921 let data = default_nft_data();1922 create_test_item(1, &data.into());19231924 let variable_data = b"test data".to_vec();1925 assert_ok!(TemplateModule::set_variable_meta_data(1926 origin1,1927 collection_id,1928 1,1929 variable_data.clone()1930 ));19311932 assert_eq!(1933 TemplateModule::nft_item_id(collection_id, 1)1934 .unwrap()1935 .variable_data,1936 variable_data1937 );1938 });1939}19401941#[test]1942fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1943 new_test_ext().execute_with(|| {1944 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19451946 let origin1 = Origin::signed(1);19471948 let data = default_re_fungible_data();1949 create_test_item(1, &data.into());19501951 let variable_data = b"test data".to_vec();1952 assert_ok!(TemplateModule::set_variable_meta_data(1953 origin1,1954 collection_id,1955 1,1956 variable_data.clone()1957 ));19581959 assert_eq!(1960 TemplateModule::refungible_item_id(collection_id, 1)1961 .unwrap()1962 .variable_data,1963 variable_data1964 );1965 });1966}19671968#[test]1969fn set_variable_meta_data_on_fungible_token_fails() {1970 new_test_ext().execute_with(|| {1971 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19721973 let origin1 = Origin::signed(1);19741975 let data = default_fungible_data();1976 create_test_item(1, &data.into());19771978 let variable_data = b"test data".to_vec();1979 assert_noop!(1980 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1981 Error::<Test>::CantStoreMetadataInFungibleTokens1982 );1983 });1984}19851986#[test]1987fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1988 new_test_ext().execute_with(|| {1989 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19901991 let origin1 = Origin::signed(1);19921993 let data = default_nft_data();1994 create_test_item(1, &data.into());19951996 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1997 assert_noop!(1998 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1999 Error::<Test>::TokenVariableDataLimitExceeded2000 );2001 });2002}20032004#[test]2005fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2006 new_test_ext().execute_with(|| {2007 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);20082009 let origin1 = Origin::signed(1);20102011 let data = default_re_fungible_data();2012 create_test_item(1, &data.into());20132014 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2015 assert_noop!(2016 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2017 Error::<Test>::TokenVariableDataLimitExceeded2018 );2019 });2020}20212022#[test]2023fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2024 new_test_ext().execute_with(|| {2025 //default_limits();20262027 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20282029 let origin1 = Origin::signed(1);20302031 let data = default_nft_data();2032 create_test_item(1, &data.into());20332034 assert_ok!(TemplateModule::set_meta_update_permission_flag(2035 origin1.clone(),2036 collection_id,2037 MetaUpdatePermission::ItemOwner,2038 ));20392040 let variable_data = b"ten chars.".to_vec();2041 assert_ok!(TemplateModule::set_variable_meta_data(2042 origin1,2043 collection_id,2044 1,2045 variable_data.clone()2046 ));20472048 assert_eq!(2049 TemplateModule::nft_item_id(collection_id, 1)2050 .unwrap()2051 .variable_data,2052 variable_data2053 );2054 });2055}20562057#[test]2058fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2059 new_test_ext().execute_with(|| {2060 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);20612062 let origin1 = Origin::signed(1);20632064 assert_ok!(TemplateModule::set_mint_permission(2065 origin1.clone(),2066 collection_id,2067 true2068 ));2069 assert_ok!(TemplateModule::add_to_white_list(2070 origin1.clone(),2071 collection_id,2072 account(1)2073 ));20742075 let data = default_nft_data();2076 create_test_item(1, &data.into());20772078 assert_ok!(TemplateModule::set_meta_update_permission_flag(2079 origin1.clone(),2080 collection_id,2081 MetaUpdatePermission::ItemOwner,2082 ));20832084 let variable_data = b"1234567890123".to_vec();2085 assert_noop!(2086 TemplateModule::set_variable_meta_data(2087 origin1,2088 collection_id,2089 1,2090 variable_data.clone()2091 ),2092 Error::<Test>::TokenVariableDataLimitExceeded2093 );2094 })2095}20962097#[test]2098fn collection_transfer_flag_works() {2099 new_test_ext().execute_with(|| {2100 let origin1 = Origin::signed(1);21012102 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2103 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));21042105 let data = default_nft_data();2106 create_test_item(collection_id, &data.into());2107 assert_eq!(TemplateModule::balance_count(1, 1), 1);2108 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);21092110 let origin1 = Origin::signed(1);21112112 // default scenario2113 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));2114 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));2115 assert_eq!(TemplateModule::balance_count(1, 1), 0);2116 assert_eq!(TemplateModule::balance_count(1, 2), 1);21172118 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);2119 });2120}21212122#[test]2123fn set_variable_meta_data_on_nft_with_admin_flag() {2124 new_test_ext().execute_with(|| {2125 // default_limits();21262127 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21282129 let origin1 = Origin::signed(1);2130 let origin2 = Origin::signed(2);21312132 assert_ok!(TemplateModule::set_mint_permission(2133 origin2.clone(),2134 collection_id,2135 true2136 ));2137 assert_ok!(TemplateModule::add_to_white_list(2138 origin2.clone(),2139 collection_id,2140 account(1)2141 ));21422143 assert_ok!(TemplateModule::add_collection_admin(2144 origin2.clone(),2145 collection_id,2146 account(1)2147 ));21482149 let data = default_nft_data();2150 create_test_item(1, &data.into());21512152 assert_ok!(TemplateModule::set_meta_update_permission_flag(2153 origin2.clone(),2154 collection_id,2155 MetaUpdatePermission::Admin,2156 ));21572158 let variable_data = b"test.".to_vec();2159 assert_ok!(TemplateModule::set_variable_meta_data(2160 origin1,2161 collection_id,2162 1,2163 variable_data.clone()2164 ));21652166 assert_eq!(2167 TemplateModule::nft_item_id(collection_id, 1)2168 .unwrap()2169 .variable_data,2170 variable_data2171 );2172 });2173}21742175#[test]2176fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2177 new_test_ext().execute_with(|| {2178 // default_limits();21792180 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21812182 let origin1 = Origin::signed(1);2183 let origin2 = Origin::signed(2);21842185 assert_ok!(TemplateModule::set_mint_permission(2186 origin2.clone(),2187 collection_id,2188 true2189 ));2190 assert_ok!(TemplateModule::add_to_white_list(2191 origin2.clone(),2192 collection_id,2193 account(1)2194 ));21952196 let data = default_nft_data();2197 create_test_item(1, &data.into());21982199 assert_ok!(TemplateModule::set_meta_update_permission_flag(2200 origin2.clone(),2201 collection_id,2202 MetaUpdatePermission::Admin,2203 ));22042205 let variable_data = b"test.".to_vec();2206 assert_noop!(2207 TemplateModule::set_variable_meta_data(2208 origin1,2209 collection_id,2210 1,2211 variable_data.clone()2212 ),2213 Error::<Test>::NoPermission2214 );2215 });2216}22172218#[test]2219fn set_variable_meta_flag_after_freeze() {2220 new_test_ext().execute_with(|| {2221 // default_limits();22222223 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);22242225 let origin2 = Origin::signed(2);22262227 assert_ok!(TemplateModule::set_meta_update_permission_flag(2228 origin2.clone(),2229 collection_id,2230 MetaUpdatePermission::None,2231 ));2232 assert_noop!(2233 TemplateModule::set_meta_update_permission_flag(2234 origin2.clone(),2235 collection_id,2236 MetaUpdatePermission::Admin2237 ),2238 Error::<Test>::MetadataFlagFrozen2239 );2240 });2241}22422243#[test]2244fn set_variable_meta_data_on_nft_with_none_flag_neg() {2245 new_test_ext().execute_with(|| {2246 // default_limits();22472248 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);2249 let origin1 = Origin::signed(1);22502251 let data = default_nft_data();2252 create_test_item(1, &data.into());22532254 assert_ok!(TemplateModule::set_meta_update_permission_flag(2255 origin1.clone(),2256 collection_id,2257 MetaUpdatePermission::None,2258 ));22592260 let variable_data = b"test.".to_vec();2261 assert_noop!(2262 TemplateModule::set_variable_meta_data(2263 origin1.clone(),2264 collection_id,2265 1,2266 variable_data.clone()2267 ),2268 Error::<Test>::MetadataUpdateDenied2269 );2270 });2271}22722273#[test]2274fn collection_transfer_flag_works_neg() {2275 new_test_ext().execute_with(|| {2276 let origin1 = Origin::signed(1);22772278 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2279 assert_ok!(TemplateModule::set_transfers_enabled_flag(2280 origin1, 1, false2281 ));22822283 let data = default_nft_data();2284 create_test_item(collection_id, &data.into());2285 assert_eq!(TemplateModule::balance_count(1, 1), 1);2286 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);22872288 let origin1 = Origin::signed(1);22892290 // default scenario2291 assert_noop!(2292 TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2293 Error::<Test>::TransferNotAllowed2294 );2295 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2296 assert_eq!(TemplateModule::balance_count(1, 1), 1);2297 assert_eq!(TemplateModule::balance_count(1, 2), 0);22982299 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2300 });2301}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, CreateItemData};5use nft_data_structs::{6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7 MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use sp_std::convert::TryInto;1112fn default_nft_data() -> CreateNftData {13 CreateNftData {14 const_data: vec![1, 2, 3].try_into().unwrap(),15 variable_data: vec![3, 2, 1].try_into().unwrap(),16 }17}1819fn default_fungible_data() -> CreateFungibleData {20 CreateFungibleData { value: 5 }21}2223fn default_re_fungible_data() -> CreateReFungibleData {24 CreateReFungibleData {25 const_data: vec![1, 2, 3].try_into().unwrap(),26 variable_data: vec![3, 2, 1].try_into().unwrap(),27 pieces: 1023,28 }29}3031fn create_test_collection_for_owner(32 mode: &CollectionMode,33 owner: u64,34 id: CollectionId,35) -> CollectionId {36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();37 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();38 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3940 let origin1 = Origin::signed(owner);41 assert_ok!(TemplateModule::create_collection(42 origin1,43 col_name1,44 col_desc1,45 token_prefix1,46 mode.clone()47 ));4849 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();50 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();51 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();52 assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);53 assert_eq!(54 TemplateModule::collection_id(id).unwrap().name,55 saved_col_name56 );57 assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);58 assert_eq!(59 TemplateModule::collection_id(id).unwrap().description,60 saved_description61 );62 assert_eq!(63 TemplateModule::collection_id(id).unwrap().token_prefix,64 saved_prefix65 );66 id67}6869fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {70 create_test_collection_for_owner(&mode, 1, id)71}7273fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {74 let origin1 = Origin::signed(1);75 assert_ok!(TemplateModule::create_item(76 origin1,77 collection_id,78 account(1),79 data.clone()80 ));81}8283fn account(sub: u64) -> TestCrossAccountId {84 TestCrossAccountId::from_sub(sub)85}8687// Use cases tests region88// #region8990#[test]91fn set_version_schema() {92 new_test_ext().execute_with(|| {93 let origin1 = Origin::signed(1);94 let collection_id = create_test_collection(&CollectionMode::NFT, 1);9596 assert_ok!(TemplateModule::set_schema_version(97 origin1,98 collection_id,99 SchemaVersion::Unique100 ));101 assert_eq!(102 TemplateModule::collection_id(collection_id)103 .unwrap()104 .schema_version,105 SchemaVersion::Unique106 );107 });108}109110#[test]111fn create_fungible_collection_fails_with_large_decimal_numbers() {112 new_test_ext().execute_with(|| {113 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();114 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();115 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();116117 let origin1 = Origin::signed(1);118 assert_noop!(119 TemplateModule::create_collection(120 origin1,121 col_name1,122 col_desc1,123 token_prefix1,124 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)125 ),126 Error::<Test>::CollectionDecimalPointLimitExceeded127 );128 });129}130131#[test]132fn create_nft_item() {133 new_test_ext().execute_with(|| {134 let collection_id = create_test_collection(&CollectionMode::NFT, 1);135136 let data = default_nft_data();137 create_test_item(collection_id, &data.clone().into());138 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();139 assert_eq!(item.const_data, data.const_data.into_inner());140 assert_eq!(item.variable_data, data.variable_data.into_inner());141 });142}143144// Use cases tests region145// #region146#[test]147fn create_nft_multiple_items() {148 new_test_ext().execute_with(|| {149 create_test_collection(&CollectionMode::NFT, 1);150151 let origin1 = Origin::signed(1);152153 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];154155 assert_ok!(TemplateModule::create_multiple_items(156 origin1,157 1,158 account(1),159 items_data160 .clone()161 .into_iter()162 .map(|d| { d.into() })163 .collect()164 ));165 for (index, data) in items_data.into_iter().enumerate() {166 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();167 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());168 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());169 }170 });171}172173#[test]174fn create_refungible_item() {175 new_test_ext().execute_with(|| {176 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);177178 let data = default_re_fungible_data();179 create_test_item(collection_id, &data.clone().into());180 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();181 assert_eq!(item.const_data, data.const_data.into_inner());182 assert_eq!(item.variable_data, data.variable_data.into_inner());183 assert_eq!(184 item.owner[0],185 Ownership {186 owner: account(1),187 fraction: 1023188 }189 );190 });191}192193#[test]194fn create_multiple_refungible_items() {195 new_test_ext().execute_with(|| {196 create_test_collection(&CollectionMode::ReFungible, 1);197198 let origin1 = Origin::signed(1);199200 let items_data = vec![201 default_re_fungible_data(),202 default_re_fungible_data(),203 default_re_fungible_data(),204 ];205206 assert_ok!(TemplateModule::create_multiple_items(207 origin1,208 1,209 account(1),210 items_data211 .clone()212 .into_iter()213 .map(|d| { d.into() })214 .collect()215 ));216 for (index, data) in items_data.into_iter().enumerate() {217 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();218 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());219 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());220 assert_eq!(221 item.owner[0],222 Ownership {223 owner: account(1),224 fraction: 1023225 }226 );227 }228 });229}230231#[test]232fn create_fungible_item() {233 new_test_ext().execute_with(|| {234 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);235236 let data = default_fungible_data();237 create_test_item(collection_id, &data.into());238239 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);240 });241}242243//#[test]244// fn create_multiple_fungible_items() {245// new_test_ext().execute_with(|| {246// default_limits();247248// create_test_collection(&CollectionMode::Fungible(3), 1);249250// let origin1 = Origin::signed(1);251252// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];253254// assert_ok!(TemplateModule::create_multiple_items(255// origin1.clone(),256// 1,257// 1,258// items_data.clone().into_iter().map(|d| { d.into() }).collect()259// ));260261// for (index, _) in items_data.iter().enumerate() {262// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);263// }264// assert_eq!(TemplateModule::balance_count(1, 1), 3000);265// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);266// });267// }268269#[test]270fn transfer_fungible_item() {271 new_test_ext().execute_with(|| {272 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);273274 let origin1 = Origin::signed(1);275 let origin2 = Origin::signed(2);276277 let data = default_fungible_data();278 create_test_item(collection_id, &data.into());279280 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);281 assert_eq!(TemplateModule::balance_count(1, 1), 5);282283 // change owner scenario284 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));285 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);286 assert_eq!(TemplateModule::balance_count(1, 1), 0);287 assert_eq!(TemplateModule::balance_count(1, 2), 5);288289 // split item scenario290 assert_ok!(TemplateModule::transfer(291 origin2.clone(),292 account(3),293 1,294 1,295 3296 ));297 assert_eq!(TemplateModule::balance_count(1, 2), 2);298 assert_eq!(TemplateModule::balance_count(1, 3), 3);299300 // split item and new owner has account scenario301 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));302 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);303 assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);304 assert_eq!(TemplateModule::balance_count(1, 2), 1);305 assert_eq!(TemplateModule::balance_count(1, 3), 4);306 });307}308309#[test]310fn transfer_refungible_item() {311 new_test_ext().execute_with(|| {312 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);313314 let data = default_re_fungible_data();315 create_test_item(collection_id, &data.clone().into());316317 let origin1 = Origin::signed(1);318 let origin2 = Origin::signed(2);319 {320 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();321 assert_eq!(item.const_data, data.const_data.into_inner());322 assert_eq!(item.variable_data, data.variable_data.into_inner());323 assert_eq!(324 item.owner[0],325 Ownership {326 owner: account(1),327 fraction: 1023328 }329 );330 }331 assert_eq!(TemplateModule::balance_count(1, 1), 1023);332 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);333334 // change owner scenario335 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));336 assert_eq!(337 TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],338 Ownership {339 owner: account(2),340 fraction: 1023341 }342 );343 assert_eq!(TemplateModule::balance_count(1, 1), 0);344 assert_eq!(TemplateModule::balance_count(1, 2), 1023);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(350 origin2.clone(),351 account(3),352 1,353 1,354 500355 ));356 {357 let item = TemplateModule::refungible_item_id(1, 1).unwrap();358 assert_eq!(359 item.owner[0],360 Ownership {361 owner: account(2),362 fraction: 523363 }364 );365 assert_eq!(366 item.owner[1],367 Ownership {368 owner: account(3),369 fraction: 500370 }371 );372 }373 assert_eq!(TemplateModule::balance_count(1, 2), 523);374 assert_eq!(TemplateModule::balance_count(1, 3), 500);375 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);376 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);377378 // split item and new owner has account scenario379 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));380 {381 let item = TemplateModule::refungible_item_id(1, 1).unwrap();382 assert_eq!(383 item.owner[0],384 Ownership {385 owner: account(2),386 fraction: 323387 }388 );389 assert_eq!(390 item.owner[1],391 Ownership {392 owner: account(3),393 fraction: 700394 }395 );396 }397 assert_eq!(TemplateModule::balance_count(1, 2), 323);398 assert_eq!(TemplateModule::balance_count(1, 3), 700);399 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);400 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);401 });402}403404#[test]405fn transfer_nft_item() {406 new_test_ext().execute_with(|| {407 let collection_id = create_test_collection(&CollectionMode::NFT, 1);408409 let data = default_nft_data();410 create_test_item(collection_id, &data.into());411 assert_eq!(TemplateModule::balance_count(1, 1), 1);412 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);413414 let origin1 = Origin::signed(1);415 // default scenario416 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));417 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));418 assert_eq!(TemplateModule::balance_count(1, 1), 0);419 assert_eq!(TemplateModule::balance_count(1, 2), 1);420 // assert_eq!(TemplateModule::address_tokens(1, 1), []);421 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);422 });423}424425#[test]426fn nft_approve_and_transfer_from() {427 new_test_ext().execute_with(|| {428 let collection_id = create_test_collection(&CollectionMode::NFT, 1);429430 let data = default_nft_data();431 create_test_item(collection_id, &data.into());432433 let origin1 = Origin::signed(1);434 let origin2 = Origin::signed(2);435436 assert_eq!(TemplateModule::balance_count(1, 1), 1);437 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);438439 // neg transfer440 assert_noop!(441 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),442 Error::<Test>::NoPermission443 );444445 // do approve446 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));447 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);448 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);449450 assert_ok!(TemplateModule::transfer_from(451 origin2,452 account(1),453 account(3),454 1,455 1,456 1457 ));458 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);459 });460}461462#[test]463fn nft_approve_and_transfer_from_white_list() {464 new_test_ext().execute_with(|| {465 let collection_id = create_test_collection(&CollectionMode::NFT, 1);466467 let origin1 = Origin::signed(1);468 let origin2 = Origin::signed(2);469470 let data = default_nft_data();471 create_test_item(collection_id, &data.clone().into());472473 assert_eq!(474 &TemplateModule::nft_item_id(1, 1).unwrap().const_data,475 &data.const_data.into_inner()476 );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(491 origin1.clone(),492 1,493 account(1)494 ));495 assert_ok!(TemplateModule::add_to_white_list(496 origin1.clone(),497 1,498 account(2)499 ));500 assert_ok!(TemplateModule::add_to_white_list(501 origin1.clone(),502 1,503 account(3)504 ));505506 // do approve507 assert_ok!(TemplateModule::approve(508 origin1.clone(),509 account(2),510 1,511 1,512 5513 ));514 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);515 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));516 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);517518 assert_ok!(TemplateModule::transfer_from(519 origin2,520 account(1),521 account(3),522 1,523 1,524 1525 ));526 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);527 });528}529530#[test]531fn refungible_approve_and_transfer_from() {532 new_test_ext().execute_with(|| {533 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);534535 let origin1 = Origin::signed(1);536 let origin2 = Origin::signed(2);537538 let data = default_re_fungible_data();539 create_test_item(collection_id, &data.into());540541 assert_eq!(TemplateModule::balance_count(1, 1), 1023);542 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);543544 assert_ok!(TemplateModule::set_mint_permission(545 origin1.clone(),546 1,547 true548 ));549 assert_ok!(TemplateModule::set_public_access_mode(550 origin1.clone(),551 1,552 AccessMode::WhiteList553 ));554 assert_ok!(TemplateModule::add_to_white_list(555 origin1.clone(),556 1,557 account(1)558 ));559 assert_ok!(TemplateModule::add_to_white_list(560 origin1.clone(),561 1,562 account(2)563 ));564 assert_ok!(TemplateModule::add_to_white_list(565 origin1.clone(),566 1,567 account(3)568 ));569570 // do approve571 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));572 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);573574 assert_ok!(TemplateModule::transfer_from(575 origin2,576 account(1),577 account(3),578 1,579 1,580 100581 ));582 assert_eq!(TemplateModule::balance_count(1, 1), 923);583 assert_eq!(TemplateModule::balance_count(1, 3), 100);584 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);585 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);586587 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);588 });589}590591#[test]592fn fungible_approve_and_transfer_from() {593 new_test_ext().execute_with(|| {594 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);595596 let data = default_fungible_data();597 create_test_item(collection_id, &data.into());598599 let origin1 = Origin::signed(1);600 let origin2 = Origin::signed(2);601602 assert_eq!(TemplateModule::balance_count(1, 1), 5);603604 assert_ok!(TemplateModule::set_mint_permission(605 origin1.clone(),606 1,607 true608 ));609 assert_ok!(TemplateModule::set_public_access_mode(610 origin1.clone(),611 1,612 AccessMode::WhiteList613 ));614 assert_ok!(TemplateModule::add_to_white_list(615 origin1.clone(),616 1,617 account(1)618 ));619 assert_ok!(TemplateModule::add_to_white_list(620 origin1.clone(),621 1,622 account(2)623 ));624 assert_ok!(TemplateModule::add_to_white_list(625 origin1.clone(),626 1,627 account(3)628 ));629630 // do approve631 assert_ok!(TemplateModule::approve(632 origin1.clone(),633 account(2),634 1,635 1,636 5637 ));638 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);639 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));640 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);641 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);642643 assert_ok!(TemplateModule::transfer_from(644 origin2.clone(),645 account(1),646 account(3),647 1,648 1,649 4650 ));651 assert_eq!(TemplateModule::balance_count(1, 1), 1);652 assert_eq!(TemplateModule::balance_count(1, 3), 4);653654 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);655656 assert_noop!(657 TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),658 Error::<Test>::NoPermission659 );660 });661}662663#[test]664fn change_collection_owner() {665 new_test_ext().execute_with(|| {666 let collection_id = create_test_collection(&CollectionMode::NFT, 1);667668 let origin1 = Origin::signed(1);669 assert_ok!(TemplateModule::change_collection_owner(670 origin1,671 collection_id,672 2673 ));674 assert_eq!(675 TemplateModule::collection_id(collection_id).unwrap().owner,676 2677 );678 });679}680681#[test]682fn destroy_collection() {683 new_test_ext().execute_with(|| {684 let collection_id = create_test_collection(&CollectionMode::NFT, 1);685686 let origin1 = Origin::signed(1);687 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));688 });689}690691#[test]692fn burn_nft_item() {693 new_test_ext().execute_with(|| {694 let collection_id = create_test_collection(&CollectionMode::NFT, 1);695696 let origin1 = Origin::signed(1);697 assert_ok!(TemplateModule::add_collection_admin(698 origin1.clone(),699 collection_id,700 account(2)701 ));702703 let data = default_nft_data();704 create_test_item(collection_id, &data.into());705706 // check balance (collection with id = 1, user id = 1)707 assert_eq!(TemplateModule::balance_count(1, 1), 1);708709 // burn item710 assert_ok!(TemplateModule::burn_item(711 origin1.clone(),712 collection_id,713 1,714 1715 ));716 assert_noop!(717 TemplateModule::burn_item(origin1, collection_id, 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 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);729730 let origin1 = Origin::signed(1);731 assert_ok!(TemplateModule::add_collection_admin(732 origin1.clone(),733 collection_id,734 account(2)735 ));736737 let data = default_fungible_data();738 create_test_item(collection_id, &data.into());739740 // check balance (collection with id = 1, user id = 1)741 assert_eq!(TemplateModule::balance_count(1, 1), 5);742743 // burn item744 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));745 assert_noop!(746 TemplateModule::burn_item(origin1, 1, 1, 5),747 Error::<Test>::TokenValueNotEnough748 );749750 assert_eq!(TemplateModule::balance_count(1, 1), 0);751 });752}753754#[test]755fn burn_refungible_item() {756 new_test_ext().execute_with(|| {757 let collection_id = create_test_collection(&CollectionMode::ReFungible, 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(771 origin1.clone(),772 1,773 account(1)774 ));775776 assert_ok!(TemplateModule::add_collection_admin(777 origin1.clone(),778 1,779 account(2)780 ));781782 let data = default_re_fungible_data();783 create_test_item(collection_id, &data.into());784785 // check balance (collection with id = 1, user id = 2)786 assert_eq!(TemplateModule::balance_count(1, 1), 1023);787788 // burn item789 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));790 assert_noop!(791 TemplateModule::burn_item(origin1, 1, 1, 1023),792 Error::<Test>::TokenNotFound793 );794795 assert_eq!(TemplateModule::balance_count(1, 1), 0);796 });797}798799#[test]800fn add_collection_admin() {801 new_test_ext().execute_with(|| {802 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);803 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);804 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);805806 let origin1 = Origin::signed(1);807808 // collection admin809 assert_ok!(TemplateModule::add_collection_admin(810 origin1.clone(),811 collection1_id,812 account(2)813 ));814 assert_ok!(TemplateModule::add_collection_admin(815 origin1,816 collection1_id,817 account(3)818 ));819820 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);821 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);822 });823}824825#[test]826fn remove_collection_admin() {827 new_test_ext().execute_with(|| {828 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);829 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);830 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);831832 let origin1 = Origin::signed(1);833 let origin2 = Origin::signed(2);834835 // collection admin836 assert_ok!(TemplateModule::add_collection_admin(837 origin1.clone(),838 collection1_id,839 account(2)840 ));841 assert_ok!(TemplateModule::add_collection_admin(842 origin1,843 collection1_id,844 account(3)845 ));846847 assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);848 assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);849850 // remove admin851 assert_ok!(TemplateModule::remove_collection_admin(852 origin2,853 1,854 account(3)855 ));856 assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);857 });858}859860#[test]861fn balance_of() {862 new_test_ext().execute_with(|| {863 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);864 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);865 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);866867 // check balance before868 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);869 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);870 assert_eq!(871 TemplateModule::balance_count(re_fungible_collection_id, 1),872 0873 );874875 let nft_data = default_nft_data();876 create_test_item(nft_collection_id, &nft_data.into());877878 let fungible_data = default_fungible_data();879 create_test_item(fungible_collection_id, &fungible_data.into());880881 let re_fungible_data = default_re_fungible_data();882 create_test_item(re_fungible_collection_id, &re_fungible_data.into());883884 // check balance (collection with id = 1, user id = 1)885 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);886 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);887 assert_eq!(888 TemplateModule::balance_count(re_fungible_collection_id, 1),889 1023890 );891 assert_eq!(892 TemplateModule::nft_item_id(nft_collection_id, 1)893 .unwrap()894 .owner,895 account(1)896 );897 assert_eq!(898 TemplateModule::fungible_item_id(fungible_collection_id, 1).value,899 5900 );901 assert_eq!(902 TemplateModule::refungible_item_id(re_fungible_collection_id, 1)903 .unwrap()904 .owner[0]905 .owner,906 account(1)907 );908 });909}910911#[test]912fn approve() {913 new_test_ext().execute_with(|| {914 let collection_id = create_test_collection(&CollectionMode::NFT, 1);915916 let data = default_nft_data();917 create_test_item(collection_id, &data.into());918919 let origin1 = Origin::signed(1);920921 // approve922 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));923 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);924 });925}926927#[test]928fn transfer_from() {929 new_test_ext().execute_with(|| {930 let collection_id = create_test_collection(&CollectionMode::NFT, 1);931 let origin1 = Origin::signed(1);932 let origin2 = Origin::signed(2);933934 let data = default_nft_data();935 create_test_item(collection_id, &data.into());936937 // approve938 assert_ok!(TemplateModule::approve(939 origin1.clone(),940 account(2),941 1,942 1,943 1944 ));945 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);946947 assert_ok!(TemplateModule::set_mint_permission(948 origin1.clone(),949 1,950 true951 ));952 assert_ok!(TemplateModule::set_public_access_mode(953 origin1.clone(),954 1,955 AccessMode::WhiteList956 ));957 assert_ok!(TemplateModule::add_to_white_list(958 origin1.clone(),959 1,960 account(1)961 ));962 assert_ok!(TemplateModule::add_to_white_list(963 origin1.clone(),964 1,965 account(2)966 ));967 assert_ok!(TemplateModule::add_to_white_list(origin1, 1, account(3)));968969 assert_ok!(TemplateModule::transfer_from(970 origin2,971 account(1),972 account(2),973 1,974 1,975 1976 ));977978 // after transfer979 assert_eq!(TemplateModule::balance_count(1, 1), 0);980 assert_eq!(TemplateModule::balance_count(1, 2), 1);981 });982}983984// #endregion985986// Coverage tests region987// #region988989#[test]990fn owner_can_add_address_to_white_list() {991 new_test_ext().execute_with(|| {992 let collection_id = create_test_collection(&CollectionMode::NFT, 1);993994 let origin1 = Origin::signed(1);995 assert_ok!(TemplateModule::add_to_white_list(996 origin1,997 collection_id,998 account(2)999 ));1000 assert!(TemplateModule::white_list(collection_id, 2));1001 });1002}10031004#[test]1005fn admin_can_add_address_to_white_list() {1006 new_test_ext().execute_with(|| {1007 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1008 let origin1 = Origin::signed(1);1009 let origin2 = Origin::signed(2);10101011 assert_ok!(TemplateModule::add_collection_admin(1012 origin1,1013 collection_id,1014 account(2)1015 ));1016 assert_ok!(TemplateModule::add_to_white_list(1017 origin2,1018 collection_id,1019 account(3)1020 ));1021 assert!(TemplateModule::white_list(collection_id, 3));1022 });1023}10241025#[test]1026fn nonprivileged_user_cannot_add_address_to_white_list() {1027 new_test_ext().execute_with(|| {1028 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10291030 let origin2 = Origin::signed(2);1031 assert_noop!(1032 TemplateModule::add_to_white_list(origin2, collection_id, account(3)),1033 Error::<Test>::NoPermission1034 );1035 });1036}10371038#[test]1039fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1040 new_test_ext().execute_with(|| {1041 let origin1 = Origin::signed(1);10421043 assert_noop!(1044 TemplateModule::add_to_white_list(origin1, 1, account(2)),1045 Error::<Test>::CollectionNotFound1046 );1047 });1048}10491050#[test]1051fn nobody_can_add_address_to_white_list_of_deleted_collection() {1052 new_test_ext().execute_with(|| {1053 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10541055 let origin1 = Origin::signed(1);1056 assert_ok!(TemplateModule::destroy_collection(1057 origin1.clone(),1058 collection_id1059 ));1060 assert_noop!(1061 TemplateModule::add_to_white_list(origin1, collection_id, account(2)),1062 Error::<Test>::CollectionNotFound1063 );1064 });1065}10661067// If address is already added to white list, nothing happens1068#[test]1069fn address_is_already_added_to_white_list() {1070 new_test_ext().execute_with(|| {1071 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1072 let origin1 = Origin::signed(1);10731074 assert_ok!(TemplateModule::add_to_white_list(1075 origin1.clone(),1076 collection_id,1077 account(2)1078 ));1079 assert_ok!(TemplateModule::add_to_white_list(1080 origin1,1081 collection_id,1082 account(2)1083 ));1084 assert!(TemplateModule::white_list(collection_id, 2));1085 });1086}10871088#[test]1089fn owner_can_remove_address_from_white_list() {1090 new_test_ext().execute_with(|| {1091 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10921093 let origin1 = Origin::signed(1);1094 assert_ok!(TemplateModule::add_to_white_list(1095 origin1.clone(),1096 collection_id,1097 account(2)1098 ));1099 assert_ok!(TemplateModule::remove_from_white_list(1100 origin1,1101 collection_id,1102 account(2)1103 ));1104 assert!(!TemplateModule::white_list(collection_id, 2));1105 });1106}11071108#[test]1109fn admin_can_remove_address_from_white_list() {1110 new_test_ext().execute_with(|| {1111 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1112 let origin1 = Origin::signed(1);1113 let origin2 = Origin::signed(2);11141115 assert_ok!(TemplateModule::add_collection_admin(1116 origin1.clone(),1117 collection_id,1118 account(2)1119 ));11201121 assert_ok!(TemplateModule::add_to_white_list(1122 origin1,1123 collection_id,1124 account(3)1125 ));1126 assert_ok!(TemplateModule::remove_from_white_list(1127 origin2,1128 collection_id,1129 account(3)1130 ));1131 assert!(!TemplateModule::white_list(collection_id, 3));1132 });1133}11341135#[test]1136fn nonprivileged_user_cannot_remove_address_from_white_list() {1137 new_test_ext().execute_with(|| {1138 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1139 let origin1 = Origin::signed(1);1140 let origin2 = Origin::signed(2);11411142 assert_ok!(TemplateModule::add_to_white_list(1143 origin1,1144 collection_id,1145 account(2)1146 ));1147 assert_noop!(1148 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1149 Error::<Test>::NoPermission1150 );1151 assert!(TemplateModule::white_list(collection_id, 2));1152 });1153}11541155#[test]1156fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1157 new_test_ext().execute_with(|| {1158 let origin1 = Origin::signed(1);11591160 assert_noop!(1161 TemplateModule::remove_from_white_list(origin1, 1, account(2)),1162 Error::<Test>::CollectionNotFound1163 );1164 });1165}11661167#[test]1168fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1169 new_test_ext().execute_with(|| {1170 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1171 let origin1 = Origin::signed(1);1172 let origin2 = Origin::signed(2);11731174 assert_ok!(TemplateModule::add_to_white_list(1175 origin1.clone(),1176 collection_id,1177 account(2)1178 ));1179 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1180 assert_noop!(1181 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1182 Error::<Test>::CollectionNotFound1183 );1184 assert!(!TemplateModule::white_list(collection_id, 2));1185 });1186}11871188// If address is already removed from white list, nothing happens1189#[test]1190fn address_is_already_removed_from_white_list() {1191 new_test_ext().execute_with(|| {1192 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1193 let origin1 = Origin::signed(1);11941195 assert_ok!(TemplateModule::add_to_white_list(1196 origin1.clone(),1197 collection_id,1198 account(2)1199 ));1200 assert_ok!(TemplateModule::remove_from_white_list(1201 origin1.clone(),1202 collection_id,1203 account(2)1204 ));1205 assert_ok!(TemplateModule::remove_from_white_list(1206 origin1,1207 collection_id,1208 account(2)1209 ));1210 assert!(!TemplateModule::white_list(collection_id, 2));1211 });1212}12131214// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1215#[test]1216fn white_list_test_1() {1217 new_test_ext().execute_with(|| {1218 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12191220 let origin1 = Origin::signed(1);12211222 let data = default_nft_data();1223 create_test_item(collection_id, &data.into());12241225 assert_ok!(TemplateModule::set_public_access_mode(1226 origin1.clone(),1227 collection_id,1228 AccessMode::WhiteList1229 ));1230 assert_ok!(TemplateModule::add_to_white_list(1231 origin1.clone(),1232 collection_id,1233 account(2)1234 ));12351236 assert_noop!(1237 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1238 Error::<Test>::AddresNotInWhiteList1239 );1240 });1241}12421243#[test]1244fn white_list_test_2() {1245 new_test_ext().execute_with(|| {1246 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1247 let origin1 = Origin::signed(1);12481249 let data = default_nft_data();1250 create_test_item(collection_id, &data.into());12511252 assert_ok!(TemplateModule::set_public_access_mode(1253 origin1.clone(),1254 collection_id,1255 AccessMode::WhiteList1256 ));1257 assert_ok!(TemplateModule::add_to_white_list(1258 origin1.clone(),1259 1,1260 account(1)1261 ));1262 assert_ok!(TemplateModule::add_to_white_list(1263 origin1.clone(),1264 1,1265 account(2)1266 ));12671268 // do approve1269 assert_ok!(TemplateModule::approve(1270 origin1.clone(),1271 account(1),1272 1,1273 1,1274 11275 ));1276 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);12771278 assert_ok!(TemplateModule::remove_from_white_list(1279 origin1.clone(),1280 1,1281 account(1)1282 ));12831284 assert_noop!(1285 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1286 Error::<Test>::AddresNotInWhiteList1287 );1288 });1289}12901291// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1292#[test]1293fn white_list_test_3() {1294 new_test_ext().execute_with(|| {1295 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12961297 let origin1 = Origin::signed(1);12981299 let data = default_nft_data();1300 create_test_item(collection_id, &data.into());13011302 assert_ok!(TemplateModule::set_public_access_mode(1303 origin1.clone(),1304 collection_id,1305 AccessMode::WhiteList1306 ));1307 assert_ok!(TemplateModule::add_to_white_list(1308 origin1.clone(),1309 1,1310 account(1)1311 ));13121313 assert_noop!(1314 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1315 Error::<Test>::AddresNotInWhiteList1316 );1317 });1318}13191320#[test]1321fn white_list_test_4() {1322 new_test_ext().execute_with(|| {1323 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13241325 let origin1 = Origin::signed(1);13261327 let data = default_nft_data();1328 create_test_item(collection_id, &data.into());13291330 assert_ok!(TemplateModule::set_public_access_mode(1331 origin1.clone(),1332 collection_id,1333 AccessMode::WhiteList1334 ));1335 assert_ok!(TemplateModule::add_to_white_list(1336 origin1.clone(),1337 collection_id,1338 account(1)1339 ));1340 assert_ok!(TemplateModule::add_to_white_list(1341 origin1.clone(),1342 collection_id,1343 account(2)1344 ));13451346 // do approve1347 assert_ok!(TemplateModule::approve(1348 origin1.clone(),1349 account(1),1350 1,1351 1,1352 11353 ));1354 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13551356 assert_ok!(TemplateModule::remove_from_white_list(1357 origin1.clone(),1358 collection_id,1359 account(2)1360 ));13611362 assert_noop!(1363 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1364 Error::<Test>::AddresNotInWhiteList1365 );1366 });1367}13681369// 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)1370#[test]1371fn white_list_test_5() {1372 new_test_ext().execute_with(|| {1373 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13741375 let origin1 = Origin::signed(1);13761377 let data = default_nft_data();1378 create_test_item(collection_id, &data.into());13791380 assert_ok!(TemplateModule::set_public_access_mode(1381 origin1.clone(),1382 collection_id,1383 AccessMode::WhiteList1384 ));1385 assert_noop!(1386 TemplateModule::burn_item(origin1.clone(), 1, 1, 5),1387 Error::<Test>::AddresNotInWhiteList1388 );1389 });1390}13911392// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1393#[test]1394fn white_list_test_6() {1395 new_test_ext().execute_with(|| {1396 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13971398 let origin1 = Origin::signed(1);13991400 let data = default_nft_data();1401 create_test_item(collection_id, &data.into());14021403 assert_ok!(TemplateModule::set_public_access_mode(1404 origin1.clone(),1405 collection_id,1406 AccessMode::WhiteList1407 ));14081409 // do approve1410 assert_noop!(1411 TemplateModule::approve(origin1, account(1), 1, 1, 5),1412 Error::<Test>::AddresNotInWhiteList1413 );1414 });1415}14161417// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1418// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1419#[test]1420fn white_list_test_7() {1421 new_test_ext().execute_with(|| {1422 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14231424 let data = default_nft_data();1425 create_test_item(collection_id, &data.into());14261427 let origin1 = Origin::signed(1);14281429 assert_ok!(TemplateModule::set_public_access_mode(1430 origin1.clone(),1431 collection_id,1432 AccessMode::WhiteList1433 ));1434 assert_ok!(TemplateModule::add_to_white_list(1435 origin1.clone(),1436 collection_id,1437 account(1)1438 ));1439 assert_ok!(TemplateModule::add_to_white_list(1440 origin1.clone(),1441 collection_id,1442 account(2)1443 ));14441445 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1446 });1447}14481449#[test]1450fn white_list_test_8() {1451 new_test_ext().execute_with(|| {1452 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14531454 let data = default_nft_data();1455 create_test_item(collection_id, &data.into());14561457 let origin1 = Origin::signed(1);14581459 assert_ok!(TemplateModule::set_public_access_mode(1460 origin1.clone(),1461 collection_id,1462 AccessMode::WhiteList1463 ));1464 assert_ok!(TemplateModule::add_to_white_list(1465 origin1.clone(),1466 collection_id,1467 account(1)1468 ));1469 assert_ok!(TemplateModule::add_to_white_list(1470 origin1.clone(),1471 collection_id,1472 account(2)1473 ));14741475 // do approve1476 assert_ok!(TemplateModule::approve(1477 origin1.clone(),1478 account(1),1479 1,1480 1,1481 51482 ));1483 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);14841485 assert_ok!(TemplateModule::transfer_from(1486 origin1,1487 account(1),1488 account(2),1489 1,1490 1,1491 11492 ));1493 });1494}14951496// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1497#[test]1498fn white_list_test_9() {1499 new_test_ext().execute_with(|| {1500 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1501 let origin1 = Origin::signed(1);15021503 assert_ok!(TemplateModule::set_public_access_mode(1504 origin1.clone(),1505 collection_id,1506 AccessMode::WhiteList1507 ));1508 assert_ok!(TemplateModule::set_mint_permission(1509 origin1,1510 collection_id,1511 false1512 ));15131514 let data = default_nft_data();1515 create_test_item(collection_id, &data.into());1516 });1517}15181519// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1520#[test]1521fn white_list_test_10() {1522 new_test_ext().execute_with(|| {1523 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15241525 let origin1 = Origin::signed(1);1526 let origin2 = Origin::signed(2);15271528 assert_ok!(TemplateModule::set_public_access_mode(1529 origin1.clone(),1530 collection_id,1531 AccessMode::WhiteList1532 ));1533 assert_ok!(TemplateModule::set_mint_permission(1534 origin1.clone(),1535 collection_id,1536 false1537 ));15381539 assert_ok!(TemplateModule::add_collection_admin(1540 origin1,1541 collection_id,1542 account(2)1543 ));15441545 assert_ok!(TemplateModule::create_item(1546 origin2,1547 collection_id,1548 account(2),1549 default_nft_data().into()1550 ));1551 });1552}15531554// 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.1555#[test]1556fn white_list_test_11() {1557 new_test_ext().execute_with(|| {1558 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15591560 let origin1 = Origin::signed(1);1561 let origin2 = Origin::signed(2);15621563 assert_ok!(TemplateModule::set_public_access_mode(1564 origin1.clone(),1565 collection_id,1566 AccessMode::WhiteList1567 ));1568 assert_ok!(TemplateModule::set_mint_permission(1569 origin1.clone(),1570 collection_id,1571 false1572 ));1573 assert_ok!(TemplateModule::add_to_white_list(1574 origin1,1575 collection_id,1576 account(2)1577 ));15781579 assert_noop!(1580 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1581 Error::<Test>::PublicMintingNotAllowed1582 );1583 });1584}15851586// 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.1587#[test]1588fn white_list_test_12() {1589 new_test_ext().execute_with(|| {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,1602 collection_id,1603 false1604 ));16051606 assert_noop!(1607 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1608 Error::<Test>::PublicMintingNotAllowed1609 );1610 });1611}16121613// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1614#[test]1615fn white_list_test_13() {1616 new_test_ext().execute_with(|| {1617 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16181619 let origin1 = Origin::signed(1);16201621 assert_ok!(TemplateModule::set_public_access_mode(1622 origin1.clone(),1623 collection_id,1624 AccessMode::WhiteList1625 ));1626 assert_ok!(TemplateModule::set_mint_permission(1627 origin1,1628 collection_id,1629 true1630 ));16311632 let data = default_nft_data();1633 create_test_item(collection_id, &data.into());1634 });1635}16361637// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1638#[test]1639fn white_list_test_14() {1640 new_test_ext().execute_with(|| {1641 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16421643 let origin1 = Origin::signed(1);1644 let origin2 = Origin::signed(2);16451646 assert_ok!(TemplateModule::set_public_access_mode(1647 origin1.clone(),1648 collection_id,1649 AccessMode::WhiteList1650 ));1651 assert_ok!(TemplateModule::set_mint_permission(1652 origin1.clone(),1653 collection_id,1654 true1655 ));16561657 assert_ok!(TemplateModule::add_collection_admin(1658 origin1,1659 collection_id,1660 account(2)1661 ));16621663 assert_ok!(TemplateModule::create_item(1664 origin2,1665 1,1666 account(2),1667 default_nft_data().into()1668 ));1669 });1670}16711672// 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.1673#[test]1674fn white_list_test_15() {1675 new_test_ext().execute_with(|| {1676 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16771678 let origin1 = Origin::signed(1);1679 let origin2 = Origin::signed(2);16801681 assert_ok!(TemplateModule::set_public_access_mode(1682 origin1.clone(),1683 collection_id,1684 AccessMode::WhiteList1685 ));1686 assert_ok!(TemplateModule::set_mint_permission(1687 origin1,1688 collection_id,1689 true1690 ));16911692 assert_noop!(1693 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1694 Error::<Test>::AddresNotInWhiteList1695 );1696 });1697}16981699// 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.1700#[test]1701fn white_list_test_16() {1702 new_test_ext().execute_with(|| {1703 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17041705 let origin1 = Origin::signed(1);1706 let origin2 = Origin::signed(2);17071708 assert_ok!(TemplateModule::set_public_access_mode(1709 origin1.clone(),1710 collection_id,1711 AccessMode::WhiteList1712 ));1713 assert_ok!(TemplateModule::set_mint_permission(1714 origin1.clone(),1715 collection_id,1716 true1717 ));1718 assert_ok!(TemplateModule::add_to_white_list(1719 origin1,1720 collection_id,1721 account(2)1722 ));17231724 assert_ok!(TemplateModule::create_item(1725 origin2,1726 1,1727 account(2),1728 default_nft_data().into()1729 ));1730 });1731}17321733// Total number of collections. Positive test1734#[test]1735fn total_number_collections_bound() {1736 new_test_ext().execute_with(|| {1737 create_test_collection(&CollectionMode::NFT, 1);1738 });1739}17401741// Total number of collections. Negotive test1742#[test]1743fn total_number_collections_bound_neg() {1744 new_test_ext().execute_with(|| {1745 let origin1 = Origin::signed(1);17461747 for i in 0..COLLECTION_NUMBER_LIMIT {1748 create_test_collection(&CollectionMode::NFT, i + 1);1749 }17501751 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1752 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1753 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17541755 // 11-th collection in chain. Expects error1756 assert_noop!(1757 TemplateModule::create_collection(1758 origin1,1759 col_name1,1760 col_desc1,1761 token_prefix1,1762 CollectionMode::NFT1763 ),1764 Error::<Test>::TotalCollectionsLimitExceeded1765 );1766 });1767}17681769// Owned tokens by a single address. Positive test1770#[test]1771fn owned_tokens_bound() {1772 new_test_ext().execute_with(|| {1773 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17741775 let data = default_nft_data();1776 create_test_item(collection_id, &data.clone().into());1777 create_test_item(collection_id, &data.into());1778 });1779}17801781// Owned tokens by a single address. Negotive test1782#[test]1783fn owned_tokens_bound_neg() {1784 new_test_ext().execute_with(|| {1785 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17861787 let origin1 = Origin::signed(1);17881789 for _ in 0..ACCOUNT_TOKEN_OWNERSHIP_LIMIT {1790 let data = default_nft_data();1791 create_test_item(collection_id, &data.clone().into());1792 }17931794 let data = default_nft_data();1795 assert_noop!(1796 TemplateModule::create_item(origin1, 1, account(1), data.into()),1797 Error::<Test>::AccountTokenLimitExceeded1798 );1799 });1800}18011802// Number of collection admins. Positive test1803#[test]1804fn collection_admins_bound() {1805 new_test_ext().execute_with(|| {1806 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18071808 let origin1 = Origin::signed(1);18091810 assert_ok!(TemplateModule::add_collection_admin(1811 origin1.clone(),1812 collection_id,1813 account(2)1814 ));1815 assert_ok!(TemplateModule::add_collection_admin(1816 origin1,1817 collection_id,1818 account(3)1819 ));1820 });1821}18221823// Number of collection admins. Negotive test1824#[test]1825fn collection_admins_bound_neg() {1826 new_test_ext().execute_with(|| {1827 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18281829 let origin1 = Origin::signed(1);18301831 for i in 0..COLLECTION_ADMINS_LIMIT {1832 assert_ok!(TemplateModule::add_collection_admin(1833 origin1.clone(),1834 collection_id,1835 account(2 + i)1836 ));1837 }1838 assert_noop!(1839 TemplateModule::add_collection_admin(1840 origin1,1841 collection_id,1842 account(3 + COLLECTION_ADMINS_LIMIT)1843 ),1844 Error::<Test>::CollectionAdminsLimitExceeded1845 );1846 });1847}1848// #endregion18491850#[test]1851fn set_const_on_chain_schema() {1852 new_test_ext().execute_with(|| {1853 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18541855 let origin1 = Origin::signed(1);1856 assert_ok!(TemplateModule::set_const_on_chain_schema(1857 origin1,1858 collection_id,1859 b"test const on chain schema".to_vec()1860 ));18611862 assert_eq!(1863 TemplateModule::collection_id(collection_id)1864 .unwrap()1865 .const_on_chain_schema,1866 b"test const on chain schema".to_vec()1867 );1868 assert_eq!(1869 TemplateModule::collection_id(collection_id)1870 .unwrap()1871 .variable_on_chain_schema,1872 b"".to_vec()1873 );1874 });1875}18761877#[test]1878fn set_variable_on_chain_schema() {1879 new_test_ext().execute_with(|| {1880 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18811882 let origin1 = Origin::signed(1);1883 assert_ok!(TemplateModule::set_variable_on_chain_schema(1884 origin1,1885 collection_id,1886 b"test variable on chain schema".to_vec()1887 ));18881889 assert_eq!(1890 TemplateModule::collection_id(collection_id)1891 .unwrap()1892 .const_on_chain_schema,1893 b"".to_vec()1894 );1895 assert_eq!(1896 TemplateModule::collection_id(collection_id)1897 .unwrap()1898 .variable_on_chain_schema,1899 b"test variable on chain schema".to_vec()1900 );1901 });1902}19031904#[test]1905fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1906 new_test_ext().execute_with(|| {1907 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19081909 let origin1 = Origin::signed(1);19101911 let data = default_nft_data();1912 create_test_item(1, &data.into());19131914 let variable_data = b"test data".to_vec();1915 assert_ok!(TemplateModule::set_variable_meta_data(1916 origin1,1917 collection_id,1918 1,1919 variable_data.clone()1920 ));19211922 assert_eq!(1923 TemplateModule::nft_item_id(collection_id, 1)1924 .unwrap()1925 .variable_data,1926 variable_data1927 );1928 });1929}19301931#[test]1932fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1933 new_test_ext().execute_with(|| {1934 let collection_id = create_test_collection(&CollectionMode::ReFungible, 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 data".to_vec();1942 assert_ok!(TemplateModule::set_variable_meta_data(1943 origin1,1944 collection_id,1945 1,1946 variable_data.clone()1947 ));19481949 assert_eq!(1950 TemplateModule::refungible_item_id(collection_id, 1)1951 .unwrap()1952 .variable_data,1953 variable_data1954 );1955 });1956}19571958#[test]1959fn set_variable_meta_data_on_fungible_token_fails() {1960 new_test_ext().execute_with(|| {1961 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19621963 let origin1 = Origin::signed(1);19641965 let data = default_fungible_data();1966 create_test_item(1, &data.into());19671968 let variable_data = b"test data".to_vec();1969 assert_noop!(1970 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1971 Error::<Test>::CantStoreMetadataInFungibleTokens1972 );1973 });1974}19751976#[test]1977fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1978 new_test_ext().execute_with(|| {1979 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!(1988 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1989 Error::<Test>::TokenVariableDataLimitExceeded1990 );1991 });1992}19931994#[test]1995fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1996 new_test_ext().execute_with(|| {1997 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19981999 let origin1 = Origin::signed(1);20002001 let data = default_re_fungible_data();2002 create_test_item(1, &data.into());20032004 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2005 assert_noop!(2006 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2007 Error::<Test>::TokenVariableDataLimitExceeded2008 );2009 });2010}20112012#[test]2013fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2014 new_test_ext().execute_with(|| {2015 //default_limits();20162017 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20182019 let origin1 = Origin::signed(1);20202021 let data = default_nft_data();2022 create_test_item(1, &data.into());20232024 assert_ok!(TemplateModule::set_meta_update_permission_flag(2025 origin1.clone(),2026 collection_id,2027 MetaUpdatePermission::ItemOwner,2028 ));20292030 let variable_data = b"ten chars.".to_vec();2031 assert_ok!(TemplateModule::set_variable_meta_data(2032 origin1,2033 collection_id,2034 1,2035 variable_data.clone()2036 ));20372038 assert_eq!(2039 TemplateModule::nft_item_id(collection_id, 1)2040 .unwrap()2041 .variable_data,2042 variable_data2043 );2044 });2045}20462047#[test]2048fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2049 new_test_ext().execute_with(|| {2050 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);20512052 let origin1 = Origin::signed(1);20532054 assert_ok!(TemplateModule::set_mint_permission(2055 origin1.clone(),2056 collection_id,2057 true2058 ));2059 assert_ok!(TemplateModule::add_to_white_list(2060 origin1.clone(),2061 collection_id,2062 account(1)2063 ));20642065 let data = default_nft_data();2066 create_test_item(1, &data.into());20672068 assert_ok!(TemplateModule::set_meta_update_permission_flag(2069 origin1.clone(),2070 collection_id,2071 MetaUpdatePermission::ItemOwner,2072 ));20732074 let variable_data = b"1234567890123".to_vec();2075 assert_noop!(2076 TemplateModule::set_variable_meta_data(2077 origin1,2078 collection_id,2079 1,2080 variable_data.clone()2081 ),2082 Error::<Test>::TokenVariableDataLimitExceeded2083 );2084 })2085}20862087#[test]2088fn collection_transfer_flag_works() {2089 new_test_ext().execute_with(|| {2090 let origin1 = Origin::signed(1);20912092 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2093 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));20942095 let data = default_nft_data();2096 create_test_item(collection_id, &data.into());2097 assert_eq!(TemplateModule::balance_count(1, 1), 1);2098 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);20992100 let origin1 = Origin::signed(1);21012102 // default scenario2103 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));2104 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));2105 assert_eq!(TemplateModule::balance_count(1, 1), 0);2106 assert_eq!(TemplateModule::balance_count(1, 2), 1);21072108 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);2109 });2110}21112112#[test]2113fn set_variable_meta_data_on_nft_with_admin_flag() {2114 new_test_ext().execute_with(|| {2115 // default_limits();21162117 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21182119 let origin1 = Origin::signed(1);2120 let origin2 = Origin::signed(2);21212122 assert_ok!(TemplateModule::set_mint_permission(2123 origin2.clone(),2124 collection_id,2125 true2126 ));2127 assert_ok!(TemplateModule::add_to_white_list(2128 origin2.clone(),2129 collection_id,2130 account(1)2131 ));21322133 assert_ok!(TemplateModule::add_collection_admin(2134 origin2.clone(),2135 collection_id,2136 account(1)2137 ));21382139 let data = default_nft_data();2140 create_test_item(1, &data.into());21412142 assert_ok!(TemplateModule::set_meta_update_permission_flag(2143 origin2.clone(),2144 collection_id,2145 MetaUpdatePermission::Admin,2146 ));21472148 let variable_data = b"test.".to_vec();2149 assert_ok!(TemplateModule::set_variable_meta_data(2150 origin1,2151 collection_id,2152 1,2153 variable_data.clone()2154 ));21552156 assert_eq!(2157 TemplateModule::nft_item_id(collection_id, 1)2158 .unwrap()2159 .variable_data,2160 variable_data2161 );2162 });2163}21642165#[test]2166fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2167 new_test_ext().execute_with(|| {2168 // default_limits();21692170 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21712172 let origin1 = Origin::signed(1);2173 let origin2 = Origin::signed(2);21742175 assert_ok!(TemplateModule::set_mint_permission(2176 origin2.clone(),2177 collection_id,2178 true2179 ));2180 assert_ok!(TemplateModule::add_to_white_list(2181 origin2.clone(),2182 collection_id,2183 account(1)2184 ));21852186 let data = default_nft_data();2187 create_test_item(1, &data.into());21882189 assert_ok!(TemplateModule::set_meta_update_permission_flag(2190 origin2.clone(),2191 collection_id,2192 MetaUpdatePermission::Admin,2193 ));21942195 let variable_data = b"test.".to_vec();2196 assert_noop!(2197 TemplateModule::set_variable_meta_data(2198 origin1,2199 collection_id,2200 1,2201 variable_data.clone()2202 ),2203 Error::<Test>::NoPermission2204 );2205 });2206}22072208#[test]2209fn set_variable_meta_flag_after_freeze() {2210 new_test_ext().execute_with(|| {2211 // default_limits();22122213 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);22142215 let origin2 = Origin::signed(2);22162217 assert_ok!(TemplateModule::set_meta_update_permission_flag(2218 origin2.clone(),2219 collection_id,2220 MetaUpdatePermission::None,2221 ));2222 assert_noop!(2223 TemplateModule::set_meta_update_permission_flag(2224 origin2.clone(),2225 collection_id,2226 MetaUpdatePermission::Admin2227 ),2228 Error::<Test>::MetadataFlagFrozen2229 );2230 });2231}22322233#[test]2234fn set_variable_meta_data_on_nft_with_none_flag_neg() {2235 new_test_ext().execute_with(|| {2236 // default_limits();22372238 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);2239 let origin1 = Origin::signed(1);22402241 let data = default_nft_data();2242 create_test_item(1, &data.into());22432244 assert_ok!(TemplateModule::set_meta_update_permission_flag(2245 origin1.clone(),2246 collection_id,2247 MetaUpdatePermission::None,2248 ));22492250 let variable_data = b"test.".to_vec();2251 assert_noop!(2252 TemplateModule::set_variable_meta_data(2253 origin1.clone(),2254 collection_id,2255 1,2256 variable_data.clone()2257 ),2258 Error::<Test>::MetadataUpdateDenied2259 );2260 });2261}22622263#[test]2264fn collection_transfer_flag_works_neg() {2265 new_test_ext().execute_with(|| {2266 let origin1 = Origin::signed(1);22672268 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2269 assert_ok!(TemplateModule::set_transfers_enabled_flag(2270 origin1, 1, false2271 ));22722273 let data = default_nft_data();2274 create_test_item(collection_id, &data.into());2275 assert_eq!(TemplateModule::balance_count(1, 1), 1);2276 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);22772278 let origin1 = Origin::signed(1);22792280 // default scenario2281 assert_noop!(2282 TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2283 Error::<Test>::TransferNotAllowed2284 );2285 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2286 assert_eq!(TemplateModule::balance_count(1, 1), 1);2287 assert_eq!(TemplateModule::balance_count(1, 2), 0);22882289 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2290 });2291}