@plone/volto 19.0.0-alpha.0 → 19.0.0-alpha.2

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 (188) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc +2 -0
  3. package/CHANGELOG.md +63 -2
  4. package/locales/ca/LC_MESSAGES/volto.po +15 -0
  5. package/locales/ca.json +1 -1
  6. package/locales/de/LC_MESSAGES/volto.po +15 -0
  7. package/locales/de.json +1 -1
  8. package/locales/en/LC_MESSAGES/volto.po +15 -0
  9. package/locales/en.json +1 -1
  10. package/locales/es/LC_MESSAGES/volto.po +15 -0
  11. package/locales/es.json +1 -1
  12. package/locales/eu/LC_MESSAGES/volto.po +15 -0
  13. package/locales/eu.json +1 -1
  14. package/locales/fi/LC_MESSAGES/volto.po +15 -0
  15. package/locales/fi.json +1 -1
  16. package/locales/fr/LC_MESSAGES/volto.po +15 -0
  17. package/locales/fr.json +1 -1
  18. package/locales/hi/LC_MESSAGES/volto.po +15 -0
  19. package/locales/hi.json +1 -1
  20. package/locales/it/LC_MESSAGES/volto.po +15 -0
  21. package/locales/it.json +1 -1
  22. package/locales/ja/LC_MESSAGES/volto.po +15 -0
  23. package/locales/ja.json +1 -1
  24. package/locales/nl/LC_MESSAGES/volto.po +15 -0
  25. package/locales/nl.json +1 -1
  26. package/locales/pt/LC_MESSAGES/volto.po +15 -0
  27. package/locales/pt.json +1 -1
  28. package/locales/pt_BR/LC_MESSAGES/volto.po +15 -0
  29. package/locales/pt_BR.json +1 -1
  30. package/locales/ro/LC_MESSAGES/volto.po +15 -0
  31. package/locales/ro.json +1 -1
  32. package/locales/ru/LC_MESSAGES/volto.po +15 -0
  33. package/locales/ru.json +1 -1
  34. package/locales/volto.pot +15 -0
  35. package/locales/zh_CN/LC_MESSAGES/volto.po +15 -0
  36. package/locales/zh_CN.json +1 -1
  37. package/package.json +15 -8
  38. package/src/actions/actions/actions.test.js +3 -3
  39. package/src/actions/addons/addons.test.js +15 -12
  40. package/src/actions/aliases/aliases.test.js +1 -1
  41. package/src/actions/querystring/querystring.test.js +2 -2
  42. package/src/actions/types/types.test.js +1 -1
  43. package/src/components/manage/Actions/Actions.test.jsx +5 -1
  44. package/src/components/manage/Add/Add.jsx +22 -20
  45. package/src/components/manage/Add/Add.test.jsx +6 -3
  46. package/src/components/manage/Aliases/Aliases.test.jsx +7 -7
  47. package/src/components/manage/Blocks/Block/BlocksForm.jsx +1 -0
  48. package/src/components/manage/Blocks/Block/BlocksForm.test.jsx +48 -16
  49. package/src/components/manage/Blocks/Block/Edit.jsx +2 -1
  50. package/src/components/manage/Blocks/Block/Settings.test.jsx +5 -1
  51. package/src/components/manage/Blocks/Block/StyleWrapper.jsx +11 -3
  52. package/src/components/manage/Blocks/Description/View.test.jsx +1 -1
  53. package/src/components/manage/Blocks/HTML/Edit.test.jsx +12 -5
  54. package/src/components/manage/Blocks/HTML/View.test.jsx +1 -1
  55. package/src/components/manage/Blocks/Image/ImageSidebar.test.jsx +6 -2
  56. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -1
  57. package/src/components/manage/Blocks/Listing/View.test.jsx +3 -1
  58. package/src/components/manage/Blocks/Maps/MapsSidebar.test.jsx +5 -1
  59. package/src/components/manage/Blocks/Search/components/DateRangeFacet.test.jsx +13 -7
  60. package/src/components/manage/Blocks/Search/components/SelectFacet.test.jsx +12 -6
  61. package/src/components/manage/Blocks/Title/Edit.jsx +8 -2
  62. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +11 -1
  63. package/src/components/manage/Blocks/Video/VideoSidebar.test.jsx +5 -1
  64. package/src/components/manage/ConditionalLink/ConditionalLink.test.tsx +109 -0
  65. package/src/components/manage/ConditionalLink/ConditionalLink.tsx +36 -0
  66. package/src/components/manage/Contents/Contents.test.jsx +29 -13
  67. package/src/components/manage/Contents/ContentsPropertiesModal.test.jsx +5 -1
  68. package/src/components/manage/Contents/ContentsRenameModal.test.jsx +5 -1
  69. package/src/components/manage/Contents/ContentsTagsModal.test.jsx +5 -1
  70. package/src/components/manage/Contents/ContentsWorkflowModal.test.jsx +5 -1
  71. package/src/components/manage/Contents/__mocks__/index.tsx +16 -0
  72. package/src/components/manage/Contents/__mocks__/index.vitest.tsx +5 -0
  73. package/src/components/manage/Controlpanels/AddonsControlpanel.test.jsx +28 -3
  74. package/src/components/manage/Controlpanels/Aliases.test.jsx +35 -3
  75. package/src/components/manage/Controlpanels/ContentType.test.jsx +29 -3
  76. package/src/components/manage/Controlpanels/ContentTypeLayout.test.jsx +4 -2
  77. package/src/components/manage/Controlpanels/ContentTypes.test.jsx +25 -2
  78. package/src/components/manage/Controlpanels/Controlpanel.test.jsx +37 -6
  79. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +47 -3
  80. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.test.jsx +15 -9
  81. package/src/components/manage/Controlpanels/ModerateComments.test.jsx +31 -5
  82. package/src/components/manage/Controlpanels/Rules/AddRule.test.jsx +13 -4
  83. package/src/components/manage/Controlpanels/Rules/ConfigureRule.test.jsx +9 -5
  84. package/src/components/manage/Controlpanels/Rules/EditRule.test.jsx +12 -4
  85. package/src/components/manage/Controlpanels/Rules/Rules.test.jsx +7 -3
  86. package/src/components/manage/Controlpanels/UndoControlpanel.test.jsx +33 -4
  87. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.test.jsx +3 -1
  88. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +15 -9
  89. package/src/components/manage/Delete/Delete.test.jsx +45 -4
  90. package/src/components/manage/Diff/Diff.test.jsx +15 -6
  91. package/src/components/manage/Diff/DiffField.test.jsx +12 -6
  92. package/src/components/manage/Display/Display.test.jsx +17 -6
  93. package/src/components/manage/Edit/Edit.test.jsx +11 -3
  94. package/src/components/manage/Form/BlockDataForm.test.jsx +5 -1
  95. package/src/components/manage/Form/Form.jsx +32 -0
  96. package/src/components/manage/Form/Form.test.jsx +27 -19
  97. package/src/components/manage/Form/InlineForm.test.jsx +5 -1
  98. package/src/components/manage/Form/ModalForm.test.jsx +5 -1
  99. package/src/components/manage/Form/__mocks__/index.tsx +17 -0
  100. package/src/components/manage/Form/__mocks__/index.vitest.tsx +73 -0
  101. package/src/components/manage/History/History.test.jsx +3 -1
  102. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +6 -4
  103. package/src/components/manage/MaybeWrap/MaybeWrap.tsx +15 -0
  104. package/src/components/manage/Multilingual/ManageTranslations.test.jsx +3 -2
  105. package/src/components/manage/Preferences/ChangePassword.test.jsx +9 -2
  106. package/src/components/manage/Preferences/PersonalInformation.test.jsx +3 -1
  107. package/src/components/manage/Preferences/PersonalPreferences.test.jsx +20 -7
  108. package/src/components/manage/Rules/Rules.test.jsx +6 -3
  109. package/src/components/manage/Sharing/Sharing.test.jsx +3 -1
  110. package/src/components/manage/Sidebar/ObjectBrowserNav.test.jsx +3 -3
  111. package/src/components/manage/Toolbar/More.test.jsx +6 -7
  112. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +196 -14
  113. package/src/components/manage/UniversalLink/UniversalLink.tsx +214 -0
  114. package/src/components/manage/Widgets/ArrayWidget.test.jsx +22 -5
  115. package/src/components/manage/Widgets/CheckboxGroupWidget.test.jsx +12 -5
  116. package/src/components/manage/Widgets/DatetimeWidget.test.jsx +21 -6
  117. package/src/components/manage/Widgets/ImageWidget.jsx +5 -2
  118. package/src/components/manage/Widgets/NumberWidget.test.jsx +8 -7
  119. package/src/components/manage/Widgets/ObjectListWidget.jsx +11 -1
  120. package/src/components/manage/Widgets/ObjectListWidget.test.jsx +18 -8
  121. package/src/components/manage/Widgets/ObjectWidget.test.jsx +5 -1
  122. package/src/components/manage/Widgets/RadioGroupWidget.test.jsx +12 -5
  123. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.test.jsx +12 -6
  124. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +43 -41
  125. package/src/components/manage/Widgets/SchemaWidget.test.jsx +12 -5
  126. package/src/components/manage/Widgets/SchemaWidgetFieldset.test.jsx +12 -5
  127. package/src/components/manage/Widgets/SelectAutoComplete.test.jsx +12 -6
  128. package/src/components/manage/Widgets/SelectWidget.jsx +3 -1
  129. package/src/components/manage/Widgets/SelectWidget.test.jsx +12 -6
  130. package/src/components/manage/Widgets/TimeWidget.test.jsx +13 -5
  131. package/src/components/manage/Widgets/TokenWidget.test.jsx +12 -6
  132. package/src/components/manage/Widgets/VocabularyTermsWidget.test.jsx +18 -9
  133. package/src/components/manage/Widgets/__mocks__/index.tsx +16 -0
  134. package/src/components/manage/Widgets/__mocks__/index.vitest.tsx +41 -0
  135. package/src/components/manage/Workflow/Workflow.test.jsx +17 -7
  136. package/src/components/theme/App/App.test.jsx +21 -17
  137. package/src/components/theme/AppExtras/AppExtras.test.jsx +6 -6
  138. package/src/components/theme/Comments/CommentEditModal.test.jsx +5 -1
  139. package/src/components/theme/Comments/Comments.test.jsx +29 -12
  140. package/src/components/theme/ContactForm/ContactForm.test.jsx +8 -4
  141. package/src/components/theme/Header/Header.test.jsx +19 -13
  142. package/src/components/theme/Logout/Logout.test.jsx +1 -1
  143. package/src/components/theme/PasswordReset/PasswordReset.test.jsx +10 -1
  144. package/src/components/theme/PasswordReset/RequestPasswordReset.test.jsx +5 -1
  145. package/src/components/theme/Register/Register.test.jsx +5 -1
  146. package/src/components/theme/Search/Search.test.jsx +6 -4
  147. package/src/components/theme/TsTest/TsTest.test.tsx +0 -1
  148. package/src/components/theme/View/EventDatesInfo.test.jsx +12 -5
  149. package/src/components/theme/View/EventView.test.jsx +12 -5
  150. package/src/components/theme/View/ListingView.test.jsx +2 -0
  151. package/src/components/theme/View/SummaryView.test.jsx +10 -0
  152. package/src/components/theme/View/TabularView.test.jsx +1 -0
  153. package/src/components/theme/View/View.test.jsx +42 -23
  154. package/src/helpers/Api/Api.plone.rest.test.js +11 -9
  155. package/src/helpers/Api/Api.test.js +11 -14
  156. package/src/helpers/AsyncConnect/AsyncConnect.test.jsx +145 -189
  157. package/src/helpers/AuthToken/AuthToken.test.js +60 -22
  158. package/src/helpers/Blocks/Blocks.test.js +1 -1
  159. package/src/helpers/Html/Html.test.jsx +32 -28
  160. package/src/helpers/Loadable/__mocks__/Loadable.jsx +16 -1
  161. package/src/helpers/Loadable/__mocks__/Loadable.vitest.jsx +39 -0
  162. package/src/helpers/Utils/withSaveAsDraft.jsx +241 -0
  163. package/src/middleware/Api.test.js +47 -0
  164. package/src/middleware/api.js +1 -1
  165. package/src/middleware/storeProtectLoadUtils.test.js +90 -78
  166. package/test-setup-globals-vitest.js +46 -0
  167. package/theme/themes/pastanaga/collections/table.overrides +9 -0
  168. package/theme/themes/pastanaga/extras/main.less +15 -0
  169. package/tsconfig.declarations.json +12 -1
  170. package/tsconfig.json +2 -1
  171. package/types/components/manage/ConditionalLink/ConditionalLink.d.ts +11 -15
  172. package/types/components/manage/Contents/__mocks__/index.vitest.d.ts +2 -0
  173. package/types/components/manage/Form/__mocks__/index.vitest.d.ts +8 -0
  174. package/types/components/manage/MaybeWrap/MaybeWrap.d.ts +7 -5
  175. package/types/components/manage/UniversalLink/UniversalLink.d.ts +54 -20
  176. package/types/components/manage/Widgets/__mocks__/index.vitest.d.ts +33 -0
  177. package/types/helpers/Loadable/__mocks__/Loadable.vitest.d.ts +3 -0
  178. package/types/helpers/Utils/withSaveAsDraft.d.ts +1 -0
  179. package/types/react-router-hash-link.d.ts +12 -0
  180. package/types/routes.d.ts +4 -0
  181. package/types/server.d.ts +1 -1
  182. package/vite-plugins/svg.mjs +81 -0
  183. package/vitest.config.mjs +77 -0
  184. package/src/components/manage/ConditionalLink/ConditionalLink.jsx +0 -27
  185. package/src/components/manage/ConditionalLink/ConditionalLink.test.jsx +0 -30
  186. package/src/components/manage/MaybeWrap/MaybeWrap.jsx +0 -9
  187. package/src/components/manage/UniversalLink/UniversalLink.jsx +0 -154
  188. package/src/components/manage/Widgets/FileWidget.test.jsx +0 -91
