UpdateCategoriesStatusFixture.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { Api } from '../../Api'
  2. import { QueryNodeApi } from '../../QueryNodeApi'
  3. import { EventDetails } from '../../types'
  4. import { WorkerId } from '@joystream/types/working-group'
  5. import { SubmittableExtrinsic } from '@polkadot/api/types'
  6. import { Utils } from '../../utils'
  7. import { ISubmittableResult } from '@polkadot/types/types/'
  8. import {
  9. CategoryArchivalStatusUpdatedEventFieldsFragment,
  10. ForumCategoryFieldsFragment,
  11. } from '../../graphql/generated/queries'
  12. import { assert } from 'chai'
  13. import { CategoryId } from '@joystream/types/forum'
  14. import { WithForumWorkersFixture } from './WithForumWorkersFixture'
  15. import _ from 'lodash'
  16. export type CategoryStatusUpdate = {
  17. categoryId: CategoryId
  18. archived: boolean
  19. asWorker?: WorkerId
  20. }
  21. export class UpdateCategoriesStatusFixture extends WithForumWorkersFixture {
  22. protected updates: CategoryStatusUpdate[]
  23. public constructor(api: Api, query: QueryNodeApi, updates: CategoryStatusUpdate[]) {
  24. super(api, query)
  25. this.updates = updates
  26. }
  27. protected async getSignerAccountOrAccounts(): Promise<string[]> {
  28. return Promise.all(
  29. this.updates.map(async (u) => {
  30. const workerId = u.asWorker || (await this.getForumLeadId())
  31. return (await this.api.query.forumWorkingGroup.workerById(workerId)).role_account_id.toString()
  32. })
  33. )
  34. }
  35. protected async getExtrinsics(): Promise<SubmittableExtrinsic<'promise'>[]> {
  36. return this.updates.map((u) =>
  37. this.api.tx.forum.updateCategoryArchivalStatus(
  38. u.asWorker ? { Moderator: u.asWorker } : { Lead: null },
  39. u.categoryId,
  40. u.archived
  41. )
  42. )
  43. }
  44. protected async getEventFromResult(result: ISubmittableResult): Promise<EventDetails> {
  45. return this.api.retrieveForumEventDetails(result, 'CategoryArchivalStatusUpdated')
  46. }
  47. protected assertQueriedCategoriesAreValid(
  48. qCategories: ForumCategoryFieldsFragment[],
  49. qEvents: CategoryArchivalStatusUpdatedEventFieldsFragment[]
  50. ): void {
  51. // Check against latest update per category
  52. _.uniqBy([...this.updates].reverse(), (v) => v.categoryId).map((update) => {
  53. const updateIndex = this.updates.indexOf(update)
  54. const qCategory = qCategories.find((c) => c.id === update.categoryId.toString())
  55. const qEvent = this.findMatchingQueryNodeEvent(this.events[updateIndex], qEvents)
  56. Utils.assert(qCategory, 'Query node: Category not found')
  57. if (update.archived) {
  58. Utils.assert(qCategory.status.__typename === 'CategoryStatusArchived', 'Invalid category status')
  59. Utils.assert(
  60. qCategory.status.categoryArchivalStatusUpdatedEvent,
  61. 'Query node: Missing CategoryArchivalStatusUpdatedEvent ref'
  62. )
  63. assert.equal(qCategory.status.categoryArchivalStatusUpdatedEvent.id, qEvent.id)
  64. } else {
  65. assert.equal(qCategory.status.__typename, 'CategoryStatusActive')
  66. }
  67. })
  68. }
  69. protected assertQueryNodeEventIsValid(qEvent: CategoryArchivalStatusUpdatedEventFieldsFragment, i: number): void {
  70. const { categoryId, archived, asWorker } = this.updates[i]
  71. assert.equal(qEvent.category.id, categoryId.toString())
  72. assert.equal(qEvent.newArchivalStatus, archived)
  73. assert.equal(qEvent.actor.id, `forumWorkingGroup-${asWorker ? asWorker.toString() : this.forumLeadId!.toString()}`)
  74. }
  75. async runQueryNodeChecks(): Promise<void> {
  76. await super.runQueryNodeChecks()
  77. // Query the events
  78. const qEvents = await this.query.tryQueryWithTimeout(
  79. () => this.query.getCategoryArchivalStatusUpdatedEvents(this.events),
  80. (qEvents) => this.assertQueryNodeEventsAreValid(qEvents)
  81. )
  82. // Query the categories
  83. const qCategories = await this.query.getCategoriesByIds(this.updates.map((u) => u.categoryId))
  84. this.assertQueriedCategoriesAreValid(qCategories, qEvents)
  85. }
  86. }