managed-institutions.test.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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 links = screen.getAllByRole('link')
  59. expect(links[0].getAttribute('href')).to.equal('/metrics/institutions/123')
  60. expect(links[1].getAttribute('href')).to.equal('/institutions/123/hub')
  61. expect(links[2].getAttribute('href')).to.equal(
  62. '/manage/institutions/123/managers'
  63. )
  64. expect(links[3].getAttribute('href')).to.equal('/metrics/institutions/456')
  65. expect(links[4].getAttribute('href')).to.equal('/institutions/456/hub')
  66. expect(links[5].getAttribute('href')).to.equal(
  67. '/manage/institutions/456/managers'
  68. )
  69. const subscribeLinks = screen.getAllByText('Subscribe')
  70. expect(subscribeLinks.length).to.equal(1)
  71. const unsubscribeLinks = screen.getAllByText('Unsubscribe')
  72. expect(unsubscribeLinks.length).to.equal(1)
  73. })
  74. it('clicking unsubscribe should unsubscribe from metrics emails', async function () {
  75. window.metaAttributesCache.set('ol-managedInstitutions', [institution1])
  76. const unsubscribeUrl = '/institutions/123/emailSubscription'
  77. fetchMock.post(unsubscribeUrl, {
  78. status: 204,
  79. body: [userId],
  80. })
  81. render(
  82. <SubscriptionDashboardProvider>
  83. <ManagedInstitutions />
  84. </SubscriptionDashboardProvider>
  85. )
  86. const unsubscribeLink = screen.getByText('Unsubscribe')
  87. await fireEvent.click(unsubscribeLink)
  88. await waitFor(() => expect(fetchMock.called(unsubscribeUrl)).to.be.true)
  89. await waitFor(() => {
  90. expect(screen.getByText('Subscribe')).to.exist
  91. })
  92. })
  93. it('clicking subscribe should subscribe to metrics emails', async function () {
  94. window.metaAttributesCache.set('ol-managedInstitutions', [institution2])
  95. const subscribeUrl = '/institutions/456/emailSubscription'
  96. fetchMock.post(subscribeUrl, {
  97. status: 204,
  98. body: [],
  99. })
  100. render(
  101. <SubscriptionDashboardProvider>
  102. <ManagedInstitutions />
  103. </SubscriptionDashboardProvider>
  104. )
  105. const subscribeLink = screen.getByText('Subscribe')
  106. await fireEvent.click(subscribeLink)
  107. await waitFor(() => expect(fetchMock.called(subscribeUrl)).to.be.true)
  108. await waitFor(() => {
  109. expect(screen.getByText('Unsubscribe')).to.exist
  110. })
  111. })
  112. it('renders nothing when there are no institutions', function () {
  113. window.metaAttributesCache.set('ol-managedInstitutions', undefined)
  114. render(
  115. <SubscriptionDashboardProvider>
  116. <ManagedInstitutions />
  117. </SubscriptionDashboardProvider>
  118. )
  119. const elements = screen.queryAllByText('You are a', {
  120. exact: false,
  121. })
  122. expect(elements.length).to.equal(0)
  123. })
  124. })