@pranaysahith/decap-cms-core 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +9 -0
  2. package/dist/@pranaysahith/decap-cms-core.js +52 -0
  3. package/dist/@pranaysahith/decap-cms-core.js.LICENSE.txt +141 -0
  4. package/dist/@pranaysahith/decap-cms-core.js.map +1 -0
  5. package/dist/decap-cms-core.js +47 -0
  6. package/dist/decap-cms-core.js.LICENSE.txt +116 -0
  7. package/dist/decap-cms-core.js.map +1 -0
  8. package/dist/esm/actions/auth.js +97 -0
  9. package/dist/esm/actions/collections.js +15 -0
  10. package/dist/esm/actions/config.js +493 -0
  11. package/dist/esm/actions/deploys.js +79 -0
  12. package/dist/esm/actions/editorialWorkflow.js +480 -0
  13. package/dist/esm/actions/entries.js +865 -0
  14. package/dist/esm/actions/media.js +147 -0
  15. package/dist/esm/actions/mediaLibrary.js +552 -0
  16. package/dist/esm/actions/notifications.js +21 -0
  17. package/dist/esm/actions/search.js +149 -0
  18. package/dist/esm/actions/status.js +74 -0
  19. package/dist/esm/actions/waitUntil.js +32 -0
  20. package/dist/esm/backend.js +1082 -0
  21. package/dist/esm/bootstrap.js +101 -0
  22. package/dist/esm/components/App/App.js +289 -0
  23. package/dist/esm/components/App/Header.js +172 -0
  24. package/dist/esm/components/App/NotFoundPage.js +19 -0
  25. package/dist/esm/components/Collection/Collection.js +198 -0
  26. package/dist/esm/components/Collection/CollectionControls.js +46 -0
  27. package/dist/esm/components/Collection/CollectionSearch.js +222 -0
  28. package/dist/esm/components/Collection/CollectionTop.js +68 -0
  29. package/dist/esm/components/Collection/ControlButton.js +17 -0
  30. package/dist/esm/components/Collection/Entries/Entries.js +73 -0
  31. package/dist/esm/components/Collection/Entries/EntriesCollection.js +241 -0
  32. package/dist/esm/components/Collection/Entries/EntriesSearch.js +113 -0
  33. package/dist/esm/components/Collection/Entries/EntryCard.js +177 -0
  34. package/dist/esm/components/Collection/Entries/EntryListing.js +143 -0
  35. package/dist/esm/components/Collection/FilterControl.js +33 -0
  36. package/dist/esm/components/Collection/FolderRenameControl.js +403 -0
  37. package/dist/esm/components/Collection/GroupControl.js +33 -0
  38. package/dist/esm/components/Collection/NestedCollection.js +308 -0
  39. package/dist/esm/components/Collection/Sidebar.js +91 -0
  40. package/dist/esm/components/Collection/SortControl.js +59 -0
  41. package/dist/esm/components/Collection/ViewStyleControl.js +38 -0
  42. package/dist/esm/components/Editor/Editor.js +466 -0
  43. package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +395 -0
  44. package/dist/esm/components/Editor/EditorControlPane/EditorControlPane.js +254 -0
  45. package/dist/esm/components/Editor/EditorControlPane/Widget.js +374 -0
  46. package/dist/esm/components/Editor/EditorInterface.js +386 -0
  47. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreview.js +47 -0
  48. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewContent.js +66 -0
  49. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewPane.js +288 -0
  50. package/dist/esm/components/Editor/EditorPreviewPane/PreviewHOC.js +27 -0
  51. package/dist/esm/components/Editor/EditorToolbar.js +536 -0
  52. package/dist/esm/components/Editor/EntryPathEditor.js +272 -0
  53. package/dist/esm/components/Editor/withWorkflow.js +56 -0
  54. package/dist/esm/components/EditorWidgets/Unknown/UnknownControl.js +18 -0
  55. package/dist/esm/components/EditorWidgets/Unknown/UnknownPreview.js +20 -0
  56. package/dist/esm/components/EditorWidgets/index.js +4 -0
  57. package/dist/esm/components/MediaLibrary/EmptyMessage.js +22 -0
  58. package/dist/esm/components/MediaLibrary/MediaLibrary.js +446 -0
  59. package/dist/esm/components/MediaLibrary/MediaLibraryButtons.js +93 -0
  60. package/dist/esm/components/MediaLibrary/MediaLibraryCard.js +99 -0
  61. package/dist/esm/components/MediaLibrary/MediaLibraryCardGrid.js +198 -0
  62. package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +32 -0
  63. package/dist/esm/components/MediaLibrary/MediaLibraryModal.js +156 -0
  64. package/dist/esm/components/MediaLibrary/MediaLibrarySearch.js +51 -0
  65. package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +123 -0
  66. package/dist/esm/components/UI/DragDrop.js +67 -0
  67. package/dist/esm/components/UI/ErrorBoundary.js +173 -0
  68. package/dist/esm/components/UI/FileUploadButton.js +27 -0
  69. package/dist/esm/components/UI/Modal.js +104 -0
  70. package/dist/esm/components/UI/Notifications.js +62 -0
  71. package/dist/esm/components/UI/SettingsDropdown.js +107 -0
  72. package/dist/esm/components/UI/index.js +6 -0
  73. package/dist/esm/components/Workflow/Workflow.js +133 -0
  74. package/dist/esm/components/Workflow/WorkflowCard.js +128 -0
  75. package/dist/esm/components/Workflow/WorkflowList.js +204 -0
  76. package/dist/esm/constants/collectionTypes.js +2 -0
  77. package/dist/esm/constants/collectionViews.js +2 -0
  78. package/dist/esm/constants/commitProps.js +2 -0
  79. package/dist/esm/constants/configSchema.js +644 -0
  80. package/dist/esm/constants/fieldInference.js +57 -0
  81. package/dist/esm/constants/publishModes.js +18 -0
  82. package/dist/esm/constants/validationErrorTypes.js +6 -0
  83. package/dist/esm/formats/formats.js +83 -0
  84. package/dist/esm/formats/frontmatter.js +146 -0
  85. package/dist/esm/formats/helpers.js +12 -0
  86. package/dist/esm/formats/json.js +8 -0
  87. package/dist/esm/formats/toml.js +32 -0
  88. package/dist/esm/formats/yaml.js +51 -0
  89. package/dist/esm/index.js +7 -0
  90. package/dist/esm/integrations/index.js +28 -0
  91. package/dist/esm/integrations/providers/algolia/implementation.js +174 -0
  92. package/dist/esm/integrations/providers/assetStore/implementation.js +165 -0
  93. package/dist/esm/lib/consoleError.js +3 -0
  94. package/dist/esm/lib/formatters.js +191 -0
  95. package/dist/esm/lib/i18n.js +367 -0
  96. package/dist/esm/lib/phrases.js +6 -0
  97. package/dist/esm/lib/polyfill.js +8 -0
  98. package/dist/esm/lib/registry.js +329 -0
  99. package/dist/esm/lib/serializeEntryValues.js +67 -0
  100. package/dist/esm/lib/stega.js +142 -0
  101. package/dist/esm/lib/textHelper.js +9 -0
  102. package/dist/esm/lib/urlHelper.js +111 -0
  103. package/dist/esm/mediaLibrary.js +37 -0
  104. package/dist/esm/reducers/auth.js +27 -0
  105. package/dist/esm/reducers/collections.js +428 -0
  106. package/dist/esm/reducers/combinedReducer.js +8 -0
  107. package/dist/esm/reducers/config.js +29 -0
  108. package/dist/esm/reducers/cursors.js +31 -0
  109. package/dist/esm/reducers/deploys.js +45 -0
  110. package/dist/esm/reducers/editorialWorkflow.js +83 -0
  111. package/dist/esm/reducers/entries.js +568 -0
  112. package/dist/esm/reducers/entryDraft.js +212 -0
  113. package/dist/esm/reducers/globalUI.js +25 -0
  114. package/dist/esm/reducers/index.js +66 -0
  115. package/dist/esm/reducers/integrations.js +53 -0
  116. package/dist/esm/reducers/mediaLibrary.js +252 -0
  117. package/dist/esm/reducers/medias.js +68 -0
  118. package/dist/esm/reducers/notifications.js +23 -0
  119. package/dist/esm/reducers/search.js +92 -0
  120. package/dist/esm/reducers/status.js +30 -0
  121. package/dist/esm/redux/index.js +7 -0
  122. package/dist/esm/redux/middleware/waitUntilAction.js +48 -0
  123. package/dist/esm/routing/history.js +12 -0
  124. package/dist/esm/types/diacritics.d.js +0 -0
  125. package/dist/esm/types/global.d.js +1 -0
  126. package/dist/esm/types/immutable.js +7 -0
  127. package/dist/esm/types/redux.js +14 -0
  128. package/dist/esm/types/tomlify-j0.4.d.js +0 -0
  129. package/dist/esm/valueObjects/AssetProxy.js +44 -0
  130. package/dist/esm/valueObjects/EditorComponent.js +34 -0
  131. package/dist/esm/valueObjects/Entry.js +20 -0
  132. package/index.d.ts +618 -0
  133. package/package.json +106 -0
  134. package/src/__tests__/backend.spec.js +1161 -0
  135. package/src/actions/__tests__/config.spec.js +1009 -0
  136. package/src/actions/__tests__/editorialWorkflow.spec.js +216 -0
  137. package/src/actions/__tests__/entries.spec.js +596 -0
  138. package/src/actions/__tests__/media.spec.ts +171 -0
  139. package/src/actions/__tests__/mediaLibrary.spec.js +327 -0
  140. package/src/actions/__tests__/search.spec.js +209 -0
  141. package/src/actions/auth.ts +127 -0
  142. package/src/actions/collections.ts +18 -0
  143. package/src/actions/config.ts +565 -0
  144. package/src/actions/deploys.ts +104 -0
  145. package/src/actions/editorialWorkflow.ts +567 -0
  146. package/src/actions/entries.ts +1055 -0
  147. package/src/actions/media.ts +139 -0
  148. package/src/actions/mediaLibrary.ts +574 -0
  149. package/src/actions/notifications.ts +36 -0
  150. package/src/actions/search.ts +221 -0
  151. package/src/actions/status.ts +99 -0
  152. package/src/actions/waitUntil.ts +49 -0
  153. package/src/backend.ts +1400 -0
  154. package/src/bootstrap.js +104 -0
  155. package/src/components/App/App.js +286 -0
  156. package/src/components/App/Header.js +266 -0
  157. package/src/components/App/NotFoundPage.js +23 -0
  158. package/src/components/Collection/Collection.js +210 -0
  159. package/src/components/Collection/CollectionControls.js +58 -0
  160. package/src/components/Collection/CollectionSearch.js +243 -0
  161. package/src/components/Collection/CollectionTop.js +81 -0
  162. package/src/components/Collection/ControlButton.js +27 -0
  163. package/src/components/Collection/Entries/Entries.js +82 -0
  164. package/src/components/Collection/Entries/EntriesCollection.js +277 -0
  165. package/src/components/Collection/Entries/EntriesSearch.js +102 -0
  166. package/src/components/Collection/Entries/EntryCard.js +246 -0
  167. package/src/components/Collection/Entries/EntryListing.js +151 -0
  168. package/src/components/Collection/Entries/__tests__/EntriesCollection.spec.js +163 -0
  169. package/src/components/Collection/Entries/__tests__/__snapshots__/EntriesCollection.spec.js.snap +46 -0
  170. package/src/components/Collection/FilterControl.js +39 -0
  171. package/src/components/Collection/GroupControl.js +39 -0
  172. package/src/components/Collection/NestedCollection.js +330 -0
  173. package/src/components/Collection/Sidebar.js +136 -0
  174. package/src/components/Collection/SortControl.js +68 -0
  175. package/src/components/Collection/ViewStyleControl.js +50 -0
  176. package/src/components/Collection/__tests__/Collection.spec.js +75 -0
  177. package/src/components/Collection/__tests__/NestedCollection.spec.js +445 -0
  178. package/src/components/Collection/__tests__/Sidebar.spec.js +87 -0
  179. package/src/components/Collection/__tests__/__snapshots__/Collection.spec.js.snap +144 -0
  180. package/src/components/Collection/__tests__/__snapshots__/NestedCollection.spec.js.snap +550 -0
  181. package/src/components/Collection/__tests__/__snapshots__/Sidebar.spec.js.snap +312 -0
  182. package/src/components/Editor/Editor.js +497 -0
  183. package/src/components/Editor/EditorControlPane/EditorControl.js +452 -0
  184. package/src/components/Editor/EditorControlPane/EditorControlPane.js +269 -0
  185. package/src/components/Editor/EditorControlPane/Widget.js +384 -0
  186. package/src/components/Editor/EditorInterface.js +444 -0
  187. package/src/components/Editor/EditorPreviewPane/EditorPreview.js +40 -0
  188. package/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js +74 -0
  189. package/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js +333 -0
  190. package/src/components/Editor/EditorPreviewPane/PreviewHOC.js +33 -0
  191. package/src/components/Editor/EditorToolbar.js +691 -0
  192. package/src/components/Editor/__tests__/Editor.spec.js +221 -0
  193. package/src/components/Editor/__tests__/EditorToolbar.spec.js +120 -0
  194. package/src/components/Editor/__tests__/__snapshots__/Editor.spec.js.snap +45 -0
  195. package/src/components/Editor/__tests__/__snapshots__/EditorToolbar.spec.js.snap +4233 -0
  196. package/src/components/Editor/withWorkflow.js +61 -0
  197. package/src/components/EditorWidgets/Unknown/UnknownControl.js +17 -0
  198. package/src/components/EditorWidgets/Unknown/UnknownPreview.js +19 -0
  199. package/src/components/EditorWidgets/index.js +5 -0
  200. package/src/components/MediaLibrary/EmptyMessage.js +28 -0
  201. package/src/components/MediaLibrary/MediaLibrary.js +411 -0
  202. package/src/components/MediaLibrary/MediaLibraryButtons.js +136 -0
  203. package/src/components/MediaLibrary/MediaLibraryCard.js +128 -0
  204. package/src/components/MediaLibrary/MediaLibraryCardGrid.js +199 -0
  205. package/src/components/MediaLibrary/MediaLibraryHeader.js +48 -0
  206. package/src/components/MediaLibrary/MediaLibraryModal.js +200 -0
  207. package/src/components/MediaLibrary/MediaLibrarySearch.js +61 -0
  208. package/src/components/MediaLibrary/MediaLibraryTop.js +143 -0
  209. package/src/components/MediaLibrary/__tests__/MediaLibraryButtons.spec.js +45 -0
  210. package/src/components/MediaLibrary/__tests__/MediaLibraryCard.spec.js +49 -0
  211. package/src/components/MediaLibrary/__tests__/__snapshots__/MediaLibraryCard.spec.js.snap +264 -0
  212. package/src/components/UI/DragDrop.js +66 -0
  213. package/src/components/UI/ErrorBoundary.js +214 -0
  214. package/src/components/UI/FileUploadButton.js +24 -0
  215. package/src/components/UI/Modal.js +112 -0
  216. package/src/components/UI/Notifications.tsx +83 -0
  217. package/src/components/UI/SettingsDropdown.js +103 -0
  218. package/src/components/UI/__tests__/ErrorBoundary.spec.js +57 -0
  219. package/src/components/UI/index.js +6 -0
  220. package/src/components/Workflow/Workflow.js +169 -0
  221. package/src/components/Workflow/WorkflowCard.js +177 -0
  222. package/src/components/Workflow/WorkflowList.js +272 -0
  223. package/src/constants/__tests__/configSchema.spec.js +611 -0
  224. package/src/constants/collectionTypes.ts +2 -0
  225. package/src/constants/collectionViews.js +2 -0
  226. package/src/constants/commitProps.ts +2 -0
  227. package/src/constants/configSchema.js +441 -0
  228. package/src/constants/fieldInference.tsx +78 -0
  229. package/src/constants/publishModes.ts +22 -0
  230. package/src/constants/validationErrorTypes.js +6 -0
  231. package/src/formats/__tests__/formats.spec.js +87 -0
  232. package/src/formats/__tests__/frontmatter.spec.js +429 -0
  233. package/src/formats/__tests__/toml.spec.js +9 -0
  234. package/src/formats/__tests__/yaml.spec.js +162 -0
  235. package/src/formats/formats.ts +97 -0
  236. package/src/formats/frontmatter.ts +150 -0
  237. package/src/formats/helpers.ts +14 -0
  238. package/src/formats/json.ts +9 -0
  239. package/src/formats/toml.ts +33 -0
  240. package/src/formats/yaml.ts +58 -0
  241. package/src/index.js +8 -0
  242. package/src/integrations/index.js +35 -0
  243. package/src/integrations/providers/algolia/implementation.js +176 -0
  244. package/src/integrations/providers/assetStore/implementation.js +148 -0
  245. package/src/lib/__tests__/formatters.spec.js +751 -0
  246. package/src/lib/__tests__/i18n.spec.js +792 -0
  247. package/src/lib/__tests__/phrases.spec.js +119 -0
  248. package/src/lib/__tests__/registry.spec.js +261 -0
  249. package/src/lib/__tests__/serializeEntryValues.spec.js +22 -0
  250. package/src/lib/__tests__/urlHelper.spec.js +138 -0
  251. package/src/lib/consoleError.js +7 -0
  252. package/src/lib/formatters.ts +286 -0
  253. package/src/lib/i18n.ts +454 -0
  254. package/src/lib/phrases.js +8 -0
  255. package/src/lib/polyfill.js +9 -0
  256. package/src/lib/registry.js +312 -0
  257. package/src/lib/serializeEntryValues.js +75 -0
  258. package/src/lib/stega.ts +145 -0
  259. package/src/lib/textHelper.js +11 -0
  260. package/src/lib/urlHelper.ts +128 -0
  261. package/src/mediaLibrary.ts +51 -0
  262. package/src/reducers/__tests__/auth.spec.ts +38 -0
  263. package/src/reducers/__tests__/collections.spec.js +610 -0
  264. package/src/reducers/__tests__/config.spec.js +38 -0
  265. package/src/reducers/__tests__/entries.spec.js +694 -0
  266. package/src/reducers/__tests__/entryDraft.spec.js +297 -0
  267. package/src/reducers/__tests__/globalUI.js +43 -0
  268. package/src/reducers/__tests__/integrations.spec.ts +76 -0
  269. package/src/reducers/__tests__/mediaLibrary.spec.js +154 -0
  270. package/src/reducers/__tests__/medias.spec.ts +49 -0
  271. package/src/reducers/auth.ts +46 -0
  272. package/src/reducers/collections.ts +535 -0
  273. package/src/reducers/combinedReducer.ts +11 -0
  274. package/src/reducers/config.ts +38 -0
  275. package/src/reducers/cursors.js +36 -0
  276. package/src/reducers/deploys.ts +52 -0
  277. package/src/reducers/editorialWorkflow.ts +163 -0
  278. package/src/reducers/entries.ts +819 -0
  279. package/src/reducers/entryDraft.js +260 -0
  280. package/src/reducers/globalUI.ts +45 -0
  281. package/src/reducers/index.ts +82 -0
  282. package/src/reducers/integrations.ts +59 -0
  283. package/src/reducers/mediaLibrary.ts +296 -0
  284. package/src/reducers/medias.ts +66 -0
  285. package/src/reducers/notifications.ts +52 -0
  286. package/src/reducers/search.ts +111 -0
  287. package/src/reducers/status.ts +40 -0
  288. package/src/redux/index.ts +18 -0
  289. package/src/redux/middleware/waitUntilAction.ts +64 -0
  290. package/src/routing/__tests__/history.spec.ts +49 -0
  291. package/src/routing/history.ts +17 -0
  292. package/src/types/diacritics.d.ts +1 -0
  293. package/src/types/global.d.ts +8 -0
  294. package/src/types/immutable.ts +49 -0
  295. package/src/types/redux.ts +827 -0
  296. package/src/types/tomlify-j0.4.d.ts +13 -0
  297. package/src/valueObjects/AssetProxy.ts +48 -0
  298. package/src/valueObjects/EditorComponent.js +38 -0
  299. package/src/valueObjects/Entry.ts +63 -0
