create-folder.spec.tsx 6.6 KB

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