git.delta.rocks / unique-network / refs/commits / a9c0e00e1682

difftreelog

source

js-packages/tests/createMultipleItems.test.ts14.5 KiBsourcehistory
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import type {IKeyringPair} from '@polkadot/types/types';18import {usingPlaygrounds, expect, Pallets, itSub} from './util/index.js';1920describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {21  let alice: IKeyringPair;2223  before(async () => {24    await usingPlaygrounds(async (helper, privateKey) => {25      const donor = await privateKey({url: import.meta.url});26      [alice] = await helper.arrange.createAccounts([100n], donor);27    });28  });2930  itSub('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async ({helper}) => {31    const collection = await helper.nft.mintCollection(alice, {32      name: 'name',33      description: 'descr',34      tokenPrefix: 'COL',35      tokenPropertyPermissions: [36        {key: 'data', permission: {tokenOwner: true, mutable: false, collectionAdmin: false}},37      ],38    });39    const args = [40      {properties: [{key: 'data', value: '1'}]},41      {properties: [{key: 'data', value: '2'}]},42      {properties: [{key: 'data', value: '3'}]},43    ];44    const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);45    for(const [i, token] of tokens.entries()) {46      const tokenData = await token.getData();47      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});48      expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);49    }50  });5152  itSub('Create 0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async ({helper}) => {53    const collection = await helper.ft.mintCollection(alice, {54      name: 'name',55      description: 'descr',56      tokenPrefix: 'COL',57    });58    const args = [59      {value: 1n},60      {value: 2n},61      {value: 3n},62    ];63    await helper.ft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, args, {Substrate: alice.address});64    expect(await collection.getBalance({Substrate: alice.address})).to.be.equal(6n);65  });6667  itSub.ifWithPallets('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', [Pallets.ReFungible], async ({helper}) => {68    const collection = await helper.rft.mintCollection(alice, {69      name: 'name',70      description: 'descr',71      tokenPrefix: 'COL',72    });73    const args = [74      {pieces: 1n},75      {pieces: 2n},76      {pieces: 3n},77    ];78    const tokens = await helper.rft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);7980    for(const [i, token] of tokens.entries()) {81      expect(await token.getBalance({Substrate: alice.address})).to.be.equal(BigInt(i + 1));82    }83  });8485  itSub('Can mint amount of items equals to collection limits', async ({helper}) => {86    const collection = await helper.nft.mintCollection(alice, {87      name: 'name',88      description: 'descr',89      tokenPrefix: 'COL',90      limits: {91        tokenLimit: 2,92      },93    });94    const args = [{}, {}];95    await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);96  });9798  itSub('Create 0x31, 0x32, 0x33 items in active NFT with property Admin', async ({helper}) => {99    const collection = await helper.nft.mintCollection(alice, {100      name: 'name',101      description: 'descr',102      tokenPrefix: 'COL',103      tokenPropertyPermissions: [104        {key: 'data', permission: {tokenOwner: false, mutable: true, collectionAdmin: true}},105      ],106    });107    const args = [108      {properties: [{key: 'data', value: '1'}]},109      {properties: [{key: 'data', value: '2'}]},110      {properties: [{key: 'data', value: '3'}]},111    ];112    const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);113    for(const [i, token] of tokens.entries()) {114      const tokenData = await token.getData();115      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});116      expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);117    }118  });119120  itSub('Create 0x31, 0x32, 0x33 items in active NFT with property AdminConst', async ({helper}) => {121    const collection = await helper.nft.mintCollection(alice, {122      name: 'name',123      description: 'descr',124      tokenPrefix: 'COL',125      tokenPropertyPermissions: [126        {key: 'data', permission: {tokenOwner: false, mutable: false, collectionAdmin: true}},127      ],128    });129    const args = [130      {properties: [{key: 'data', value: '1'}]},131      {properties: [{key: 'data', value: '2'}]},132      {properties: [{key: 'data', value: '3'}]},133    ];134    const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);135    for(const [i, token] of tokens.entries()) {136      const tokenData = await token.getData();137      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});138      expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);139    }140  });141142  itSub('Create 0x31, 0x32, 0x33 items in active NFT with property itemOwnerOrAdmin', async ({helper}) => {143    const collection = await helper.nft.mintCollection(alice, {144      name: 'name',145      description: 'descr',146      tokenPrefix: 'COL',147      tokenPropertyPermissions: [148        {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},149      ],150    });151    const args = [152      {properties: [{key: 'data', value: '1'}]},153      {properties: [{key: 'data', value: '2'}]},154      {properties: [{key: 'data', value: '3'}]},155    ];156    const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);157    for(const [i, token] of tokens.entries()) {158      const tokenData = await token.getData();159      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});160      expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);161    }162  });163});164165describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => {166  let alice: IKeyringPair;167  let bob: IKeyringPair;168169  before(async () => {170    await usingPlaygrounds(async (helper, privateKey) => {171      const donor = await privateKey({url: import.meta.url});172      [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);173    });174  });175176  itSub('Regular user cannot create items in active NFT collection', async ({helper}) => {177    const collection = await helper.nft.mintCollection(alice, {178      name: 'name',179      description: 'descr',180      tokenPrefix: 'COL',181    });182    const args = [183      {},184      {},185    ];186    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(bob, collection.collectionId, {Substrate: alice.address}, args);187    await expect(mintTx()).to.be.rejectedWith(/common\.PublicMintingNotAllowed/);188  });189190  itSub('Regular user cannot create items in active Fungible collection', async ({helper}) => {191    const collection = await helper.ft.mintCollection(alice, {192      name: 'name',193      description: 'descr',194      tokenPrefix: 'COL',195    });196    const args = [197      {value: 1n},198      {value: 2n},199      {value: 3n},200    ];201    const mintTx = () => helper.ft.mintMultipleTokensWithOneOwner(bob, collection.collectionId, args, {Substrate: alice.address});202    await expect(mintTx()).to.be.rejectedWith(/common\.PublicMintingNotAllowed/);203  });204205  itSub.ifWithPallets('Regular user cannot create items in active ReFungible collection', [Pallets.ReFungible], async ({helper}) => {206    const collection = await helper.rft.mintCollection(alice, {207      name: 'name',208      description: 'descr',209      tokenPrefix: 'COL',210    });211    const args = [212      {pieces: 1n},213      {pieces: 1n},214      {pieces: 1n},215    ];216    const mintTx = () => helper.rft.mintMultipleTokensWithOneOwner(bob, collection.collectionId, {Substrate: alice.address}, args);217    await expect(mintTx()).to.be.rejectedWith(/common\.PublicMintingNotAllowed/);218  });219220  itSub('Create token in not existing collection', async ({helper}) => {221    const collectionId = 1_000_000;222    const args = [223      {},224      {},225    ];226    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(bob, collectionId, {Substrate: alice.address}, args);227    await expect(mintTx()).to.be.rejectedWith(/common\.CollectionNotFound/);228  });229230  itSub('Create NFTs that has reached the maximum data limit', async ({helper}) => {231    const collection = await helper.nft.mintCollection(alice, {232      name: 'name',233      description: 'descr',234      tokenPrefix: 'COL',235      tokenPropertyPermissions: [236        {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},237      ],238    });239    const args = [240      {properties: [{key: 'data', value: 'A'.repeat(32769)}]},241      {properties: [{key: 'data', value: 'B'.repeat(32769)}]},242      {properties: [{key: 'data', value: 'C'.repeat(32769)}]},243    ];244    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);245    await expect(mintTx()).to.be.rejectedWith('Verification Error');246  });247248  itSub.ifWithPallets('Create Refungible tokens that has reached the maximum data limit', [Pallets.ReFungible], async ({helper}) => {249    const collection = await helper.rft.mintCollection(alice, {250      name: 'name',251      description: 'descr',252      tokenPrefix: 'COL',253      tokenPropertyPermissions: [254        {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},255      ],256    });257    const args = [258      {pieces: 10n, properties: [{key: 'data', value: 'A'.repeat(32769)}]},259      {pieces: 10n, properties: [{key: 'data', value: 'B'.repeat(32769)}]},260      {pieces: 10n, properties: [{key: 'data', value: 'C'.repeat(32769)}]},261    ];262    const mintTx = () => helper.rft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);263    await expect(mintTx()).to.be.rejectedWith('Verification Error');264  });265266  itSub.ifWithPallets('Create tokens with different types', [Pallets.ReFungible], async ({helper}) => {267    const {collectionId} = await helper.nft.mintCollection(alice, {268      name: 'name',269      description: 'descr',270      tokenPrefix: 'COL',271    });272273    const types = ['NFT', 'Fungible', 'ReFungible'];274    await expect(helper.executeExtrinsic(275      alice,276      'api.tx.unique.createMultipleItems',277      [collectionId, {Substrate: alice.address}, types],278    )).to.be.rejectedWith(/nonfungible\.NotNonfungibleDataUsedToMintFungibleCollectionToken/);279  });280281  itSub('Create tokens with different data limits <> maximum data limit', async ({helper}) => {282    const collection = await helper.nft.mintCollection(alice, {283      name: 'name',284      description: 'descr',285      tokenPrefix: 'COL',286      tokenPropertyPermissions: [287        {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},288      ],289    });290    const args = [291      {properties: [{key: 'data', value: 'A'}]},292      {properties: [{key: 'data', value: 'B'.repeat(32769)}]},293    ];294    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);295    await expect(mintTx()).to.be.rejectedWith('Verification Error');296  });297298  itSub('Fails when minting tokens exceeds collectionLimits amount', async ({helper}) => {299    const collection = await helper.nft.mintCollection(alice, {300      name: 'name',301      description: 'descr',302      tokenPrefix: 'COL',303      tokenPropertyPermissions: [304        {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},305      ],306      limits: {307        tokenLimit: 1,308      },309    });310    const args = [311      {},312      {},313    ];314    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);315    await expect(mintTx()).to.be.rejectedWith(/common\.CollectionTokenLimitExceeded/);316  });317318  itSub('User doesnt have editing rights', async ({helper}) => {319    const collection = await helper.nft.mintCollection(alice, {320      name: 'name',321      description: 'descr',322      tokenPrefix: 'COL',323      tokenPropertyPermissions: [324        {key: 'data', permission: {tokenOwner: false, mutable: true, collectionAdmin: false}},325      ],326    });327    const args = [328      {properties: [{key: 'data', value: 'A'}]},329    ];330    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);331    await expect(mintTx()).to.be.rejectedWith(/common\.NoPermission/);332  });333334  itSub('Adding property without access rights', async ({helper}) => {335    const collection = await helper.nft.mintCollection(alice, {336      name: 'name',337      description: 'descr',338      tokenPrefix: 'COL',339      properties: [340        {341          key: 'data',342          value: 'v',343        },344      ],345    });346    const args = [347      {properties: [{key: 'data', value: 'A'}]},348    ];349    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);350    await expect(mintTx()).to.be.rejectedWith(/common\.NoPermission/);351  });352353  itSub('Adding more than 64 prps', async ({helper}) => {354    const collection = await helper.nft.mintCollection(alice, {355      name: 'name',356      description: 'descr',357      tokenPrefix: 'COL',358    });359    const prps = [];360361    for(let i = 0; i < 65; i++) {362      prps.push({key: `key${i}`, value: `value${i}`});363    }364365    const args = [366      {properties: prps},367      {properties: prps},368      {properties: prps},369    ];370371    const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);372    await expect(mintTx()).to.be.rejectedWith('Verification Error');373  });374});