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

difftreelog

fixes

kpozdnikin2021-01-18parent: #9ecb329.patch.diff
in: master

3 files changed

modifiedtests/src/createMultipleItems.test.tsdiffbeforeafterboth
--- a/tests/src/createMultipleItems.test.ts
+++ b/tests/src/createMultipleItems.test.ts
@@ -8,7 +8,11 @@
 import chaiAsPromised from 'chai-as-promised';
 import privateKey from './substrate/privateKey';
 import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';
-import {createCollectionExpectSuccess, destroyCollectionExpectSuccess} from './util/helpers';
+import {
+  createCollectionExpectSuccess,
+  destroyCollectionExpectSuccess,
+  IReFungibleTokenDataType,
+} from './util/helpers';
 
 chai.use(chaiAsPromised);
 const expect = chai.expect;
@@ -47,9 +51,45 @@
       expect(token1Data.VariableData.toString()).to.be.equal('0x31');
       expect(token2Data.VariableData.toString()).to.be.equal('0x32');
       expect(token3Data.VariableData.toString()).to.be.equal('0x33');
+    });
+  });
+
+  it('Create  0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {
+    await usingApi(async (api: ApiPromise) => {
+      const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+      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 = [
+        { Refungible: ['0x31', '0x31'] },
+        { Refungible: ['0x32', '0x32'] },
+        { Refungible: ['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.reFungibleItemList(collectionId, 1) as unknown as IReFungibleTokenDataType;
+      const token2Data = await api.query.nft.reFungibleItemList(collectionId, 2) as unknown as IReFungibleTokenDataType;
+      const token3Data = await api.query.nft.reFungibleItemList(collectionId, 3) as unknown as IReFungibleTokenDataType;
+
+      expect(token1Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);
+      expect(token1Data.Owner[0].Fraction.toNumber()).to.be.equal(1);
+
+      expect(token2Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);
+      expect(token2Data.Owner[0].Fraction.toNumber()).to.be.equal(1);
+
+      expect(token3Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);
+      expect(token3Data.Owner[0].Fraction.toNumber()).to.be.equal(1);
 
-      // garbage collection :-D
-      await destroyCollectionExpectSuccess(collectionId);
+      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');
     });
   });
 });
@@ -60,15 +100,14 @@
       const collectionId = await createCollectionExpectSuccess();
       const Alice = privateKey('//Alice');
       try {
+        const args = [{ invalid: null }, { invalid: null }, { invalid: null }];
         const createMultipleItemsTx = await api.tx.nft
-          .createMultipleItems(collectionId, Alice.address, ['UNKNOWN', 'UNKNOWN', 'UNKNOWN']);
+          .createMultipleItems(collectionId, Alice.address, args);
         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);
     });
   });
 
@@ -79,8 +118,6 @@
       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);
     });
   });
 
@@ -97,21 +134,18 @@
       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) },
+      // ReFungible
+      const collectionIdReFungible =
+        await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+      const argsReFungible = [
+        { ReFungible: ['1'.repeat(2049), '1'.repeat(2049)] },
+        { ReFungible: ['2'.repeat(2049), '2'.repeat(2049)] },
+        { ReFungible: ['3'.repeat(2049), '3'.repeat(2049)] },
       ];
       const createMultipleItemsTxFungible = await api.tx.nft
-        .createMultipleItems(collectionIdFungible, Alice.address, argsFungible);
+        .createMultipleItems(collectionIdReFungible, Alice.address, argsReFungible);
       await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTxFungible)).to.be.rejected;
-      // garbage collection :-D
-      await destroyCollectionExpectSuccess(collectionId);
     });
   });
 
@@ -139,8 +173,6 @@
       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);
     });
   });
 });
