From 258e5a1bc41175e34f3ba5af06fa503f0cc151aa Mon Sep 17 00:00:00 2001 From: Fahrrader Date: Wed, 12 Oct 2022 10:27:22 +0000 Subject: [PATCH] tests: rearrange scripts & lift top util files to util folder --- --- a/tests/package.json +++ b/tests/package.json @@ -21,23 +21,23 @@ }, "mocha": { "timeout": 9999999, - "require": ["ts-node/register", "./src/util/playgrounds/globalSetup.ts"] + "require": ["ts-node/register", "./src/util/globalSetup.ts"] }, "scripts": { "lint": "eslint --ext .ts,.js src/", "fix": "eslint --ext .ts,.js src/ --fix", - "test": "yarn testParallel && yarn testSequential", + "test": "mocha --timeout 9999999 -r ts-node/register './src/**/*.*test.ts'", + "testParallelFull": "yarn testParallel && yarn testSequential", "testParallel": "mocha --parallel --timeout 9999999 -r ts-node/register './src/**/*.test.ts'", "testSequential": "mocha --timeout 9999999 -r ts-node/register './src/**/*.seqtest.ts'", - "testDevnode": "mocha --timeout 9999999 -r ts-node/register './src/**/*test.ts'", - "testStructure": "mocha --parallel --timeout 9999999 -r ts-node/register ./**/nesting/**.test.ts", - "testEth": "mocha --parallel --timeout 9999999 -r ts-node/register './**/eth/**/*.test.ts'", - "testEthNesting": "mocha --parallel --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.test.ts'", - "testEthFractionalizer": "mocha --parallel --timeout 9999999 -r ts-node/register './**/eth/fractionalizer/**/*.test.ts'", - "testEthMarketplace": "mocha --parallel --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.test.ts'", - "testEvent": "mocha --parallel --timeout 9999999 -r ts-node/register ./src/check-event/*.test.ts", - "testRmrk": "mocha --timeout 9999999 -r ts-node/register ./**/rmrk/**test.ts", + "testStructure": "mocha --timeout 9999999 -r ts-node/register ./**/nesting/*.*test.ts", + "testEth": "mocha --timeout 9999999 -r ts-node/register './**/eth/**/*.*test.ts'", + "testEthNesting": "mocha --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.*test.ts'", + "testEthFractionalizer": "mocha --timeout 9999999 -r ts-node/register './**/eth/fractionalizer/**/*.*test.ts'", + "testEthMarketplace": "mocha --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.*test.ts'", + "testEvent": "mocha --timeout 9999999 -r ts-node/register ./src/check-event/*.*test.ts", + "testRmrk": "mocha --timeout 9999999 -r ts-node/register ./**/rmrk/*.*test.ts", "testEthPayable": "mocha --timeout 9999999 -r ts-node/register './**/eth/payable.test.ts'", "testEthTokenProperties": "mocha --timeout 9999999 -r ts-node/register ./**/eth/tokenProperties.test.ts", --- a/tests/src/addCollectionAdmin.test.ts +++ b/tests/src/addCollectionAdmin.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Integration Test addCollectionAdmin(collection_id, new_admin_id):', () => { let donor: IKeyringPair; --- a/tests/src/adminTransferAndBurn.test.ts +++ b/tests/src/adminTransferAndBurn.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from './util'; describe('Integration Test: ownerCanTransfer allows admins to use only transferFrom/burnFrom:', () => { let alice: IKeyringPair; --- a/tests/src/allowLists.test.ts +++ b/tests/src/allowLists.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from './util'; import {ICollectionPermissions} from './util/playgrounds/types'; describe('Integration Test ext. Allow list tests', () => { --- a/tests/src/app-promotion.seqtest.ts +++ b/tests/src/app-promotion.seqtest.ts @@ -15,8 +15,8 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util/playgrounds'; -import {expect} from './eth/util/playgrounds'; +import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util'; +import {expect} from './eth/util'; let superuser: IKeyringPair; let donor: IKeyringPair; --- a/tests/src/app-promotion.test.ts +++ b/tests/src/app-promotion.test.ts @@ -15,9 +15,9 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util/playgrounds'; +import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util'; import {DevUniqueHelper} from './util/playgrounds/unique.dev'; -import {itEth, expect, SponsoringMode} from './eth/util/playgrounds'; +import {itEth, expect, SponsoringMode} from './eth/util'; let donor: IKeyringPair; let palletAdmin: IKeyringPair; @@ -36,7 +36,7 @@ await usingPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.AppPromotion]); donor = await privateKey({filename: __filename}); - palletAddress = helper.arrange.calculatePalleteAddress('appstake'); + palletAddress = helper.arrange.calculatePalletAddress('appstake'); palletAdmin = await privateKey('//PromotionAdmin'); nominal = helper.balance.getOneTokenNominal(); accounts = await helper.arrange.createCrowd(100, 1000n, donor); // create accounts-pool to speed up tests --- a/tests/src/approve.test.ts +++ b/tests/src/approve.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from './util'; describe('Integration Test approve(spender, collection_id, item_id, amount):', () => { --- a/tests/src/block-production.test.ts +++ b/tests/src/block-production.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {ApiPromise} from '@polkadot/api'; -import {expect, itSub} from './util/playgrounds'; +import {expect, itSub} from './util'; const BLOCK_TIME_MS = 12000; const TOLERANCE_MS = 3000; --- a/tests/src/burnItem.test.ts +++ b/tests/src/burnItem.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from './util'; describe('integration test: ext. burnItem():', () => { --- a/tests/src/calibrate.ts +++ b/tests/src/calibrate.ts @@ -1,6 +1,6 @@ import {IKeyringPair} from '@polkadot/types/types'; -import {usingEthPlaygrounds, EthUniqueHelper} from './eth/util/playgrounds'; +import {usingEthPlaygrounds, EthUniqueHelper} from './eth/util'; function linearRegression(points: { x: bigint, y: bigint }[]) { @@ -56,9 +56,9 @@ }).reduce((a, b) => a + b, 0n) / BigInt(points.length)); } -async function calibrateWeightToFee(helper: EthUniqueHelper, privateKey: (account: string) => IKeyringPair) { - const alice = privateKey('//Alice'); - const bob = privateKey('//Bob'); +async function calibrateWeightToFee(helper: EthUniqueHelper, privateKey: (account: string) => Promise) { + const alice = await privateKey('//Alice'); + const bob = await privateKey('//Bob'); const dataPoints = []; { @@ -106,8 +106,8 @@ } } -async function calibrateMinGasPrice(helper: EthUniqueHelper, privateKey: (account: string) => IKeyringPair) { - const alice = privateKey('//Alice'); +async function calibrateMinGasPrice(helper: EthUniqueHelper, privateKey: (account: string) => Promise) { + const alice = await privateKey('//Alice'); const caller = await helper.eth.createAccountWithBalance(alice); const receiver = helper.eth.createAccount(); const dataPoints = []; --- a/tests/src/change-collection-owner.test.ts +++ b/tests/src/change-collection-owner.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from './util'; describe('Integration Test changeCollectionOwner(collection_id, new_owner):', () => { let alice: IKeyringPair; --- a/tests/src/check-event/burnItemEvent.test.ts +++ b/tests/src/check-event/burnItemEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from '../util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from '../util'; import {IEvent} from '../util/playgrounds/types'; --- a/tests/src/check-event/createCollectionEvent.test.ts +++ b/tests/src/check-event/createCollectionEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, itSub, expect} from '../util/playgrounds'; +import {usingPlaygrounds, itSub, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Create collection event ', () => { --- a/tests/src/check-event/createItemEvent.test.ts +++ b/tests/src/check-event/createItemEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from '../util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Create Item event ', () => { --- a/tests/src/check-event/createMultipleItemsEvent.test.ts +++ b/tests/src/check-event/createMultipleItemsEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, itSub, expect} from '../util/playgrounds'; +import {usingPlaygrounds, itSub, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Create Multiple Items Event event ', () => { --- a/tests/src/check-event/destroyCollectionEvent.test.ts +++ b/tests/src/check-event/destroyCollectionEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from '../util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Destroy collection event ', () => { --- a/tests/src/check-event/transferEvent.test.ts +++ b/tests/src/check-event/transferEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from '../util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Transfer event ', () => { --- a/tests/src/check-event/transferFromEvent.test.ts +++ b/tests/src/check-event/transferFromEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from '../util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Transfer event ', () => { --- a/tests/src/confirmSponsorship.test.ts +++ b/tests/src/confirmSponsorship.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub, Pallets} from './util'; async function setSponsorHelper(collection: any, signer: IKeyringPair, sponsorAddress: string) { await collection.setSponsor(signer, sponsorAddress); --- a/tests/src/connection.test.ts +++ b/tests/src/connection.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itSub, expect, usingPlaygrounds} from './util/playgrounds'; +import {itSub, expect, usingPlaygrounds} from './util'; describe('Connection smoke test', () => { itSub('Connection can be established', async ({helper}) => { --- a/tests/src/createCollection.test.ts +++ b/tests/src/createCollection.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub, Pallets} from './util'; import {ICollectionCreationOptions, IProperty} from './util/playgrounds/types'; import {UniqueHelper} from './util/playgrounds/unique'; --- a/tests/src/createItem.test.ts +++ b/tests/src/createItem.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub, Pallets} from './util'; import {IProperty, ICrossAccountId} from './util/playgrounds/types'; import {UniqueHelper} from './util/playgrounds/unique'; --- a/tests/src/createMultipleItems.test.ts +++ b/tests/src/createMultipleItems.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, Pallets, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, Pallets, itSub} from './util'; describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => { let alice: IKeyringPair; --- a/tests/src/createMultipleItemsEx.test.ts +++ b/tests/src/createMultipleItemsEx.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, Pallets, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, Pallets, itSub} from './util'; import {IProperty} from './util/playgrounds/types'; describe('Integration Test: createMultipleItemsEx', () => { --- a/tests/src/creditFeesToTreasury.seqtest.ts +++ b/tests/src/creditFeesToTreasury.seqtest.ts @@ -17,7 +17,7 @@ import './interfaces/augment-api-consts'; import {IKeyringPair} from '@polkadot/types/types'; import {ApiPromise} from '@polkadot/api'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from './util'; const TREASURY = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z'; const saneMinimumFee = 0.05; --- a/tests/src/destroyCollection.test.ts +++ b/tests/src/destroyCollection.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, expect, usingPlaygrounds, Pallets} from './util/playgrounds'; +import {itSub, expect, usingPlaygrounds, Pallets} from './util'; describe('integration test: ext. destroyCollection():', () => { let alice: IKeyringPair; --- a/tests/src/enableDisableTransfer.test.ts +++ b/tests/src/enableDisableTransfer.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Enable/Disable Transfers', () => { let alice: IKeyringPair; --- a/tests/src/eth/allowlist.test.ts +++ b/tests/src/eth/allowlist.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, usingEthPlaygrounds, expect} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect} from './util'; describe('EVM contract allowlist', () => { let donor: IKeyringPair; --- a/tests/src/eth/base.test.ts +++ b/tests/src/eth/base.test.ts @@ -17,7 +17,7 @@ import {Contract} from 'web3-eth-contract'; import {IKeyringPair} from '@polkadot/types/types'; -import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util/playgrounds'; +import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util'; describe('Contract calls', () => { --- a/tests/src/eth/collectionAdmin.test.ts +++ b/tests/src/eth/collectionAdmin.test.ts @@ -14,7 +14,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util/playgrounds'; +import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util'; async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise) { const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress)); --- a/tests/src/eth/collectionProperties.test.ts +++ b/tests/src/eth/collectionProperties.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itEth, usingEthPlaygrounds, expect} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('EVM collection properties', () => { --- a/tests/src/eth/collectionSponsoring.test.ts +++ b/tests/src/eth/collectionSponsoring.test.ts @@ -1,6 +1,22 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds} from './../util/playgrounds/index'; -import {itEth, expect} from '../eth/util/playgrounds'; +import {usingPlaygrounds} from '../util/index'; +import {itEth, expect} from './util'; describe('evm collection sponsoring', () => { let donor: IKeyringPair; --- a/tests/src/eth/contractSponsoring.test.ts +++ b/tests/src/eth/contractSponsoring.test.ts @@ -16,8 +16,8 @@ import {IKeyringPair} from '@polkadot/types/types'; import {EthUniqueHelper} from './util/playgrounds/unique.dev'; -import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from '../eth/util/playgrounds'; -import {usingPlaygrounds} from '../util/playgrounds'; +import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from './util'; +import {usingPlaygrounds} from '../util'; import {CompiledContract} from './util/playgrounds/types'; describe('Sponsoring EVM contracts', () => { --- a/tests/src/eth/createNFTCollection.test.ts +++ b/tests/src/eth/createNFTCollection.test.ts @@ -16,7 +16,7 @@ import {evmToAddress} from '@polkadot/util-crypto'; import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; describe('Create NFT collection from EVM', () => { --- a/tests/src/eth/createRFTCollection.test.ts +++ b/tests/src/eth/createRFTCollection.test.ts @@ -16,8 +16,8 @@ import {evmToAddress} from '@polkadot/util-crypto'; import {IKeyringPair} from '@polkadot/types/types'; -import {Pallets, requirePalletsOrSkip} from '../util/playgrounds'; -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {Pallets, requirePalletsOrSkip} from '../util'; +import {expect, itEth, usingEthPlaygrounds} from './util'; describe('Create RFT collection from EVM', () => { --- a/tests/src/eth/crossTransfer.test.ts +++ b/tests/src/eth/crossTransfer.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds} from './util'; import {CrossAccountId} from '../util/playgrounds/unique'; import {IKeyringPair} from '@polkadot/types/types'; --- a/tests/src/eth/evmCoder.test.ts +++ b/tests/src/eth/evmCoder.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, expect, usingEthPlaygrounds} from './util/playgrounds'; +import {itEth, expect, usingEthPlaygrounds} from './util'; const getContractSource = (collectionAddress: string, contractAddress: string): string => { return ` --- a/tests/src/eth/fractionalizer/fractionalizer.test.ts +++ b/tests/src/eth/fractionalizer/fractionalizer.test.ts @@ -22,9 +22,9 @@ import {Contract} from 'web3-eth-contract'; -import {usingEthPlaygrounds, expect, itEth, EthUniqueHelper} from '../util/playgrounds'; +import {usingEthPlaygrounds, expect, itEth, EthUniqueHelper} from '../util'; import {CompiledContract} from '../util/playgrounds/types'; -import {requirePalletsOrSkip, Pallets} from '../../util/playgrounds'; +import {requirePalletsOrSkip, Pallets} from '../../util'; let compiledFractionalizer: CompiledContract; --- a/tests/src/eth/fungible.test.ts +++ b/tests/src/eth/fungible.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('Fungible: Information getting', () => { --- a/tests/src/eth/helpersSmoke.test.ts +++ b/tests/src/eth/helpersSmoke.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('Helpers sanity check', () => { --- a/tests/src/eth/marketplace/marketplace.test.ts +++ b/tests/src/eth/marketplace/marketplace.test.ts @@ -16,7 +16,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import {readFile} from 'fs/promises'; -import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from '../util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from '../util'; describe('Matcher contract usage', () => { const PRICE = 2000n; --- a/tests/src/eth/migration.test.ts +++ b/tests/src/eth/migration.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('EVM Migrations', () => { --- a/tests/src/eth/nesting/nest.test.ts +++ b/tests/src/eth/nesting/nest.test.ts @@ -1,7 +1,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import {Contract} from 'web3-eth-contract'; -import {itEth, EthUniqueHelper, usingEthPlaygrounds, expect} from '../util/playgrounds'; +import {itEth, EthUniqueHelper, usingEthPlaygrounds, expect} from '../util'; const createNestingCollection = async ( helper: EthUniqueHelper, --- a/tests/src/eth/nonFungible.test.ts +++ b/tests/src/eth/nonFungible.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util'; import {IKeyringPair} from '@polkadot/types/types'; import {Contract} from 'web3-eth-contract'; --- a/tests/src/eth/payable.test.ts +++ b/tests/src/eth/payable.test.ts @@ -16,7 +16,7 @@ import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util/playgrounds'; +import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util'; describe('EVM payable contracts', () => { let donor: IKeyringPair; --- a/tests/src/eth/proxy/fungibleProxy.test.ts +++ b/tests/src/eth/proxy/fungibleProxy.test.ts @@ -17,7 +17,7 @@ import {expect} from 'chai'; import {readFile} from 'fs/promises'; import {IKeyringPair} from '@polkadot/types/types'; -import {EthUniqueHelper, itEth, usingEthPlaygrounds} from '../util/playgrounds'; +import {EthUniqueHelper, itEth, usingEthPlaygrounds} from '../util'; async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) { // Proxy owner has no special privilegies, we don't need to reuse them --- a/tests/src/eth/proxy/nonFungibleProxy.test.ts +++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts @@ -16,7 +16,7 @@ import {readFile} from 'fs/promises'; import {IKeyringPair} from '@polkadot/types/types'; -import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from '../util/playgrounds'; +import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from '../util'; async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) { --- a/tests/src/eth/reFungible.test.ts +++ b/tests/src/eth/reFungible.test.ts @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {Pallets, requirePalletsOrSkip} from '../util/playgrounds'; -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {Pallets, requirePalletsOrSkip} from '../util'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('Refungible: Information getting', () => { --- a/tests/src/eth/reFungibleToken.test.ts +++ b/tests/src/eth/reFungibleToken.test.ts @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {Pallets, requirePalletsOrSkip} from '../util/playgrounds'; -import {EthUniqueHelper, expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {Pallets, requirePalletsOrSkip} from '../util'; +import {EthUniqueHelper, expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; import {Contract} from 'web3-eth-contract'; --- a/tests/src/eth/sponsoring.test.ts +++ b/tests/src/eth/sponsoring.test.ts @@ -15,8 +15,8 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, expect, SponsoringMode} from '../eth/util/playgrounds'; -import {usingPlaygrounds} from './../util/playgrounds/index'; +import {itEth, expect, SponsoringMode} from './util'; +import {usingPlaygrounds} from '../util/index'; describe('EVM sponsoring', () => { let donor: IKeyringPair; --- a/tests/src/eth/tokenProperties.test.ts +++ b/tests/src/eth/tokenProperties.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itEth, usingEthPlaygrounds, expect} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('EVM token properties', () => { --- /dev/null +++ b/tests/src/eth/util/index.ts @@ -0,0 +1,83 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +import * as path from 'path'; +import {IKeyringPair} from '@polkadot/types/types'; + +import config from '../../config'; + +import {EthUniqueHelper} from './playgrounds/unique.dev'; +import {SilentLogger, SilentConsole} from '../../util/playgrounds/unique.dev'; + +export {EthUniqueHelper} from './playgrounds/unique.dev'; + +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import chaiLike from 'chai-like'; +import {getTestSeed, requirePalletsOrSkip} from '../../util'; + +chai.use(chaiAsPromised); +chai.use(chaiLike); +export const expect = chai.expect; + +export enum SponsoringMode { + Disabled = 0, + Allowlisted = 1, + Generous = 2, +} + +export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise) => Promise) => { + const silentConsole = new SilentConsole(); + silentConsole.enable(); + + const helper = new EthUniqueHelper(new SilentLogger()); + + try { + await helper.connect(config.substrateUrl); + await helper.connectWeb3(config.substrateUrl); + const ss58Format = helper.chain.getChainProperties().ss58Format; + const privateKey = async (seed: string | {filename: string}) => { + if (typeof seed === 'string') { + return helper.util.fromSeed(seed, ss58Format); + } + else { + const actualSeed = getTestSeed(seed.filename); + let account = helper.util.fromSeed(actualSeed, ss58Format); + if (await helper.balance.getSubstrate(account.address) == 0n) { + console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`); + account = helper.util.fromSeed('//Alice', ss58Format); + } + return account; + } + }; + await code(helper, privateKey); + } + finally { + await helper.disconnect(); + silentConsole.disable(); + } +}; + +export async function itEth(name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + (opts.only ? it.only : + opts.skip ? it.skip : it)(name, async function() { + await usingEthPlaygrounds(async (helper, privateKey) => { + if (opts.requiredPallets) { + requirePalletsOrSkip(this, helper, opts.requiredPallets); + } + + await cb({helper, privateKey}); + }); + }); +} + +export async function itEthIfWithPallet(name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + return itEth(name, cb, {requiredPallets: required, ...opts}); +} + +itEth.only = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEth(name, cb, {only: true}); +itEth.skip = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEth(name, cb, {skip: true}); + +itEthIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEthIfWithPallet(name, required, cb, {only: true}); +itEthIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEthIfWithPallet(name, required, cb, {skip: true}); +itEth.ifWithPallets = itEthIfWithPallet; --- a/tests/src/eth/util/playgrounds/index.ts +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -import * as path from 'path'; -import {IKeyringPair} from '@polkadot/types/types'; - -import config from '../../../config'; - -import {EthUniqueHelper} from './unique.dev'; -import {SilentLogger, SilentConsole} from '../../../util/playgrounds/unique.dev'; - -export {EthUniqueHelper} from './unique.dev'; - -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import chaiLike from 'chai-like'; -import {getTestSeed, requirePalletsOrSkip} from '../../../util/playgrounds'; - -chai.use(chaiAsPromised); -chai.use(chaiLike); -export const expect = chai.expect; - -export enum SponsoringMode { - Disabled = 0, - Allowlisted = 1, - Generous = 2, -} - -export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise) => Promise) => { - const silentConsole = new SilentConsole(); - silentConsole.enable(); - - const helper = new EthUniqueHelper(new SilentLogger()); - - try { - await helper.connect(config.substrateUrl); - await helper.connectWeb3(config.substrateUrl); - const ss58Format = helper.chain.getChainProperties().ss58Format; - const privateKey = async (seed: string | {filename: string}) => { - if (typeof seed === 'string') { - return helper.util.fromSeed(seed, ss58Format); - } - else { - const actualSeed = getTestSeed(seed.filename); - let account = helper.util.fromSeed(actualSeed, ss58Format); - if (await helper.balance.getSubstrate(account.address) == 0n) { - console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`); - account = helper.util.fromSeed('//Alice', ss58Format); - } - return account; - } - }; - await code(helper, privateKey); - } - finally { - await helper.disconnect(); - silentConsole.disable(); - } -}; - -export async function itEth(name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - (opts.only ? it.only : - opts.skip ? it.skip : it)(name, async function() { - await usingEthPlaygrounds(async (helper, privateKey) => { - if (opts.requiredPallets) { - requirePalletsOrSkip(this, helper, opts.requiredPallets); - } - - await cb({helper, privateKey}); - }); - }); -} - -export async function itEthIfWithPallet(name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - return itEth(name, cb, {requiredPallets: required, ...opts}); -} - -itEth.only = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEth(name, cb, {only: true}); -itEth.skip = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEth(name, cb, {skip: true}); - -itEthIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEthIfWithPallet(name, required, cb, {only: true}); -itEthIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEthIfWithPallet(name, required, cb, {skip: true}); -itEth.ifWithPallets = itEthIfWithPallet; --- a/tests/src/fungible.test.ts +++ b/tests/src/fungible.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; const U128_MAX = (1n << 128n) - 1n; --- a/tests/src/getPropertiesRpc.test.ts +++ b/tests/src/getPropertiesRpc.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; import {UniqueHelper, UniqueNFTCollection} from './util/playgrounds/unique'; const collectionProps = [ --- a/tests/src/inflation.test.ts +++ b/tests/src/inflation.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, usingPlaygrounds} from './util'; // todo:playgrounds requires sudo, look into on the later stage describe('integration test: Inflation', () => { --- a/tests/src/limits.test.ts +++ b/tests/src/limits.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util'; describe('Number of tokens per address (NFT)', () => { let alice: IKeyringPair; --- a/tests/src/nesting/collectionProperties.test.ts +++ b/tests/src/nesting/collectionProperties.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, usingPlaygrounds, expect} from '../util/playgrounds'; +import {itSub, Pallets, usingPlaygrounds, expect} from '../util'; import {UniqueBaseCollection} from '../util/playgrounds/unique'; describe('Integration Test: Collection Properties', () => { --- a/tests/src/nesting/graphs.test.ts +++ b/tests/src/nesting/graphs.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, usingPlaygrounds} from '../util/playgrounds'; +import {expect, itSub, usingPlaygrounds} from '../util'; import {UniqueHelper, UniqueNFToken} from '../util/playgrounds/unique'; /** --- a/tests/src/nesting/nest.test.ts +++ b/tests/src/nesting/nest.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from '../util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from '../util'; describe('Integration Test: Composite nesting tests', () => { let alice: IKeyringPair; --- a/tests/src/nesting/propertyPermissions.test.ts +++ b/tests/src/nesting/propertyPermissions.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, usingPlaygrounds, expect} from '../util/playgrounds'; +import {itSub, Pallets, usingPlaygrounds, expect} from '../util'; import {UniqueNFTCollection, UniqueRFTCollection} from '../util/playgrounds/unique'; describe('Integration Test: Access Rights to Token Properties', () => { --- a/tests/src/nesting/tokenProperties.test.ts +++ b/tests/src/nesting/tokenProperties.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util/playgrounds'; +import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util'; import {UniqueHelper, UniqueNFToken, UniqueRFToken} from '../util/playgrounds/unique'; describe('Integration Test: Token Properties', () => { --- a/tests/src/nesting/unnest.test.ts +++ b/tests/src/nesting/unnest.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from '../util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from '../util'; describe('Integration Test: Unnesting', () => { let alice: IKeyringPair; --- a/tests/src/nextSponsoring.test.ts +++ b/tests/src/nextSponsoring.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from './util'; const SPONSORING_TIMEOUT = 5; --- a/tests/src/pallet-presence.test.ts +++ b/tests/src/pallet-presence.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; // Pallets that must always be present const requiredPallets = [ --- a/tests/src/refungible.test.ts +++ b/tests/src/refungible.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util'; const MAX_REFUNGIBLE_PIECES = 1_000_000_000_000_000_000_000n; --- a/tests/src/removeCollectionAdmin.test.ts +++ b/tests/src/removeCollectionAdmin.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Integration Test removeCollectionAdmin(collection_id, account_id):', () => { let alice: IKeyringPair; --- a/tests/src/removeCollectionSponsor.test.ts +++ b/tests/src/removeCollectionSponsor.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('integration test: ext. removeCollectionSponsor():', () => { let donor: IKeyringPair; --- a/tests/src/rpc.test.ts +++ b/tests/src/rpc.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, itSub, expect} from './util/playgrounds'; +import {usingPlaygrounds, itSub, expect} from './util'; import {CrossAccountId} from './util/playgrounds/unique'; describe('integration test: RPC methods', () => { --- a/tests/src/setCollectionLimits.test.ts +++ b/tests/src/setCollectionLimits.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; const accountTokenOwnershipLimit = 0; const sponsoredDataSize = 0; --- a/tests/src/setCollectionSponsor.test.ts +++ b/tests/src/setCollectionSponsor.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect, Pallets} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect, Pallets} from './util'; describe('integration test: ext. setCollectionSponsor():', () => { let alice: IKeyringPair; --- a/tests/src/setPermissions.test.ts +++ b/tests/src/setPermissions.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Integration Test: Set Permissions', () => { let alice: IKeyringPair; --- a/tests/src/transfer.test.ts +++ b/tests/src/transfer.test.ts @@ -15,8 +15,8 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, usingEthPlaygrounds} from './eth/util/playgrounds'; -import {itSub, Pallets, usingPlaygrounds, expect} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds} from './eth/util'; +import {itSub, Pallets, usingPlaygrounds, expect} from './util'; describe('Integration Test Transfer(recipient, collection_id, item_id, value)', () => { let donor: IKeyringPair; --- a/tests/src/transferFrom.test.ts +++ b/tests/src/transferFrom.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, Pallets, usingPlaygrounds, expect} from './util'; describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => { let alice: IKeyringPair; --- a/tests/src/tx-version-presence.test.ts +++ b/tests/src/tx-version-presence.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {Metadata} from '@polkadot/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; let metadata: Metadata; --- /dev/null +++ b/tests/src/util/globalSetup.ts @@ -0,0 +1,102 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +import {usingPlaygrounds, Pallets} from './index'; +import * as path from 'path'; +import {promises as fs} from 'fs'; + +// This file is used in the mocha package.json section +export async function mochaGlobalSetup() { + await usingPlaygrounds(async (helper, privateKey) => { + try { + // 1. Create donors for test files + await fundFilenamesWithRetries(3) + .then((result) => { + if (!result) process.exit(1); + }); + + // 2. Set up App Promotion admin + const missingPallets = helper.fetchMissingPalletNames([Pallets.AppPromotion]); + if (missingPallets.length === 0) { + const superuser = await privateKey('//Alice'); + const palletAddress = helper.arrange.calculatePalletAddress('appstake'); + const palletAdmin = await privateKey('//PromotionAdmin'); + const api = helper.getApi(); + await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address}))); + const nominal = helper.balance.getOneTokenNominal(); + await helper.balance.transferToSubstrate(superuser, palletAdmin.address, 1000n * nominal); + await helper.balance.transferToSubstrate(superuser, palletAddress, 1000n * nominal); + } + } catch (error) { + console.error(error); + process.exit(1); + } + }); +} + +async function getFiles(rootPath: string): Promise { + const files = await fs.readdir(rootPath, {withFileTypes: true}); + const filenames: string[] = []; + for (const entry of files) { + const res = path.resolve(rootPath, entry.name); + if (entry.isDirectory()) { + filenames.push(...await getFiles(res)); + } else { + filenames.push(res); + } + } + return filenames; +} + +const fundFilenames = async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const oneToken = helper.balance.getOneTokenNominal(); + const alice = await privateKey('//Alice'); + const nonce = await helper.chain.getNonce(alice.address); + const filenames = await getFiles(path.resolve(__dirname, '..')); + + // batching is actually undesireable, it takes away the time while all the transactions actually succeed + const batchSize = 300; + let balanceGrantedCounter = 0; + for (let b = 0; b < filenames.length; b += batchSize) { + const tx = []; + let batchBalanceGrantedCounter = 0; + for (let i = 0; batchBalanceGrantedCounter < batchSize && b + i < filenames.length; i++) { + const f = filenames[b + i]; + if (!f.endsWith('.test.ts') && !f.endsWith('seqtest.ts') || f.includes('.outdated')) continue; + const account = await privateKey({filename: f, ignoreFundsPresence: true}); + const aliceBalance = await helper.balance.getSubstrate(account.address); + + if (aliceBalance < 100_000n * oneToken) { + tx.push(helper.executeExtrinsic( + alice, + 'api.tx.balances.transfer', + [account.address, 1_000_000n * oneToken], + true, + {nonce: nonce + balanceGrantedCounter++}, + ).then(() => true).catch(() => {console.error(`Transaction to ${path.basename(f)} registered as failed. Strange.`); return false;})); + batchBalanceGrantedCounter++; + } + } + + if(tx.length > 0) { + console.log(`Granting funds to ${batchBalanceGrantedCounter} filename accounts.`); + const result = await Promise.all(tx); + if (result && result.lastIndexOf(false) > -1) throw new Error('The transactions actually probably succeeded, should check the balances.'); + } + } + + if (balanceGrantedCounter == 0) console.log('No account needs additional funding.'); + }); +}; + +const fundFilenamesWithRetries = async (retriesLeft: number): Promise => { + if (retriesLeft <= 0) return Promise.resolve(false); + return fundFilenames() + .then(() => Promise.resolve(true)) + .catch(e => { + console.error(e); + console.error(`Some transactions might have failed. ${retriesLeft > 1 ? 'Retrying...' : 'Something is wrong.'}\n`); + return fundFilenamesWithRetries(--retriesLeft); + }); +}; --- /dev/null +++ b/tests/src/util/index.ts @@ -0,0 +1,97 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +import * as path from 'path'; +import * as crypto from 'crypto'; +import {IKeyringPair} from '@polkadot/types/types'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import {Context} from 'mocha'; +import config from '../config'; +import '../interfaces/augment-api-events'; +import {DevUniqueHelper, SilentLogger, SilentConsole} from './playgrounds/unique.dev'; + +chai.use(chaiAsPromised); +export const expect = chai.expect; + +const getTestHash = (filename: string) => { + return crypto.createHash('md5').update(path.basename(filename)).digest('hex'); +}; + +export const getTestSeed = (filename: string) => { + return `//Alice+${getTestHash(filename)}`; +}; + +export const usingPlaygrounds = async (code: (helper: DevUniqueHelper, privateKey: (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => Promise) => Promise, url: string = config.substrateUrl) => { + const silentConsole = new SilentConsole(); + silentConsole.enable(); + + const helper = new DevUniqueHelper(new SilentLogger()); + + try { + await helper.connect(url); + const ss58Format = helper.chain.getChainProperties().ss58Format; + const privateKey = async (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => { + if (typeof seed === 'string') { + return helper.util.fromSeed(seed, ss58Format); + } + else { + const actualSeed = getTestSeed(seed.filename); + let account = helper.util.fromSeed(actualSeed, ss58Format); + if (!seed.ignoreFundsPresence && await helper.balance.getSubstrate(account.address) == 0n) { + console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`); + account = helper.util.fromSeed('//Alice', ss58Format); + } + return account; + } + }; + await code(helper, privateKey); + } + finally { + await helper.disconnect(); + silentConsole.disable(); + } +}; + +export enum Pallets { + Inflation = 'inflation', + RmrkCore = 'rmrkcore', + RmrkEquip = 'rmrkequip', + ReFungible = 'refungible', + Fungible = 'fungible', + NFT = 'nonfungible', + Scheduler = 'scheduler', + AppPromotion = 'apppromotion', +} + +export function requirePalletsOrSkip(test: Context, helper: DevUniqueHelper, requiredPallets: string[]) { + const missingPallets = helper.fetchMissingPalletNames(requiredPallets); + + if (missingPallets.length > 0) { + const skipMsg = `\tSkipping test '${test.test?.title}'.\n\tThe following pallets are missing:\n\t- ${missingPallets.join('\n\t- ')}`; + console.warn('\x1b[38:5:208m%s\x1b[0m', skipMsg); + test.skip(); + } +} + +export async function itSub(name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + (opts.only ? it.only : + opts.skip ? it.skip : it)(name, async function () { + await usingPlaygrounds(async (helper, privateKey) => { + if (opts.requiredPallets) { + requirePalletsOrSkip(this, helper, opts.requiredPallets); + } + + await cb({helper, privateKey}); + }); + }); +} +export async function itSubIfWithPallet(name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + return itSub(name, cb, {requiredPallets: required, ...opts}); +} +itSub.only = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSub(name, cb, {only: true}); +itSub.skip = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSub(name, cb, {skip: true}); + +itSubIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSubIfWithPallet(name, required, cb, {only: true}); +itSubIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSubIfWithPallet(name, required, cb, {skip: true}); +itSub.ifWithPallets = itSubIfWithPallet; --- a/tests/src/util/playgrounds/globalSetup.ts +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -import {usingPlaygrounds, Pallets} from './index'; -import * as path from 'path'; -import {promises as fs} from 'fs'; - -// This file is used in the mocha package.json section -export async function mochaGlobalSetup() { - await usingPlaygrounds(async (helper, privateKey) => { - try { - // 1. Create donors - await fundFilenamesWithRetries(3) - .then((result) => { - if (!result) process.exit(1); - }); - - // 2. Set up App Promotion admin - const missingPallets = helper.fetchMissingPalletNames([Pallets.AppPromotion]); - if (missingPallets.length === 0) { - const superuser = await privateKey('//Alice'); - const palletAddress = helper.arrange.calculatePalleteAddress('appstake'); - const palletAdmin = await privateKey('//PromotionAdmin'); - const api = helper.getApi(); - await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address}))); - const nominal = helper.balance.getOneTokenNominal(); - await helper.balance.transferToSubstrate(superuser, palletAdmin.address, 1000n * nominal); - await helper.balance.transferToSubstrate(superuser, palletAddress, 1000n * nominal); - } - } catch (error) { - console.error(error); - process.exit(1); - } - }); -} - -async function getFiles(rootPath: string): Promise { - const files = await fs.readdir(rootPath, {withFileTypes: true}); - const filenames: string[] = []; - for (const entry of files) { - const res = path.resolve(rootPath, entry.name); - if (entry.isDirectory()) { - filenames.push(...await getFiles(res)); - } else { - filenames.push(res); - } - } - return filenames; -} - -const fundFilenames = async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const oneToken = helper.balance.getOneTokenNominal(); - const alice = await privateKey('//Alice'); - const nonce = await helper.chain.getNonce(alice.address); - const filenames = await getFiles(path.resolve(__dirname, '../..')); - - // batching is actually undesired, it takes away the time while all the transactions actually succeed - const batchSize = 300; - let balanceGrantedCounter = 0; - for (let b = 0; b < filenames.length; b += batchSize) { - const tx = []; - let batchBalanceGrantedCounter = 0; - for (let i = 0; batchBalanceGrantedCounter < batchSize && b + i < filenames.length; i++) { - const f = filenames[b + i]; - if (!f.endsWith('.test.ts') && !f.endsWith('seqtest.ts') || f.includes('.outdated')) continue; - const account = await privateKey({filename: f, ignoreFundsPresence: true}); - const aliceBalance = await helper.balance.getSubstrate(account.address); - - if (aliceBalance < 100_000n * oneToken) { - tx.push(helper.executeExtrinsic( - alice, - 'api.tx.balances.transfer', - [account.address, 1_000_000n * oneToken], - true, - {nonce: nonce + balanceGrantedCounter++}, - ).then(() => true).catch(() => {console.error(`Transaction to ${path.basename(f)} registered as failed. Strange.`); return false;})); - batchBalanceGrantedCounter++; - } - } - - if(tx.length > 0) { - console.log(`Granting funds to ${batchBalanceGrantedCounter} filename accounts.`); - const result = await Promise.all(tx); - if (result && result.lastIndexOf(false) > -1) throw new Error('The transactions actually probably succeeded, should check the balances.'); - } - } - - if (balanceGrantedCounter == 0) console.log('No account needs additional funding.'); - }); -}; - -const fundFilenamesWithRetries = async (retriesLeft: number): Promise => { - if (retriesLeft <= 0) return Promise.resolve(false); - return fundFilenames() - .then(() => Promise.resolve(true)) - .catch(e => { - console.error(e); - console.error(`Some transactions might have failed. ${retriesLeft > 1 ? 'Retrying...' : 'Something is wrong.'}\n`); - return fundFilenamesWithRetries(--retriesLeft); - }); -}; --- a/tests/src/util/playgrounds/index.ts +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -import * as path from 'path'; -import * as crypto from 'crypto'; -import {IKeyringPair} from '@polkadot/types/types'; -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import {Context} from 'mocha'; -import config from '../../config'; -import '../../interfaces/augment-api-events'; -import {DevUniqueHelper, SilentLogger, SilentConsole} from './unique.dev'; - -chai.use(chaiAsPromised); -export const expect = chai.expect; - -const getTestHash = (filename: string) => { - return crypto.createHash('md5').update(path.basename(filename)).digest('hex'); -}; - -export const getTestSeed = (filename: string) => { - return `//Alice+${getTestHash(filename)}`; -}; - -export const usingPlaygrounds = async (code: (helper: DevUniqueHelper, privateKey: (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => Promise) => Promise, url: string = config.substrateUrl) => { - const silentConsole = new SilentConsole(); - silentConsole.enable(); - - const helper = new DevUniqueHelper(new SilentLogger()); - - try { - await helper.connect(url); - const ss58Format = helper.chain.getChainProperties().ss58Format; - const privateKey = async (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => { - if (typeof seed === 'string') { - return helper.util.fromSeed(seed, ss58Format); - } - else { - const actualSeed = getTestSeed(seed.filename); - let account = helper.util.fromSeed(actualSeed, ss58Format); - if (!seed.ignoreFundsPresence && await helper.balance.getSubstrate(account.address) == 0n) { - console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`); - account = helper.util.fromSeed('//Alice', ss58Format); - } - return account; - } - }; - await code(helper, privateKey); - } - finally { - await helper.disconnect(); - silentConsole.disable(); - } -}; - -export enum Pallets { - Inflation = 'inflation', - RmrkCore = 'rmrkcore', - RmrkEquip = 'rmrkequip', - ReFungible = 'refungible', - Fungible = 'fungible', - NFT = 'nonfungible', - Scheduler = 'scheduler', - AppPromotion = 'apppromotion', -} - -export function requirePalletsOrSkip(test: Context, helper: DevUniqueHelper, requiredPallets: string[]) { - const missingPallets = helper.fetchMissingPalletNames(requiredPallets); - - if (missingPallets.length > 0) { - const skipMsg = `\tSkipping test '${test.test?.title}'.\n\tThe following pallets are missing:\n\t- ${missingPallets.join('\n\t- ')}`; - console.warn('\x1b[38:5:208m%s\x1b[0m', skipMsg); - test.skip(); - } -} - -export async function itSub(name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - (opts.only ? it.only : - opts.skip ? it.skip : it)(name, async function () { - await usingPlaygrounds(async (helper, privateKey) => { - if (opts.requiredPallets) { - requirePalletsOrSkip(this, helper, opts.requiredPallets); - } - - await cb({helper, privateKey}); - }); - }); -} -export async function itSubIfWithPallet(name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - return itSub(name, cb, {requiredPallets: required, ...opts}); -} -itSub.only = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSub(name, cb, {only: true}); -itSub.skip = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSub(name, cb, {skip: true}); - -itSubIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSubIfWithPallet(name, required, cb, {only: true}); -itSubIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSubIfWithPallet(name, required, cb, {skip: true}); -itSub.ifWithPallets = itSubIfWithPallet; --- a/tests/src/util/playgrounds/unique.dev.ts +++ b/tests/src/util/playgrounds/unique.dev.ts @@ -245,7 +245,7 @@ return balance; } - calculatePalleteAddress(palletId: any) { + calculatePalletAddress(palletId: any) { const address = stringToU8a(('modl' + palletId).padEnd(32, '\0')); return encodeAddress(address); } -- gitstuff