file-tree-folder-list.test.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { expect } from 'chai'
  2. import { screen, fireEvent } from '@testing-library/react'
  3. import renderWithContext from '../helpers/render-with-context'
  4. import FileTreeFolderList from '../../../../../frontend/js/features/file-tree/components/file-tree-folder-list'
  5. describe('<FileTreeFolderList/>', function () {
  6. it('renders empty', function () {
  7. renderWithContext(<FileTreeFolderList folders={[]} docs={[]} files={[]} />)
  8. screen.queryByRole('tree')
  9. expect(screen.queryByRole('treeitem')).to.not.exist
  10. })
  11. it('renders docs, files and folders', function () {
  12. const aFolder = {
  13. _id: '456def',
  14. name: 'A Folder',
  15. folders: [],
  16. docs: [],
  17. fileRefs: [],
  18. }
  19. const aDoc = { _id: '789ghi', name: 'doc.tex', linkedFileData: {} }
  20. const aFile = { _id: '987jkl', name: 'file.bib', linkedFileData: {} }
  21. renderWithContext(
  22. <FileTreeFolderList folders={[aFolder]} docs={[aDoc]} files={[aFile]} />
  23. )
  24. screen.queryByRole('tree')
  25. screen.queryByRole('treeitem', { name: 'A Folder' })
  26. screen.queryByRole('treeitem', { name: 'doc.tex' })
  27. screen.queryByRole('treeitem', { name: 'file.bib' })
  28. })
  29. describe('selection and multi-selection', function () {
  30. it('without write permissions', function () {
  31. const docs = [
  32. { _id: '1', name: '1.tex' },
  33. { _id: '2', name: '2.tex' },
  34. ]
  35. renderWithContext(
  36. <FileTreeFolderList folders={[]} docs={docs} files={[]} />,
  37. {
  38. contextProps: {
  39. permissionsLevel: 'readOnly',
  40. rootFolder: [
  41. {
  42. _id: 'root-folder-id',
  43. name: 'rootFolder',
  44. docs: [{ _id: '1' }, { _id: '2' }],
  45. fileRefs: [],
  46. folders: [],
  47. },
  48. ],
  49. },
  50. }
  51. )
  52. const treeitem1 = screen.getByRole('treeitem', { name: '1.tex' })
  53. const treeitem2 = screen.getByRole('treeitem', { name: '2.tex' })
  54. // click on item 1: it gets selected
  55. fireEvent.click(treeitem1)
  56. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  57. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  58. // meta-click on item 2: no changes
  59. fireEvent.click(treeitem2, { ctrlKey: true })
  60. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  61. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  62. })
  63. it('with write permissions', function () {
  64. const docs = [
  65. { _id: '1', name: '1.tex' },
  66. { _id: '2', name: '2.tex' },
  67. { _id: '3', name: '3.tex' },
  68. ]
  69. renderWithContext(
  70. <FileTreeFolderList folders={[]} docs={docs} files={[]} />,
  71. {
  72. contextProps: {
  73. rootFolder: [
  74. {
  75. _id: 'root-folder-id',
  76. name: 'rootFolder',
  77. docs: [{ _id: '1' }, { _id: '2' }, { _id: '3' }],
  78. fileRefs: [],
  79. folders: [],
  80. },
  81. ],
  82. },
  83. }
  84. )
  85. const treeitem1 = screen.getByRole('treeitem', { name: '1.tex' })
  86. const treeitem2 = screen.getByRole('treeitem', { name: '2.tex' })
  87. const treeitem3 = screen.getByRole('treeitem', { name: '3.tex' })
  88. // click item 1: it gets selected
  89. fireEvent.click(treeitem1)
  90. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  91. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  92. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  93. // click on item 2: it gets selected and item 1 is not selected anymore
  94. fireEvent.click(treeitem2)
  95. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  96. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  97. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  98. // meta-click on item 3: it gets selected and item 2 as well
  99. fireEvent.click(treeitem3, { ctrlKey: true })
  100. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  101. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  102. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  103. // meta-click on item 1: add to selection
  104. fireEvent.click(treeitem1, { ctrlKey: true })
  105. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  106. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  107. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  108. // meta-click on item 1: remove from selection
  109. fireEvent.click(treeitem1, { ctrlKey: true })
  110. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  111. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  112. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  113. // meta-click on item 3: remove from selection
  114. fireEvent.click(treeitem3, { ctrlKey: true })
  115. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  116. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  117. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  118. // meta-click on item 2: cannot unselect
  119. fireEvent.click(treeitem2, { ctrlKey: true })
  120. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  121. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  122. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  123. // meta-click on item 3: add back to selection
  124. fireEvent.click(treeitem3, { ctrlKey: true })
  125. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  126. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  127. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  128. // click on item 3: unselect other items
  129. fireEvent.click(treeitem3)
  130. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  131. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  132. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  133. })
  134. })
  135. })