file-tree-item-name.test.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { expect } from 'chai'
  2. import sinon from 'sinon'
  3. import { screen, fireEvent, cleanup } from '@testing-library/react'
  4. import renderWithContext from '../../helpers/render-with-context'
  5. import FileTreeItemName from '../../../../../../frontend/js/features/file-tree/components/file-tree-item/file-tree-item-name'
  6. describe('<FileTreeItemName />', function () {
  7. const sandbox = sinon.createSandbox()
  8. const setIsDraggable = sinon.stub()
  9. beforeEach(function () {
  10. sandbox.spy(window, 'requestAnimationFrame')
  11. })
  12. afterEach(function () {
  13. sandbox.restore()
  14. setIsDraggable.reset()
  15. cleanup()
  16. })
  17. it('renders name as button', function () {
  18. renderWithContext(
  19. <FileTreeItemName
  20. name="foo.tex"
  21. isSelected
  22. setIsDraggable={setIsDraggable}
  23. />
  24. )
  25. screen.getByRole('button', { name: 'foo.tex' })
  26. expect(screen.queryByRole('textbox')).to.not.exist
  27. })
  28. it("doesn't start renaming on unselected component", function () {
  29. renderWithContext(
  30. <FileTreeItemName
  31. name="foo.tex"
  32. isSelected={false}
  33. setIsDraggable={setIsDraggable}
  34. />
  35. )
  36. const button = screen.queryByRole('button')
  37. fireEvent.click(button)
  38. fireEvent.click(button)
  39. fireEvent.doubleClick(button)
  40. expect(screen.queryByRole('textbox')).to.not.exist
  41. })
  42. it('start renaming on double-click', function () {
  43. renderWithContext(
  44. <FileTreeItemName
  45. name="foo.tex"
  46. isSelected
  47. setIsDraggable={setIsDraggable}
  48. />
  49. )
  50. const button = screen.queryByRole('button')
  51. fireEvent.click(button)
  52. fireEvent.click(button)
  53. fireEvent.doubleClick(button)
  54. screen.getByRole('textbox')
  55. expect(screen.queryByRole('button')).to.not.exist
  56. expect(window.requestAnimationFrame).to.be.calledOnce
  57. expect(setIsDraggable).to.be.calledWith(false)
  58. })
  59. it('cannot start renaming in read-only', function () {
  60. renderWithContext(
  61. <FileTreeItemName
  62. name="foo.tex"
  63. isSelected
  64. setIsDraggable={setIsDraggable}
  65. />,
  66. {
  67. contextProps: { permissionsLevel: 'readOnly' },
  68. }
  69. )
  70. const button = screen.queryByRole('button')
  71. fireEvent.click(button)
  72. fireEvent.click(button)
  73. fireEvent.doubleClick(button)
  74. expect(screen.queryByRole('textbox')).to.not.exist
  75. })
  76. describe('stop renaming', function () {
  77. beforeEach(function () {
  78. renderWithContext(
  79. <FileTreeItemName
  80. name="foo.tex"
  81. isSelected
  82. setIsDraggable={setIsDraggable}
  83. />
  84. )
  85. const button = screen.getByRole('button')
  86. fireEvent.click(button)
  87. fireEvent.click(button)
  88. fireEvent.doubleClick(button)
  89. const input = screen.getByRole('textbox')
  90. fireEvent.change(input, { target: { value: 'bar.tex' } })
  91. })
  92. it('on Escape', function () {
  93. const input = screen.getByRole('textbox')
  94. fireEvent.keyDown(input, { key: 'Escape' })
  95. screen.getByRole('button', { name: 'foo.tex' })
  96. expect(setIsDraggable).to.be.calledWith(true)
  97. })
  98. })
  99. })