| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- import { expect } from 'chai'
- import { fireEvent, screen, render } from '@testing-library/react'
- import fetchMock from 'fetch-mock'
- import AccountInfoSection from '../../../../../frontend/js/features/settings/components/account-info-section'
- import { UserProvider } from '../../../../../frontend/js/shared/context/user-context'
- import getMeta from '@/utils/meta'
- function renderSectionWithUserProvider() {
- render(<AccountInfoSection />, {
- wrapper: ({ children }) => <UserProvider>{children}</UserProvider>,
- })
- }
- describe('<AccountInfoSection />', function () {
- beforeEach(function () {
- window.metaAttributesCache.set('ol-user', {
- email: 'sherlock@holmes.co.uk',
- first_name: 'Sherlock',
- last_name: 'Holmes',
- })
- Object.assign(getMeta('ol-ExposedSettings'), {
- hasAffiliationsFeature: false,
- })
- window.metaAttributesCache.set(
- 'ol-isExternalAuthenticationSystemUsed',
- false
- )
- window.metaAttributesCache.set('ol-shouldAllowEditingDetails', true)
- })
- afterEach(function () {
- fetchMock.removeRoutes().clearHistory()
- })
- it('submits all inputs', async function () {
- const updateMock = fetchMock.post('/user/settings', 200)
- renderSectionWithUserProvider()
- fireEvent.change(screen.getByLabelText('Email'), {
- target: { value: 'john@watson.co.uk' },
- })
- fireEvent.change(screen.getByLabelText('First name'), {
- target: { value: 'John' },
- })
- fireEvent.change(screen.getByLabelText('Last name'), {
- target: { value: 'Watson' },
- })
- fireEvent.click(
- screen.getByRole('button', {
- name: 'Update account info',
- })
- )
- expect(updateMock.callHistory.called()).to.be.true
- expect(
- JSON.parse(updateMock.callHistory.calls().at(-1)?.options.body as string)
- ).to.deep.equal({
- email: 'john@watson.co.uk',
- first_name: 'John',
- last_name: 'Watson',
- })
- })
- it('disables button on invalid email', async function () {
- const updateMock = fetchMock.post('/user/settings', 200)
- renderSectionWithUserProvider()
- fireEvent.change(screen.getByLabelText('Email'), {
- target: { value: 'john' },
- })
- const button = screen.getByRole('button', {
- name: 'Update account info',
- }) as HTMLButtonElement
- expect(button.disabled).to.be.true
- fireEvent.click(button)
- expect(updateMock.callHistory.called()).to.be.false
- })
- it('shows inflight state and success message', async function () {
- let finishUpdateCall: (value: any) => void = () => {}
- fetchMock.post(
- '/user/settings',
- new Promise(resolve => (finishUpdateCall = resolve))
- )
- renderSectionWithUserProvider()
- fireEvent.click(
- screen.getByRole('button', {
- name: /update/i,
- })
- )
- await screen.findByRole('button', { name: /saving/i })
- finishUpdateCall(200)
- await screen.findByRole('button', {
- name: /update/i,
- })
- screen.getByText('Thanks, your settings have been updated.')
- })
- it('shows server error', async function () {
- fetchMock.post('/user/settings', 500)
- renderSectionWithUserProvider()
- fireEvent.click(
- screen.getByRole('button', {
- name: /update/i,
- })
- )
- await screen.findByText('Something went wrong. Please try again.')
- })
- it('shows invalid error', async function () {
- fetchMock.post('/user/settings', 400)
- renderSectionWithUserProvider()
- fireEvent.click(
- screen.getByRole('button', {
- name: /update/i,
- })
- )
- await screen.findByText(
- 'Invalid Request. Please correct the data and try again.'
- )
- })
- it('shows conflict error', async function () {
- fetchMock.post('/user/settings', {
- status: 409,
- body: {
- message:
- 'This email address is already associated with a different Overleaf account.',
- },
- })
- renderSectionWithUserProvider()
- fireEvent.click(
- screen.getByRole('button', {
- name: /update/i,
- })
- )
- await screen.findByText(
- 'This email address is already associated with a different Overleaf account.'
- )
- })
- it('hides email input', async function () {
- Object.assign(getMeta('ol-ExposedSettings'), {
- hasAffiliationsFeature: true,
- })
- const updateMock = fetchMock.post('/user/settings', 200)
- renderSectionWithUserProvider()
- expect(screen.queryByLabelText('Email')).to.not.exist
- fireEvent.click(
- screen.getByRole('button', {
- name: /update/i,
- })
- )
- expect(
- JSON.parse(updateMock.callHistory.calls().at(-1)?.options.body as string)
- ).to.deep.equal({
- first_name: 'Sherlock',
- last_name: 'Holmes',
- })
- })
- it('disables email input', async function () {
- window.metaAttributesCache.set(
- 'ol-isExternalAuthenticationSystemUsed',
- true
- )
- const updateMock = fetchMock.post('/user/settings', 200)
- renderSectionWithUserProvider()
- expect(screen.getByLabelText('Email')).to.have.property('readOnly', true)
- expect(screen.getByLabelText('First name')).to.have.property(
- 'readOnly',
- false
- )
- expect(screen.getByLabelText('Last name')).to.have.property(
- 'readOnly',
- false
- )
- fireEvent.click(
- screen.getByRole('button', {
- name: /update account info/i,
- })
- )
- expect(
- JSON.parse(updateMock.callHistory.calls().at(-1)?.options.body as string)
- ).to.deep.equal({
- first_name: 'Sherlock',
- last_name: 'Holmes',
- })
- })
- it('disables names input', async function () {
- window.metaAttributesCache.set('ol-shouldAllowEditingDetails', false)
- const updateMock = fetchMock.post('/user/settings', 200)
- renderSectionWithUserProvider()
- expect(screen.getByLabelText('Email')).to.have.property('readOnly', false)
- expect(screen.getByLabelText('First name')).to.have.property(
- 'readOnly',
- true
- )
- expect(screen.getByLabelText('Last name')).to.have.property(
- 'readOnly',
- true
- )
- fireEvent.click(
- screen.getByRole('button', {
- name: /update/i,
- })
- )
- expect(
- JSON.parse(updateMock.callHistory.calls().at(-1)?.options.body as string)
- ).to.deep.equal({
- email: 'sherlock@holmes.co.uk',
- })
- })
- })
|