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

difftreelog

transferFrom tests

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

3 files changed

modifiedtests/src/approve.test.tsdiffbeforeafterboth
7import chai from 'chai';7import chai from 'chai';
8import chaiAsPromised from 'chai-as-promised';8import chaiAsPromised from 'chai-as-promised';
9import privateKey from './substrate/privateKey';9import privateKey from './substrate/privateKey';
10import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';10import { default as usingApi } from './substrate/substrate-api';
11import {11import {
12 approveExpectFail,12 approveExpectFail,
13 approveExpectSuccess,13 approveExpectSuccess,
29 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');29 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
30 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);30 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);
31 // fungible31 // fungible
32 const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'});32 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
33 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');33 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
34 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);34 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);
35 // reFungible35 // reFungible
36 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});36 const reFungibleCollectionId =
37 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
37 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');38 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
38 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);39 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);
3940
54 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1);55 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1);
55 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 0);56 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 0);
56 // fungible57 // fungible
57 const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'});58 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
58 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');59 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
59 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1);60 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1);
60 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 0);61 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 0);
61 // reFungible62 // reFungible
62 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});63 const reFungibleCollectionId =
64 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
63 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');65 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
64 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 1);66 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 1);
65 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 0);67 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 0);
81 const nftCollectionId = await createCollectionExpectSuccess();83 const nftCollectionId = await createCollectionExpectSuccess();
82 await approveExpectFail(nftCollectionId + 1, 1, Alice, Bob);84 await approveExpectFail(nftCollectionId + 1, 1, Alice, Bob);
83 // fungible85 // fungible
84 const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'});86 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
85 await approveExpectFail(fungibleCollectionId + 1, 1, Alice, Bob);87 await approveExpectFail(fungibleCollectionId + 1, 1, Alice, Bob);
86 // reFungible88 // reFungible
87 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});89 const reFungibleCollectionId =
90 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
88 await approveExpectFail(reFungibleCollectionId + 1, 1, Alice, Bob);91 await approveExpectFail(reFungibleCollectionId + 1, 1, Alice, Bob);
89 // garbage collection :-D92 // garbage collection :-D
90 await destroyCollectionExpectSuccess(nftCollectionId);93 await destroyCollectionExpectSuccess(nftCollectionId);
102 await destroyCollectionExpectSuccess(nftCollectionId);105 await destroyCollectionExpectSuccess(nftCollectionId);
103 await approveExpectFail(nftCollectionId, 1, Alice, Bob);106 await approveExpectFail(nftCollectionId, 1, Alice, Bob);
104 // fungible107 // fungible
105 const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'});108 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
106 await destroyCollectionExpectSuccess(fungibleCollectionId);109 await destroyCollectionExpectSuccess(fungibleCollectionId);
107 await approveExpectFail(fungibleCollectionId, 1, Alice, Bob);110 await approveExpectFail(fungibleCollectionId, 1, Alice, Bob);
108 // reFungible111 // reFungible
109 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});112 const reFungibleCollectionId =
113 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
110 await destroyCollectionExpectSuccess(reFungibleCollectionId);114 await destroyCollectionExpectSuccess(reFungibleCollectionId);
111 await approveExpectFail(reFungibleCollectionId, 1, Alice, Bob);115 await approveExpectFail(reFungibleCollectionId, 1, Alice, Bob);
112 });116 });
120 const nftCollectionId = await createCollectionExpectSuccess();124 const nftCollectionId = await createCollectionExpectSuccess();
121 await approveExpectFail(nftCollectionId, 2, Alice, Bob);125 await approveExpectFail(nftCollectionId, 2, Alice, Bob);
122 // fungible126 // fungible
123 const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'});127 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
124 await approveExpectFail(fungibleCollectionId, 2, Alice, Bob);128 await approveExpectFail(fungibleCollectionId, 2, Alice, Bob);
125 // reFungible129 // reFungible
126 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});130 const reFungibleCollectionId =
131 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
127 await approveExpectFail(reFungibleCollectionId, 2, Alice, Bob);132 await approveExpectFail(reFungibleCollectionId, 2, Alice, Bob);
128 // garbage collection :-D133 // garbage collection :-D
129 await destroyCollectionExpectSuccess(nftCollectionId);134 await destroyCollectionExpectSuccess(nftCollectionId);
141 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');146 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
142 await approveExpectFail(nftCollectionId, newNftTokenId, Bob, Alice);147 await approveExpectFail(nftCollectionId, newNftTokenId, Bob, Alice);
143 // fungible148 // fungible
144 const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'});149 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
145 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');150 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
146 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice);151 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice);
147 // reFungible152 // reFungible
148 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});153 const reFungibleCollectionId =
154 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
149 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');155 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
150 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice);156 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice);
151157
modifiedtests/src/transferFrom.test.tsdiffbeforeafterboth
--- a/tests/src/transferFrom.test.ts
+++ b/tests/src/transferFrom.test.ts
@@ -3,19 +3,19 @@
 // file 'LICENSE', which is part of this source code package.
 //
 import { ApiPromise } from '@polkadot/api';
