From be0c28ab6ce388cbfbdfa97b1171de539ea6a360 Mon Sep 17 00:00:00 2001 From: kpozdnikin Date: Mon, 18 Jan 2021 09:38:03 +0000 Subject: [PATCH] transferFrom tests --- --- a/tests/src/approve.test.ts +++ b/tests/src/approve.test.ts @@ -7,7 +7,7 @@ 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, @@ -29,11 +29,12 @@ const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob); // 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); // 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); @@ -54,12 +55,13 @@ await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1); await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 0); // 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, 1); await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 0); // 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, 1); await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 0); @@ -81,10 +83,11 @@ const nftCollectionId = await createCollectionExpectSuccess(); await approveExpectFail(nftCollectionId + 1, 1, Alice, Bob); // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'}); + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); await approveExpectFail(fungibleCollectionId + 1, 1, Alice, Bob); // reFungible - const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'}); + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}}); await approveExpectFail(reFungibleCollectionId + 1, 1, Alice, Bob); // garbage collection :-D await destroyCollectionExpectSuccess(nftCollectionId); @@ -102,11 +105,12 @@ await destroyCollectionExpectSuccess(nftCollectionId); await approveExpectFail(nftCollectionId, 1, Alice, Bob); // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'}); + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); await destroyCollectionExpectSuccess(fungibleCollectionId); await approveExpectFail(fungibleCollectionId, 1, Alice, Bob); // reFungible - const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'}); + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}}); await destroyCollectionExpectSuccess(reFungibleCollectionId); await approveExpectFail(reFungibleCollectionId, 1, Alice, Bob); }); @@ -120,10 +124,11 @@ const nftCollectionId = await createCollectionExpectSuccess(); await approveExpectFail(nftCollectionId, 2, Alice, Bob); // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'}); + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); await approveExpectFail(fungibleCollectionId, 2, Alice, Bob); // reFungible - const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'}); + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}}); await approveExpectFail(reFungibleCollectionId, 2, Alice, Bob); // garbage collection :-D await destroyCollectionExpectSuccess(nftCollectionId); @@ -141,11 +146,12 @@ const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); await approveExpectFail(nftCollectionId, newNftTokenId, Bob, Alice); // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: 'Fungible'}); + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible'); await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice); // reFungible - const reFungibleCollectionId = await createCollectionExpectSuccess({mode: 'ReFungible'}); + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}}); const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible'); await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice); --- 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); }); }); }); --- 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) => { -- gitstuff