--- a/tests/src/governance/init.test.ts +++ b/tests/src/governance/init.test.ts @@ -1,13 +1,17 @@ import {IKeyringPair} from '@polkadot/types/types'; import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util'; import {Event} from '../util/playgrounds/unique.dev'; -import {ICounselors, democracyLaunchPeriod, democracyVotingPeriod, ITechComms, democracyEnactmentPeriod, clearCouncil, clearTechComm} from './util'; +import {ICounselors, democracyLaunchPeriod, democracyVotingPeriod, ITechComms, democracyEnactmentPeriod, clearCouncil, clearTechComm, clearFellowship} from './util'; describeGov('Governance: Initialization', () => { let donor: IKeyringPair; let sudoer: IKeyringPair; let counselors: ICounselors; let techcomms: ITechComms; + let coreDevs: any; + + const expectedAlexFellowRank = 7; + const expectedFellowRank = 6; before(async function() { await usingPlaygrounds(async (helper, privateKey) => { @@ -21,7 +25,24 @@ donor = await privateKey({url: import.meta.url}); sudoer = await privateKey('//Alice'); - const [alex, ildar, charu, filip, irina] = await helper.arrange.createAccounts([10_000n, 10_000n, 10_000n, 10_000n, 10_000n], donor); + const counselorsNum = 5; + const techCommsNum = 3; + const coreDevsNum = 2; + const [ + alex, + ildar, + charu, + filip, + irina, + + greg, + andy, + constantine, + + yaroslav, + daniel, + ] = await helper.arrange.createAccounts(new Array(counselorsNum + techCommsNum + coreDevsNum).fill(10_000n), donor); + counselors = { alex, ildar, @@ -30,26 +51,43 @@ irina, }; - const [greg, andy, constantine] = await helper.arrange.createAccounts([10_000n, 10_000n, 10_000n], donor); techcomms = { greg, andy, constantine, }; + + coreDevs = { + yaroslav: yaroslav, + daniel: daniel, + }; }); }); itSub('Initialize Governance', async ({helper}) => { + const promoteFellow = (fellow: string, promotionsNum: number) => { + return new Array(promotionsNum).fill(helper.fellowship.collective.promoteCall(fellow)); + }; + + const expectFellowRank = async (fellow: string, expectedRank: number) => { + expect(await helper.fellowship.collective.getMemberRank(fellow)).to.be.equal(expectedRank); + }; + console.log('\t- Setup the Prime of the Council via sudo'); await helper.getSudo().utility.batchAll(sudoer, [ helper.council.membership.addMemberCall(counselors.alex.address), helper.council.membership.setPrimeCall(counselors.alex.address), + + helper.fellowship.collective.addMemberCall(counselors.alex.address), + ...promoteFellow(counselors.alex.address, expectedAlexFellowRank), ]); let councilMembers = await helper.council.membership.getMembers(); const councilPrime = await helper.council.collective.getPrimeMember(); + const alexFellowRank = await helper.fellowship.collective.getMemberRank(counselors.alex.address); expect(councilMembers).to.be.deep.equal([counselors.alex.address]); expect(councilPrime).to.be.equal(counselors.alex.address); + expect(alexFellowRank).to.be.equal(expectedAlexFellowRank); console.log('\t- The Council Prime initializes the Technical Commettee'); const councilProposalThreshold = 1; @@ -80,6 +118,26 @@ helper.council.membership.addMemberCall(counselors.charu.address), helper.council.membership.addMemberCall(counselors.filip.address), helper.council.membership.addMemberCall(counselors.irina.address), + + helper.fellowship.collective.addMemberCall(counselors.charu.address), + helper.fellowship.collective.addMemberCall(counselors.ildar.address), + helper.fellowship.collective.addMemberCall(counselors.irina.address), + helper.fellowship.collective.addMemberCall(counselors.filip.address), + helper.fellowship.collective.addMemberCall(techcomms.greg.address), + helper.fellowship.collective.addMemberCall(techcomms.andy.address), + helper.fellowship.collective.addMemberCall(techcomms.constantine.address), + helper.fellowship.collective.addMemberCall(coreDevs.yaroslav.address), + helper.fellowship.collective.addMemberCall(coreDevs.daniel.address), + + ...promoteFellow(counselors.charu.address, expectedFellowRank), + ...promoteFellow(counselors.ildar.address, expectedFellowRank), + ...promoteFellow(counselors.irina.address, expectedFellowRank), + ...promoteFellow(counselors.filip.address, expectedFellowRank), + ...promoteFellow(techcomms.greg.address, expectedFellowRank), + ...promoteFellow(techcomms.andy.address, expectedFellowRank), + ...promoteFellow(techcomms.constantine.address, expectedFellowRank), + ...promoteFellow(coreDevs.yaroslav.address, expectedFellowRank), + ...promoteFellow(coreDevs.daniel.address, expectedFellowRank), ]), returnPreimageHash); await helper.council.collective.propose( @@ -116,9 +174,20 @@ ]; expect(councilMembers.length).to.be.equal(expectedCounselors.length); expect(councilMembers).to.containSubset(expectedCounselors); + + await expectFellowRank(counselors.ildar.address, expectedFellowRank); + await expectFellowRank(counselors.charu.address, expectedFellowRank); + await expectFellowRank(counselors.filip.address, expectedFellowRank); + await expectFellowRank(counselors.irina.address, expectedFellowRank); + await expectFellowRank(techcomms.greg.address, expectedFellowRank); + await expectFellowRank(techcomms.andy.address, expectedFellowRank); + await expectFellowRank(techcomms.constantine.address, expectedFellowRank); + await expectFellowRank(coreDevs.yaroslav.address, expectedFellowRank); + await expectFellowRank(coreDevs.daniel.address, expectedFellowRank); }); after(async function() { + await clearFellowship(sudoer); await clearTechComm(sudoer); await clearCouncil(sudoer); }); --- 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 {