From 3f3b2f783da307dc689a64f148e0bde4937877a8 Mon Sep 17 00:00:00 2001 From: Greg Zaitsev Date: Wed, 03 Feb 2021 16:46:56 +0000 Subject: [PATCH] Merge pull request #85 from usetech-llc/feature/NFTPAR-244_setContractSponsoringRateLimit Add tests for setContractSponsoringRateLimit --- --- a/tests/package.json +++ b/tests/package.json @@ -35,7 +35,8 @@ "testAddToContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/addToContractWhiteList.test.ts", "testTransfer": "mocha --timeout 9999999 -r ts-node/register ./**/transfer.test.ts", "testBurnItem": "mocha --timeout 9999999 -r ts-node/register ./**/burnItem.test.ts", - "testCreditFeesToTreasury": "mocha --timeout 9999999 -r ts-node/register ./**/creditFeesToTreasury.test.ts" + "testCreditFeesToTreasury": "mocha --timeout 9999999 -r ts-node/register ./**/creditFeesToTreasury.test.ts", + "testSetContractSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setContractSponsoringRateLimit.test.ts" }, "author": "", "license": "SEE LICENSE IN ../LICENSE", --- /dev/null +++ b/tests/src/setContractSponsoringRateLimit.test.ts @@ -0,0 +1,62 @@ +import { IKeyringPair } from '@polkadot/types/types'; +import privateKey from './substrate/privateKey'; +import usingApi from './substrate/substrate-api'; +import waitNewBlocks from './substrate/wait-new-blocks'; +import { deployFlipper, toggleFlipValueExpectFailure, toggleFlipValueExpectSuccess } from './util/contracthelpers'; +import { + enableContractSponsoringExpectSuccess, + findUnusedAddress, + setContractSponsoringRateLimitExpectFailure, + setContractSponsoringRateLimitExpectSuccess, +} from './util/helpers'; + +describe('Integration Test setContractSponsoringRateLimit', () => { + it('ensure sponsored contract can\'t be called twice without pause for free', async () => { + await usingApi(async (api) => { + const user = await findUnusedAddress(api); + + const [flipper, deployer] = await deployFlipper(api); + await enableContractSponsoringExpectSuccess(deployer, flipper.address, true); + await setContractSponsoringRateLimitExpectSuccess(deployer, flipper.address, 10); + await toggleFlipValueExpectSuccess(user, flipper); + await toggleFlipValueExpectFailure(user, flipper); + }); + }); + + it('ensure sponsored contract can be called twice with pause for free', async () => { + await usingApi(async (api) => { + const user = await findUnusedAddress(api); + + const [flipper, deployer] = await deployFlipper(api); + await enableContractSponsoringExpectSuccess(deployer, flipper.address, true); + await setContractSponsoringRateLimitExpectSuccess(deployer, flipper.address, 1); + await toggleFlipValueExpectSuccess(user, flipper); + await waitNewBlocks(api, 1); + await toggleFlipValueExpectSuccess(user, flipper); + }); + }); +}); + +describe('Negative Integration Test setContractSponsoringRateLimit', () => { + let alice: IKeyringPair; + + before(async () => { + alice = privateKey('//Alice'); + }); + + it('fails when called for non-contract address', async () => { + await usingApi(async (api) => { + const user = await findUnusedAddress(api); + + await setContractSponsoringRateLimitExpectFailure(alice, user.address, 1); + }); + }); + + it('fails when called by non-owning user', async () => { + await usingApi(async (api) => { + const [flipper, _] = await deployFlipper(api); + + await setContractSponsoringRateLimitExpectFailure(alice, flipper.address, 1); + }); + }); +}); --- a/tests/src/util/contracthelpers.ts +++ b/tests/src/util/contracthelpers.ts @@ -5,7 +5,7 @@ import chai from "chai"; import chaiAsPromised from 'chai-as-promised'; -import { submitTransactionAsync } from "../substrate/substrate-api"; +import { submitTransactionAsync, submitTransactionExpectFailAsync } from "../substrate/substrate-api"; import fs from "fs"; import { Abi, BlueprintPromise as Blueprint, CodePromise, ContractPromise as Contract } from "@polkadot/api-contract"; import { IKeyringPair } from "@polkadot/types/types"; @@ -14,7 +14,7 @@ chai.use(chaiAsPromised); const expect = chai.expect; import { BigNumber } from 'bignumber.js'; -import { findUnusedAddress } from '../util/helpers'; +import { findUnusedAddress, getGenericResult } from '../util/helpers'; const value = 0; const gasLimit = '200000000000'; @@ -92,6 +92,19 @@ return (result.result.asOk.data[0] == 0x00) ? false : true; } +export async function toggleFlipValueExpectSuccess(sender: IKeyringPair, contract: Contract) { + const tx = contract.tx.flip(value, gasLimit); + const events = await submitTransactionAsync(sender, tx); + const result = getGenericResult(events); + + expect(result.success).to.be.true; +} + +export async function toggleFlipValueExpectFailure(sender: IKeyringPair, contract: Contract) { + const tx = contract.tx.flip(value, gasLimit); + await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected; +} + function instantiateTransferContract(alice: IKeyringPair, blueprint: Blueprint) : Promise { return new Promise(async (resolve, reject) => { const unsub = await blueprint.tx --- a/tests/src/util/helpers.ts +++ b/tests/src/util/helpers.ts @@ -384,6 +384,46 @@ }); } +export async function enableContractSponsoringExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, enable: boolean) { + await usingApi(async (api) => { + const tx = api.tx.nft.enableContractSponsoring(contractAddress, enable); + const events = await submitTransactionAsync(sender, tx); + const result = getGenericResult(events); + + expect(result.success).to.be.true; + }); +} + +export async function enableContractSponsoringExpectFailure(sender: IKeyringPair, contractAddress: AccountId | string, enable: boolean) { + await usingApi(async (api) => { + const tx = api.tx.nft.enableContractSponsoring(contractAddress, enable); + const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected; + const result = getGenericResult(events); + + expect(result.success).to.be.false; + }); +} + +export async function setContractSponsoringRateLimitExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, rateLimit: number) { + await usingApi(async (api) => { + const tx = api.tx.nft.setContractSponsoringRateLimit(contractAddress, rateLimit); + const events = await submitTransactionAsync(sender, tx); + const result = getGenericResult(events); + + expect(result.success).to.be.true; + }); +} + +export async function setContractSponsoringRateLimitExpectFailure(sender: IKeyringPair, contractAddress: AccountId | string, rateLimit: number) { + await usingApi(async (api) => { + const tx = api.tx.nft.setContractSponsoringRateLimit(contractAddress, rateLimit); + const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected; + const result = getGenericResult(events); + + expect(result.success).to.be.false; + }); +} + export async function setVariableMetaDataExpectSuccess(sender: IKeyringPair, collectionId: number, itemId: number, data: number[]) { await usingApi(async (api) => { const tx = api.tx.nft.setVariableMetaData(collectionId, itemId, '0x' + Buffer.from(data).toString('hex')); -- gitstuff