-import BN from 'bn.js';
 import chai from 'chai';
 import chaiAsPromised from 'chai-as-promised';
 import privateKey from './substrate/privateKey';
-import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';
+import { default as usingApi } from './substrate/substrate-api';
 import {
+  approveExpectFail,
   approveExpectSuccess,
   createCollectionExpectSuccess,
   createItemExpectSuccess,
   destroyCollectionExpectSuccess,
+  transferFromExpectFail,
   transferFromExpectSuccess,
 } from './util/helpers';
-import {IKeyringPair} from "@polkadot/types/types";
 
 chai.use(chaiAsPromised);
 const expect = chai.expect;
@@ -26,29 +26,30 @@
       const Alice = privateKey('//Alice');
       const Bob = privateKey('//Bob');
       const Charlie = privateKey('//CHARLIE');
+      // nft
       const nftCollectionId = await createCollectionExpectSuccess();
-      console.log('nftCollectionId', nftCollectionId);
-      const collectionInfo = await api.query.nft.collection(nftCollectionId);
-      console.log('collectionInfo', collectionInfo);
-      // nft
       const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
       await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);
 
-      await transferFromExpectSuccess(nftCollectionId, newNftTokenId, Alice, Charlie, 1, 'NFT');
+      await transferFromExpectSuccess(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1, 'NFT');
 
       // fungible
-      /*const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'});
+      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
       const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
       await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);
+      await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1, 'Fungible');
       // reFungible
-      const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});
+      const reFungibleCollectionId = await
+        createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
       const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
-      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);*/
+      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);
+      await transferFromExpectSuccess(reFungibleCollectionId,
+        newReFungibleTokenId, Bob, Alice, Charlie, 1, 'ReFungible');
 
       // garbage collection :-D
       await destroyCollectionExpectSuccess(nftCollectionId);
-      // await destroyCollectionExpectSuccess(fungibleCollectionId);
-      // await destroyCollectionExpectSuccess(reFungibleCollectionId);
+      await destroyCollectionExpectSuccess(fungibleCollectionId);
+      await destroyCollectionExpectSuccess(reFungibleCollectionId);
     });
   });
 });
