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

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