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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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' }]}
  31. files={[
  32. {
  33. _id: '987jkl',
  34. name: 'file.bib',
  35. hash: 'some hash',
  36. linkedFileData: {},
  37. },
  38. ]}
  39. />
  40. </FileTreeProvider>
  41. </EditorProviders>
  42. )
  43. cy.findByRole('tree')
  44. cy.findByRole('treeitem', { name: 'A Folder' })
  45. cy.findByRole('treeitem', { name: 'doc.tex' })
  46. cy.findByRole('treeitem', { name: 'file.bib' })
  47. })
  48. describe('selection and multi-selection', function () {
  49. it('without write permissions', function () {
  50. const rootFolder = [
  51. {
  52. _id: 'root-folder-id',
  53. name: 'rootFolder',
  54. docs: [{ _id: '1' }, { _id: '2' }],
  55. fileRefs: [],
  56. folders: [],
  57. },
  58. ]
  59. cy.mount(
  60. <EditorProviders
  61. rootFolder={rootFolder as any}
  62. permissionsLevel="readOnly"
  63. >
  64. <FileTreeProvider>
  65. <FileTreeFolderList
  66. folders={[]}
  67. docs={[
  68. { _id: '1', name: '1.tex' },
  69. { _id: '2', name: '2.tex' },
  70. ]}
  71. files={[]}
  72. />
  73. </FileTreeProvider>
  74. </EditorProviders>
  75. )
  76. // click on item 1: it gets selected
  77. cy.findByRole('treeitem', { name: '1.tex' }).click()
  78. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  79. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  80. // meta-click on item 2: no changes
  81. cy.findByRole('treeitem', { name: '2.tex' }).click({
  82. ctrlKey: true,
  83. cmdKey: true,
  84. })
  85. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  86. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  87. })
  88. it('with write permissions', function () {
  89. const rootFolder = [
  90. {
  91. _id: 'root-folder-id',
  92. name: 'rootFolder',
  93. docs: [{ _id: '1' }, { _id: '2' }, { _id: '3' }],
  94. fileRefs: [],
  95. folders: [],
  96. },
  97. ]
  98. cy.mount(
  99. <EditorProviders rootFolder={rootFolder as any}>
  100. <FileTreeProvider>
  101. <FileTreeFolderList
  102. folders={[]}
  103. docs={[
  104. { _id: '1', name: '1.tex' },
  105. { _id: '2', name: '2.tex' },
  106. { _id: '3', name: '3.tex' },
  107. ]}
  108. files={[]}
  109. />
  110. </FileTreeProvider>
  111. </EditorProviders>
  112. )
  113. // click item 1: it gets selected
  114. cy.findByRole('treeitem', { name: '1.tex' }).click()
  115. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  116. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  117. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  118. // click on item 2: it gets selected and item 1 is not selected anymore
  119. cy.findByRole('treeitem', { name: '2.tex' }).click()
  120. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  121. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  122. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  123. // meta-click on item 3: it gets selected and item 2 as well
  124. cy.findByRole('treeitem', { name: '3.tex' }).click({
  125. ctrlKey: true,
  126. cmdKey: true,
  127. })
  128. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  129. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  130. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  131. // meta-click on item 1: add to selection
  132. cy.findByRole('treeitem', { name: '1.tex' }).click({
  133. ctrlKey: true,
  134. cmdKey: true,
  135. })
  136. cy.findByRole('treeitem', { name: '1.tex', selected: true })
  137. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  138. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  139. // meta-click on item 1: remove from selection
  140. cy.findByRole('treeitem', { name: '1.tex' }).click({
  141. ctrlKey: true,
  142. cmdKey: true,
  143. })
  144. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  145. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  146. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  147. // meta-click on item 3: remove from selection
  148. cy.findByRole('treeitem', { name: '3.tex' }).click({
  149. ctrlKey: true,
  150. cmdKey: true,
  151. })
  152. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  153. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  154. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  155. // meta-click on item 2: cannot unselect
  156. cy.findByRole('treeitem', { name: '2.tex' }).click({
  157. ctrlKey: true,
  158. cmdKey: true,
  159. })
  160. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  161. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  162. cy.findByRole('treeitem', { name: '3.tex', selected: false })
  163. // meta-click on item 3: add back to selection
  164. cy.findByRole('treeitem', { name: '3.tex' }).click({
  165. ctrlKey: true,
  166. cmdKey: true,
  167. })
  168. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  169. cy.findByRole('treeitem', { name: '2.tex', selected: true })
  170. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  171. // click on item 3: unselect other items
  172. cy.findByRole('treeitem', { name: '3.tex' }).click()
  173. cy.findByRole('treeitem', { name: '1.tex', selected: false })
  174. cy.findByRole('treeitem', { name: '2.tex', selected: false })
  175. cy.findByRole('treeitem', { name: '3.tex', selected: true })
  176. })
  177. })
  178. })