From a43996cb0086ecca0bd60c2f49d9f4bb53e6437b Mon Sep 17 00:00:00 2001 From: Max Andreev Date: Wed, 07 Dec 2022 11:57:07 +0000 Subject: [PATCH] Add zero transfer[From], burn[From] tests --- --- a/tests/src/burnItem.test.ts +++ b/tests/src/burnItem.test.ts @@ -180,4 +180,50 @@ await expect(collection.burnTokens(alice, 11n)).to.be.rejectedWith('common.TokenValueTooLow'); expect(await collection.getBalance({Substrate: alice.address})).to.eq(10n); }); + + itSub('Zero burn NFT', async ({helper}) => { + const api = helper.getApi(); + const collection = await helper.nft.mintCollection(alice, {name: 'Coll', description: 'Desc', tokenPrefix: 'T'}); + const tokenAlice = await collection.mintToken(alice, {Substrate: alice.address}); + const tokenBob = await collection.mintToken(alice, {Substrate: bob.address}); + + // 1. Zero burn of own tokens allowed: + await helper.signTransaction(alice, api.tx.unique.burnItem(collection.collectionId, tokenAlice.tokenId, 0)); + // 2. Zero burn of non-owned tokens not allowed: + await expect(helper.signTransaction(alice, api.tx.unique.burnItem(collection.collectionId, tokenBob.tokenId, 0))).to.be.rejectedWith('common.NoPermission'); + // 3. Zero burn of non-existing tokens not allowed: + await expect(helper.signTransaction(alice, api.tx.unique.burnItem(collection.collectionId, 9999, 0))).to.be.rejectedWith('common.TokenNotFound'); + expect(await tokenAlice.doesExist()).to.be.true; + expect(await tokenAlice.getOwner()).to.deep.eq({Substrate: alice.address}); + expect(await tokenBob.getOwner()).to.deep.eq({Substrate: bob.address}); + // 4. Storage is not corrupted: + await tokenAlice.transfer(alice, {Substrate: bob.address}); + await tokenBob.transfer(alice, {Substrate: alice.address}); + expect(await tokenAlice.getOwner()).to.deep.eq({Substrate: bob.address}); + expect(await tokenBob.getOwner()).to.deep.eq({Substrate: alice.address}); + }); + + itSub('zero burnFrom NFT', async ({helper}) => { + const api = helper.getApi(); + const collection = await helper.nft.mintCollection(alice, {name: 'Zero', description: 'Zero transfer', tokenPrefix: 'TF'}); + const notApprovedNft = await collection.mintToken(alice, {Substrate: bob.address}); + const approvedNft = await collection.mintToken(alice, {Substrate: bob.address}); + await approvedNft.approve(bob, {Substrate: alice.address}); + + // 1. Zero burnFrom of non-existing tokens not allowed: + await expect(helper.signTransaction(alice, api.tx.unique.burnFrom(collection.collectionId, {Substrate: bob.address}, 9999, 0))).to.be.rejectedWith('common.ApprovedValueTooLow'); + // 2. Zero burnFrom of not approved tokens not allowed: + await expect(helper.signTransaction(alice, api.tx.unique.burnFrom(collection.collectionId, {Substrate: bob.address}, notApprovedNft.tokenId, 0))).to.be.rejectedWith('common.NoPermission'); + // 3. Zero burnFrom of approved tokens allowed: + await helper.signTransaction(alice, api.tx.unique.burnFrom(collection.collectionId, {Substrate: bob.address}, approvedNft.tokenId, 0)); + + // 4.1 approvedNft still approved: + expect(await approvedNft.isApproved({Substrate: alice.address})).to.be.true; + // 4.2 bob is still the owner: + expect(await approvedNft.getOwner()).to.deep.eq({Substrate: bob.address}); + expect(await notApprovedNft.getOwner()).to.deep.eq({Substrate: bob.address}); + // 4.3 Alice can burn approved nft: + await approvedNft.burnFrom(alice, {Substrate: bob.address}); + expect(await approvedNft.doesExist()).to.be.false; + }); }); --- a/tests/src/transfer.test.ts +++ b/tests/src/transfer.test.ts @@ -122,6 +122,7 @@ }); }); + itSub('[nft] Transfer with not existed collection_id', async ({helper}) => { const collectionId = (1 << 32) - 1; await expect(helper.nft.transferToken(alice, collectionId, 1, {Substrate: bob.address})) @@ -191,6 +192,26 @@ .to.be.rejectedWith(/common\.TokenValueTooLow/); }); + itSub('Zero transfer NFT', async ({helper}) => { + const api = helper.getApi(); + const collection = await helper.nft.mintCollection(alice, {name: 'Transfer-Neg-3-NFT', description: '', tokenPrefix: 'T'}); + const tokenAlice = await collection.mintToken(alice, {Substrate: alice.address}); + const tokenBob = await collection.mintToken(alice, {Substrate: bob.address}); + // 1. Zero transfer of own tokens allowed: + await helper.signTransaction(alice, api.tx.unique.transfer({Substrate: bob.address}, collection.collectionId, tokenAlice.tokenId, 0)); + // 2. Zero transfer of non-owned tokens not allowed: + await expect(helper.signTransaction(alice, api.tx.unique.transfer({Substrate: alice.address}, collection.collectionId, tokenBob.tokenId, 0))).to.be.rejectedWith('common.NoPermission'); + // 3. Zero transfer of non-existing tokens not allowed: + await expect(helper.signTransaction(alice, api.tx.unique.transfer({Substrate: alice.address}, collection.collectionId, 10, 0))).to.be.rejectedWith('common.TokenNotFound'); + expect(await tokenAlice.getOwner()).to.deep.eq({Substrate: alice.address}); + expect(await tokenBob.getOwner()).to.deep.eq({Substrate: bob.address}); + // 4. Storage is not corrupted: + await tokenAlice.transfer(alice, {Substrate: bob.address}); + await tokenBob.transfer(alice, {Substrate: alice.address}); + expect(await tokenAlice.getOwner()).to.deep.eq({Substrate: bob.address}); + expect(await tokenBob.getOwner()).to.deep.eq({Substrate: alice.address}); + }); + itSub('[nft] Transfer with deleted item_id', async ({helper}) => { const collection = await helper.nft.mintCollection(alice, {name: 'Transfer-Neg-3-NFT', description: '', tokenPrefix: 'T'}); const nft = await collection.mintToken(alice); --- a/tests/src/transferFrom.test.ts +++ b/tests/src/transferFrom.test.ts @@ -349,4 +349,28 @@ {Substrate: charlie.address}, )).to.be.rejectedWith(/common\.ApprovedValueTooLow/); }); + + itSub('zero transfer NFT', async ({helper}) => { + const api = helper.getApi(); + const collection = await helper.nft.mintCollection(alice, {name: 'Zero', description: 'Zero transfer', tokenPrefix: 'TF'}); + const notApprovedNft = await collection.mintToken(alice, {Substrate: bob.address}); + const approvedNft = await collection.mintToken(alice, {Substrate: bob.address}); + await approvedNft.approve(bob, {Substrate: alice.address}); + + // 1. Cannot zero transferFrom (non-existing token) + await expect(helper.signTransaction(alice, api.tx.unique.transferFrom({Substrate: bob.address}, {Substrate: alice.address}, collection.collectionId, 9999, 0))).to.be.rejectedWith('common.ApprovedValueTooLow'); + // 2. Cannot zero transferFrom (not approved token) + await expect(helper.signTransaction(alice, api.tx.unique.transferFrom({Substrate: bob.address}, {Substrate: alice.address}, collection.collectionId, notApprovedNft.tokenId, 0))).to.be.rejectedWith('common.NoPermission'); + // 3. Can zero transferFrom (approved token): + await helper.signTransaction(alice, api.tx.unique.transferFrom({Substrate: bob.address}, {Substrate: alice.address}, collection.collectionId, approvedNft.tokenId, 0)); + + // 4.1 approvedNft still approved: + expect(await approvedNft.isApproved({Substrate: alice.address})).to.be.true; + // 4.2 bob is still the owner: + expect(await approvedNft.getOwner()).to.deep.eq({Substrate: bob.address}); + expect(await notApprovedNft.getOwner()).to.deep.eq({Substrate: bob.address}); + // 4.3 Alice can transfer approved nft: + await approvedNft.transferFrom(alice, {Substrate: bob.address}, {Substrate: alice.address}); + expect(await approvedNft.getOwner()).to.deep.eq({Substrate: alice.address}); + }); }); -- gitstuff