project-name-editable-label.test.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { expect } from 'chai'
  2. import sinon from 'sinon'
  3. import React from 'react'
  4. import { fireEvent, render, screen } from '@testing-library/react'
  5. import ProjectNameEditableLabel from '../../../../../frontend/js/features/editor-navigation-toolbar/components/project-name-editable-label'
  6. describe('<ProjectNameEditableLabel />', function () {
  7. const defaultProps = { projectName: 'test-project', onChange: () => {} }
  8. it('displays the project name', function () {
  9. render(<ProjectNameEditableLabel {...defaultProps} />)
  10. screen.getByText('test-project')
  11. })
  12. describe('when the name is editable', function () {
  13. const editableProps = { ...defaultProps, userIsAdmin: true }
  14. it('displays an editable input when the edit button is clicked', function () {
  15. render(<ProjectNameEditableLabel {...editableProps} />)
  16. fireEvent.click(screen.getByRole('button'))
  17. screen.getByRole('textbox')
  18. })
  19. it('displays an editable input when the project name is double clicked', function () {
  20. render(<ProjectNameEditableLabel {...editableProps} />)
  21. fireEvent.doubleClick(screen.getByText('test-project'))
  22. screen.getByRole('textbox')
  23. })
  24. it('calls "onChange" when the project name is updated', function () {
  25. const props = {
  26. ...editableProps,
  27. onChange: sinon.stub(),
  28. }
  29. render(<ProjectNameEditableLabel {...props} />)
  30. fireEvent.doubleClick(screen.getByText('test-project'))
  31. const input = screen.getByRole('textbox')
  32. fireEvent.change(input, { target: { value: 'new project name' } })
  33. fireEvent.keyDown(input, { key: 'Enter' })
  34. expect(props.onChange).to.be.calledWith('new project name')
  35. })
  36. it('cancels renaming when the input loses focus', function () {
  37. render(<ProjectNameEditableLabel {...editableProps} />)
  38. fireEvent.doubleClick(screen.getByText('test-project'))
  39. fireEvent.blur(screen.getByRole('textbox'))
  40. expect(screen.queryByRole('textbox')).to.not.exist
  41. })
  42. })
  43. describe('when the name is not editable', function () {
  44. const nonEditableProps = { userIsAdmin: false, ...defaultProps }
  45. it('the edit button is not displayed', function () {
  46. render(<ProjectNameEditableLabel {...nonEditableProps} />)
  47. expect(screen.queryByRole('button')).to.not.exist
  48. })
  49. })
  50. })