git.delta.rocks / unique-network / refs/commits / 5795d313a129

difftreelog

tests: add setVariableMetadataSponsoringRateLimit

Yaroslav Bolyukin2021-02-25parent: #91fceee.patch.diff
in: master

3 files changed

modifiedruntime_types.jsondiffbeforeafterboth
before · runtime_types.json
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      "SponsoredMintSize": "u32",97      "TokenLimit": "u32",98      "SponsorTimeout": "u32",99      "OwnerCanTransfer": "bool",100      "OwnerCanDestroy": "bool"101    }102}
after · runtime_types.json
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}
modifiedtests/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",
addedtests/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);
+  });
+});