managed-institutions.test.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import { expect } from 'chai'
  2. import { fireEvent, render, screen, waitFor } from '@testing-library/react'
  3. import ManagedInstitutions from '../../../../../../frontend/js/features/subscription/components/dashboard/managed-institutions'
  4. import { SubscriptionDashboardProvider } from '../../../../../../frontend/js/features/subscription/context/subscription-dashboard-context'
  5. import fetchMock from 'fetch-mock'
  6. import { SplitTestProvider } from '@/shared/context/split-test-context'
  7. import { ManagedInstitution } from '../../../../../../types/subscription/dashboard/managed-institution'
  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: ManagedInstitution[] = [institution1, institution2]
  28. describe('<ManagedInstitutions />', function () {
  29. beforeEach(function () {
  30. window.metaAttributesCache.set(
  31. 'ol-managedInstitutions',
  32. managedInstitutions
  33. )
  34. window.metaAttributesCache.set('ol-user_id', userId)
  35. })
  36. afterEach(function () {
  37. fetchMock.removeRoutes().clearHistory()
  38. })
  39. it('renders all managed institutions', function () {
  40. render(
  41. <SplitTestProvider>
  42. <SubscriptionDashboardProvider>
  43. <ManagedInstitutions />
  44. </SubscriptionDashboardProvider>
  45. </SplitTestProvider>
  46. )
  47. const elements = screen.getAllByText('You are a', {
  48. exact: false,
  49. })
  50. expect(elements.length).to.equal(2)
  51. expect(elements[0].textContent).to.equal(
  52. 'You are a manager of the Overleaf Commons subscription at Inst 1'
  53. )
  54. expect(elements[1].textContent).to.equal(
  55. 'You are a manager of the Overleaf Commons subscription at Inst 2'
  56. )
  57. const links = screen.getAllByRole('link')
  58. expect(links[0].getAttribute('href')).to.equal('/metrics/institutions/123')
  59. expect(links[1].getAttribute('href')).to.equal('/institutions/123/hub')
  60. expect(links[2].getAttribute('href')).to.equal(
  61. '/manage/institutions/123/managers'
  62. )
  63. expect(links[3].getAttribute('href')).to.equal('/metrics/institutions/456')
  64. expect(links[4].getAttribute('href')).to.equal('/institutions/456/hub')
  65. expect(links[5].getAttribute('href')).to.equal(
  66. '/manage/institutions/456/managers'
  67. )
  68. const subscribeLinks = screen.getAllByText('Subscribe')
  69. expect(subscribeLinks.length).to.equal(1)
  70. const unsubscribeLinks = screen.getAllByText('Unsubscribe')
  71. expect(unsubscribeLinks.length).to.equal(1)
  72. })
  73. it('clicking unsubscribe should unsubscribe from metrics emails', async function () {
  74. window.metaAttributesCache.set('ol-managedInstitutions', [institution1])
  75. const unsubscribeUrl = '/institutions/123/emailSubscription'
  76. fetchMock.post(unsubscribeUrl, {
  77. status: 204,
  78. body: [userId],
  79. })
  80. render(
  81. <SplitTestProvider>
  82. <SubscriptionDashboardProvider>
  83. <ManagedInstitutions />
  84. </SubscriptionDashboardProvider>
  85. </SplitTestProvider>
  86. )
  87. const unsubscribeLink = screen.getByText('Unsubscribe')
  88. fireEvent.click(unsubscribeLink)
  89. await waitFor(
  90. () => expect(fetchMock.callHistory.called(unsubscribeUrl)).to.be.true
  91. )
  92. await waitFor(() => {
  93. expect(screen.getByText('Subscribe')).to.exist
  94. })
  95. })
  96. it('clicking subscribe should subscribe to metrics emails', async function () {
  97. window.metaAttributesCache.set('ol-managedInstitutions', [institution2])
  98. const subscribeUrl = '/institutions/456/emailSubscription'
  99. fetchMock.post(subscribeUrl, {
  100. status: 204,
  101. body: [],
  102. })
  103. render(
  104. <SplitTestProvider>
  105. <SubscriptionDashboardProvider>
  106. <ManagedInstitutions />
  107. </SubscriptionDashboardProvider>
  108. </SplitTestProvider>
  109. )
  110. const subscribeLink = await screen.findByText('Subscribe')
  111. fireEvent.click(subscribeLink)
  112. await waitFor(
  113. () => expect(fetchMock.callHistory.called(subscribeUrl)).to.be.true
  114. )
  115. await screen.findByText('Unsubscribe')
  116. })
  117. it('renders nothing when there are no institutions', function () {
  118. window.metaAttributesCache.set('ol-managedInstitutions', undefined)
  119. render(
  120. <SplitTestProvider>
  121. <SubscriptionDashboardProvider>
  122. <ManagedInstitutions />
  123. </SubscriptionDashboardProvider>
  124. </SplitTestProvider>
  125. )
  126. const elements = screen.queryAllByText('You are a', {
  127. exact: false,
  128. })
  129. expect(elements.length).to.equal(0)
  130. })
  131. })