context-menu.spec.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import FileTreeRoot from '../../../../../frontend/js/features/file-tree/components/file-tree-root'
  2. import { EditorProviders } from '../../../helpers/editor-providers'
  3. describe('FileTree Context Menu Flow', function () {
  4. beforeEach(function () {
  5. cy.window().then(win => {
  6. win.metaAttributesCache.set('ol-user', { id: 'user1' })
  7. })
  8. })
  9. it('opens on contextMenu event', function () {
  10. const rootFolder = [
  11. {
  12. _id: 'root-folder-id',
  13. name: 'rootFolder',
  14. docs: [{ _id: '456def', name: 'main.tex' }],
  15. folders: [],
  16. fileRefs: [],
  17. },
  18. ]
  19. cy.mount(
  20. <EditorProviders
  21. rootFolder={rootFolder as any}
  22. projectId="123abc"
  23. rootDocId="456def"
  24. >
  25. <FileTreeRoot
  26. refProviders={{}}
  27. setRefProviderEnabled={cy.stub()}
  28. setStartedFreeTrial={cy.stub()}
  29. onSelect={cy.stub()}
  30. onInit={cy.stub()}
  31. isConnected
  32. />
  33. </EditorProviders>
  34. )
  35. cy.findByRole('menu').should('not.exist')
  36. cy.findByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu')
  37. cy.findByRole('menu')
  38. })
  39. it('should not open on Shift+right-click', function () {
  40. const rootFolder = [
  41. {
  42. _id: 'root-folder-id',
  43. name: 'rootFolder',
  44. docs: [{ _id: '456def', name: 'main.tex' }],
  45. folders: [],
  46. fileRefs: [],
  47. },
  48. ]
  49. cy.mount(
  50. <EditorProviders
  51. rootFolder={rootFolder as any}
  52. projectId="123abc"
  53. rootDocId="456def"
  54. >
  55. <FileTreeRoot
  56. refProviders={{}}
  57. setRefProviderEnabled={cy.stub()}
  58. setStartedFreeTrial={cy.stub()}
  59. onSelect={cy.stub()}
  60. onInit={cy.stub()}
  61. isConnected
  62. />
  63. </EditorProviders>
  64. )
  65. cy.findByRole('menu').should('not.exist')
  66. cy.findByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu', {
  67. button: 2,
  68. shiftKey: true,
  69. bubbles: true,
  70. cancelable: true,
  71. force: true,
  72. })
  73. cy.findByRole('menu').should('not.exist')
  74. })
  75. it('should close an already-open menu on Shift+right-click', function () {
  76. const rootFolder = [
  77. {
  78. _id: 'root-folder-id',
  79. name: 'rootFolder',
  80. docs: [{ _id: '456def', name: 'main.tex' }],
  81. folders: [],
  82. fileRefs: [],
  83. },
  84. ]
  85. cy.mount(
  86. <EditorProviders
  87. rootFolder={rootFolder as any}
  88. projectId="123abc"
  89. rootDocId="456def"
  90. >
  91. <FileTreeRoot
  92. refProviders={{}}
  93. setRefProviderEnabled={cy.stub()}
  94. setStartedFreeTrial={cy.stub()}
  95. onSelect={cy.stub()}
  96. onInit={cy.stub()}
  97. isConnected
  98. />
  99. </EditorProviders>
  100. )
  101. cy.findByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu')
  102. cy.findByRole('menu').should('exist')
  103. cy.findByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu', {
  104. button: 2,
  105. shiftKey: true,
  106. bubbles: true,
  107. cancelable: true,
  108. force: true,
  109. })
  110. cy.findByRole('menu').should('not.exist')
  111. })
  112. it('closes when a new selection is started', function () {
  113. const rootFolder = [
  114. {
  115. _id: 'root-folder-id',
  116. name: 'rootFolder',
  117. docs: [
  118. { _id: '456def', name: 'main.tex' },
  119. { _id: '456def', name: 'foo.tex' },
  120. ],
  121. folders: [],
  122. fileRefs: [],
  123. },
  124. ]
  125. cy.mount(
  126. <EditorProviders
  127. rootFolder={rootFolder as any}
  128. projectId="123abc"
  129. rootDocId="456def"
  130. >
  131. <FileTreeRoot
  132. refProviders={{}}
  133. setRefProviderEnabled={cy.stub()}
  134. setStartedFreeTrial={cy.stub()}
  135. onSelect={cy.stub()}
  136. onInit={cy.stub()}
  137. isConnected
  138. />
  139. </EditorProviders>
  140. )
  141. cy.findByRole('menu').should('not.exist')
  142. cy.findByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu')
  143. cy.findByRole('menu')
  144. cy.findAllByRole('treeitem', { name: 'foo.tex' }).click()
  145. cy.findByRole('menu').should('not.exist')
  146. })
  147. it("doesn't open in read only mode", function () {
  148. const rootFolder = [
  149. {
  150. _id: 'root-folder-id',
  151. name: 'rootFolder',
  152. docs: [{ _id: '456def', name: 'main.tex' }],
  153. folders: [],
  154. fileRefs: [],
  155. },
  156. ]
  157. cy.mount(
  158. <EditorProviders
  159. rootFolder={rootFolder as any}
  160. projectId="123abc"
  161. rootDocId="456def"
  162. permissionsLevel="readOnly"
  163. >
  164. <FileTreeRoot
  165. refProviders={{}}
  166. setRefProviderEnabled={cy.stub()}
  167. setStartedFreeTrial={cy.stub()}
  168. onSelect={cy.stub()}
  169. onInit={cy.stub()}
  170. isConnected
  171. />
  172. </EditorProviders>
  173. )
  174. cy.findAllByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu')
  175. cy.findByRole('menu').should('not.exist')
  176. })
  177. it('shows "set main document" item when appropriate', function () {
  178. const rootFolder = [
  179. {
  180. _id: 'root-folder-id',
  181. name: 'rootFolder',
  182. docs: [
  183. { _id: 'main-doc', name: 'main.tex' },
  184. { _id: 'other-doc', name: 'other.tex' },
  185. ],
  186. folders: [],
  187. fileRefs: [],
  188. },
  189. ]
  190. cy.mount(
  191. <EditorProviders
  192. rootFolder={rootFolder as any}
  193. projectId="123abc"
  194. rootDocId="main-doc"
  195. >
  196. <FileTreeRoot
  197. refProviders={{}}
  198. setRefProviderEnabled={cy.stub()}
  199. setStartedFreeTrial={cy.stub()}
  200. onSelect={cy.stub()}
  201. onInit={cy.stub()}
  202. isConnected
  203. />
  204. </EditorProviders>
  205. )
  206. cy.findByRole('menu').should('not.exist')
  207. // main.tex is already the main document
  208. cy.findByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu')
  209. cy.findByRole('menu')
  210. .findByRole('menuitem', { name: 'Set as main document' })
  211. .should('not.exist')
  212. // set other.tex as the main document
  213. cy.findByRole('treeitem', { name: 'other.tex' }).click({ force: true })
  214. cy.findByRole('treeitem', { name: 'other.tex' }).trigger('contextmenu')
  215. cy.intercept('POST', '/project/123abc/settings', { statusCode: 204 }).as(
  216. 'update-settings'
  217. )
  218. cy.findByRole('menu')
  219. .findByRole('menuitem', { name: 'Set as main document' })
  220. .click()
  221. cy.wait('@update-settings')
  222. .its('request.body.rootDocId')
  223. .should('eq', 'other-doc')
  224. // main.tex is now not the main document
  225. cy.findByRole('treeitem', { name: 'main.tex' }).trigger('contextmenu')
  226. cy.findByRole('menu').findByRole('menuitem', {
  227. name: 'Set as main document',
  228. })
  229. })
  230. })