--- a/tests/package.json +++ b/tests/package.json @@ -25,6 +25,7 @@ "testSetVariableMetaData": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetaData.test.ts", "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts", "testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts", + "testRemoveFromWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromWhiteList.test.ts", "testConnection": "mocha --timeout 9999999 -r ts-node/register ./**/connection.test.ts", "testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts", "testCreateMultipleItems": "mocha --timeout 9999999 -r ts-node/register ./**/createMultipleItems.test.ts", --- /dev/null +++ b/tests/src/removeFromWhiteList.test.ts @@ -0,0 +1,84 @@ +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import { default as usingApi } from './substrate/substrate-api'; +import { + createCollectionExpectSuccess, + destroyCollectionExpectSuccess, + enableWhiteListExpectSuccess, + addToWhiteListExpectSuccess, + removeFromWhiteListExpectSuccess, + isWhitelisted, + findNotExistingCollection, + removeFromWhiteListExpectFailure, + disableWhiteListExpectSuccess, +} from './util/helpers'; +import { IKeyringPair } from '@polkadot/types/types'; +import privateKey from './substrate/privateKey'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('Integration Test removeFromWhiteList', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + + before(async () => { + await usingApi(async (api) => { + alice = privateKey('//Alice'); + bob = privateKey('//Bob'); + }); + }); + + it('ensure bob is not in whitelist after removal', async () => { + await usingApi(async () => { + const collectionId = await createCollectionExpectSuccess({ mode: { type: 'NFT' } }); + await enableWhiteListExpectSuccess(alice, collectionId); + await addToWhiteListExpectSuccess(alice, collectionId, bob.address); + + await removeFromWhiteListExpectSuccess(alice, collectionId, bob.address); + expect(await isWhitelisted(collectionId, bob.address)).to.be.false; + }); + }); + + it('allows removal from collection with unset whitelist status', async () => { + await usingApi(async () => { + const collectionWithoutWhitelistId = await createCollectionExpectSuccess(); + await enableWhiteListExpectSuccess(alice, collectionWithoutWhitelistId); + await addToWhiteListExpectSuccess(alice, collectionWithoutWhitelistId, bob.address); + await disableWhiteListExpectSuccess(alice, collectionWithoutWhitelistId); + + await removeFromWhiteListExpectSuccess(alice, collectionWithoutWhitelistId, bob.address); + }); + }); +}); + +describe('Negative Integration Test removeFromWhiteList', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + + before(async () => { + await usingApi(async (api) => { + alice = privateKey('//Alice'); + bob = privateKey('//Bob'); + }); + }); + + it('fails on removal from not existing collection', async () => { + await usingApi(async (api) => { + const collectionId = await findNotExistingCollection(api); + + await removeFromWhiteListExpectFailure(alice, collectionId, bob.address); + }); + }); + + it('fails on removal from removed collection', async () => { + await usingApi(async () => { + const collectionId = await createCollectionExpectSuccess(); + await enableWhiteListExpectSuccess(alice, collectionId); + await addToWhiteListExpectSuccess(alice, collectionId, bob.address); + await destroyCollectionExpectSuccess(collectionId); + + await removeFromWhiteListExpectFailure(alice, collectionId, bob.address); + }); + }); +}); --- a/tests/src/util/helpers.ts +++ b/tests/src/util/helpers.ts @@ -645,11 +645,14 @@ return newItemId; } -export async function enableWhiteListExpectSuccess(sender: IKeyringPair, collectionId: number) { +export async function setPublicAccessModeExpectSuccess( + sender: IKeyringPair, collectionId: number, + accessMode: 'Normal' | 'WhiteList', +) { await usingApi(async (api) => { // Run the transaction - const tx = api.tx.nft.setPublicAccessMode(collectionId, 'WhiteList'); + const tx = api.tx.nft.setPublicAccessMode(collectionId, accessMode); const events = await submitTransactionAsync(sender, tx); const result = getGenericResult(events); @@ -659,10 +662,18 @@ // What to expect // tslint:disable-next-line:no-unused-expression expect(result.success).to.be.true; - expect(collection.Access).to.be.equal('WhiteList'); + expect(collection.Access).to.be.equal(accessMode); }); } +export async function enableWhiteListExpectSuccess(sender: IKeyringPair, collectionId: number) { + await setPublicAccessModeExpectSuccess(sender, collectionId, 'WhiteList'); +} + +export async function disableWhiteListExpectSuccess(sender: IKeyringPair, collectionId: number) { + await setPublicAccessModeExpectSuccess(sender, collectionId, 'Normal'); +} + export async function enablePublicMintingExpectSuccess(sender: IKeyringPair, collectionId: number) { await usingApi(async (api) => { @@ -680,6 +691,14 @@ }); } +export async function isWhitelisted(collectionId: number, address: string) { + let whitelisted: boolean = false; + await usingApi(async (api) => { + whitelisted = (await api.query.nft.whiteList(collectionId, address)).toJSON() as unknown as boolean; + }); + return whitelisted; +} + export async function addToWhiteListExpectSuccess(sender: IKeyringPair, collectionId: number, address: string) { await usingApi(async (api) => { @@ -702,6 +721,32 @@ }); } +export async function removeFromWhiteListExpectSuccess(sender: IKeyringPair, collectionId: number, address: string) { + await usingApi(async (api) => { + // Run the transaction + const tx = api.tx.nft.removeFromWhiteList(collectionId, address); + const events = await submitTransactionAsync(sender, tx); + const result = getGenericResult(events); + + // What to expect + // tslint:disable-next-line:no-unused-expression + expect(result.success).to.be.true; + }); +} + +export async function removeFromWhiteListExpectFailure(sender: IKeyringPair, collectionId: number, address: string) { + await usingApi(async (api) => { + // Run the transaction + const tx = api.tx.nft.removeFromWhiteList(collectionId, address); + const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected; + const result = getGenericResult(events); + + // What to expect + // tslint:disable-next-line:no-unused-expression + expect(result.success).to.be.false; + }); +} + export const getDetailedCollectionInfo = async (api: ApiPromise, collectionId: number) : Promise => { return await api.query.nft.collection(collectionId) as unknown as ICollectionInterface;