HireWorkersFixture.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { WorkerId } from '@joystream/types/working-group'
  2. import { Api } from '../../Api'
  3. import { LEADER_OPENING_STAKE } from '../../consts'
  4. import { BaseQueryNodeFixture, FixtureRunner } from '../../Fixture'
  5. import { QueryNodeApi } from '../../QueryNodeApi'
  6. import { WorkingGroupModuleName } from '../../types'
  7. import { Utils } from '../../utils'
  8. import { AddStakingAccountsHappyCaseFixture, BuyMembershipHappyCaseFixture } from '../membership'
  9. import { ApplicantDetails, ApplyOnOpeningsHappyCaseFixture } from './ApplyOnOpeningsHappyCaseFixture'
  10. import { CreateOpeningsFixture, DEFAULT_OPENING_PARAMS } from './CreateOpeningsFixture'
  11. import { FillOpeningsFixture } from './FillOpeningsFixture'
  12. export class HireWorkersFixture extends BaseQueryNodeFixture {
  13. protected group: WorkingGroupModuleName
  14. protected workersN: number
  15. protected createdWorkerIds: WorkerId[] = []
  16. protected fillOpeningRunner?: FixtureRunner
  17. constructor(api: Api, query: QueryNodeApi, group: WorkingGroupModuleName, workersN: number) {
  18. super(api, query)
  19. this.group = group
  20. this.workersN = workersN
  21. }
  22. public getCreatedWorkerIds(): WorkerId[] {
  23. Utils.assert(this.createdWorkerIds.length, 'Trying to get created workers before they were created!')
  24. return this.createdWorkerIds
  25. }
  26. public async execute(): Promise<void> {
  27. // Transfer funds to leader staking account to cover opening stake
  28. const leaderStakingAcc = await this.api.getLeaderStakingKey(this.group)
  29. await this.api.treasuryTransferBalance(leaderStakingAcc, LEADER_OPENING_STAKE)
  30. // Create an opening
  31. const createOpeningFixture = new CreateOpeningsFixture(this.api, this.query, this.group)
  32. const openingRunner = new FixtureRunner(createOpeningFixture)
  33. await openingRunner.run()
  34. const [openingId] = createOpeningFixture.getCreatedOpeningIds()
  35. const { stake: openingStake, metadata: openingMetadata } = DEFAULT_OPENING_PARAMS
  36. // Create the applications
  37. const roleAccounts = (await this.api.createKeyPairs(this.workersN)).map((kp) => kp.address)
  38. const stakingAccounts = (await this.api.createKeyPairs(this.workersN)).map((kp) => kp.address)
  39. const rewardAccounts = (await this.api.createKeyPairs(this.workersN)).map((kp) => kp.address)
  40. const buyMembershipFixture = new BuyMembershipHappyCaseFixture(this.api, this.query, roleAccounts)
  41. await new FixtureRunner(buyMembershipFixture).run()
  42. const memberIds = buyMembershipFixture.getCreatedMembers()
  43. const applicantContexts = roleAccounts.map((account, i) => ({
  44. account,
  45. memberId: memberIds[i],
  46. }))
  47. await Promise.all(
  48. applicantContexts.map((applicantContext, i) => {
  49. const addStakingAccFixture = new AddStakingAccountsHappyCaseFixture(this.api, this.query, applicantContext, [
  50. stakingAccounts[i],
  51. ])
  52. return new FixtureRunner(addStakingAccFixture).run()
  53. })
  54. )
  55. await Promise.all(stakingAccounts.map((a) => this.api.treasuryTransferBalance(a, openingStake)))
  56. const applicants: ApplicantDetails[] = memberIds.map((memberId, i) => ({
  57. memberId,
  58. roleAccount: roleAccounts[i],
  59. stakingAccount: stakingAccounts[i],
  60. rewardAccount: rewardAccounts[i],
  61. }))
  62. const applyOnOpeningFixture = new ApplyOnOpeningsHappyCaseFixture(this.api, this.query, this.group, [
  63. {
  64. openingId,
  65. openingMetadata,
  66. applicants,
  67. },
  68. ])
  69. const applyRunner = new FixtureRunner(applyOnOpeningFixture)
  70. await applyRunner.run()
  71. const applicationIds = await applyOnOpeningFixture.getCreatedApplicationsByOpeningId(openingId)
  72. // Fill the opening
  73. const fillOpeningFixture = new FillOpeningsFixture(this.api, this.query, this.group, [openingId], [applicationIds])
  74. const fillOpeningRunner = new FixtureRunner(fillOpeningFixture)
  75. await fillOpeningRunner.run()
  76. this.createdWorkerIds = fillOpeningFixture.getCreatedWorkerIdsByOpeningId(openingId)
  77. }
  78. public async runQueryNodeChecks(): Promise<void> {
  79. Utils.assert(this.fillOpeningRunner)
  80. await this.fillOpeningRunner.runQueryNodeChecks()
  81. }
  82. }