create-folder.spec.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. // @ts-ignore
  2. import MockedSocket from 'socket.io-mock'
  3. import FileTreeRoot from '../../../../../frontend/js/features/file-tree/components/file-tree-root'
  4. import { EditorProviders } from '../../../helpers/editor-providers'
  5. describe('FileTree Create Folder Flow', function () {
  6. beforeEach(function () {
  7. cy.window().then(win => {
  8. win.metaAttributesCache.set('ol-user', { id: 'user1' })
  9. })
  10. })
  11. it('add to root when no files are selected', function () {
  12. const rootFolder = [
  13. {
  14. _id: 'root-folder-id',
  15. name: 'rootFolder',
  16. docs: [{ _id: '456def', name: 'main.tex' }],
  17. folders: [],
  18. fileRefs: [],
  19. },
  20. ]
  21. cy.mount(
  22. <EditorProviders
  23. rootFolder={rootFolder as any}
  24. projectId="123abc"
  25. socket={new MockedSocket()}
  26. >
  27. <FileTreeRoot
  28. refProviders={{}}
  29. reindexReferences={cy.stub()}
  30. setRefProviderEnabled={cy.stub()}
  31. setStartedFreeTrial={cy.stub()}
  32. onSelect={cy.stub()}
  33. onInit={cy.stub()}
  34. isConnected
  35. />
  36. </EditorProviders>
  37. )
  38. const name = 'Foo Bar In Root'
  39. cy.intercept('post', '/project/*/folder', {
  40. body: {
  41. folders: [],
  42. fileRefs: [],
  43. docs: [],
  44. _id: fakeId(),
  45. name,
  46. },
  47. }).as('createFolder')
  48. createFolder(name)
  49. cy.get('@createFolder').its('request.body').should('deep.equal', {
  50. parent_folder_id: 'root-folder-id',
  51. name,
  52. })
  53. cy.window().then(win => {
  54. // @ts-ignore
  55. win._ide.socket.socketClient.emit('reciveNewFolder', 'root-folder-id', {
  56. _id: fakeId(),
  57. name,
  58. docs: [],
  59. fileRefs: [],
  60. folders: [],
  61. })
  62. })
  63. cy.findByRole('treeitem', { name })
  64. })
  65. it('add to folder from folder', function () {
  66. const rootFolder = [
  67. {
  68. _id: 'root-folder-id',
  69. name: 'rootFolder',
  70. docs: [],
  71. folders: [
  72. {
  73. _id: '789ghi',
  74. name: 'thefolder',
  75. docs: [],
  76. fileRefs: [],
  77. folders: [],
  78. },
  79. ],
  80. fileRefs: [],
  81. },
  82. ]
  83. cy.mount(
  84. <EditorProviders
  85. rootFolder={rootFolder as any}
  86. projectId="123abc"
  87. rootDocId="789ghi"
  88. socket={new MockedSocket()}
  89. >
  90. <FileTreeRoot
  91. refProviders={{}}
  92. reindexReferences={cy.stub()}
  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('button', { name: 'Expand' }).click()
  102. const name = 'Foo Bar In thefolder'
  103. cy.intercept('post', '/project/*/folder', {
  104. body: {
  105. folders: [],
  106. fileRefs: [],
  107. docs: [],
  108. _id: fakeId(),
  109. name,
  110. },
  111. }).as('createFolder')
  112. createFolder(name)
  113. cy.get('@createFolder').its('request.body').should('deep.equal', {
  114. parent_folder_id: '789ghi',
  115. name,
  116. })
  117. cy.window().then(win => {
  118. // @ts-ignore
  119. win._ide.socket.socketClient.emit('reciveNewFolder', '789ghi', {
  120. _id: fakeId(),
  121. name,
  122. docs: [],
  123. fileRefs: [],
  124. folders: [],
  125. })
  126. })
  127. // find the created folder
  128. cy.findByRole('treeitem', { name })
  129. // collapse the parent folder; created folder should not be rendered anymore
  130. cy.findByRole('button', { name: 'Collapse' }).click()
  131. cy.findByRole('treeitem', { name }).should('not.exist')
  132. })
  133. it('add to folder from child', function () {
  134. const rootFolder = [
  135. {
  136. _id: 'root-folder-id',
  137. name: 'rootFolder',
  138. docs: [],
  139. folders: [
  140. {
  141. _id: '789ghi',
  142. name: 'thefolder',
  143. docs: [],
  144. fileRefs: [{ _id: '456def', name: 'sub.tex' }],
  145. folders: [],
  146. },
  147. ],
  148. fileRefs: [],
  149. },
  150. ]
  151. cy.mount(
  152. <EditorProviders
  153. rootFolder={rootFolder as any}
  154. projectId="123abc"
  155. rootDocId="456def"
  156. socket={new MockedSocket()}
  157. >
  158. <FileTreeRoot
  159. refProviders={{}}
  160. reindexReferences={cy.stub()}
  161. setRefProviderEnabled={cy.stub()}
  162. setStartedFreeTrial={cy.stub()}
  163. onSelect={cy.stub()}
  164. onInit={cy.stub()}
  165. isConnected
  166. />
  167. </EditorProviders>
  168. )
  169. const name = 'Foo Bar In thefolder'
  170. cy.intercept('post', '/project/*/folder', {
  171. body: {
  172. folders: [],
  173. fileRefs: [],
  174. docs: [],
  175. _id: fakeId(),
  176. name,
  177. },
  178. }).as('createFolder')
  179. createFolder(name)
  180. cy.get('@createFolder').its('request.body').should('deep.equal', {
  181. parent_folder_id: '789ghi',
  182. name,
  183. })
  184. cy.window().then(win => {
  185. // @ts-ignore
  186. win._ide.socket.socketClient.emit('reciveNewFolder', '789ghi', {
  187. _id: fakeId(),
  188. name,
  189. docs: [],
  190. fileRefs: [],
  191. folders: [],
  192. })
  193. })
  194. // find the created folder
  195. cy.findByRole('treeitem', { name })
  196. // collapse the parent folder; created folder should not be rendered anymore
  197. cy.findByRole('button', { name: 'Collapse' }).click()
  198. cy.findByRole('treeitem', { name }).should('not.exist')
  199. })
  200. it('prevents adding duplicate or invalid names', function () {
  201. const rootFolder = [
  202. {
  203. _id: 'root-folder-id',
  204. name: 'rootFolder',
  205. docs: [{ _id: '456def', name: 'existingFile' }],
  206. folders: [],
  207. fileRefs: [],
  208. },
  209. ]
  210. cy.mount(
  211. <EditorProviders
  212. rootFolder={rootFolder as any}
  213. projectId="123abc"
  214. rootDocId="456def"
  215. socket={new MockedSocket()}
  216. >
  217. <FileTreeRoot
  218. refProviders={{}}
  219. reindexReferences={cy.stub()}
  220. setRefProviderEnabled={cy.stub()}
  221. setStartedFreeTrial={cy.stub()}
  222. onSelect={cy.stub()}
  223. onInit={cy.stub()}
  224. isConnected
  225. />
  226. </EditorProviders>
  227. )
  228. const name = 'existingFile'
  229. cy.intercept('post', '/project/*/folder', cy.spy().as('createFolder'))
  230. createFolder(name)
  231. cy.get('@createFolder').should('not.have.been.called')
  232. cy.findByRole('alert', {
  233. name: 'A file or folder with this name already exists',
  234. })
  235. cy.findByRole('textbox').type('in/valid ')
  236. cy.findByRole('alert', {
  237. name: 'File name is empty or contains invalid characters',
  238. })
  239. })
  240. function createFolder(name: string) {
  241. cy.findByRole('button', { name: 'New Folder' }).click()
  242. cy.findByRole('textbox').type(name)
  243. cy.findByRole('button', { name: 'Create' }).click()
  244. }
  245. function fakeId() {
  246. return Math.random().toString(16).replace(/0\./, 'random-test-id-')
  247. }
  248. })