file-tree-folder-list.spec.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import FileTreeFolderList from '../../../../../frontend/js/features/file-tree/components/file-tree-folder-list'
  2. import { EditorProviders } from '../../../helpers/editor-providers'
  3. import { FileTreeProvider } from '../helpers/file-tree-provider'
  4. describe('<FileTreeFolderList/>', function () {
  5. it('renders empty', function () {
  6. cy.mount(
  7. <EditorProviders>
  8. <FileTreeProvider>
  9. <FileTreeFolderList folders={[]} docs={[]} files={[]} />
  10. </FileTreeProvider>
  11. </EditorProviders>
  12. )
  13. cy.findByRole('tree')
  14. cy.findByRole('treeitem').should('not.exist')
  15. })
  16. it('renders docs, files and folders', function () {
  17. cy.mount(
  18. <EditorProviders>
  19. <FileTreeProvider>
  20. <FileTreeFolderList
  21. folders={[
  22. {
  23. _id: '456def',
  24. name: 'A Folder',
  25. folders: [],
  26. docs: [],
  27. fileRefs: [],
  28. },
  29. ]}
  30. docs={[{ _id: '789ghi', name: 'doc.tex', linkedFileData: {} }]}
  31. files={[{ _id: '987jkl', name: 'file.bib', linkedFileData: {} }]}
  32. />
  33. </FileTreeProvider>
  34. </EditorProviders>
  35. )
  36. cy.findByRole('tree')
  37. cy.findByRole('treeitem', { name: 'A Folder' })
  38. cy.findByRole('treeitem', { name: 'doc.tex' })
  39. cy.findByRole('treeitem', { name: 'file.bib' })
  40. })
  41. describe('selection and multi-selection', function () {
  42. it('without write permissions', function () {
  43. const rootFolder = [
  44. {
  45. _id: 'root-folder-id',
  46. name: 'rootFolder',
  47. docs: [{ _id: '1' }, { _id: '2' }],
  48. fileRefs: [],
  49. folders: [],
  50. },
  51. ]
  52. cy.mount(
  53. <EditorProviders
  54. rootFolder={rootFolder as any}
  55. permissionsLevel="readOnly"
  56. >
  57. <FileTreeProvider>
  58. <FileTreeFolderList
  59. folders={[]}
  60. docs={[
  61. { _id: '1', name: '1.tex' },
  62. { _id: '2', name: '2.tex' },
  63. ]}
  64. files={[]}
  65. />
  66. </FileTreeProvider>
  67. </EditorProviders>
  68. )
  69. // click on item 1: it gets selected
  70. cy.findByRole('treeitem', { name: '1.tex' }).click()
  71. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  72. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  73. // meta-click on item 2: no changes
  74. cy.findByRole('treeitem', { name: '2.tex' }).click({
  75. ctrlKey: true,
  76. cmdKey: true,
  77. })
  78. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  79. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  80. })
  81. it('with write permissions', function () {
  82. const rootFolder = [
  83. {
  84. _id: 'root-folder-id',
  85. name: 'rootFolder',
  86. docs: [{ _id: '1' }, { _id: '2' }, { _id: '3' }],
  87. fileRefs: [],
  88. folders: [],
  89. },
  90. ]
  91. cy.mount(
  92. <EditorProviders rootFolder={rootFolder as any}>
  93. <FileTreeProvider>
  94. <FileTreeFolderList
  95. folders={[]}
  96. docs={[
  97. { _id: '1', name: '1.tex' },
  98. { _id: '2', name: '2.tex' },
  99. { _id: '3', name: '3.tex' },
  100. ]}
  101. files={[]}
  102. />
  103. </FileTreeProvider>
  104. </EditorProviders>
  105. )
  106. // click item 1: it gets selected
  107. cy.findByRole('treeitem', { name: '1.tex' }).click()
  108. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  109. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  110. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  111. // click on item 2: it gets selected and item 1 is not selected anymore
  112. cy.findByRole('treeitem', { name: '2.tex' }).click()
  113. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  114. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  115. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  116. // meta-click on item 3: it gets selected and item 2 as well
  117. cy.findByRole('treeitem', { name: '3.tex' }).click({
  118. ctrlKey: true,
  119. cmdKey: true,
  120. })
  121. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  122. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  123. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  124. // meta-click on item 1: add to selection
  125. cy.findByRole('treeitem', { name: '1.tex' }).click({
  126. ctrlKey: true,
  127. cmdKey: true,
  128. })
  129. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  130. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  131. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  132. // meta-click on item 1: remove from selection
  133. cy.findByRole('treeitem', { name: '1.tex' }).click({
  134. ctrlKey: true,
  135. cmdKey: true,
  136. })
  137. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  138. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  139. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  140. // meta-click on item 3: remove from selection
  141. cy.findByRole('treeitem', { name: '3.tex' }).click({
  142. ctrlKey: true,
  143. cmdKey: true,
  144. })
  145. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  146. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  147. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  148. // meta-click on item 2: cannot unselect
  149. cy.findByRole('treeitem', { name: '2.tex' }).click({
  150. ctrlKey: true,
  151. cmdKey: true,
  152. })
  153. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  154. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  155. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  156. // meta-click on item 3: add back to selection
  157. cy.findByRole('treeitem', { name: '3.tex' }).click({
  158. ctrlKey: true,
  159. cmdKey: true,
  160. })
  161. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  162. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  163. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  164. // click on item 3: unselect other items
  165. cy.findByRole('treeitem', { name: '3.tex' }).click()
  166. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  167. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  168. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  169. })
  170. })
  171. })