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

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