--- a/tests/package-lock.json +++ b/tests/package-lock.json @@ -4824,6 +4824,11 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, + "@types/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -5867,6 +5872,14 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } } }, "arr-diff": { @@ -20684,10 +20697,9 @@ } }, "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, "sshpk": { "version": "1.16.1", --- a/tests/package.json +++ b/tests/package.json @@ -21,7 +21,8 @@ "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts", "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts", "testConnection": "mocha --timeout 9999999 -r ts-node/register ./**/connection.test.ts", - "testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts" + "testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts", + "testCreateMultipleItems": "mocha --timeout 9999999 -r ts-node/register ./**/createMultipleItems.test.ts" }, "author": "", "license": "Apache 2.0", --- a/tests/src/createMultipleItems.test.ts +++ b/tests/src/createMultipleItems.test.ts @@ -3,18 +3,53 @@ // file 'LICENSE', which is part of this source code package. // import { ApiPromise } from '@polkadot/api'; -import { assert } from 'chai'; -import { alicesPublicKey } from './accounts'; +import BN from 'bn.js'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; import privateKey from './substrate/privateKey'; -import usingApi from './substrate/substrate-api'; -import waitNewBlocks from './substrate/wait-new-blocks'; +import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api'; +import {createCollectionExpectSuccess, destroyCollectionExpectSuccess} from './util/helpers'; -const idCollection = 12; +chai.use(chaiAsPromised); +const expect = chai.expect; + +interface ITokenDataType { + Owner: number[]; + ConstData: number[]; + VariableData: number[]; +} describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => { it('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => { await usingApi(async (api: ApiPromise) => { + const collectionId = await createCollectionExpectSuccess(); + const itemsListIndexBefore = await api.query.nft.itemListIndex(collectionId) as unknown as BN; + expect(itemsListIndexBefore.toNumber()).to.be.equal(0); + const Alice = privateKey('//Alice'); + const args = [{ nft: ['0x31', '0x31'] }, { nft: ['0x32', '0x32'] }, { nft: ['0x33', '0x33'] }]; + const createMultipleItemsTx = await api.tx.nft + .createMultipleItems(collectionId, Alice.address, args); + await submitTransactionAsync(Alice, createMultipleItemsTx); + const itemsListIndexAfter = await api.query.nft.itemListIndex(collectionId) as unknown as BN; + expect(itemsListIndexAfter.toNumber()).to.be.equal(3); + const token1Data = await api.query.nft.nftItemList(collectionId, 1) as unknown as ITokenDataType; + const token2Data = await api.query.nft.nftItemList(collectionId, 2) as unknown as ITokenDataType; + const token3Data = await api.query.nft.nftItemList(collectionId, 3) as unknown as ITokenDataType; + + expect(token1Data.Owner.toString()).to.be.equal(Alice.address); + expect(token2Data.Owner.toString()).to.be.equal(Alice.address); + expect(token3Data.Owner.toString()).to.be.equal(Alice.address); + + expect(token1Data.ConstData.toString()).to.be.equal('0x31'); + expect(token2Data.ConstData.toString()).to.be.equal('0x32'); + expect(token3Data.ConstData.toString()).to.be.equal('0x33'); + expect(token1Data.VariableData.toString()).to.be.equal('0x31'); + expect(token2Data.VariableData.toString()).to.be.equal('0x32'); + expect(token3Data.VariableData.toString()).to.be.equal('0x33'); + + // garbage collection :-D + await destroyCollectionExpectSuccess(collectionId); }); }); }); @@ -22,94 +57,90 @@ describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => { it('Create token with not existing type', async () => { await usingApi(async (api: ApiPromise) => { - + const collectionId = await createCollectionExpectSuccess(); + const Alice = privateKey('//Alice'); + try { + const createMultipleItemsTx = await api.tx.nft + .createMultipleItems(collectionId, Alice.address, ['UNKNOWN', 'UNKNOWN', 'UNKNOWN']); + await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected; + } catch (e) { + // tslint:disable-next-line:no-unused-expression + expect(e).to.be.exist; + } + // garbage collection :-D + await destroyCollectionExpectSuccess(collectionId); }); }); it('Create token in not existing collection', async () => { await usingApi(async (api: ApiPromise) => { - + const collectionId = await createCollectionExpectSuccess(); + const Alice = privateKey('//Alice'); + const createMultipleItemsTx = await api.tx.nft + .createMultipleItems(collectionId + 1, Alice.address, ['NFT', 'NFT', 'NFT']); + await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected; + // garbage collection :-D + await destroyCollectionExpectSuccess(collectionId); }); }); - it('Create token that has reached the maximum data limit', async () => { + it('Create NFT and Re-fungible tokens that has reached the maximum data limit', async () => { await usingApi(async (api: ApiPromise) => { + // NFT + const collectionId = await createCollectionExpectSuccess(); + const Alice = privateKey('//Alice'); + const args = [ + { nft: ['A'.repeat(2049), 'A'.repeat(2049)] }, + { nft: ['B'.repeat(2049), 'B'.repeat(2049)] }, + { nft: ['C'.repeat(2049), 'C'.repeat(2049)] }, + ]; + const createMultipleItemsTx = await api.tx.nft + .createMultipleItems(collectionId, Alice.address, args); + await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected; + // garbage collection :-D + await destroyCollectionExpectSuccess(collectionId); + // Fungible + const collectionIdFungible = await createCollectionExpectSuccess(); + const argsFungible = [ + { fungible: parseInt('1'.repeat(2049), 10) }, + { fungible: parseInt('2'.repeat(2049), 10) }, + { fungible: parseInt('3'.repeat(2049), 10) }, + ]; + const createMultipleItemsTxFungible = await api.tx.nft + .createMultipleItems(collectionIdFungible, Alice.address, argsFungible); + await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTxFungible)).to.be.rejected; + // garbage collection :-D + await destroyCollectionExpectSuccess(collectionId); }); }); it('Create tokens with different types', async () => { await usingApi(async (api: ApiPromise) => { - + const collectionId = await createCollectionExpectSuccess(); + const Alice = privateKey('//Alice'); + const createMultipleItemsTx = await api.tx.nft + .createMultipleItems(collectionId, Alice.address, ['NFT', 'Fungible', 'ReFungible']); + await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected; + // garbage collection :-D + await destroyCollectionExpectSuccess(collectionId); }); }); - - it('Create tokens in not existing collection', async () => { - await usingApi(async (api: ApiPromise) => { - }); - }); - it('Create tokens with different data limits <> maximum data limit', async () => { await usingApi(async (api: ApiPromise) => { - - }); - }); -}); - -describe.skip('integration test: ext. createMultipleItems():', () => { - it('Create two NFT tokens in active NFT collection', async () => { - await usingApi(async (api) => { - const AitemListIndex = await api.query.nft.itemListIndex(idCollection); - console.log(`itemListIndex count (before): ${AitemListIndex}`); - const args = ['NFT', 'NFT']; - const alicePrivateKey = privateKey('//Alice'); - const createMultipleItems = await api.tx.nft - .createMultipleItems(idCollection, alicesPublicKey, args) - .signAndSend(alicePrivateKey); - // tslint:disable-next-line: no-unused-expression - assert.exists(createMultipleItems, 'createMultipleItems is neither `null` or `undefined`'); - console.log(`Ext. createMultipleItems submitted with hash: ${createMultipleItems}`); - await waitNewBlocks(api); - const BitemListIndex = await api.query.nft.itemListIndex(idCollection); - console.log(`itemListIndex count (after): ${BitemListIndex}`); - if (BitemListIndex === AitemListIndex) { assert.fail('Corret token not added in collection!'); } - }); - }); - it('(!negative test!) Create two Fungible tokens in active NFT collection', async () => { - await usingApi(async (api) => { - const AitemListIndex = await api.query.nft.itemListIndex(idCollection); - console.log(`itemListIndex count (before): ${AitemListIndex}`); - const args = ['Fungible', 'Fungible']; - const alicePrivateKey = privateKey('//Alice'); - const createMultipleItems = await api.tx.nft - .createMultipleItems(idCollection, alicesPublicKey, args) - .signAndSend(alicePrivateKey); - // tslint:disable-next-line: no-unused-expression - assert.exists(createMultipleItems, 'createMultipleItems is neither `null` or `undefined`'); - console.log(`Ext. createMultipleItems submitted with hash: ${createMultipleItems}`); - await waitNewBlocks(api); - const BitemListIndex = await api.query.nft.itemListIndex(idCollection); - console.log(`itemListIndex count (after): ${BitemListIndex}`); - if (BitemListIndex > AitemListIndex) { assert.fail('Incorrect token added in collection!'); } - }); - }); - it('(!negative test!) Create two ReFungible tokens in active NFT collection', async () => { - await usingApi(async (api) => { - const AitemListIndex = await api.query.nft.itemListIndex(idCollection); - console.log(`itemListIndex count (before): ${AitemListIndex}`); - const args = ['ReFungible', 'ReFungible']; - const alicePrivateKey = privateKey('//Alice'); - const createMultipleItems = await api.tx.nft - .createMultipleItems(idCollection, alicesPublicKey, args) - .signAndSend(alicePrivateKey); - // tslint:disable-next-line: no-unused-expression - assert.exists(createMultipleItems, 'createMultipleItems is neither `null` or `undefined`'); - console.log(`Ext. createMultipleItems submitted with hash: ${createMultipleItems}`); - await waitNewBlocks(api); - const BitemListIndex = await api.query.nft.itemListIndex(idCollection); - console.log(`itemListIndex count (after): ${BitemListIndex}`); - if (BitemListIndex > AitemListIndex) { assert.fail('Incorrect token added in collection!'); } + const collectionId = await createCollectionExpectSuccess(); + const Alice = privateKey('//Alice'); + const args = [ + { nft: ['A', 'A'] }, + { nft: ['B', 'B'.repeat(2049)] }, + { nft: ['C'.repeat(2049), 'C'] }, + ]; + const createMultipleItemsTx = await api.tx.nft + .createMultipleItems(collectionId, Alice.address, args); + await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected; + // garbage collection :-D + await destroyCollectionExpectSuccess(collectionId); }); }); });