difftreelog
test governance init fellowship
in: master
2 files changed
tests/src/governance/init.test.tsdiffbeforeafterboth1import {IKeyringPair} from '@polkadot/types/types';2import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';3import {Event} from '../util/playgrounds/unique.dev';4import {ICounselors, democracyLaunchPeriod, democracyVotingPeriod, ITechComms, democracyEnactmentPeriod, clearCouncil, clearTechComm} from './util';56describeGov('Governance: Initialization', () => {7 let donor: IKeyringPair;8 let sudoer: IKeyringPair;9 let counselors: ICounselors;10 let techcomms: ITechComms;1112 before(async function() {13 await usingPlaygrounds(async (helper, privateKey) => {14 requirePalletsOrSkip(this, helper, [Pallets.Democracy, Pallets.Council, Pallets.TechnicalCommittee]);1516 const councilMembers = await helper.council.membership.getMembers();17 const techcommMembers = await helper.technicalCommittee.membership.getMembers();18 expect(councilMembers.length == 0, 'The Council must be empty before the Gov Init');19 expect(techcommMembers.length == 0, 'The Technical Commettee must be empty before the Gov Init');2021 donor = await privateKey({url: import.meta.url});22 sudoer = await privateKey('//Alice');2324 const [alex, ildar, charu, filip, irina] = await helper.arrange.createAccounts([10_000n, 10_000n, 10_000n, 10_000n, 10_000n], donor);25 counselors = {26 alex,27 ildar,28 charu,29 filip,30 irina,31 };3233 const [greg, andy, constantine] = await helper.arrange.createAccounts([10_000n, 10_000n, 10_000n], donor);34 techcomms = {35 greg,36 andy,37 constantine,38 };39 });40 });4142 itSub('Initialize Governance', async ({helper}) => {43 console.log('\t- Setup the Prime of the Council via sudo');44 await helper.getSudo().utility.batchAll(sudoer, [45 helper.council.membership.addMemberCall(counselors.alex.address),46 helper.council.membership.setPrimeCall(counselors.alex.address),47 ]);4849 let councilMembers = await helper.council.membership.getMembers();50 const councilPrime = await helper.council.collective.getPrimeMember();51 expect(councilMembers).to.be.deep.equal([counselors.alex.address]);52 expect(councilPrime).to.be.equal(counselors.alex.address);5354 console.log('\t- The Council Prime initializes the Technical Commettee');55 const councilProposalThreshold = 1;5657 await helper.council.collective.propose(58 counselors.alex,59 helper.utility.batchAllCall([60 helper.technicalCommittee.membership.addMemberCall(techcomms.greg.address),61 helper.technicalCommittee.membership.addMemberCall(techcomms.andy.address),62 helper.technicalCommittee.membership.addMemberCall(techcomms.constantine.address),6364 helper.technicalCommittee.membership.setPrimeCall(techcomms.greg.address),65 ]),66 councilProposalThreshold,67 );6869 const techCommMembers = await helper.technicalCommittee.membership.getMembers();70 const techCommPrime = await helper.technicalCommittee.membership.getPrimeMember();71 const expectedTechComms = [techcomms.greg.address, techcomms.andy.address, techcomms.constantine.address];72 expect(techCommMembers.length).to.be.equal(expectedTechComms.length);73 expect(techCommMembers).to.containSubset(expectedTechComms);74 expect(techCommPrime).to.be.equal(techcomms.greg.address);7576 console.log('\t- The Council Prime initiates a referendum to add counselors');77 const returnPreimageHash = true;78 const preimageHash = await helper.preimage.notePreimageFromCall(counselors.alex, helper.utility.batchAllCall([79 helper.council.membership.addMemberCall(counselors.ildar.address),80 helper.council.membership.addMemberCall(counselors.charu.address),81 helper.council.membership.addMemberCall(counselors.filip.address),82 helper.council.membership.addMemberCall(counselors.irina.address),83 ]), returnPreimageHash);8485 await helper.council.collective.propose(86 counselors.alex,87 helper.democracy.externalProposeDefaultWithPreimageCall(preimageHash),88 councilProposalThreshold,89 );9091 console.log('\t- The referendum is being decided');92 const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);9394 await helper.democracy.vote(counselors.filip, startedEvent.referendumIndex, {95 Standard: {96 vote: {97 aye: true,98 conviction: 1,99 },100 balance: 10_000n,101 },102 });103104 const passedReferendumEvent = await helper.wait.expectEvent(democracyVotingPeriod, Event.Democracy.Passed);105 expect(passedReferendumEvent.referendumIndex).to.be.equal(startedEvent.referendumIndex);106107 await helper.wait.expectEvent(democracyEnactmentPeriod, Event.Scheduler.Dispatched);108109 councilMembers = await helper.council.membership.getMembers();110 const expectedCounselors = [111 counselors.alex.address,112 counselors.ildar.address,113 counselors.charu.address,114 counselors.filip.address,115 counselors.irina.address,116 ];117 expect(councilMembers.length).to.be.equal(expectedCounselors.length);118 expect(councilMembers).to.containSubset(expectedCounselors);119 });120121 after(async function() {122 await clearTechComm(sudoer);123 await clearCouncil(sudoer);124 });125});1import {IKeyringPair} from '@polkadot/types/types';2import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';3import {Event} from '../util/playgrounds/unique.dev';4import {ICounselors, democracyLaunchPeriod, democracyVotingPeriod, ITechComms, democracyEnactmentPeriod, clearCouncil, clearTechComm, clearFellowship} from './util';56describeGov('Governance: Initialization', () => {7 let donor: IKeyringPair;8 let sudoer: IKeyringPair;9 let counselors: ICounselors;10 let techcomms: ITechComms;11 let coreDevs: any;1213 const expectedAlexFellowRank = 7;14 const expectedFellowRank = 6;1516 before(async function() {17 await usingPlaygrounds(async (helper, privateKey) => {18 requirePalletsOrSkip(this, helper, [Pallets.Democracy, Pallets.Council, Pallets.TechnicalCommittee]);1920 const councilMembers = await helper.council.membership.getMembers();21 const techcommMembers = await helper.technicalCommittee.membership.getMembers();22 expect(councilMembers.length == 0, 'The Council must be empty before the Gov Init');23 expect(techcommMembers.length == 0, 'The Technical Commettee must be empty before the Gov Init');2425 donor = await privateKey({url: import.meta.url});26 sudoer = await privateKey('//Alice');2728 const counselorsNum = 5;29 const techCommsNum = 3;30 const coreDevsNum = 2;31 const [32 alex,33 ildar,34 charu,35 filip,36 irina,3738 greg,39 andy,40 constantine,4142 yaroslav,43 daniel,44 ] = await helper.arrange.createAccounts(new Array(counselorsNum + techCommsNum + coreDevsNum).fill(10_000n), donor);4546 counselors = {47 alex,48 ildar,49 charu,50 filip,51 irina,52 };5354 techcomms = {55 greg,56 andy,57 constantine,58 };5960 coreDevs = {61 yaroslav: yaroslav,62 daniel: daniel,63 };64 });65 });6667 itSub('Initialize Governance', async ({helper}) => {68 const promoteFellow = (fellow: string, promotionsNum: number) => {69 return new Array(promotionsNum).fill(helper.fellowship.collective.promoteCall(fellow));70 };7172 const expectFellowRank = async (fellow: string, expectedRank: number) => {73 expect(await helper.fellowship.collective.getMemberRank(fellow)).to.be.equal(expectedRank);74 };7576 console.log('\t- Setup the Prime of the Council via sudo');77 await helper.getSudo().utility.batchAll(sudoer, [78 helper.council.membership.addMemberCall(counselors.alex.address),79 helper.council.membership.setPrimeCall(counselors.alex.address),8081 helper.fellowship.collective.addMemberCall(counselors.alex.address),82 ...promoteFellow(counselors.alex.address, expectedAlexFellowRank),83 ]);8485 let councilMembers = await helper.council.membership.getMembers();86 const councilPrime = await helper.council.collective.getPrimeMember();87 const alexFellowRank = await helper.fellowship.collective.getMemberRank(counselors.alex.address);88 expect(councilMembers).to.be.deep.equal([counselors.alex.address]);89 expect(councilPrime).to.be.equal(counselors.alex.address);90 expect(alexFellowRank).to.be.equal(expectedAlexFellowRank);9192 console.log('\t- The Council Prime initializes the Technical Commettee');93 const councilProposalThreshold = 1;9495 await helper.council.collective.propose(96 counselors.alex,97 helper.utility.batchAllCall([98 helper.technicalCommittee.membership.addMemberCall(techcomms.greg.address),99 helper.technicalCommittee.membership.addMemberCall(techcomms.andy.address),100 helper.technicalCommittee.membership.addMemberCall(techcomms.constantine.address),101102 helper.technicalCommittee.membership.setPrimeCall(techcomms.greg.address),103 ]),104 councilProposalThreshold,105 );106107 const techCommMembers = await helper.technicalCommittee.membership.getMembers();108 const techCommPrime = await helper.technicalCommittee.membership.getPrimeMember();109 const expectedTechComms = [techcomms.greg.address, techcomms.andy.address, techcomms.constantine.address];110 expect(techCommMembers.length).to.be.equal(expectedTechComms.length);111 expect(techCommMembers).to.containSubset(expectedTechComms);112 expect(techCommPrime).to.be.equal(techcomms.greg.address);113114 console.log('\t- The Council Prime initiates a referendum to add counselors');115 const returnPreimageHash = true;116 const preimageHash = await helper.preimage.notePreimageFromCall(counselors.alex, helper.utility.batchAllCall([117 helper.council.membership.addMemberCall(counselors.ildar.address),118 helper.council.membership.addMemberCall(counselors.charu.address),119 helper.council.membership.addMemberCall(counselors.filip.address),120 helper.council.membership.addMemberCall(counselors.irina.address),121122 helper.fellowship.collective.addMemberCall(counselors.charu.address),123 helper.fellowship.collective.addMemberCall(counselors.ildar.address),124 helper.fellowship.collective.addMemberCall(counselors.irina.address),125 helper.fellowship.collective.addMemberCall(counselors.filip.address),126 helper.fellowship.collective.addMemberCall(techcomms.greg.address),127 helper.fellowship.collective.addMemberCall(techcomms.andy.address),128 helper.fellowship.collective.addMemberCall(techcomms.constantine.address),129 helper.fellowship.collective.addMemberCall(coreDevs.yaroslav.address),130 helper.fellowship.collective.addMemberCall(coreDevs.daniel.address),131132 ...promoteFellow(counselors.charu.address, expectedFellowRank),133 ...promoteFellow(counselors.ildar.address, expectedFellowRank),134 ...promoteFellow(counselors.irina.address, expectedFellowRank),135 ...promoteFellow(counselors.filip.address, expectedFellowRank),136 ...promoteFellow(techcomms.greg.address, expectedFellowRank),137 ...promoteFellow(techcomms.andy.address, expectedFellowRank),138 ...promoteFellow(techcomms.constantine.address, expectedFellowRank),139 ...promoteFellow(coreDevs.yaroslav.address, expectedFellowRank),140 ...promoteFellow(coreDevs.daniel.address, expectedFellowRank),141 ]), returnPreimageHash);142143 await helper.council.collective.propose(144 counselors.alex,145 helper.democracy.externalProposeDefaultWithPreimageCall(preimageHash),146 councilProposalThreshold,147 );148149 console.log('\t- The referendum is being decided');150 const startedEvent = await helper.wait.expectEvent(democracyLaunchPeriod, Event.Democracy.Started);151152 await helper.democracy.vote(counselors.filip, startedEvent.referendumIndex, {153 Standard: {154 vote: {155 aye: true,156 conviction: 1,157 },158 balance: 10_000n,159 },160 });161162 const passedReferendumEvent = await helper.wait.expectEvent(democracyVotingPeriod, Event.Democracy.Passed);163 expect(passedReferendumEvent.referendumIndex).to.be.equal(startedEvent.referendumIndex);164165 await helper.wait.expectEvent(democracyEnactmentPeriod, Event.Scheduler.Dispatched);166167 councilMembers = await helper.council.membership.getMembers();168 const expectedCounselors = [169 counselors.alex.address,170 counselors.ildar.address,171 counselors.charu.address,172 counselors.filip.address,173 counselors.irina.address,174 ];175 expect(councilMembers.length).to.be.equal(expectedCounselors.length);176 expect(councilMembers).to.containSubset(expectedCounselors);177178 await expectFellowRank(counselors.ildar.address, expectedFellowRank);179 await expectFellowRank(counselors.charu.address, expectedFellowRank);180 await expectFellowRank(counselors.filip.address, expectedFellowRank);181 await expectFellowRank(counselors.irina.address, expectedFellowRank);182 await expectFellowRank(techcomms.greg.address, expectedFellowRank);183 await expectFellowRank(techcomms.andy.address, expectedFellowRank);184 await expectFellowRank(techcomms.constantine.address, expectedFellowRank);185 await expectFellowRank(coreDevs.yaroslav.address, expectedFellowRank);186 await expectFellowRank(coreDevs.daniel.address, expectedFellowRank);187 });188189 after(async function() {190 await clearFellowship(sudoer);191 await clearTechComm(sudoer);192 await clearCouncil(sudoer);193 });194});tests/src/util/playgrounds/unique.tsdiffbeforeafterboth--- a/tests/src/util/playgrounds/unique.ts
+++ b/tests/src/util/playgrounds/unique.ts
@@ -3255,8 +3255,8 @@
return this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.promoteMember`, [member]);
}
- promoteCall(newMember: string) {
- return this.helper.constructApiCall(`api.tx.${this.collective}.promoteMember`, [newMember]);
+ promoteCall(member: string) {
+ return this.helper.constructApiCall(`api.tx.${this.collective}.promoteMember`, [member]);
}
demote(signer: TSigner, member: string) {
@@ -3275,6 +3275,10 @@
return (await this.helper.getApi().query.fellowshipCollective.members.keys())
.map((key) => key.args[0].toString());
}
+
+ async getMemberRank(member: string) {
+ return (await this.helper.callRpc('api.query.fellowshipCollective.members', [member])).toJSON().rank;
+ }
}
class ReferendaGroup extends HelperGroup<UniqueHelper> {