@@ -0,0 +1,221 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import { fromJS } from 'immutable';
4
+
5
+ import { Editor } from '../Editor';
6
+
7
+ jest.mock('lodash/debounce', () => {
8
+ const flush = jest.fn();
9
+ return func => {
10
+ func.flush = flush;
11
+ return func;
12
+ };
13
+ });
14
+ // eslint-disable-next-line react/display-name
15
+ jest.mock('../EditorInterface', () => props => <mock-editor-interface {...props} />);
16
+ jest.mock('decap-cms-ui-default', () => {
17
+ return {
18
+ // eslint-disable-next-line react/display-name
19
+ Loader: props => <mock-loader {...props} />,
20
+ };
21
+ });
22
+ jest.mock('../../../routing/history');
23
+
24
+ describe('Editor', () => {
25
+ const props = {
26
+ boundGetAsset: jest.fn(),
27
+ changeDraftField: jest.fn(),
28
+ changeDraftFieldValidation: jest.fn(),
29
+ collection: fromJS({ name: 'posts' }),
30
+ createDraftDuplicateFromEntry: jest.fn(),
31
+ createEmptyDraft: jest.fn(),
32
+ discardDraft: jest.fn(),
33
+ entry: fromJS({}),
34
+ entryDraft: fromJS({}),
35
+ loadEntry: jest.fn(),
36
+ persistEntry: jest.fn(),
37
+ deleteEntry: jest.fn(),
38
+ showDelete: true,
39
+ fields: fromJS([]),
40
+ slug: 'slug',
41
+ newEntry: true,
42
+ updateUnpublishedEntryStatus: jest.fn(),
43
+ publishUnpublishedEntry: jest.fn(),
44
+ deleteUnpublishedEntry: jest.fn(),
45
+ logoutUser: jest.fn(),
46
+ loadEntries: jest.fn(),
47
+ deployPreview: fromJS({}),
48
+ loadDeployPreview: jest.fn(),
49
+ user: fromJS({}),
50
+ t: jest.fn(key => key),
51
+ localBackup: fromJS({}),
52
+ retrieveLocalBackup: jest.fn(),
53
+ persistLocalBackup: jest.fn(),
54
+ location: { search: '?title=title' },
55
+ };
56
+
57
+ beforeEach(() => {
58
+ jest.clearAllMocks();
59
+ });
60
+
61
+ it('should render loader when entryDraft is null', () => {
62
+ // suppress prop type error
63
+ jest.spyOn(console, 'error').mockImplementation(() => {});
64
+ const { asFragment } = render(<Editor {...props} entryDraft={null} />);
65
+ expect(asFragment()).toMatchSnapshot();
66
+ expect(console.error).toHaveBeenCalledTimes(1);
67
+ expect(console.error).toHaveBeenCalledWith(
68
+ expect.stringContaining(
69
+ 'Warning: Failed prop type: Required prop `entryDraft` was not specified in `Editor`.',
70
+ ),
71
+ );
72
+ });
73
+
74
+ it('should render loader when entryDraft entry is undefined', () => {
75
+ const { asFragment } = render(<Editor {...props} entryDraft={fromJS({})} />);
76
+ expect(asFragment()).toMatchSnapshot();
77
+ });
78
+
79
+ it('should render loader when entry is fetching', () => {
80
+ const { asFragment } = render(
81
+ <Editor {...props} entryDraft={fromJS({ entry: {} })} entry={fromJS({ isFetching: true })} />,
82
+ );
83
+ expect(asFragment()).toMatchSnapshot();
84
+ });
85
+
86
+ it('should render editor interface when entry is not fetching', () => {
87
+ const { asFragment } = render(
88
+ <Editor
89
+ {...props}
90
+ entryDraft={fromJS({ entry: { slug: 'slug' } })}
91
+ entry={fromJS({ isFetching: false })}
92
+ />,
93
+ );
94
+ expect(asFragment()).toMatchSnapshot();
95
+ });
96
+
97
+ it('should call retrieveLocalBackup on mount', () => {
98
+ render(
99
+ <Editor
100
+ {...props}
101
+ entryDraft={fromJS({ entry: { slug: 'slug' } })}
102
+ entry={fromJS({ isFetching: false })}
103
+ />,
104
+ );
105
+
106
+ expect(props.retrieveLocalBackup).toHaveBeenCalledTimes(1);
107
+ expect(props.retrieveLocalBackup).toHaveBeenCalledWith(props.collection, props.slug);
108
+ });
109
+
110
+ it('should create new draft on new entry when mounting', () => {
111
+ render(
112
+ <Editor
113
+ {...props}
114
+ entryDraft={fromJS({ entry: { slug: 'slug' } })}
115
+ entry={fromJS({ isFetching: false })}
116
+ newEntry={true}
117
+ />,
118
+ );
119
+
120
+ expect(props.createEmptyDraft).toHaveBeenCalledTimes(1);
121
+ expect(props.createEmptyDraft).toHaveBeenCalledWith(props.collection, '?title=title');
122
+ expect(props.loadEntry).toHaveBeenCalledTimes(0);
123
+ });
124
+
125
+ it('should load entry on existing entry when mounting', () => {
126
+ render(
127
+ <Editor
128
+ {...props}
129
+ entryDraft={fromJS({ entry: { slug: 'slug' } })}
130
+ entry={fromJS({ isFetching: false })}
131
+ newEntry={false}
132
+ />,
133
+ );
134
+
135
+ expect(props.createEmptyDraft).toHaveBeenCalledTimes(0);
136
+ expect(props.loadEntry).toHaveBeenCalledTimes(1);
137
+ expect(props.loadEntry).toHaveBeenCalledWith(props.collection, 'slug');
138
+ });
139
+
140
+ it('should load entries when entries are not loaded when mounting', () => {
141
+ render(
142
+ <Editor
143
+ {...props}
144
+ entryDraft={fromJS({ entry: { slug: 'slug' } })}
145
+ entry={fromJS({ isFetching: false })}
146
+ collectionEntriesLoaded={false}
147
+ />,
148
+ );
149
+
150
+ expect(props.loadEntries).toHaveBeenCalledTimes(1);
151
+ expect(props.loadEntries).toHaveBeenCalledWith(props.collection);
152
+ });
153
+
154
+ it('should not load entries when entries are loaded when mounting', () => {
155
+ render(
156
+ <Editor
157
+ {...props}
158
+ entryDraft={fromJS({ entry: { slug: 'slug' } })}
159
+ entry={fromJS({ isFetching: false })}
160
+ collectionEntriesLoaded={true}
161
+ />,
162
+ );
163
+
164
+ expect(props.loadEntries).toHaveBeenCalledTimes(0);
165
+ });
166
+
167
+ it('should flush debounce createBackup, discard draft and remove exit blocker on umount', () => {
168
+ window.removeEventListener = jest.fn();
169
+ const debounce = require('lodash/debounce');
170
+
171
+ const flush = debounce({}).flush;
172
+ const { unmount } = render(
173
+ <Editor
174
+ {...props}
175
+ entryDraft={fromJS({ entry: { slug: 'slug' }, hasChanged: true })}
176
+ entry={fromJS({ isFetching: false })}
177
+ />,
178
+ );
179
+
180
+ jest.clearAllMocks();
181
+ unmount();
182
+
183
+ expect(flush).toHaveBeenCalledTimes(1);
184
+ expect(props.discardDraft).toHaveBeenCalledTimes(1);
185
+ expect(window.removeEventListener).toHaveBeenCalledWith('beforeunload', expect.any(Function));
186
+
187
+ const callback = window.removeEventListener.mock.calls.find(
188
+ call => call[0] === 'beforeunload',
189
+ )[1];
190
+
191
+ const event = {};
192
+ callback(event);
193
+ expect(event).toEqual({ returnValue: 'editor.editor.onLeavePage' });
194
+ });
195
+
196
+ it('should persist backup when changed', () => {
197
+ const { rerender } = render(
198
+ <Editor
199
+ {...props}
200
+ entryDraft={fromJS({ entry: {} })}
201
+ entry={fromJS({ isFetching: false })}
202
+ />,
203
+ );
204
+
205
+ jest.clearAllMocks();
206
+ rerender(
207
+ <Editor
208
+ {...props}
209
+ entryDraft={fromJS({ entry: { mediaFiles: [{ id: '1' }] } })}
210
+ entry={fromJS({ isFetching: false, data: {} })}
211
+ hasChanged={true}
212
+ />,
213
+ );
214
+
215
+ expect(props.persistLocalBackup).toHaveBeenCalledTimes(1);
216
+ expect(props.persistLocalBackup).toHaveBeenCalledWith(
217
+ fromJS({ mediaFiles: [{ id: '1' }] }),
218
+ props.collection,
219
+ );
220
+ });
221
+ });
@@ -0,0 +1,120 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import { fromJS } from 'immutable';
4
+
5
+ import { EditorToolbar } from '../EditorToolbar';
6
+
7
+ jest.mock('../../UI', () => ({
8
+ // eslint-disable-next-line react/display-name
9
+ SettingsDropdown: props => <mock-settings-dropdown {...props} />,
10
+ }));
11
+ jest.mock('react-router-dom', () => {
12
+ return {
13
+ // eslint-disable-next-line react/display-name
14
+ Link: props => <mock-link {...props} />,
15
+ };
16
+ });
17
+
18
+ describe('EditorToolbar', () => {
19
+ const props = {
20
+ isPersisting: false,
21
+ isPublishing: false,
22
+ isUpdatingStatus: false,
23
+ isDeleting: false,
24
+ onPersist: jest.fn(),
25
+ onPersistAndNew: jest.fn(),
26
+ onPersistAndDuplicate: jest.fn(),
27
+ showDelete: true,
28
+ onDelete: jest.fn(),
29
+ onDeleteUnpublishedChanges: jest.fn(),
30
+ onChangeStatus: jest.fn(),
31
+ onPublish: jest.fn(),
32
+ unPublish: jest.fn(),
33
+ onDuplicate: jest.fn(),
34
+ onPublishAndNew: jest.fn(),
35
+ onPublishAndDuplicate: jest.fn(),
36
+ hasChanged: false,
37
+ collection: fromJS({ name: 'posts' }),
38
+ hasWorkflow: false,
39
+ useOpenAuthoring: false,
40
+ hasUnpublishedChanges: false,
41
+ isNewEntry: false,
42
+ isModification: false,
43
+ onLogoutClick: jest.fn(),
44
+ loadDeployPreview: jest.fn(),
45
+ t: jest.fn(key => key),
46
+ editorBackLink: '',
47
+ };
48
+
49
+ beforeEach(() => {
50
+ jest.clearAllMocks();
51
+ });
52
+
53
+ it('should render with default props', () => {
54
+ const { asFragment } = render(<EditorToolbar {...props} />);
55
+ expect(asFragment()).toMatchSnapshot();
56
+ });
57
+
58
+ [false, true].forEach(useOpenAuthoring => {
59
+ it(`should render with workflow controls hasUnpublishedChanges=true,isNewEntry=false,isModification=true,useOpenAuthoring=${useOpenAuthoring}`, () => {
60
+ const { asFragment } = render(
61
+ <EditorToolbar
62
+ {...props}
63
+ hasWorkflow={true}
64
+ hasUnpublishedChanges={true}
65
+ isNewEntry={false}
66
+ isModification={true}
67
+ useOpenAuthoring={useOpenAuthoring}
68
+ />,
69
+ );
70
+ expect(asFragment()).toMatchSnapshot();
71
+ });
72
+
73
+ it(`should render with workflow controls hasUnpublishedChanges=true,isNewEntry=false,isModification=false,useOpenAuthoring=${useOpenAuthoring}`, () => {
74
+ const { asFragment } = render(
75
+ <EditorToolbar
76
+ {...props}
77
+ hasWorkflow={true}
78
+ hasUnpublishedChanges={true}
79
+ isNewEntry={false}
80
+ isModification={false}
81
+ useOpenAuthoring={useOpenAuthoring}
82
+ />,
83
+ );
84
+ expect(asFragment()).toMatchSnapshot();
85
+ });
86
+
87
+ it(`should render with workflow controls hasUnpublishedChanges=false,isNewEntry=false,isModification=false,useOpenAuthoring=${useOpenAuthoring}`, () => {
88
+ const { asFragment } = render(
89
+ <EditorToolbar
90
+ {...props}
91
+ hasWorkflow={true}
92
+ hasUnpublishedChanges={false}
93
+ isNewEntry={false}
94
+ isModification={false}
95
+ useOpenAuthoring={useOpenAuthoring}
96
+ />,
97
+ );
98
+ expect(asFragment()).toMatchSnapshot();
99
+ });
100
+
101
+ ['draft', 'pending_review', 'pending_publish'].forEach(status => {
102
+ it(`should render with status=${status},useOpenAuthoring=${useOpenAuthoring}`, () => {
103
+ const { asFragment } = render(
104
+ <EditorToolbar
105
+ {...props}
106
+ hasWorkflow={true}
107
+ currentStatus={status}
108
+ useOpenAuthoring={useOpenAuthoring}
109
+ />,
110
+ );
111
+ expect(asFragment()).toMatchSnapshot();
112
+ });
113
+ });
114
+
115
+ it(`should render normal save button`, () => {
116
+ const { asFragment } = render(<EditorToolbar {...props} hasChanged={true} />);
117
+ expect(asFragment()).toMatchSnapshot();
118
+ });
119
+ });
120
+ });
@@ -0,0 +1,45 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Editor should render editor interface when entry is not fetching 1`] = `
4
+ <DocumentFragment>
5
+ <mock-editor-interface
6
+ collection="Map { \\"name\\": \\"posts\\" }"
7
+ deploypreview="Map {}"
8
+ entry="Map { \\"slug\\": \\"slug\\" }"
9
+ fields="List []"
10
+ isnewentry=""
11
+ showdelete=""
12
+ user="Map {}"
13
+ />
14
+ </DocumentFragment>
15
+ `;
16
+
17
+ exports[`Editor should render loader when entry is fetching 1`] = `
18
+ <DocumentFragment>
19
+ <mock-loader
20
+ active=""
21
+ >
22
+ editor.editor.loadingEntry
23
+ </mock-loader>
24
+ </DocumentFragment>
25
+ `;
26
+
27
+ exports[`Editor should render loader when entryDraft entry is undefined 1`] = `
28
+ <DocumentFragment>
29
+ <mock-loader
30
+ active=""
31
+ >
32
+ editor.editor.loadingEntry
33
+ </mock-loader>
34
+ </DocumentFragment>
35
+ `;
36
+
37
+ exports[`Editor should render loader when entryDraft is null 1`] = `
38
+ <DocumentFragment>
39
+ <mock-loader
40
+ active=""
41
+ >
42
+ editor.editor.loadingEntry
43
+ </mock-loader>
44
+ </DocumentFragment>
45
+ `;