managed-institutions.test.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { expect } from 'chai'
  2. import { fireEvent, render, screen, waitFor } from '@testing-library/react'
  3. import ManagedInstitutions, {
  4. Institution,
  5. } from '../../../../../../frontend/js/features/subscription/components/dashboard/managed-institutions'
  6. import { SubscriptionDashboardProvider } from '../../../../../../frontend/js/features/subscription/context/subscription-dashboard-context'
  7. import fetchMock from 'fetch-mock'
  8. const userId = 'fff999fff999'
  9. const institution1 = {
  10. v1Id: 123,
  11. managerIds: [],
  12. metricsEmail: {
  13. optedOutUserIds: [],
  14. lastSent: new Date(),
  15. },
  16. name: 'Inst 1',
  17. }
  18. const institution2 = {
  19. v1Id: 456,
  20. managerIds: [],
  21. metricsEmail: {
  22. optedOutUserIds: [userId],
  23. lastSent: new Date(),
  24. },
  25. name: 'Inst 2',
  26. }
  27. const managedInstitutions: Institution[] = [institution1, institution2]
  28. describe('<ManagedInstitutions />', function () {
  29. beforeEach(function () {
  30. window.metaAttributesCache = new Map()
  31. window.metaAttributesCache.set(
  32. 'ol-managedInstitutions',
  33. managedInstitutions
  34. )
  35. window.user_id = userId
  36. })
  37. afterEach(function () {
  38. window.metaAttributesCache = new Map()
  39. delete window.user_id
  40. fetchMock.reset()
  41. })
  42. it('renders all managed institutions', function () {
  43. render(
  44. <SubscriptionDashboardProvider>
  45. <ManagedInstitutions />
  46. </SubscriptionDashboardProvider>
  47. )
  48. const elements = screen.getAllByText('You are a', {
  49. exact: false,
  50. })
  51. expect(elements.length).to.equal(2)
  52. expect(elements[0].textContent).to.equal(
  53. 'You are a manager of the Overleaf Commons subscription at Inst 1'
  54. )
  55. expect(elements[1].textContent).to.equal(
  56. 'You are a manager of the Overleaf Commons subscription at Inst 2'
  57. )
  58. const viewMetricsLinks = screen.getAllByText('View metrics')
  59. expect(viewMetricsLinks.length).to.equal(2)
  60. expect(viewMetricsLinks[0].getAttribute('href')).to.equal(
  61. '/metrics/institutions/123'
  62. )
  63. expect(viewMetricsLinks[1].getAttribute('href')).to.equal(
  64. '/metrics/institutions/456'
  65. )
  66. const viewHubLinks = screen.getAllByText('View hub')
  67. expect(viewHubLinks.length).to.equal(2)
  68. expect(viewHubLinks[0].getAttribute('href')).to.equal(
  69. '/institutions/123/hub'
  70. )
  71. expect(viewHubLinks[1].getAttribute('href')).to.equal(
  72. '/institutions/456/hub'
  73. )
  74. const manageGroupManagersLinks = screen.getAllByText(
  75. 'Manage institution managers'
  76. )
  77. expect(manageGroupManagersLinks.length).to.equal(2)
  78. expect(manageGroupManagersLinks[0].getAttribute('href')).to.equal(
  79. '/manage/institutions/123/managers'
  80. )
  81. expect(manageGroupManagersLinks[1].getAttribute('href')).to.equal(
  82. '/manage/institutions/456/managers'
  83. )
  84. const subscribeLinks = screen.getAllByText('Subscribe')
  85. expect(subscribeLinks.length).to.equal(1)
  86. const unsubscribeLinks = screen.getAllByText('Unsubscribe')
  87. expect(unsubscribeLinks.length).to.equal(1)
  88. })
  89. it('clicking unsubscribe should unsubscribe from metrics emails', async function () {
  90. window.metaAttributesCache.set('ol-managedInstitutions', [institution1])
  91. const unsubscribeUrl = '/institutions/123/emailSubscription'
  92. fetchMock.post(unsubscribeUrl, {
  93. status: 204,
  94. body: [userId],
  95. })
  96. render(
  97. <SubscriptionDashboardProvider>
  98. <ManagedInstitutions />
  99. </SubscriptionDashboardProvider>
  100. )
  101. const unsubscribeLink = screen.getByText('Unsubscribe')
  102. await fireEvent.click(unsubscribeLink)
  103. await waitFor(() => expect(fetchMock.called(unsubscribeUrl)).to.be.true)
  104. await waitFor(() => {
  105. expect(screen.getByText('Subscribe')).to.exist
  106. })
  107. })
  108. it('clicking subscribe should subscribe to metrics emails', async function () {
  109. window.metaAttributesCache.set('ol-managedInstitutions', [institution2])
  110. const subscribeUrl = '/institutions/456/emailSubscription'
  111. fetchMock.post(subscribeUrl, {
  112. status: 204,
  113. body: [],
  114. })
  115. render(
  116. <SubscriptionDashboardProvider>
  117. <ManagedInstitutions />
  118. </SubscriptionDashboardProvider>
  119. )
  120. const subscribeLink = screen.getByText('Subscribe')
  121. await fireEvent.click(subscribeLink)
  122. await waitFor(() => expect(fetchMock.called(subscribeUrl)).to.be.true)
  123. await waitFor(() => {
  124. expect(screen.getByText('Unsubscribe')).to.exist
  125. })
  126. })
  127. it('renders nothing when there are no institutions', function () {
  128. window.metaAttributesCache.set('ol-managedInstitutions', undefined)
  129. render(
  130. <SubscriptionDashboardProvider>
  131. <ManagedInstitutions />
  132. </SubscriptionDashboardProvider>
  133. )
  134. const elements = screen.queryAllByText('You are a', {
  135. exact: false,
  136. })
  137. expect(elements.length).to.equal(0)
  138. })
  139. })