difftreelog
Merge pull request #382 from UniqueNetwork/feature/eth-nesting-tests
in: master
Feature/eth nesting tests
2 files changed
tests/package.jsondiffbeforeafterboth--- a/tests/package.json
+++ b/tests/package.json
@@ -28,6 +28,7 @@
"test": "mocha --timeout 9999999 -r ts-node/register './src/**/*.test.ts'",
"testEth": "mocha --timeout 9999999 -r ts-node/register './**/eth/**/*.test.ts'",
"testEthMarketplace": "mocha --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.test.ts'",
+ "testEthNesting": "mocha --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.test.ts'",
"load": "mocha --timeout 9999999 -r ts-node/register './**/*.load.ts'",
"loadTransfer": "ts-node src/transfer.nload.ts",
"testCollision": "mocha --timeout 9999999 -r ts-node/register ./src/collision-tests/*.test.ts",
tests/src/eth/nesting/nest.test.tsdiffbeforeafterboth1import {ApiPromise} from '@polkadot/api';2import {Contract} from 'web3-eth-contract';3import {expect} from 'chai';4import Web3 from 'web3';5import {createEthAccountWithBalance, evmCollectionHelpers, GAS_ARGS, getCollectionAddressFromResult, itWeb3, tokenIdToAddress} from '../../eth/util/helpers';6import nonFungibleAbi from '../nonFungibleAbi.json';78const createNestingCollection = async (9 api: ApiPromise,10 web3: Web3,11 owner: string,12): Promise<{ collectionId: number, collectionAddress: string, contract: Contract }> => {13 const collectionHelper = evmCollectionHelpers(web3, owner);14 15 const result = await collectionHelper.methods16 .createNonfungibleCollection('A', 'B', 'C')17 .send();18 const {collectionIdAddress: collectionAddress, collectionId} = await getCollectionAddressFromResult(api, result);1920 const contract = new web3.eth.Contract(nonFungibleAbi as any, collectionAddress, {from: owner, ...GAS_ARGS});21 await contract.methods.setCollectionNesting(true).send({from: owner});2223 return {collectionId, collectionAddress, contract};24};2526describe('Integration Test: EVM Nesting', () => {27 itWeb3('NFT: allows an Owner to nest/unnest their token', async ({api, web3, privateKeyWrapper}) => {28 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);29 const {collectionId, contract} = await createNestingCollection(api, web3, owner);3031 // Create a token to be nested32 const nftTokenId = await contract.methods.nextTokenId().call();33 await contract.methods.mint(34 owner,35 nftTokenId,36 ).send({from: owner});3738 // Nest into a token39 const firstTargetNftTokenId = await contract.methods.nextTokenId().call();40 await contract.methods.mint(41 owner,42 firstTargetNftTokenId,43 ).send({from: owner});4445 const targetNftTokenAddress = tokenIdToAddress(collectionId, firstTargetNftTokenId);4647 await contract.methods.transfer(targetNftTokenAddress, nftTokenId).send({from: owner});48 expect(await contract.methods.ownerOf(nftTokenId).call()).to.be.equal(targetNftTokenAddress);4950 // Re-nest into another51 const secondTargetNftTokenId = await contract.methods.nextTokenId().call();52 await contract.methods.mint(53 owner,54 secondTargetNftTokenId,55 ).send({from: owner});56 const nextNftTokenAddress = tokenIdToAddress(collectionId, secondTargetNftTokenId);5758 await contract.methods.transfer(nextNftTokenAddress, nftTokenId).send({from: owner});59 expect(await contract.methods.ownerOf(nftTokenId).call()).to.be.equal(nextNftTokenAddress);60 });6162 itWeb3('NFT: allows an Owner to nest/unnest their token (Restricted nesting)', async ({api, web3, privateKeyWrapper}) => {63 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);6465 const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner);66 const {collectionAddress: collectionAddressB, contract: contractB} = await createNestingCollection(api, web3, owner);67 await contractA.methods.setCollectionNesting(true, [collectionAddressA, collectionAddressB]).send({from: owner});6869 // Create a token to nest into70 const targetNftTokenId = await contractA.methods.nextTokenId().call();71 await contractA.methods.mint(72 owner,73 targetNftTokenId,74 ).send({from: owner});75 const nftTokenAddressA1 = tokenIdToAddress(collectionIdA, targetNftTokenId);7677 // Create a token for nesting in the same collection as the target78 const nftTokenIdA = await contractA.methods.nextTokenId().call();79 await contractA.methods.mint(80 owner,81 nftTokenIdA,82 ).send({from: owner});8384 // Create a token for nesting in a different collection85 const nftTokenIdB = await contractB.methods.nextTokenId().call();86 await contractB.methods.mint(87 owner,88 nftTokenIdB,89 ).send({from: owner});9091 // Nest92 await contractA.methods.transfer(nftTokenAddressA1, nftTokenIdA).send({from: owner});93 expect(await contractA.methods.ownerOf(nftTokenIdA).call()).to.be.equal(nftTokenAddressA1);9495 await contractB.methods.transfer(nftTokenAddressA1, nftTokenIdB).send({from: owner});96 expect(await contractB.methods.ownerOf(nftTokenIdB).call()).to.be.equal(nftTokenAddressA1);97 });98});99100describe('Negative Test: EVM Nesting', async() => {101 itWeb3('NFT: disallows to nest token if nesting is disabled', async ({api, web3, privateKeyWrapper}) => {102 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);103104 const {collectionId, contract} = await createNestingCollection(api, web3, owner);105 await contract.methods.setCollectionNesting(false).send({from: owner});106107 // Create a token to nest into108 const targetNftTokenId = await contract.methods.nextTokenId().call();109 await contract.methods.mint(110 owner,111 targetNftTokenId,112 ).send({from: owner});113114 const targetNftTokenAddress = tokenIdToAddress(collectionId, targetNftTokenId);115116 // Create a token to nest117 const nftTokenId = await contract.methods.nextTokenId().call();118 await contract.methods.mint(119 owner,120 nftTokenId,121 ).send({from: owner});122123 // Try to nest124 await expect(contract.methods125 .transfer(targetNftTokenAddress, nftTokenId)126 .call({from: owner})).to.be.rejectedWith('UserIsNotAllowedToNest');127 });128 129 itWeb3('NFT: disallows a non-Owner to nest someone else\'s token', async ({api, web3, privateKeyWrapper}) => {130 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);131 const malignant = await createEthAccountWithBalance(api, web3, privateKeyWrapper);132133 const {collectionId, contract} = await createNestingCollection(api, web3, owner);134135 // Mint a token136 const targetTokenId = await contract.methods.nextTokenId().call();137 await contract.methods.mint(138 owner,139 targetTokenId,140 ).send({from: owner});141 const targetTokenAddress = tokenIdToAddress(collectionId, targetTokenId);142 143 // Mint a token belonging to a different account144 const tokenId = await contract.methods.nextTokenId().call();145 await contract.methods.mint(146 malignant,147 tokenId,148 ).send({from: owner});149 150 // Try to nest one token in another as a non-owner account151 await expect(contract.methods152 .transfer(targetTokenAddress, tokenId)153 .call({from: malignant})).to.be.rejectedWith('UserIsNotAllowedToNest');154 });155 156 itWeb3('NFT: disallows a non-Owner to nest someone else\'s token (Restricted nesting)', async ({api, web3, privateKeyWrapper}) => {157 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);158 const malignant = await createEthAccountWithBalance(api, web3, privateKeyWrapper);159160 const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner);161 const {collectionAddress: collectionAddressB, contract: contractB} = await createNestingCollection(api, web3, owner);162163 await contractA.methods.setCollectionNesting(true, [collectionAddressA, collectionAddressB]).send({from: owner});164165 // Create a token in one collection166 const nftTokenIdA = await contractA.methods.nextTokenId().call();167 await contractA.methods.mint(168 owner,169 nftTokenIdA,170 ).send({from: owner});171 const nftTokenAddressA = tokenIdToAddress(collectionIdA, nftTokenIdA);172173 // Create a token in another collection belonging to someone else174 const nftTokenIdB = await contractB.methods.nextTokenId().call();175 await contractB.methods.mint(176 malignant,177 nftTokenIdB,178 ).send({from: owner});179180 // Try to drag someone else's token into the other collection and nest181 await expect(contractB.methods182 .transfer(nftTokenAddressA, nftTokenIdB)183 .call({from: malignant})).to.be.rejectedWith('UserIsNotAllowedToNest');184 });185 186 itWeb3('NFT: disallows to nest token in an unlisted collection', async ({api, web3, privateKeyWrapper}) => {187 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);188189 const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner);190 const {contract: contractB} = await createNestingCollection(api, web3, owner);191192 await contractA.methods.setCollectionNesting(true, [collectionAddressA]).send({from: owner});193194 // Create a token in one collection195 const nftTokenIdA = await contractA.methods.nextTokenId().call();196 await contractA.methods.mint(197 owner,198 nftTokenIdA,199 ).send({from: owner});200 const nftTokenAddressA = tokenIdToAddress(collectionIdA, nftTokenIdA);201202 // Create a token in another collection203 const nftTokenIdB = await contractB.methods.nextTokenId().call();204 await contractB.methods.mint(205 owner,206 nftTokenIdB,207 ).send({from: owner});208209 // Try to nest into a token in the other collection, disallowed in the first210 await expect(contractB.methods211 .transfer(nftTokenAddressA, nftTokenIdB)212 .call()).to.be.rejectedWith('SourceCollectionIsNotAllowedToNest');213 });214});