--- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -40,6 +40,9 @@ #[cfg(test)] mod tests; +// Structs +// #region + #[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum CollectionMode { @@ -158,6 +161,8 @@ type Event: From> + Into<::Event>; } +// #endregion + decl_storage! { trait Store for Module as Nft { @@ -1287,6 +1292,7 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// // Economic models +// #region /// Fee multiplier. pub type Multiplier = FixedU128; @@ -1481,3 +1487,4 @@ Ok(()) } } +// #endregion \ No newline at end of file --- a/pallets/nft/src/tests.rs +++ b/pallets/nft/src/tests.rs @@ -3,6 +3,8 @@ use crate::{ApprovePermissions, CollectionMode, AccessMode, Ownership}; use frame_support::{assert_noop, assert_ok}; +// Use cases tests region +// #region #[test] fn create_nft_item() { new_test_ext().execute_with(|| { @@ -955,3 +957,833 @@ assert_eq!(TemplateModule::balance_count(1, 2), 1); }); } + +// #endregion + +// Coverage tests region +// #region + +#[test] +fn owner_can_add_address_to_white_list() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_eq!(TemplateModule::white_list(1)[0], 2); + }); +} + +#[test] +fn admin_can_add_address_to_white_list() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3)); + assert_eq!(TemplateModule::white_list(1)[0], 3); + }); +} + +#[test] +fn nonprivileged_user_cannot_add_address_to_white_list() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_noop!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3), "You do not have permissions to modify this collection"); + }); +} + +#[test] +fn nobody_can_add_address_to_white_list_of_nonexisting_collection() { + new_test_ext().execute_with(|| { + + let origin1 = Origin::signed(1); + assert_noop!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2), "This collection does not exist"); + }); +} + +#[test] +fn nobody_can_add_address_to_white_list_of_deleted_collection() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1)); + assert_noop!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2), "This collection does not exist"); + }); +} + +// If address is already added to white list, nothing happens +#[test] +fn address_is_already_added_to_white_list() { + new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_eq!(TemplateModule::white_list(1)[0], 2); + assert_eq!(TemplateModule::white_list(1).len(), 1); + }); +} + +#[test] +fn owner_can_remove_address_from_white_list() { + new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2)); + assert_eq!(TemplateModule::white_list(1).len(), 0); + }); +} + +#[test] +fn admin_can_remove_address_from_white_list() { + new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3)); + assert_ok!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 3)); + assert_eq!(TemplateModule::white_list(1).len(), 0); + }); +} + +#[test] +fn nonprivileged_user_cannot_remove_address_from_white_list() { + new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_noop!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), "You do not have permissions to modify this collection"); + assert_eq!(TemplateModule::white_list(1)[0], 2); + }); +} + +#[test] +fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() { + new_test_ext().execute_with(|| { + + let origin1 = Origin::signed(1); + assert_noop!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2), "This collection does not exist"); + }); +} + +#[test] +fn nobody_can_remove_address_from_white_list_of_deleted_collection() { + new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1)); + assert_noop!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), "This collection does not exist"); + assert_eq!(TemplateModule::white_list(1).len(), 0); + }); +} + +// If address is already removed from white list, nothing happens +#[test] +fn address_is_already_removed_from_white_list() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + let origin1 = Origin::signed(1); + + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2)); + assert_eq!(TemplateModule::white_list(1).len(), 0); + }); +} + +// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests) +#[test] +fn white_list_test_1() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_eq!(TemplateModule::collection(1).owner, 1); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + + assert_noop!(TemplateModule::transfer( + origin1.clone(), + 3, + 1, + 1, + 1 + ), "Address is not in white list"); + }); +} + +#[test] +fn white_list_test_2() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_eq!(TemplateModule::collection(1).owner, 1); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + + // do approve + assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1)); + assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1); + + assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 1)); + + assert_noop!(TemplateModule::transfer_from( + origin1.clone(), + 1, + 3, + 1, + 1, + 1 + ), "Address is not in white list"); + }); +} + +// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests) +#[test] +fn white_list_test_3() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_eq!(TemplateModule::collection(1).owner, 1); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); + + assert_noop!(TemplateModule::transfer( + origin1.clone(), + 3, + 1, + 1, + 1 + ), "Address is not in white list"); + }); +} + +#[test] +fn white_list_test_4() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_eq!(TemplateModule::collection(1).owner, 1); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + + // do approve + assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1)); + assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1); + + assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2)); + + assert_noop!(TemplateModule::transfer_from( + origin1.clone(), + 1, + 3, + 1, + 1, + 1 + ), "Address is not in white list"); + }); +} + +// 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) +#[test] +fn white_list_test_5() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_eq!(TemplateModule::collection(1).owner, 1); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_noop!(TemplateModule::burn_item(origin1.clone(), 1, 1), "Address is not in white list"); + }); +} + +// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method). +#[test] +fn white_list_test_6() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + + // do approve + assert_noop!(TemplateModule::approve(origin1.clone(), 1, 1, 1), "Address is not in white list"); + }); +} + +// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and +// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) +#[test] +fn white_list_test_7() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_eq!(TemplateModule::collection(1).owner, 1); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + + assert_ok!(TemplateModule::transfer( + origin1.clone(), + 2, + 1, + 1, + 1 + )); + }); +} + +#[test] +fn white_list_test_8() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + assert_eq!(TemplateModule::collection(1).owner, 1); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + + // do approve + assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1)); + assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1); + + assert_ok!(TemplateModule::transfer_from( + origin1.clone(), + 1, + 2, + 1, + 1, + 1 + )); + }); +} + +// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner. +#[test] +fn white_list_test_9() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false)); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + }); +} + +// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin. +#[test] +fn white_list_test_10() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false)); + + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); + + assert_ok!(TemplateModule::create_item( + origin2.clone(), + 1, + [1, 2, 3].to_vec(), + 2 + )); + }); +} + +// 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. +#[test] +fn white_list_test_11() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + + assert_noop!(TemplateModule::create_item( + origin2.clone(), + 1, + [1, 2, 3].to_vec(), + 2 + ), "Collection is not in mint mode"); + }); +} + +// 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. +#[test] +fn white_list_test_12() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false)); + + assert_noop!(TemplateModule::create_item( + origin2.clone(), + 1, + [1, 2, 3].to_vec(), + 2 + ), "Collection is not in mint mode"); + }); +} + +// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner. +#[test] +fn white_list_test_13() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true)); + + assert_ok!(TemplateModule::create_item( + origin1.clone(), + 1, + [1, 2, 3].to_vec(), + 1 + )); + }); +} + +// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin. +#[test] +fn white_list_test_14() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true)); + + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); + + assert_ok!(TemplateModule::create_item( + origin2.clone(), + 1, + [1, 2, 3].to_vec(), + 2 + )); + }); +} + +// 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. +#[test] +fn white_list_test_15() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true)); + + assert_noop!(TemplateModule::create_item( + origin2.clone(), + 1, + [1, 2, 3].to_vec(), + 2 + ), "Address is not in white list"); + }); +} + +// 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. +#[test] +fn white_list_test_16() { + new_test_ext().execute_with(|| { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let mode: CollectionMode = CollectionMode::NFT(2000); + + let origin1 = Origin::signed(1); + let origin2 = Origin::signed(2); + assert_ok!(TemplateModule::create_collection( + origin1.clone(), + col_name1.clone(), + col_desc1.clone(), + token_prefix1.clone(), + mode + )); + + assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList)); + assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + + assert_ok!(TemplateModule::create_item( + origin2.clone(), + 1, + [1, 2, 3].to_vec(), + 2 + )); + }); +} + +// #endregion \ No newline at end of file