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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. hasWritePermissions: false,
  40. rootFolder: [
  41. {
  42. docs: [{ _id: '1' }, { _id: '2' }],
  43. fileRefs: [],
  44. folders: [],
  45. },
  46. ],
  47. },
  48. }
  49. )
  50. const treeitem1 = screen.getByRole('treeitem', { name: '1.tex' })
  51. const treeitem2 = screen.getByRole('treeitem', { name: '2.tex' })
  52. // click on item 1: it gets selected
  53. fireEvent.click(treeitem1)
  54. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  55. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  56. // meta-click on item 2: no changes
  57. fireEvent.click(treeitem2, { ctrlKey: true })
  58. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  59. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  60. })
  61. it('with write permissions', function () {
  62. const docs = [
  63. { _id: '1', name: '1.tex' },
  64. { _id: '2', name: '2.tex' },
  65. { _id: '3', name: '3.tex' },
  66. ]
  67. renderWithContext(
  68. <FileTreeFolderList folders={[]} docs={docs} files={[]} />,
  69. {
  70. contextProps: {
  71. rootFolder: [
  72. {
  73. docs: [{ _id: '1' }, { _id: '2' }, { _id: '3' }],
  74. fileRefs: [],
  75. folders: [],
  76. },
  77. ],
  78. },
  79. }
  80. )
  81. const treeitem1 = screen.getByRole('treeitem', { name: '1.tex' })
  82. const treeitem2 = screen.getByRole('treeitem', { name: '2.tex' })
  83. const treeitem3 = screen.getByRole('treeitem', { name: '3.tex' })
  84. // click item 1: it gets selected
  85. fireEvent.click(treeitem1)
  86. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  87. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  88. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  89. // click on item 2: it gets selected and item 1 is not selected anymore
  90. fireEvent.click(treeitem2)
  91. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  92. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  93. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  94. // meta-click on item 3: it gets selected and item 2 as well
  95. fireEvent.click(treeitem3, { ctrlKey: true })
  96. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  97. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  98. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  99. // meta-click on item 1: add to selection
  100. fireEvent.click(treeitem1, { ctrlKey: true })
  101. screen.getByRole('treeitem', { name: '1.tex', selected: true })
  102. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  103. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  104. // meta-click on item 1: remove from selection
  105. fireEvent.click(treeitem1, { ctrlKey: true })
  106. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  107. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  108. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  109. // meta-click on item 3: remove from selection
  110. fireEvent.click(treeitem3, { ctrlKey: true })
  111. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  112. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  113. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  114. // meta-click on item 2: cannot unselect
  115. fireEvent.click(treeitem2, { ctrlKey: true })
  116. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  117. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  118. screen.getByRole('treeitem', { name: '3.tex', selected: false })
  119. // meta-click on item 3: add back to selection
  120. fireEvent.click(treeitem3, { ctrlKey: true })
  121. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  122. screen.getByRole('treeitem', { name: '2.tex', selected: true })
  123. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  124. // click on item 3: unselect other items
  125. fireEvent.click(treeitem3)
  126. screen.getByRole('treeitem', { name: '1.tex', selected: false })
  127. screen.getByRole('treeitem', { name: '2.tex', selected: false })
  128. screen.getByRole('treeitem', { name: '3.tex', selected: true })
  129. })
  130. })
  131. })