@@ -56,43 +57,157 @@
 describe('Negative Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {
   it('transferFrom for a collection that does not exist', async () => {
     await usingApi(async (api: ApiPromise) => {
+      const Alice = privateKey('//Alice');
+      const Bob = privateKey('//Bob');
+      const Charlie = privateKey('//CHARLIE');
+      // nft
+      const nftCollectionId = await createCollectionExpectSuccess();
+      await approveExpectFail(nftCollectionId + 1, 1, Alice, Bob);
+
+      await transferFromExpectFail(nftCollectionId + 1, 1, Bob, Alice, Charlie, 1);
+
+      // fungible
+      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
+      await approveExpectFail(fungibleCollectionId + 1, 1, Alice, Bob);
+
+      await transferFromExpectFail(fungibleCollectionId + 1, 1, Bob, Alice, Charlie, 1);
+      // reFungible
+      const reFungibleCollectionId = await
+        createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+      await approveExpectFail(reFungibleCollectionId + 1, 1, Alice, Bob);
 
+      await transferFromExpectFail(reFungibleCollectionId + 1, 1, Bob, Alice, Charlie, 1);
+
+      // garbage collection :-D
+      await destroyCollectionExpectSuccess(nftCollectionId);
+      await destroyCollectionExpectSuccess(fungibleCollectionId);
+      await destroyCollectionExpectSuccess(reFungibleCollectionId);
     });
   });
 
-  it('transferFrom for a collection that was destroyed', async () => {
+  /* it('transferFrom for a collection that was destroyed', async () => {
     await usingApi(async (api: ApiPromise) => {
-
+      this test copies approve negative test
     });
-  });
+  }); */
 
-  it('transferFrom a token that does not exist', async () => {
+  /* it('transferFrom a token that does not exist', async () => {
     await usingApi(async (api: ApiPromise) => {
-
+      this test copies approve negative test
     });
-  });
+  }); */
 
-  it('transferFrom a token that was deleted', async () => {
+  /* it('transferFrom a token that was deleted', async () => {
     await usingApi(async (api: ApiPromise) => {
-
+      this test copies approve negative test
     });
-  });
+  }); */
 
   it('transferFrom for not approved address', async () => {
     await usingApi(async (api: ApiPromise) => {
+      const Alice = privateKey('//Alice');
+      const Bob = privateKey('//Bob');
+      const Charlie = privateKey('//CHARLIE');
+      // nft
+      const nftCollectionId = await createCollectionExpectSuccess();
+      const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
 
+      await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1);
+
+      // fungible
+      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
+      const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
+      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);
+      // reFungible
+      const reFungibleCollectionId = await
+        createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+      const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
+      await transferFromExpectFail(reFungibleCollectionId,
+        newReFungibleTokenId, Bob, Alice, Charlie, 1);
+
+      // garbage collection :-D
+      await destroyCollectionExpectSuccess(nftCollectionId);
+      await destroyCollectionExpectSuccess(fungibleCollectionId);
+      await destroyCollectionExpectSuccess(reFungibleCollectionId);
     });
   });
 
   it('transferFrom incorrect token count', async () => {
     await usingApi(async (api: ApiPromise) => {
+      const Alice = privateKey('//Alice');
+      const Bob = privateKey('//Bob');
+      const Charlie = privateKey('//CHARLIE');
+      // nft
+      const nftCollectionId = await createCollectionExpectSuccess();
+      const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
+      await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);
+
+      await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 2);
+
+      // fungible
+      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
+      const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
+      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);
+      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 2);
+      // reFungible
+      const reFungibleCollectionId = await
+        createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+      const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
+      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);
+      await transferFromExpectFail(reFungibleCollectionId,
+        newReFungibleTokenId, Bob, Alice, Charlie, 2);
 
+      // garbage collection :-D
+      await destroyCollectionExpectSuccess(nftCollectionId);
+      await destroyCollectionExpectSuccess(fungibleCollectionId);
+      await destroyCollectionExpectSuccess(reFungibleCollectionId);
     });
   });
 
   it('execute transferFrom from account that is not owner of collection', async () => {
     await usingApi(async (api: ApiPromise) => {
+      const Alice = privateKey('//Alice');
+      const Bob = privateKey('//Bob');
+      const Charlie = privateKey('//CHARLIE');
+      const Dave = privateKey('//DAVE');
+      // nft
+      const nftCollectionId = await createCollectionExpectSuccess();
+      const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
+      try {
+        await approveExpectFail(nftCollectionId, newNftTokenId, Dave, Bob);
+        await transferFromExpectFail(nftCollectionId, newNftTokenId, Dave, Alice, Charlie, 1);
+      } catch (e) {
+        // tslint:disable-next-line:no-unused-expression
+        expect(e).to.be.exist;
+      }
 
+      // await transferFromExpectFail(nftCollectionId, newNftTokenId, Dave, Alice, Charlie, 1);
+
+      // fungible
+      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
+      const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
+      try {
+        await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Dave, Bob);
+        await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Dave, Alice, Charlie, 1);
+      } catch (e) {
+        // tslint:disable-next-line:no-unused-expression
+        expect(e).to.be.exist;
+      }
+      // reFungible
+      const reFungibleCollectionId = await
+        createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+      const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
+      try {
+        await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Bob);
+        await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Alice, Charlie, 1);
+      } catch (e) {
+        // tslint:disable-next-line:no-unused-expression
+        expect(e).to.be.exist;
+      }
+      // garbage collection :-D
+      await destroyCollectionExpectSuccess(nftCollectionId);
+      await destroyCollectionExpectSuccess(fungibleCollectionId);
+      await destroyCollectionExpectSuccess(reFungibleCollectionId);
     });
   });
 });
