pause-modal.test.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { fireEvent, screen, waitFor } from '@testing-library/react'
  2. import fetchMock from 'fetch-mock'
  3. import sinon from 'sinon'
  4. import { expect } from 'chai'
  5. import {
  6. annualActiveSubscription,
  7. groupActiveSubscription,
  8. monthlyActiveCollaborator,
  9. trialSubscription,
  10. } from '../../fixtures/subscriptions'
  11. import { renderActiveSubscription } from '../../helpers/render-active-subscription'
  12. import * as useLocationModule from '../../../../../../frontend/js/shared/hooks/use-location'
  13. import { MetaTag } from '@/utils/meta'
  14. const pauseSubscriptionSplitTestMeta: MetaTag[] = [
  15. { name: 'ol-splitTestVariants', value: { 'pause-subscription': 'enabled' } },
  16. { name: 'ol-bootstrapVersion', value: 5 },
  17. ]
  18. function renderSubscriptionWithPauseSupport(
  19. subscription = monthlyActiveCollaborator
  20. ) {
  21. return renderActiveSubscription(subscription, pauseSubscriptionSplitTestMeta)
  22. }
  23. function clickCancelButton() {
  24. const button = screen.getByRole('button', {
  25. name: /Cancel your subscription/i,
  26. })
  27. fireEvent.click(button)
  28. }
  29. function clickDurationSelect() {
  30. const pauseDurationSelect = screen.getByLabelText('Pause subscription for', {
  31. selector: 'input',
  32. })
  33. fireEvent.click(pauseDurationSelect)
  34. }
  35. function clickSubmitButton() {
  36. const buttonConfirm = screen.getByRole('button', {
  37. name: 'Pause subscription',
  38. })
  39. fireEvent.click(buttonConfirm)
  40. }
  41. describe('<PauseSubscriptionModal />', function () {
  42. beforeEach(function () {
  43. reloadStub = sinon.stub()
  44. this.locationStub = sinon.stub(useLocationModule, 'useLocation').returns({
  45. assign: sinon.stub(),
  46. replace: sinon.stub(),
  47. reload: reloadStub,
  48. setHash: sinon.stub(),
  49. toString: sinon
  50. .stub()
  51. .returns('https://www.dev-overleaf.com/user/subscription'),
  52. })
  53. this.replaceStateStub = sinon.stub(window.history, 'replaceState')
  54. })
  55. afterEach(function () {
  56. fetchMock.reset()
  57. this.locationStub.restore()
  58. this.replaceStateStub.restore()
  59. })
  60. it('does not render with an annual subscription', async function () {
  61. renderSubscriptionWithPauseSupport(annualActiveSubscription)
  62. clickCancelButton()
  63. // goes straight to cancel
  64. await screen.findByText('We’d love you to stay')
  65. })
  66. it('does not render with a group plan', async function () {
  67. renderSubscriptionWithPauseSupport(groupActiveSubscription)
  68. clickCancelButton()
  69. // goes straight to cancel
  70. await screen.findByText('We’d love you to stay')
  71. })
  72. it('does not render when in a trial', async function () {
  73. renderSubscriptionWithPauseSupport(trialSubscription)
  74. clickCancelButton()
  75. await screen.findByText('We’d love you to stay')
  76. })
  77. it('renders when trying to cancel subscription', async function () {
  78. renderSubscriptionWithPauseSupport()
  79. clickCancelButton()
  80. await screen.findByText('Pause instead, to pick up where you left off')
  81. })
  82. let reloadStub: sinon.SinonStub
  83. it('renders options for pause duration', async function () {
  84. renderSubscriptionWithPauseSupport()
  85. clickCancelButton()
  86. clickDurationSelect()
  87. await screen.findByRole('option', { name: '1 month' })
  88. await screen.findByRole('option', { name: '2 months' })
  89. await screen.findByRole('option', { name: '3 months' })
  90. })
  91. it('changes to selected duration', async function () {
  92. renderSubscriptionWithPauseSupport()
  93. clickCancelButton()
  94. clickDurationSelect()
  95. const twoMonthsOption = await screen.findByRole('option', {
  96. name: '2 months',
  97. selected: false,
  98. })
  99. fireEvent.click(twoMonthsOption)
  100. clickDurationSelect()
  101. await screen.findByRole('option', { name: '2 months', selected: true })
  102. })
  103. it('shows error if pausing failed', async function () {
  104. const endPointResponse = {
  105. status: 500,
  106. }
  107. fetchMock.post(`/user/subscription/pause/1`, endPointResponse)
  108. renderSubscriptionWithPauseSupport()
  109. clickCancelButton()
  110. clickSubmitButton()
  111. await screen.findByText('Sorry, something went wrong. ', {
  112. exact: false,
  113. })
  114. })
  115. it('reloads if pause successful', async function () {
  116. const endPointResponse = {
  117. status: 200,
  118. }
  119. fetchMock.post(`/user/subscription/pause/1`, endPointResponse)
  120. renderSubscriptionWithPauseSupport()
  121. clickCancelButton()
  122. clickSubmitButton()
  123. await waitFor(() => {
  124. expect(reloadStub).to.have.been.called
  125. })
  126. })
  127. })