file-tree-root.test.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import React from 'react'
  2. import sinon from 'sinon'
  3. import { screen, render, fireEvent, waitFor } from '@testing-library/react'
  4. import fetchMock from 'fetch-mock'
  5. import FileTreeRoot from '../../../../../frontend/js/features/file-tree/components/file-tree-root'
  6. describe('<FileTreeRoot/>', function() {
  7. const onSelect = sinon.stub()
  8. const onInit = sinon.stub()
  9. beforeEach(function() {
  10. global.requestAnimationFrame = sinon.stub()
  11. })
  12. afterEach(function() {
  13. delete global.requestAnimationFrame
  14. fetchMock.restore()
  15. onSelect.reset()
  16. onInit.reset()
  17. global.localStorage.clear()
  18. })
  19. it('renders', function() {
  20. const rootFolder = [
  21. {
  22. _id: 'root-folder-id',
  23. docs: [{ _id: '456def', name: 'main.tex' }],
  24. folders: [],
  25. fileRefs: []
  26. }
  27. ]
  28. render(
  29. <FileTreeRoot
  30. rootFolder={rootFolder}
  31. projectId="123abc"
  32. hasWritePermissions={false}
  33. rootDocId="456def"
  34. onSelect={onSelect}
  35. onInit={onInit}
  36. />
  37. )
  38. screen.queryByRole('tree')
  39. screen.getByRole('treeitem')
  40. screen.getByRole('treeitem', { name: 'main.tex', selected: true })
  41. })
  42. it('renders with invalid selected doc in local storage', async function() {
  43. global.localStorage.setItem(
  44. 'doc.open_id.123abc',
  45. JSON.stringify('not-a-valid-id')
  46. )
  47. const rootFolder = [
  48. {
  49. _id: 'root-folder-id',
  50. docs: [{ _id: '456def', name: 'main.tex' }],
  51. folders: [],
  52. fileRefs: []
  53. }
  54. ]
  55. render(
  56. <FileTreeRoot
  57. rootFolder={rootFolder}
  58. projectId="123abc"
  59. hasWritePermissions
  60. rootDocId="456def"
  61. onSelect={onSelect}
  62. onInit={onInit}
  63. />
  64. )
  65. // as a proxy to check that the invalid entity ha not been select we start
  66. // a delete and ensure the modal is displayed (the cancel button can be
  67. // selected) This is needed to make sure the test fail.
  68. const treeitemFile = screen.getByRole('treeitem', { name: 'main.tex' })
  69. fireEvent.click(treeitemFile, { ctrlKey: true })
  70. const deleteButton = screen.getByRole('menuitem', { name: 'Delete' })
  71. fireEvent.click(deleteButton)
  72. await waitFor(() => screen.getByRole('button', { name: 'Cancel' }))
  73. })
  74. it('fire onSelect', function() {
  75. const rootFolder = [
  76. {
  77. _id: 'root-folder-id',
  78. docs: [
  79. { _id: '456def', name: 'main.tex' },
  80. { _id: '789ghi', name: 'other.tex' }
  81. ],
  82. folders: [],
  83. fileRefs: []
  84. }
  85. ]
  86. render(
  87. <FileTreeRoot
  88. rootFolder={rootFolder}
  89. projectId="123abc"
  90. rootDocId="456def"
  91. hasWritePermissions={false}
  92. onSelect={onSelect}
  93. onInit={onInit}
  94. />
  95. )
  96. sinon.assert.calledOnce(onSelect)
  97. sinon.assert.calledWithMatch(onSelect, [
  98. sinon.match({
  99. entity: {
  100. _id: '456def',
  101. name: 'main.tex'
  102. }
  103. })
  104. ])
  105. onSelect.reset()
  106. screen.queryByRole('tree')
  107. const treeitem = screen.getByRole('treeitem', { name: 'other.tex' })
  108. fireEvent.click(treeitem)
  109. sinon.assert.calledOnce(onSelect)
  110. sinon.assert.calledWithMatch(onSelect, [
  111. sinon.match({
  112. entity: {
  113. _id: '789ghi',
  114. name: 'other.tex'
  115. }
  116. })
  117. ])
  118. })
  119. it('listen to editor.openDoc', function() {
  120. const rootFolder = [
  121. {
  122. _id: 'root-folder-id',
  123. docs: [
  124. { _id: '456def', name: 'main.tex' },
  125. { _id: '789ghi', name: 'other.tex' }
  126. ],
  127. folders: [],
  128. fileRefs: []
  129. }
  130. ]
  131. render(
  132. <FileTreeRoot
  133. rootFolder={rootFolder}
  134. projectId="123abc"
  135. rootDocId="456def"
  136. hasWritePermissions={false}
  137. onSelect={onSelect}
  138. onInit={onInit}
  139. />
  140. )
  141. screen.getByRole('treeitem', { name: 'main.tex', selected: true })
  142. window.dispatchEvent(
  143. new CustomEvent('editor.openDoc', { detail: '789ghi' })
  144. )
  145. screen.getByRole('treeitem', { name: 'main.tex', selected: false })
  146. screen.getByRole('treeitem', { name: 'other.tex', selected: true })
  147. })
  148. })