file-tree-create-name-input.test.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { expect } from 'chai'
  2. import { screen, waitFor, cleanup } from '@testing-library/react'
  3. import sinon from 'sinon'
  4. import renderWithContext from '../../helpers/render-with-context'
  5. import FileTreeCreateNameInput from '../../../../../../frontend/js/features/file-tree/components/file-tree-create/file-tree-create-name-input'
  6. import FileTreeCreateNameProvider from '../../../../../../frontend/js/features/file-tree/contexts/file-tree-create-name'
  7. describe('<FileTreeCreateNameInput/>', function () {
  8. const sandbox = sinon.createSandbox()
  9. beforeEach(function () {
  10. sandbox.spy(window, 'requestAnimationFrame')
  11. })
  12. afterEach(function () {
  13. sandbox.restore()
  14. cleanup()
  15. })
  16. it('renders an empty input', async function () {
  17. renderWithContext(
  18. <FileTreeCreateNameProvider>
  19. <FileTreeCreateNameInput />
  20. </FileTreeCreateNameProvider>
  21. )
  22. await screen.getByLabelText('File Name')
  23. await screen.getByPlaceholderText('File Name')
  24. })
  25. it('renders a custom label and placeholder', async function () {
  26. renderWithContext(
  27. <FileTreeCreateNameProvider>
  28. <FileTreeCreateNameInput
  29. label="File name in this project"
  30. placeholder="Enter a file name…"
  31. />
  32. </FileTreeCreateNameProvider>
  33. )
  34. await screen.getByLabelText('File name in this project')
  35. await screen.getByPlaceholderText('Enter a file name…')
  36. })
  37. it('uses an initial name', async function () {
  38. renderWithContext(
  39. <FileTreeCreateNameProvider initialName="test.tex">
  40. <FileTreeCreateNameInput />
  41. </FileTreeCreateNameProvider>
  42. )
  43. const input = await screen.getByLabelText('File Name')
  44. expect(input.value).to.equal('test.tex')
  45. })
  46. it('focuses the name', async function () {
  47. renderWithContext(
  48. <FileTreeCreateNameProvider initialName="test.tex">
  49. <FileTreeCreateNameInput focusName />
  50. </FileTreeCreateNameProvider>
  51. )
  52. const input = await screen.getByLabelText('File Name')
  53. expect(input.value).to.equal('test.tex')
  54. await waitFor(
  55. () => expect(window.requestAnimationFrame).to.have.been.calledOnce
  56. )
  57. // https://github.com/jsdom/jsdom/issues/2995
  58. // "window.getSelection doesn't work with selection of <input> element"
  59. // const selection = window.getSelection().toString()
  60. // expect(selection).to.equal('test')
  61. // wait for the selection to update
  62. await new Promise(resolve => window.setTimeout(resolve, 100))
  63. expect(input.selectionStart).to.equal(0)
  64. expect(input.selectionEnd).to.equal(4)
  65. })
  66. })