modifiedtests/src/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -36,12 +36,27 @@
   itemId: number;
 }
 
+interface IReFungibleOwner {
+  Fraction: BN;
+  Owner: number[];
+}
+
 interface ITokenDataType {
   Owner: number[];
   ConstData: number[];
   VariableData: number[];
 }
 
+interface IFungibleTokenDataType {
+  Value: BN;
+}
+
+interface IReFungibleTokenDataType {
+  Owner: IReFungibleOwner[];
+  ConstData: number[];
+  VariableData: number[];
+}
+
 export function getGenericResult(events: EventRecord[]): GenericResult {
   const result: GenericResult = {
     success: false,
@@ -394,9 +409,18 @@
 }
 
 export async function
-transferFromExpectSuccess(collectionId: number, tokenId: number, accountFrom: IKeyringPair,
-                          accountTo: IKeyringPair, value: number = 1, type: string = 'NFT') {
+transferFromExpectSuccess(collectionId: number,
+                          tokenId: number,
+                          accountApproved: IKeyringPair,
+                          accountFrom: IKeyringPair,
+                          accountTo: IKeyringPair,
+                          value: number = 1,
+                          type: string = 'NFT') {
   await usingApi(async (api: ApiPromise) => {
+    let balanceBefore = new BN(0);
+    if (type === 'Fungible') {
+      balanceBefore = await api.query.nft.balance(collectionId, accountTo.address) as unknown as BN;
+    }
     const transferFromTx = await api.tx.nft.transferFrom(
       accountFrom.address, accountTo.address, collectionId, tokenId, value);
     const events = await submitTransactionAsync(accountFrom, transferFromTx);
@@ -404,21 +428,40 @@
     // tslint:disable-next-line:no-unused-expression
     expect(result.success).to.be.true;
     if (type === 'NFT') {
-      const nftItemData = api.query.nft.nftItemList(collectionId, tokenId) as unknown as ITokenDataType;
-      console.log('NFT data', nftItemData);
+      const nftItemData = await api.query.nft.nftItemList(collectionId, tokenId) as unknown as ITokenDataType;
+      expect(nftItemData.Owner.toString()).to.be.equal(accountTo.address);
     }
     if (type === 'Fungible') {
-      const nftItemData = api.query.nft.fungibleItemList(collectionId, tokenId) as unknown as ITokenDataType;
-      console.log('Fungible data', nftItemData);
+      const balanceAfter = await api.query.nft.balance(collectionId, accountTo.address) as unknown as BN;
+      expect(balanceAfter.sub(balanceBefore).toNumber()).to.be.equal(value);
     }
     if (type === 'ReFungible') {
-      const nftItemData = api.query.nft.reFungibleItemList(collectionId, tokenId) as unknown as ITokenDataType;
-      console.log('reFungibleItemList data', nftItemData);
+      const nftItemData =
+        await api.query.nft.reFungibleItemList(collectionId, tokenId) as unknown as IReFungibleTokenDataType;
+      expect(nftItemData.Owner[0].Owner.toString()).to.be.equal(accountTo.address);
+      expect(nftItemData.Owner[0].Fraction.toNumber()).to.be.equal(value);
     }
   });
 }
 
 export async function
+transferFromExpectFail(collectionId: number,
+                       tokenId: number,
+                       accountApproved: IKeyringPair,
+                       accountFrom: IKeyringPair,
+                       accountTo: IKeyringPair,
+                       value: number = 1) {
+  await usingApi(async (api: ApiPromise) => {
+    const transferFromTx = await api.tx.nft.transferFrom(
+      accountFrom.address, accountTo.address, collectionId, tokenId, value);
+    const events = await expect(submitTransactionExpectFailAsync(accountApproved, transferFromTx)).to.be.rejected;
+    const result = getCreateCollectionResult(events);
+    // tslint:disable-next-line:no-unused-expression
+    expect(result.success).to.be.false;
+  });
+}
+
+export async function
 approveExpectFail(collectionId: number,
                   tokenId: number, owner: IKeyringPair, approved: IKeyringPair, amount: number = 1) {
   await usingApi(async (api: ApiPromise) => {