@@ -7,7 +7,11 @@ import ContentsWorkflowModal from './ContentsWorkflowModal';
7
7
 
8
8
  const mockStore = configureStore();
9
9
 
10
- jest.mock('@plone/volto/components/manage/Form');
10
+ vi.mock('@plone/volto/components/manage/Form', async () => {
11
+ return await import(
12
+ '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
13
+ );
14
+ });
11
15
 
12
16
  describe('ContentsWorkflowModal', () => {
13
17
  it('renders a contents workflow modal component', () => {
@@ -1,3 +1,19 @@
1
+ /* TODO: When the Volto Team removes Jest configuration support from Volto core, update this file with the Vitest version of the mock.
2
+ Then, in the tests, we need to replace:
3
+
4
+ vi.mock('@plone/volto/components/manage/Contents', async () => {
5
+ return await import(
6
+ '@plone/volto/components/manage/Contents/__mocks__/index.vitest.tsx'
7
+ );
8
+ });
9
+
10
+ with the following:
11
+
12
+ vi.mock('@plone/volto/components/manage/Contents');
13
+
14
+ Finally, remove this comment.
15
+ */
16
+
1
17
  export const Contents = jest.fn(() => <div className="Contents" />);
2
18
 
3
19
  export const ContentsRenameModal = jest.fn(() => (
@@ -0,0 +1,5 @@
1
+ export const Contents = vi.fn(() => <div className="Contents" />);
2
+
3
+ export const ContentsRenameModal = vi.fn(() => (
4
+ <div className="ContentsRenameModal" />
5
+ ));
@@ -7,7 +7,9 @@ import AddonsControlpanel from './AddonsControlpanel';
7
7
 
8
8
  const mockStore = configureStore();
9
9
 
10
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
10
+ vi.mock('../../Toolbar/Toolbar', () => ({
11
+ default: vi.fn(() => <div id="Portal" />),
12
+ }));
11
13
 
12
14
  describe('AddonsControlpanel', () => {
13
15
  it('renders an addon control component', () => {
@@ -54,11 +56,34 @@ describe('AddonsControlpanel', () => {
54
56
  locale: 'en',
55
57
  messages: {},
56
58
  },
59
+ actions: {
60
+ actions: {},
61
+ },
62
+ userSession: {
63
+ token: null,
64
+ },
65
+ content: {
66
+ data: {},
67
+ get: {
68
+ loading: false,
69
+ loaded: true,
70
+ },
71
+ },
72
+ types: {
73
+ types: [],
74
+ get: {
75
+ loading: false,
76
+ loaded: true,
77
+ },
78
+ },
57
79
  });
80
+ store.dispatch = vi.fn(() => Promise.resolve());
58
81
  const { container } = render(
59
82
  <Provider store={store}>
60
- <AddonsControlpanel location={{ pathname: '/blog' }} />
61
- <div id="toolbar"></div>
83
+ <div>
84
+ <AddonsControlpanel location={{ pathname: '/blog' }} />
85
+ <div id="toolbar"></div>
86
+ </div>
62
87
  </Provider>,
63
88
  );
64
89
 
@@ -10,8 +10,15 @@ import { MemoryRouter } from 'react-router';
10
10
  const middlewares = [thunk];
11
11
  const mockStore = configureMockStore(middlewares);
12
12
 
13
- jest.mock('@plone/volto/components/manage/Widgets');
14
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
13
+ vi.mock('@plone/volto/components/manage/Widgets', async () => {
14
+ return await import(
15
+ '@plone/volto/components/manage/Widgets/__mocks__/index.vitest.tsx'
16
+ );
17
+ });
18
+
19
+ vi.mock('../../Toolbar/Toolbar', () => ({
20
+ default: vi.fn(() => <div id="Portal" />),
21
+ }));
15
22
 
16
23
  describe('Aliases', () => {
17
24
  it('renders an aliases control component', () => {
@@ -55,7 +62,11 @@ describe('Aliases', () => {
55
62
  },
56
63
  intl: {
57
64
  locale: 'en',
58
- messages: {},
65
+ messages: {
66
+ Both: 'Both',
67
+ Automatically: 'Automatically',
68
+ Manually: 'Manually',
69
+ },
59
70
  },
60
71
  site: {
61
72
  data: {
@@ -64,7 +75,28 @@ describe('Aliases', () => {
64
75
  },
65
76
  },
66
77
  },
78
+ actions: {
79
+ actions: {},
80
+ },
81
+ userSession: {
82
+ token: null,
83
+ },
84
+ content: {
85
+ data: {},
86
+ get: {
87
+ loading: false,
88
+ loaded: true,
89
+ },
90
+ },
91
+ types: {
92
+ types: [],
93
+ get: {
94
+ loading: false,
95
+ loaded: true,
96
+ },
97
+ },
67
98
  });
99
+ store.dispatch = vi.fn(() => Promise.resolve());
68
100
  const { container } = render(
69
101
  <Provider store={store}>
70
102
  <MemoryRouter>
@@ -8,8 +8,14 @@ import ContentType from './ContentType';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
11
- jest.mock('@plone/volto/components/manage/Form');
12
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
11
+ vi.mock('@plone/volto/components/manage/Form', async () => {
12
+ return await import(
13
+ '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
14
+ );
15
+ });
16
+ vi.mock('../../Toolbar/Toolbar', () => ({
17
+ default: vi.fn(() => <div id="Portal" />),
18
+ }));
13
19
 
14
20
  describe('ContentType', () => {
15
21
  it('renders dexterity content-type component', () => {
@@ -32,8 +38,28 @@ describe('ContentType', () => {
32
38
  locale: 'en',
33
39
  messages: {},
34
40
  },
41
+ actions: {
42
+ actions: {},
43
+ },
44
+ userSession: {
45
+ token: null,
46
+ },
47
+ content: {
48
+ data: {},
49
+ get: {
50
+ loading: false,
51
+ loaded: true,
52
+ },
53
+ },
54
+ types: {
55
+ types: [],
56
+ get: {
57
+ loading: false,
58
+ loaded: true,
59
+ },
60
+ },
35
61
  });
36
-
62
+ store.dispatch = vi.fn(() => Promise.resolve());
37
63
  const { container } = render(
38
64
  <Provider store={store}>
39
65
  <MemoryRouter
@@ -8,9 +8,11 @@ import ContentTypeLayout from './ContentTypeLayout';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
11
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
11
+ vi.mock('../../Toolbar/Toolbar', () => ({
12
+ default: vi.fn(() => <div id="Portal" />),
13
+ }));
12
14
 
13
- jest.mock('../Form/Form', () => jest.fn(() => <div id="form" />));
15
+ vi.mock('../Form/Form', () => ({ default: vi.fn(() => <div id="form" />) }));
14
16
 
15
17
  describe('ContentTypeLayout', () => {
16
18
  it('renders dexterity content-type layout component', () => {
@@ -8,9 +8,11 @@ import ContentTypes from './ContentTypes';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
11
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
11
+ vi.mock('../../Toolbar/Toolbar', () => ({
12
+ default: vi.fn(() => <div id="Portal" />),
13
+ }));
12
14
 
13
- jest.mock('../Form/Form', () => jest.fn(() => <div id="form" />));
15
+ vi.mock('../Form/Form', () => ({ default: vi.fn(() => <div id="form" />) }));
14
16
 
15
17
  describe('ContentTypes', () => {
16
18
  it('renders dexterity content-types controlpanel component', () => {
@@ -58,7 +60,28 @@ describe('ContentTypes', () => {
58
60
  locale: 'en',
59
61
  messages: {},
60
62
  },
63
+ actions: {
64
+ actions: {},
65
+ },
66
+ userSession: {
67
+ token: null,
68
+ },
69
+ content: {
70
+ data: {},
71
+ get: {
72
+ loading: false,
73
+ loaded: true,
74
+ },
75
+ },
76
+ types: {
77
+ types: [],
78
+ get: {
79
+ loading: false,
80
+ loaded: true,
81
+ },
82
+ },
61
83
  });
84
+ store.dispatch = vi.fn(() => Promise.resolve());
62
85
  const { container } = render(
63
86
  <Provider store={store}>
64
87
  <MemoryRouter initialEntries={['/controlpanel/dexterity-types']}>
@@ -2,19 +2,21 @@ import { render, waitFor, screen } from '@testing-library/react';
2
2
  import configureStore from 'redux-mock-store';
3
3
  import { Provider } from 'react-intl-redux';
4
4
  import { MemoryRouter, Route } from 'react-router-dom';
5
-
6
5
  import Controlpanel from './Controlpanel';
7
6
 
8
7
  const mockStore = configureStore();
9
8
 
10
- jest.mock('../Form/Form', () =>
11
- jest.fn(({ requestError }) => (
9
+ vi.mock('../Form/Form', () => ({
10
+ default: vi.fn(({ requestError }) => (
12
11
  <div id="form">
13
- {requestError ? `requestError : ${requestError}` : null}
12
+ {requestError ? `requestError: ${requestError}` : 'Form rendered'}
14
13
  </div>
15
14
  )),
16
- );
17
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
15
+ }));
16
+
17
+ vi.mock('../../Toolbar/Toolbar', () => ({
18
+ default: vi.fn(() => <div id="Portal">Toolbar Component</div>),
19
+ }));
18
20
 
19
21
  const store = mockStore({
20
22
  controlpanels: {
@@ -37,10 +39,35 @@ const store = mockStore({
37
39
  locale: 'en',
38
40
  messages: {},
39
41
  },
42
+ actions: {
43
+ actions: {},
44
+ },
45
+ userSession: {
46
+ token: null,
47
+ },
48
+ content: {
49
+ data: {},
50
+ unlock: {
51
+ loading: false,
52
+ loaded: true,
53
+ },
54
+ get: {
55
+ loading: false,
56
+ loaded: true,
57
+ },
58
+ },
59
+ types: {
60
+ types: [],
61
+ get: {
62
+ loading: false,
63
+ loaded: true,
64
+ },
65
+ },
40
66
  });
41
67
 
42
68
  describe('Controlpanel', () => {
43
69
  it('renders a controlpanel component', () => {
70
+ store.dispatch = vi.fn(() => Promise.resolve());
44
71
  const { container } = render(
45
72
  <Provider store={store}>
46
73
  <MemoryRouter initialEntries={['/controlpanel/date-and-time']}>
@@ -52,6 +79,7 @@ describe('Controlpanel', () => {
52
79
 
53
80
  expect(container).toMatchSnapshot();
54
81
  });
82
+
55
83
  it('renders a controlpanel component with error', async () => {
56
84
  const { container, rerender } = render(
57
85
  <Provider store={store}>
@@ -61,9 +89,11 @@ describe('Controlpanel', () => {
61
89
  </MemoryRouter>
62
90
  </Provider>,
63
91
  );
92
+
64
93
  store.getState().controlpanels.update.loading = true;
65
94
  store.getState().controlpanels.update.error.response.body.message =
66
95
  "[{'message': 'Twitter username should not include the \"@\" prefix character.', 'field': 'twitter_username', 'error': 'ValidationError'}]";
96
+ store.dispatch = vi.fn(() => Promise.resolve());
67
97
 
68
98
  rerender(
69
99
  <Provider store={store}>
@@ -73,6 +103,7 @@ describe('Controlpanel', () => {
73
103
  </MemoryRouter>
74
104
  </Provider>,
75
105
  );
106
+
76
107
  await waitFor(() => screen.findByText(/Twitter/i));
77
108
  expect(container).toMatchSnapshot();
78
109
  });
@@ -9,10 +9,12 @@ import Controlpanels from './Controlpanels';
9
9
 
10
10
  const mockStore = configureStore();
11
11
 
12
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
12
+ vi.mock('../../Toolbar/Toolbar', () => ({
13
+ default: vi.fn(() => <div id="Portal" />),
14
+ }));
13
15
 
14
- jest.mock('@plone/volto/components/manage/Controlpanels', () => ({
15
- VersionOverview: jest.fn(() => <div className="VersionOverview" />),
16
+ vi.mock('@plone/volto/components/manage/Controlpanels', () => ({
17
+ VersionOverview: vi.fn(() => <div className="VersionOverview" />),
16
18
  }));
17
19
 
18
20
  describe('Controlpanels', () => {
@@ -72,7 +74,28 @@ describe('Controlpanels', () => {
72
74
  locale: 'en',
73
75
  messages: {},
74
76
  },
77
+ actions: {
78
+ actions: {},
79
+ },
80
+ userSession: {
81
+ token: null,
82
+ },
83
+ content: {
84
+ data: {},
85
+ get: {
86
+ loading: false,
87
+ loaded: true,
88
+ },
89
+ },
90
+ types: {
91
+ types: [],
92
+ get: {
93
+ loading: false,
94
+ loaded: true,
95
+ },
96
+ },
75
97
  });
98
+ store.dispatch = vi.fn(() => Promise.resolve());
76
99
  const { container } = render(
77
100
  <Provider store={store}>
78
101
  <MemoryRouter>
@@ -111,6 +134,26 @@ describe('Controlpanels', () => {
111
134
  locale: 'en',
112
135
  messages: {},
113
136
  },
137
+ actions: {
138
+ actions: {},
139
+ },
140
+ userSession: {
141
+ token: null,
142
+ },
143
+ content: {
144
+ data: {},
145
+ get: {
146
+ loading: false,
147
+ loaded: true,
148
+ },
149
+ },
150
+ types: {
151
+ types: [],
152
+ get: {
153
+ loading: false,
154
+ loaded: true,
155
+ },
156
+ },
114
157
  });
115
158
 
116
159
  const FooComponent = () => {
@@ -130,6 +173,7 @@ describe('Controlpanels', () => {
130
173
  component: FooComponent,
131
174
  },
132
175
  ];
176
+ store.dispatch = vi.fn(() => Promise.resolve());
133
177
  const { container } = render(
134
178
  <Provider store={store}>
135
179
  <MemoryRouter>
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { render } from '@testing-library/react';
2
+ import { render, act } from '@testing-library/react';
3
3
  import configureStore from 'redux-mock-store';
4
4
  import { Provider } from 'react-intl-redux';
5
5
  import jwt from 'jsonwebtoken';
@@ -7,10 +7,12 @@ import jwt from 'jsonwebtoken';
7
7
  import GroupsControlpanel from './GroupsControlpanel';
8
8
 
9
9
  const mockStore = configureStore();
10
- jest.mock('../../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
10
+ vi.mock('../../Toolbar/Toolbar', () => ({
11
+ default: vi.fn(() => <div id="Portal" />),
12
+ }));
11
13
 
12
14
  describe('UsersControlpanel', () => {
13
- it('renders a user control component', () => {
15
+ it('renders a user control component', async () => {
14
16
  const store = mockStore({
15
17
  userSession: {
16
18
  token: jwt.sign({ sub: 'john' }, 'secret'),
@@ -36,12 +38,16 @@ describe('UsersControlpanel', () => {
36
38
  messages: {},
37
39
  },
38
40
  });
39
- const { container } = render(
40
- <Provider store={store}>
41
- <GroupsControlpanel location={{ pathname: '/blog' }} />
42
- <div id="toolbar"></div>
43
- </Provider>,
44
- );
41
+ const { container } = await act(async () => {
42
+ return render(
43
+ <Provider store={store}>
44
+ <>
45
+ <GroupsControlpanel location={{ pathname: '/blog' }} />
46
+ <div id="toolbar"></div>
47
+ </>
48
+ </Provider>,
49
+ );
50
+ });
45
51
 
46
52
  expect(container).toMatchSnapshot();
47
53
  });
@@ -2,13 +2,14 @@ import React from 'react';
2
2
  import { render } from '@testing-library/react';
3
3
  import configureStore from 'redux-mock-store';
4
4
  import { Provider } from 'react-intl-redux';
5
-
6
5
  import ModerateComments from './ModerateComments';
7
6
 
8
7
  const mockStore = configureStore();
9
8
 
10
- jest.mock('@plone/volto/components/theme/Comments');
11
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
9
+ vi.mock('@plone/volto/components/theme/Comments');
10
+ vi.mock('../../Toolbar/Toolbar', () => ({
11
+ default: vi.fn(() => <div id="Portal" />),
12
+ }));
12
13
 
13
14
  describe('ModerateComments', () => {
14
15
  it('renders a moderate comments component', () => {
@@ -26,11 +27,36 @@ describe('ModerateComments', () => {
26
27
  locale: 'en',
27
28
  messages: {},
28
29
  },
30
+ actions: {
31
+ actions: {},
32
+ },
33
+ userSession: {
34
+ token: null,
35
+ },
36
+ content: {
37
+ data: {},
38
+ get: {
39
+ loading: false,
40
+ loaded: true,
41
+ },
42
+ },
43
+ types: {
44
+ types: [],
45
+ get: {
46
+ loading: false,
47
+ loaded: true,
48
+ },
49
+ },
29
50
  });
51
+
52
+ store.dispatch = vi.fn(() => Promise.resolve());
53
+
30
54
  const { container } = render(
31
55
  <Provider store={store}>
32
- <ModerateComments location={{ pathname: '/blog' }} />
33
- <div id="toolbar"></div>
56
+ <div>
57
+ <ModerateComments location={{ pathname: '/blog' }} />
58
+ <div id="toolbar"></div>
59
+ </div>
34
60
  </Provider>,
35
61
  );
36
62
 
@@ -9,8 +9,15 @@ import AddRule from './AddRule';
9
9
  const middlewares = [thunk];
10
10
  const mockStore = configureMockStore(middlewares);
11
11
 
12
- jest.mock('@plone/volto/components/manage/Form');
13
- jest.mock('../../Toolbar/Toolbar', () => jest.fn(() => <div id="Toolbar" />));
12
+ vi.mock('@plone/volto/components/manage/Form', async () => {
13
+ return await import(
14
+ '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
15
+ );
16
+ });
17
+
18
+ vi.mock('../../Toolbar/Toolbar', () => ({
19
+ default: vi.fn(() => <div id="Toolbar" />),
20
+ }));
14
21
 
15
22
  describe('AddRule', () => {
16
23
  it('renders rules add interface', () => {
@@ -22,8 +29,10 @@ describe('AddRule', () => {
22
29
  });
23
30
  const { container } = render(
24
31
  <Provider store={store}>
25
- <AddRule location={{ pathname: '/controlpanel/rules/add' }} />
26
- <div id="toolbar"></div>
32
+ <>
33
+ <AddRule location={{ pathname: '/controlpanel/rules/add' }} />
34
+ <div id="toolbar"></div>
35
+ </>
27
36
  </Provider>,
28
37
  );
29
38
 
@@ -9,7 +9,9 @@ import ConfigureRule from './ConfigureRule';
9
9
  const middlewares = [thunk];
10
10
  const mockStore = configureMockStore(middlewares);
11
11
 
12
- jest.mock('../../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
12
+ vi.mock('../../Toolbar/Toolbar', () => ({
13
+ default: vi.fn(() => <div id="Portal" />),
14
+ }));
13
15
 
14
16
  describe('ConfigureRule', () => {
15
17
  it('renders rules configure interface', () => {
@@ -21,10 +23,12 @@ describe('ConfigureRule', () => {
21
23
  });
22
24
  const { container } = render(
23
25
  <Provider store={store}>
24
- <ConfigureRule
25
- location={{ pathname: '/controlpanel/rules/:id/configure' }}
26
- />
27
- <div id="toolbar"></div>
26
+ <>
27
+ <ConfigureRule
28
+ location={{ pathname: '/controlpanel/rules/:id/configure' }}
29
+ />
30
+ <div id="toolbar"></div>
31
+ </>
28
32
  </Provider>,
29
33
  );
30
34
 
@@ -9,9 +9,15 @@ import EditRule from './EditRule';
9
9
  const middlewares = [thunk];
10
10
  const mockStore = configureMockStore(middlewares);
11
11
 
12
- jest.mock('../../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
12
+ vi.mock('../../Toolbar/Toolbar', () => ({
13
+ default: vi.fn(() => <div id="Portal" />),
14
+ }));
13
15
 
14
- jest.mock('@plone/volto/components/manage/Form');
16
+ vi.mock('@plone/volto/components/manage/Form', async () => {
17
+ return await import(
18
+ '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
19
+ );
20
+ });
15
21
 
16
22
  describe('EditRule', () => {
17
23
  it('renders rules edit interface', () => {
@@ -23,8 +29,10 @@ describe('EditRule', () => {
23
29
  });
24
30
  const { container } = render(
25
31
  <Provider store={store}>
26
- <EditRule location={{ pathname: '/controlpanel/rules/:id/edit' }} />
27
- <div id="toolbar"></div>
32
+ <>
33
+ <EditRule location={{ pathname: '/controlpanel/rules/:id/edit' }} />
34
+ <div id="toolbar"></div>
35
+ </>
28
36
  </Provider>,
29
37
  );
30
38
 
@@ -9,7 +9,9 @@ import Rules from './Rules';
9
9
  const middlewares = [thunk];
10
10
  const mockStore = configureMockStore(middlewares);
11
11
 
12
- jest.mock('../../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
12
+ vi.mock('../../Toolbar/Toolbar', () => ({
13
+ default: vi.fn(() => <div id="Portal" />),
14
+ }));
13
15
 
14
16
  describe('Rules', () => {
15
17
  it('renders rules control panel control', () => {
@@ -64,8 +66,10 @@ describe('Rules', () => {
64
66
  });
65
67
  const { container } = render(
66
68
  <Provider store={store}>
67
- <Rules location={{ pathname: '/controlpanel/rules' }} />
68
- <div id="toolbar"></div>
69
+ <>
70
+ <Rules location={{ pathname: '/controlpanel/rules' }} />
71
+ <div id="toolbar"></div>
72
+ </>
69
73
  </Provider>,
70
74
  );
71
75