modifiedtests/src/substrate/substrate-api.tsdiffbeforeafterboth
before · tests/src/substrate/substrate-api.ts
1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import { WsProvider, ApiPromise } from "@polkadot/api";7import type { AccountId, Address, ApplyExtrinsicResult, DispatchError, DispatchInfo, EventRecord, Extrinsic, ExtrinsicStatus, Hash, RuntimeDispatchInfo } from '@polkadot/types/interfaces';8import { IKeyringPair } from "@polkadot/types/types";910import config from "../config";11import promisifySubstrate from "./promisify-substrate";12import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";13import rtt from "../../../runtime_types.json";1415function defaultApiOptions(): ApiOptions {16  const wsProvider = new WsProvider(config.substrateUrl);17  return { provider: wsProvider, types: rtt };18}1920export default async function usingApi(action: (api: ApiPromise) => Promise<void>, settings: ApiOptions | undefined = undefined): Promise<void> {21  settings = settings || defaultApiOptions();22  let api: ApiPromise = new ApiPromise(settings);2324  try {25    await promisifySubstrate(api, async () => {26      if(api) {27        await api.isReadyOrError;28        await action(api);29      }30    })();31  } finally {32    await api.disconnect();33  }34}3536enum TransactionStatus {37  Success,38  Fail,39  NotReady40}4142function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {43  if (status.isReady) {44    return TransactionStatus.NotReady;45  }46  if (status.isBroadcast) {47    return TransactionStatus.NotReady;48  } 49  if (status.isInBlock || status.isFinalized) {50    if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {51      return TransactionStatus.Fail;52    }53    if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {54      return TransactionStatus.Success;55    }56  }5758  return TransactionStatus.Fail;59}6061export function submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {62  return new Promise(async function(resolve, reject) {63    try {64      await transaction.signAndSend(sender, ({ events = [], status }) => {65        const transactionStatus = getTransactionStatus(events, status);6667        if (transactionStatus == TransactionStatus.Success) {68          resolve(events);69        } else if (transactionStatus == TransactionStatus.Fail) {70          console.log(`Something went wrong with transaction. Status: ${status}`);71          reject(events);72        }73      });74    } catch (e) {75      console.log("Error: ", e);76      reject(e);77    }78  });79}8081export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {82  const consoleError = console.error;83  const consoleLog = console.log;84  console.error = () => {};85  console.log = () => {};8687  return new Promise<EventRecord[]>(async function(res, rej) {88    const resolve = (rec: EventRecord[]) => {89      setTimeout(() => {90        res(rec);91        console.error = consoleError;92        console.log = consoleLog;93      });94    };95    const reject = (errror: any) => {96      setTimeout(() => {97        rej(errror);98        console.error = consoleError;99        console.log = consoleLog;100      });101    };102    try {103      await transaction.signAndSend(sender, ({ events = [], status }) => {104        const transactionStatus = getTransactionStatus(events, status);105106        console.log('transactionStatus', transactionStatus, 'events', events);107108        if (transactionStatus == TransactionStatus.Success) {109          resolve(events);110        } else if (transactionStatus == TransactionStatus.Fail) {111          reject(events);112        }113      });114    } catch (e) {115      reject(e);116    }117  });118}
after · tests/src/substrate/substrate-api.ts
1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import { WsProvider, ApiPromise } from "@polkadot/api";7import type { AccountId, Address, ApplyExtrinsicResult, DispatchError, DispatchInfo, EventRecord, Extrinsic, ExtrinsicStatus, Hash, RuntimeDispatchInfo } from '@polkadot/types/interfaces';8import { IKeyringPair } from "@polkadot/types/types";910import config from "../config";11import promisifySubstrate from "./promisify-substrate";12import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";13import rtt from "../../../runtime_types.json";1415function defaultApiOptions(): ApiOptions {16  const wsProvider = new WsProvider(config.substrateUrl);17  return { provider: wsProvider, types: rtt };18}1920export default async function usingApi(action: (api: ApiPromise) => Promise<void>, settings: ApiOptions | undefined = undefined): Promise<void> {21  settings = settings || defaultApiOptions();22  let api: ApiPromise = new ApiPromise(settings);2324  try {25    await promisifySubstrate(api, async () => {26      if(api) {27        await api.isReadyOrError;28        await action(api);29      }30    })();31  } finally {32    await api.disconnect();33  }34}3536enum TransactionStatus {37  Success,38  Fail,39  NotReady40}4142function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {43  if (status.isReady) {44    return TransactionStatus.NotReady;45  }46  if (status.isBroadcast) {47    return TransactionStatus.NotReady;48  } 49  if (status.isInBlock || status.isFinalized) {50    if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {51      return TransactionStatus.Fail;52    }53    if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {54      return TransactionStatus.Success;55    }56  }5758  return TransactionStatus.Fail;59}6061export function submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {62  return new Promise(async function(resolve, reject) {63    try {64      await transaction.signAndSend(sender, ({ events = [], status }) => {65        const transactionStatus = getTransactionStatus(events, status);6667        if (transactionStatus == TransactionStatus.Success) {68          resolve(events);69        } else if (transactionStatus == TransactionStatus.Fail) {70          console.log(`Something went wrong with transaction. Status: ${status}`);71          reject(events);72        }73      });74    } catch (e) {75      console.log("Error: ", e);76      reject(e);77    }78  });79}8081export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {82  const consoleError = console.error;83  const consoleLog = console.log;84  console.error = () => {};85  console.log = () => {};8687  return new Promise<EventRecord[]>(async function(res, rej) {88    const resolve = (rec: EventRecord[]) => {89      setTimeout(() => {90        res(rec);91        console.error = consoleError;92        console.log = consoleLog;93      });94    };95    const reject = (errror: any) => {96      setTimeout(() => {97        rej(errror);98        console.error = consoleError;99        console.log = consoleLog;100      });101    };102    try {103      await transaction.signAndSend(sender, ({ events = [], status }) => {104        const transactionStatus = getTransactionStatus(events, status);105        if (transactionStatus === TransactionStatus.Success) {106          resolve(events);107        } else if (transactionStatus === TransactionStatus.Fail) {108          reject(events);109        }110      });111    } catch (e) {112      reject(e);113    }114  });115}
modifiedtests/src/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -51,7 +51,7 @@
   Value: BN;
 }
 
-interface IReFungibleTokenDataType {
+export interface IReFungibleTokenDataType {
   Owner: IReFungibleOwner[];
   ConstData: number[];
   VariableData: number[];