emails-row.test.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { render, screen } from '@testing-library/react'
  2. import { expect } from 'chai'
  3. import fetchMock from 'fetch-mock'
  4. import { cloneDeep } from 'lodash'
  5. import EmailsRow from '../../../../../../frontend/js/features/settings/components/emails/row'
  6. import {
  7. professionalUserData,
  8. unconfirmedUserData,
  9. } from '../../fixtures/test-user-email-data'
  10. import { UserEmailData } from '../../../../../../types/user-email'
  11. import { UserEmailsProvider } from '../../../../../../frontend/js/features/settings/context/user-email-context'
  12. import { Affiliation } from '../../../../../../types/affiliation'
  13. import getMeta from '@/utils/meta'
  14. function renderEmailsRow(data: UserEmailData) {
  15. return render(
  16. <UserEmailsProvider>
  17. <EmailsRow userEmailData={data} />
  18. </UserEmailsProvider>
  19. )
  20. }
  21. function getByTextContent(text: string) {
  22. return screen.getAllByText(
  23. (content, node) =>
  24. content === text || node?.children[0]?.textContent === text
  25. )
  26. }
  27. describe('<EmailsRow/>', function () {
  28. beforeEach(function () {
  29. Object.assign(getMeta('ol-ExposedSettings'), {
  30. samlInitPath: '/saml',
  31. hasSamlBeta: true,
  32. })
  33. fetchMock.get('/user/emails?ensureAffiliation=true', [])
  34. })
  35. afterEach(function () {
  36. fetchMock.removeRoutes().clearHistory()
  37. })
  38. describe('with unaffiliated email data', function () {
  39. it('renders email info', function () {
  40. renderEmailsRow(unconfirmedUserData)
  41. screen.getByText('baz@overleaf.com')
  42. })
  43. it('renders actions', function () {
  44. renderEmailsRow(unconfirmedUserData)
  45. screen.getByRole('button', { name: 'Make primary' })
  46. })
  47. })
  48. describe('with affiliated email data', function () {
  49. it('renders email info', function () {
  50. renderEmailsRow(professionalUserData)
  51. screen.getByText('foo@overleaf.com')
  52. screen.getByText('Primary')
  53. })
  54. it('renders actions', function () {
  55. renderEmailsRow(professionalUserData)
  56. screen.getByRole('button', { name: 'Remove' })
  57. })
  58. it('renders institution info', function () {
  59. renderEmailsRow(professionalUserData)
  60. screen.getByText('Overleaf')
  61. screen.getByText('Reader, Art History')
  62. })
  63. })
  64. describe('with email data affiliated to an institution with SSO available', function () {
  65. let affiliatedEmail: UserEmailData & { affiliation: Affiliation }
  66. beforeEach(function () {
  67. window.metaAttributesCache.get('ol-ExposedSettings').hasSamlFeature = true
  68. // make sure the institution has SSO available
  69. affiliatedEmail = cloneDeep(professionalUserData)
  70. affiliatedEmail.affiliation.institution.confirmed = true
  71. affiliatedEmail.affiliation.institution.isUniversity = true
  72. affiliatedEmail.affiliation.institution.ssoEnabled = true
  73. })
  74. describe('when the email is not yet linked to the institution', function () {
  75. beforeEach(async function () {
  76. fetchMock.removeRoutes().clearHistory()
  77. fetchMock.get(/\/user\/emails/, [affiliatedEmail, unconfirmedUserData])
  78. await fetchMock.callHistory.flush(true)
  79. })
  80. it('prompts the user to link to their institutional account', function () {
  81. renderEmailsRow(affiliatedEmail)
  82. getByTextContent(
  83. 'You can now link your Overleaf account to your Overleaf institutional account.'
  84. )
  85. screen.getByRole('button', { name: 'Link accounts' })
  86. })
  87. })
  88. describe('when the email is already linked to the institution', function () {
  89. beforeEach(async function () {
  90. affiliatedEmail.samlProviderId = '1'
  91. fetchMock.removeRoutes().clearHistory()
  92. fetchMock.get(/\/user\/emails/, [affiliatedEmail, unconfirmedUserData])
  93. await fetchMock.callHistory.flush(true)
  94. })
  95. it('prompts the user to login using their institutional account', function () {
  96. renderEmailsRow(affiliatedEmail)
  97. getByTextContent(
  98. 'You can log in to Overleaf through your Overleaf institutional login.'
  99. )
  100. expect(screen.queryByRole('button', { name: 'Link accounts' })).to.be
  101. .null
  102. })
  103. })
  104. })
  105. })