difftreelog
tests: add setVariableMetadataSponsoringRateLimit
in: master
3 files changed
runtime_types.jsondiffbeforeafterboth1{2 "AccessMode": {3 "_enum": [4 "Normal",5 "WhiteList"6 ]7 },8 "DecimalPoints": "u8",9 "CollectionMode": {10 "_enum": {11 "Invalid": null,12 "NFT": null,13 "Fungible": "DecimalPoints",14 "ReFungible": null15 }16 },17 "Ownership": {18 "Owner": "AccountId",19 "Fraction": "u128"20 },21 "FungibleItemType": {22 "Value": "u128"23 },24 "NftItemType": {25 "Owner": "AccountId",26 "ConstData": "Vec<u8>",27 "VariableData": "Vec<u8>"28 },29 "ReFungibleItemType": {30 "Owner": "Vec<Ownership<AccountId>>",31 "ConstData": "Vec<u8>",32 "VariableData": "Vec<u8>"33 },34 "CollectionType": {35 "Owner": "AccountId",36 "Mode": "CollectionMode",37 "Access": "AccessMode",38 "DecimalPoints": "DecimalPoints",39 "Name": "Vec<u16>",40 "Description": "Vec<u16>",41 "TokenPrefix": "Vec<u8>",42 "MintMode": "bool",43 "OffchainSchema": "Vec<u8>",44 "SchemaVersion": "SchemaVersion",45 "Sponsor": "AccountId",46 "SponsorConfirmed": "bool",47 "Limits": "CollectionLimits",48 "VariableOnChainSchema": "Vec<u8>",49 "ConstOnChainSchema": "Vec<u8>"50 },51 "RawData": "Vec<u8>",52 "Address": "AccountId",53 "LookupSource": "AccountId",54 "Weight": "u64",55 "CreateNftData": {56 "const_data": "Vec<u8>",57 "variable_data": "Vec<u8>" 58 },59 "CreateFungibleData": {60 "value": "u128"61 },62 "CreateReFungibleData": {63 "const_data": "Vec<u8>",64 "variable_data": "Vec<u8>",65 "pieces": "u128"66 },67 "CreateItemData": {68 "_enum": {69 "NFT": "CreateNftData",70 "Fungible": "CreateFungibleData",71 "ReFungible": "CreateReFungibleData"72 }73 },74 "SchemaVersion": {75 "_enum": [76 "ImageURL",77 "Unique"78 ]79 },80 "CollectionId": "u32",81 "TokenId": "u32",82 "ChainLimits": {83 "CollectionNumbersLimit": "u32",84 "AccountTokenOwnershipLimit": "u32",85 "CollectionAdminsLimit": "u64",86 "CustomDataLimit": "u32",87 "NftSponsorTimeout": "u32",88 "FungibleSponsorTimeout": "u32",89 "RefungibleSponsorTimeout": "u32",90 "OffchainSchemaLimit": "u32",91 "VariableOnChainSchemaLimit": "u32",92 "ConstOnChainSchemaLimit": "u32"93 },94 "CollectionLimits": {95 "AccountTokenOwnershipLimit": "u32",96 "SponsoredMintSize": "u32",97 "TokenLimit": "u32",98 "SponsorTimeout": "u32",99 "OwnerCanTransfer": "bool",100 "OwnerCanDestroy": "bool"101 }102}1{2 "AccessMode": {3 "_enum": [4 "Normal",5 "WhiteList"6 ]7 },8 "DecimalPoints": "u8",9 "CollectionMode": {10 "_enum": {11 "Invalid": null,12 "NFT": null,13 "Fungible": "DecimalPoints",14 "ReFungible": null15 }16 },17 "Ownership": {18 "Owner": "AccountId",19 "Fraction": "u128"20 },21 "FungibleItemType": {22 "Value": "u128"23 },24 "NftItemType": {25 "Owner": "AccountId",26 "ConstData": "Vec<u8>",27 "VariableData": "Vec<u8>"28 },29 "ReFungibleItemType": {30 "Owner": "Vec<Ownership<AccountId>>",31 "ConstData": "Vec<u8>",32 "VariableData": "Vec<u8>"33 },34 "CollectionType": {35 "Owner": "AccountId",36 "Mode": "CollectionMode",37 "Access": "AccessMode",38 "DecimalPoints": "DecimalPoints",39 "Name": "Vec<u16>",40 "Description": "Vec<u16>",41 "TokenPrefix": "Vec<u8>",42 "MintMode": "bool",43 "OffchainSchema": "Vec<u8>",44 "SchemaVersion": "SchemaVersion",45 "Sponsor": "AccountId",46 "SponsorConfirmed": "bool",47 "Limits": "CollectionLimits",48 "VariableOnChainSchema": "Vec<u8>",49 "ConstOnChainSchema": "Vec<u8>"50 },51 "RawData": "Vec<u8>",52 "Address": "AccountId",53 "LookupSource": "AccountId",54 "Weight": "u64",55 "CreateNftData": {56 "const_data": "Vec<u8>",57 "variable_data": "Vec<u8>" 58 },59 "CreateFungibleData": {60 "value": "u128"61 },62 "CreateReFungibleData": {63 "const_data": "Vec<u8>",64 "variable_data": "Vec<u8>",65 "pieces": "u128"66 },67 "CreateItemData": {68 "_enum": {69 "NFT": "CreateNftData",70 "Fungible": "CreateFungibleData",71 "ReFungible": "CreateReFungibleData"72 }73 },74 "SchemaVersion": {75 "_enum": [76 "ImageURL",77 "Unique"78 ]79 },80 "CollectionId": "u32",81 "TokenId": "u32",82 "ChainLimits": {83 "CollectionNumbersLimit": "u32",84 "AccountTokenOwnershipLimit": "u32",85 "CollectionAdminsLimit": "u64",86 "CustomDataLimit": "u32",87 "NftSponsorTimeout": "u32",88 "FungibleSponsorTimeout": "u32",89 "RefungibleSponsorTimeout": "u32",90 "OffchainSchemaLimit": "u32",91 "VariableOnChainSchemaLimit": "u32",92 "ConstOnChainSchemaLimit": "u32"93 },94 "CollectionLimits": {95 "AccountTokenOwnershipLimit": "u32",96 "SponsoredDataSize": "u32",97 "TokenLimit": "u32",98 "SponsorTimeout": "u32",99 "OwnerCanTransfer": "bool",100 "OwnerCanDestroy": "bool"101 }102}tests/package.jsondiffbeforeafterboth--- a/tests/package.json
+++ b/tests/package.json
@@ -42,7 +42,8 @@
"testEnableContractSponsoring": "mocha --timeout 9999999 -r ts-node/register ./**/enableContractSponsoring.test.ts",
"testSetContractSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setContractSponsoringRateLimit.test.ts",
"testSetOffchainSchema": "mocha --timeout 9999999 -r ts-node/register ./**/setOffchainSchema.test.ts",
- "testOverflow": "mocha --timeout 9999999 -r ts-node/register ./**/overflow.test.ts"
+ "testOverflow": "mocha --timeout 9999999 -r ts-node/register ./**/overflow.test.ts",
+ "setVariableMetadataSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetadataSponsoringRateLimit.test.ts"
},
"author": "",
"license": "SEE LICENSE IN ../LICENSE",
tests/src/setVariableMetadataSponsoringRateLimit.test.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/setVariableMetadataSponsoringRateLimit.test.ts
@@ -0,0 +1,90 @@
+//
+// This file is subject to the terms and conditions defined in
+// file 'LICENSE', which is part of this source code package.
+//
+
+import { IKeyringPair } from '@polkadot/types/types';
+import privateKey from './substrate/privateKey';
+import usingApi from './substrate/substrate-api';
+import {
+ confirmSponsorshipExpectSuccess,
+ createCollectionExpectSuccess,
+ createItemExpectSuccess,
+ findNotExistingCollection,
+ findUnusedAddress,
+ setCollectionLimitsExpectSuccess,
+ setCollectionSponsorExpectSuccess,
+ setVariableMetaDataExpectFailure,
+ setVariableMetaDataExpectSuccess,
+ setVariableMetaDataSponsoringRateLimitExpectFailure,
+ setVariableMetaDataSponsoringRateLimitExpectSuccess,
+} from './util/helpers';
+
+describe('Integration Test setVariableMetadataSponsoringRateLimit', () => {
+ let alice: IKeyringPair;
+ let userWithNoBalance: IKeyringPair;
+
+ before(async () => {
+ await usingApi(async (api) => {
+ alice = privateKey('//Alice');
+ userWithNoBalance = await findUnusedAddress(api);
+ });
+ });
+
+ it('sponsored setVariableMetaData can be called twice with pause for free', async () => {
+ const collectionId = await createCollectionExpectSuccess();
+ await setCollectionSponsorExpectSuccess(collectionId, alice.address);
+ await confirmSponsorshipExpectSuccess(collectionId);
+ await setVariableMetaDataSponsoringRateLimitExpectSuccess(alice, collectionId, 1);
+
+ const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', userWithNoBalance.address);
+ await setVariableMetaDataExpectSuccess(userWithNoBalance, collectionId, itemId, [1, 2, 3]);
+ await setVariableMetaDataExpectSuccess(userWithNoBalance, collectionId, itemId, [1, 2, 3]);
+ });
+
+ it('sponsored setVariableMetaData can\'t be called twice without pause for free', async () => {
+ const collectionId = await createCollectionExpectSuccess();
+ await setCollectionSponsorExpectSuccess(collectionId, alice.address);
+ await confirmSponsorshipExpectSuccess(collectionId);
+ await setVariableMetaDataSponsoringRateLimitExpectSuccess(alice, collectionId, 10);
+
+ const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', userWithNoBalance.address);
+ await setVariableMetaDataExpectSuccess(userWithNoBalance, collectionId, itemId, [1, 2, 3]);
+ await setVariableMetaDataExpectFailure(userWithNoBalance, collectionId, itemId, [1, 2, 3]);
+ });
+
+ it('sponsored setVariableMetaData can\'t be called for free with variable metadata above collection limits', async () => {
+ const collectionId = await createCollectionExpectSuccess();
+ await setCollectionSponsorExpectSuccess(collectionId, alice.address);
+ await confirmSponsorshipExpectSuccess(collectionId);
+ await setVariableMetaDataSponsoringRateLimitExpectSuccess(alice, collectionId, 1);
+ await setCollectionLimitsExpectSuccess(alice, collectionId, {
+ SponsoredDataSize: 1,
+ });
+ const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', userWithNoBalance.address);
+
+ await setVariableMetaDataExpectSuccess(userWithNoBalance, collectionId, itemId, [1]);
+ await setVariableMetaDataExpectFailure(userWithNoBalance, collectionId, itemId, [1, 2]);
+ });
+});
+
+describe('Negative Integration Test setVariableMetadataSponsoringRateLimit', () => {
+ let alice: IKeyringPair;
+ let nonExistingCollection: number;
+
+ before(async () => {
+ await usingApi(async (api) => {
+ alice = privateKey('//Alice');
+ nonExistingCollection = await findNotExistingCollection(api);
+ });
+ });
+
+ it('fails when called with non-existing collection id', async () => {
+ await setVariableMetaDataSponsoringRateLimitExpectFailure(alice, nonExistingCollection, 1);
+ });
+
+ it('fails when called by non collection sponsor', async () => {
+ const collectionId = await createCollectionExpectSuccess();
+ await setVariableMetaDataSponsoringRateLimitExpectFailure(alice, collectionId, 1);
+ });
+});