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 {12 createCollectionExpectSuccess,13 destroyCollectionExpectSuccess,14 IReFungibleTokenDataType,15} from './util/helpers';1617chai.use(chaiAsPromised);18const expect = chai.expect;1920interface ITokenDataType {21 Owner: number[];22 ConstData: number[];23 VariableData: number[];24}2526describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {27 it('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => {28 await usingApi(async (api: ApiPromise) => {29 const collectionId = await createCollectionExpectSuccess();30 const itemsListIndexBefore = await api.query.nft.itemListIndex(collectionId) as unknown as BN;31 expect(itemsListIndexBefore.toNumber()).to.be.equal(0);32 const Alice = privateKey('//Alice');33 const args = [{ nft: ['0x31', '0x31'] }, { nft: ['0x32', '0x32'] }, { nft: ['0x33', '0x33'] }];34 const createMultipleItemsTx = await api.tx.nft35 .createMultipleItems(collectionId, Alice.address, args);36 await submitTransactionAsync(Alice, createMultipleItemsTx);37 const itemsListIndexAfter = await api.query.nft.itemListIndex(collectionId) as unknown as BN;38 expect(itemsListIndexAfter.toNumber()).to.be.equal(3);39 const token1Data = await api.query.nft.nftItemList(collectionId, 1) as unknown as ITokenDataType;40 const token2Data = await api.query.nft.nftItemList(collectionId, 2) as unknown as ITokenDataType;41 const token3Data = await api.query.nft.nftItemList(collectionId, 3) as unknown as ITokenDataType;4243 expect(token1Data.Owner.toString()).to.be.equal(Alice.address);44 expect(token2Data.Owner.toString()).to.be.equal(Alice.address);45 expect(token3Data.Owner.toString()).to.be.equal(Alice.address);4647 expect(token1Data.ConstData.toString()).to.be.equal('0x31');48 expect(token2Data.ConstData.toString()).to.be.equal('0x32');49 expect(token3Data.ConstData.toString()).to.be.equal('0x33');5051 expect(token1Data.VariableData.toString()).to.be.equal('0x31');52 expect(token2Data.VariableData.toString()).to.be.equal('0x32');53 expect(token3Data.VariableData.toString()).to.be.equal('0x33');54 });55 });5657 it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {58 await usingApi(async (api: ApiPromise) => {59 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});60 const itemsListIndexBefore = await api.query.nft.itemListIndex(collectionId) as unknown as BN;61 expect(itemsListIndexBefore.toNumber()).to.be.equal(0);62 const Alice = privateKey('//Alice');63 const args = [64 { Refungible: ['0x31', '0x31'] },65 { Refungible: ['0x32', '0x32'] },66 { Refungible: ['0x33', '0x33'] },67 ];68 const createMultipleItemsTx = await api.tx.nft69 .createMultipleItems(collectionId, Alice.address, args);70 await submitTransactionAsync(Alice, createMultipleItemsTx);71 const itemsListIndexAfter = await api.query.nft.itemListIndex(collectionId) as unknown as BN;72 expect(itemsListIndexAfter.toNumber()).to.be.equal(3);73 const token1Data = await api.query.nft.reFungibleItemList(collectionId, 1) as unknown as IReFungibleTokenDataType;74 const token2Data = await api.query.nft.reFungibleItemList(collectionId, 2) as unknown as IReFungibleTokenDataType;75 const token3Data = await api.query.nft.reFungibleItemList(collectionId, 3) as unknown as IReFungibleTokenDataType;7677 expect(token1Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);78 expect(token1Data.Owner[0].Fraction.toNumber()).to.be.equal(1);7980 expect(token2Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);81 expect(token2Data.Owner[0].Fraction.toNumber()).to.be.equal(1);8283 expect(token3Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);84 expect(token3Data.Owner[0].Fraction.toNumber()).to.be.equal(1);8586 expect(token1Data.ConstData.toString()).to.be.equal('0x31');87 expect(token2Data.ConstData.toString()).to.be.equal('0x32');88 expect(token3Data.ConstData.toString()).to.be.equal('0x33');8990 expect(token1Data.VariableData.toString()).to.be.equal('0x31');91 expect(token2Data.VariableData.toString()).to.be.equal('0x32');92 expect(token3Data.VariableData.toString()).to.be.equal('0x33');93 });94 });95});9697describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => {98 it('Create token with not existing type', async () => {99 await usingApi(async (api: ApiPromise) => {100 const collectionId = await createCollectionExpectSuccess();101 const Alice = privateKey('//Alice');102 try {103 const args = [{ invalid: null }, { invalid: null }, { invalid: null }];104 const createMultipleItemsTx = await api.tx.nft105 .createMultipleItems(collectionId, Alice.address, args);106 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;107 } catch (e) {108 109 expect(e).to.be.exist;110 }111 });112 });113114 it('Create token in not existing collection', async () => {115 await usingApi(async (api: ApiPromise) => {116 const collectionId = await createCollectionExpectSuccess();117 const Alice = privateKey('//Alice');118 const createMultipleItemsTx = await api.tx.nft119 .createMultipleItems(collectionId + 1, Alice.address, ['NFT', 'NFT', 'NFT']);120 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;121 });122 });123124 it('Create NFT and Re-fungible tokens that has reached the maximum data limit', async () => {125 await usingApi(async (api: ApiPromise) => {126 127 const collectionId = await createCollectionExpectSuccess();128 const Alice = privateKey('//Alice');129 const args = [130 { nft: ['A'.repeat(2049), 'A'.repeat(2049)] },131 { nft: ['B'.repeat(2049), 'B'.repeat(2049)] },132 { nft: ['C'.repeat(2049), 'C'.repeat(2049)] },133 ];134 const createMultipleItemsTx = await api.tx.nft135 .createMultipleItems(collectionId, Alice.address, args);136 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;137138 139 const collectionIdReFungible =140 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});141 const argsReFungible = [142 { ReFungible: ['1'.repeat(2049), '1'.repeat(2049)] },143 { ReFungible: ['2'.repeat(2049), '2'.repeat(2049)] },144 { ReFungible: ['3'.repeat(2049), '3'.repeat(2049)] },145 ];146 const createMultipleItemsTxFungible = await api.tx.nft147 .createMultipleItems(collectionIdReFungible, Alice.address, argsReFungible);148 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTxFungible)).to.be.rejected;149 });150 });151152 it('Create tokens with different types', async () => {153 await usingApi(async (api: ApiPromise) => {154 const collectionId = await createCollectionExpectSuccess();155 const Alice = privateKey('//Alice');156 const createMultipleItemsTx = await api.tx.nft157 .createMultipleItems(collectionId, Alice.address, ['NFT', 'Fungible', 'ReFungible']);158 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;159 160 await destroyCollectionExpectSuccess(collectionId);161 });162 });163164 it('Create tokens with different data limits <> maximum data limit', async () => {165 await usingApi(async (api: ApiPromise) => {166 const collectionId = await createCollectionExpectSuccess();167 const Alice = privateKey('//Alice');168 const args = [169 { nft: ['A', 'A'] },170 { nft: ['B', 'B'.repeat(2049)] },171 { nft: ['C'.repeat(2049), 'C'] },172 ];173 const createMultipleItemsTx = await api.tx.nft174 .createMultipleItems(collectionId, Alice.address, args);175 await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;176 });177 });178});