From da457a01b0ad2ed9f5fd5e210b9d87b13ed54559 Mon Sep 17 00:00:00 2001 From: str-mv <51784859+str-mv@users.noreply.github.com> Date: Tue, 22 Dec 2020 17:03:21 +0000 Subject: [PATCH] Merge pull request #46 from usetech-llc/feature/NFTPAR-242_destroy_collection_test NFTPAR-242 Add destroy collection integration tests --- --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -45,7 +45,7 @@ let mut properties = Map::new(); properties.insert("tokenSymbol".into(), "UniqueTest".into()); properties.insert("tokenDecimals".into(), 15.into()); - properties.insert("ss58Format".into(), 0.into()); + properties.insert("ss58Format".into(), 42.into()); // Generic Substrate wildcard (SS58 checksum preimage) Ok(ChainSpec::from_genesis( // Name --- a/tests/src/accounts.ts +++ b/tests/src/accounts.ts @@ -1,3 +1,4 @@ export const bobsPublicKey = '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty'; export const alicesPublicKey = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'; export const ferdiesPublicKey = '5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL'; +export const nullPublicKey = '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM'; \ No newline at end of file --- /dev/null +++ b/tests/src/destroyCollection.test.ts @@ -0,0 +1,87 @@ +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api"; +import { createCollectionExpectSuccess, createCollectionExpectFailure } from "./util/helpers"; +import type { AccountId, EventRecord } from '@polkadot/types/interfaces'; +import privateKey from './substrate/privateKey'; +import { nullPublicKey } from './accounts'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +function getDestroyResult(events: EventRecord[]): boolean { + let success: boolean = false; + events.forEach(({ phase, event: { data, method, section } }) => { + // console.log(` ${phase}: ${section}.${method}:: ${data}`); + if (method == 'ExtrinsicSuccess') { + success = true; + } + }); + return success; +} + +async function destroyCollectionExpectSuccess(collectionId: number, senderSeed: string = '//Alice') { + await usingApi(async (api) => { + // Run the DestroyCollection transaction + const alicePrivateKey = privateKey(senderSeed); + const tx = api.tx.nft.destroyCollection(collectionId); + const events = await submitTransactionAsync(alicePrivateKey, tx); + const result = getDestroyResult(events); + + // Get the collection + const collection: any = (await api.query.nft.collection(collectionId)).toJSON(); + + // What to expect + expect(result).to.be.true; + expect(collection).to.be.not.null; + expect(collection.Owner).to.be.equal(nullPublicKey); + }); +} + +async function destroyCollectionExpectFailure(collectionId: number, senderSeed: string = '//Alice') { + await usingApi(async (api) => { + // Run the DestroyCollection transaction + const alicePrivateKey = privateKey(senderSeed); + const tx = api.tx.nft.destroyCollection(collectionId); + const events = await submitTransactionAsync(alicePrivateKey, tx); + const result = getDestroyResult(events); + + // What to expect + expect(result).to.be.false; + }); +} + +describe('integration test: ext. destroyCollection():', () => { + it('NFT collection can be destroyed', async () => { + const collectionId = await createCollectionExpectSuccess('A', 'B', 'C', 'NFT'); + await destroyCollectionExpectSuccess(collectionId); + }); + it('Fungible collection can be destroyed', async () => { + const collectionId = await createCollectionExpectSuccess('A', 'B', 'C', 'Fungible'); + await destroyCollectionExpectSuccess(collectionId); + }); + it('ReFungible collection can be destroyed', async () => { + const collectionId = await createCollectionExpectSuccess('A', 'B', 'C', 'ReFungible'); + await destroyCollectionExpectSuccess(collectionId); + }); +}); + +describe('(!negative test!) integration test: ext. destroyCollection():', () => { + it('(!negative test!) Destroy a collection that never existed', async () => { + await usingApi(async (api) => { + // Find the collection that never existed + const collectionId = parseInt((await api.query.nft.createdCollectionCount()).toString()) + 1; + await destroyCollectionExpectFailure(collectionId); + }); + }); + it('(!negative test!) Destroy a collection that has already been destroyed', async () => { + const collectionId = await createCollectionExpectSuccess('A', 'B', 'C', 'NFT'); + await destroyCollectionExpectSuccess(collectionId); + await destroyCollectionExpectFailure(collectionId); + }); + it('(!negative test!) Destroy a collection using non-owner account', async () => { + const collectionId = await createCollectionExpectSuccess('A', 'B', 'C', 'NFT'); + await destroyCollectionExpectFailure(collectionId, '//Bob'); + await destroyCollectionExpectSuccess(collectionId, '//Alice'); + }); +}); --- a/tests/src/util/helpers.ts +++ b/tests/src/util/helpers.ts @@ -52,7 +52,8 @@ return result; } -export async function createCollectionExpectSuccess(name: string, description: string, tokenPrefix: string, mode: string) { +export async function createCollectionExpectSuccess(name: string, description: string, tokenPrefix: string, mode: string): Promise { + let collectionId: number = 0; await usingApi(async (api) => { // Get number of collections before the transaction const AcollectionCount = parseInt((await api.query.nft.createdCollectionCount()).toString()); @@ -78,7 +79,11 @@ expect(utf16ToStr(collection.Name)).to.be.equal(name); expect(utf16ToStr(collection.Description)).to.be.equal(description); expect(hexToStr(collection.TokenPrefix)).to.be.equal(tokenPrefix); + + collectionId = result.collectionId; }); + + return collectionId; } export async function createCollectionExpectFailure(name: string, description: string, tokenPrefix: string, mode: string) { -- gitstuff