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

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