git.delta.rocks / unique-network / refs/commits / 8a54415cf31b

difftreelog

test governance init fellowship

Daniel Shiposha2023-09-12parent: #a6d8651.patch.diff
in: master

2 files changed

modifiedtests/src/governance/init.test.tsdiffbeforeafterboth
before · tests/src/governance/init.test.ts
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} 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});
after · tests/src/governance/init.test.ts
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});
modifiedtests/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> {