12345import { ApiPromise } from '@polkadot/api';6import BN from 'bn.js';7import chai from 'chai';8import chaiAsPromised from 'chai-as-promised';9import privateKey from './substrate/privateKey';10import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';11import {createCollectionExpectSuccess, destroyCollectionExpectSuccess} from './util/helpers';1213chai.use(chaiAsPromised);14const expect = chai.expect;1516interface ITokenDataType {17 Owner: number[];18 ConstData: number[];19 VariableData: number[];20}2122describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {23 it('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => {24 await usingApi(async (api: ApiPromise) => {25 const collectionId = await createCollectionExpectSuccess();26 const itemsListIndexBefore = await api.query.nft.itemListIndex(collectionId) as unknown as BN;27 expect(itemsListIndexBefore.toNumber()).to.be.equal(0);28 const Alice = privateKey('//Alice');29 const args = [{ nft: ['0x31', '0x31'] }, { nft: ['0x32', '0x32'] }, { nft: ['0x33', '0x33'] }];30 const createMultipleItemsTx = await api.tx.nft31 .createMultipleItems(collectionId, Alice.address, args);32 await submitTransactionAsync(Alice, createMultipleItemsTx);33 const itemsListIndexAfter = await api.query.nft.itemListIndex(collectionId) as unknown as BN;34 expect(itemsListIndexAfter.toNumber()).to.be.equal(3);35 const token1Data = await api.query.nft.nftItemList(collectionId, 1) as unknown as ITokenDataType;36 const token2Data = await api.query.nft.nftItemList(collectionId, 2) as unknown as ITokenDataType;37 const token3Data = await api.query.nft.nftItemList(collectionId, 3) as unknown as ITokenDataType;3839 expect(token1Data.Owner.toString()).to.be.equal(Alice.address);40 expect(token2Data.Owner.toString()).to.be.equal(Alice.address);41 expect(token3Data.Owner.toString()).to.be.equal(Alice.address);4243 expect(token1Data.ConstData.toString()).to.be.equal('0x31');44 expect(token2Data.ConstData.toString()).to.be.equal('0x32');45 expect(token3Data.ConstData.toString()).to.be.equal('0x33');4647 expect(token1Data.VariableData.toString()).to.be.equal('0x31');48 expect(token2Data.VariableData.toString()).to.be.equal('0x32');49 expect(token3Data.VariableData.toString()).to.be.equal('0x33');5051 52 await destroyCollectionExpectSuccess(collectionId);53 });54 });55});5657describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => {58 it('Create token with not existing type', async () => {59 await usingApi(async (api: ApiPromise) => {60 const collectionId = await createCollectionExpectSuccess();61 const Alice = privateKey('//Alice');62 try {63 const createMultipleItemsTx = await api.tx.nft64 .createMultipleItems(collectionId, Alice.address, ['UNKNOWN', 'UNKNOWN', 'UNKNOWN']);65 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;66 } catch (e) {67 68 expect(e).to.be.exist;69 }70 71 await destroyCollectionExpectSuccess(collectionId);72 });73 });7475 it('Create token in not existing collection', async () => {76 await usingApi(async (api: ApiPromise) => {77 const collectionId = await createCollectionExpectSuccess();78 const Alice = privateKey('//Alice');79 const createMultipleItemsTx = await api.tx.nft80 .createMultipleItems(collectionId + 1, Alice.address, ['NFT', 'NFT', 'NFT']);81 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;82 83 await destroyCollectionExpectSuccess(collectionId);84 });85 });8687 it('Create NFT and Re-fungible tokens that has reached the maximum data limit', async () => {88 await usingApi(async (api: ApiPromise) => {89 90 const collectionId = await createCollectionExpectSuccess();91 const Alice = privateKey('//Alice');92 const args = [93 { nft: ['A'.repeat(2049), 'A'.repeat(2049)] },94 { nft: ['B'.repeat(2049), 'B'.repeat(2049)] },95 { nft: ['C'.repeat(2049), 'C'.repeat(2049)] },96 ];97 const createMultipleItemsTx = await api.tx.nft98 .createMultipleItems(collectionId, Alice.address, args);99 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;100 101 await destroyCollectionExpectSuccess(collectionId);102103 104 const collectionIdFungible = await createCollectionExpectSuccess();105 const argsFungible = [106 { fungible: parseInt('1'.repeat(2049), 10) },107 { fungible: parseInt('2'.repeat(2049), 10) },108 { fungible: parseInt('3'.repeat(2049), 10) },109 ];110 const createMultipleItemsTxFungible = await api.tx.nft111 .createMultipleItems(collectionIdFungible, Alice.address, argsFungible);112 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTxFungible)).to.be.rejected;113 114 await destroyCollectionExpectSuccess(collectionId);115 });116 });117118 it('Create tokens with different types', async () => {119 await usingApi(async (api: ApiPromise) => {120 const collectionId = await createCollectionExpectSuccess();121 const Alice = privateKey('//Alice');122 const createMultipleItemsTx = await api.tx.nft123 .createMultipleItems(collectionId, Alice.address, ['NFT', 'Fungible', 'ReFungible']);124 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;125 126 await destroyCollectionExpectSuccess(collectionId);127 });128 });129130 it('Create tokens with different data limits <> maximum data limit', async () => {131 await usingApi(async (api: ApiPromise) => {132 const collectionId = await createCollectionExpectSuccess();133 const Alice = privateKey('//Alice');134 const args = [135 { nft: ['A', 'A'] },136 { nft: ['B', 'B'.repeat(2049)] },137 { nft: ['C'.repeat(2049), 'C'] },138 ];139 const createMultipleItemsTx = await api.tx.nft140 .createMultipleItems(collectionId, Alice.address, args);141 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;142 143 await destroyCollectionExpectSuccess(collectionId);144 });145 });146});