@plone/volto 19.0.0-alpha.0 → 19.0.0-alpha.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 (148) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc +2 -0
  3. package/CHANGELOG.md +46 -2
  4. package/package.json +14 -7
  5. package/src/actions/actions/actions.test.js +3 -3
  6. package/src/actions/addons/addons.test.js +15 -12
  7. package/src/actions/aliases/aliases.test.js +1 -1
  8. package/src/actions/querystring/querystring.test.js +2 -2
  9. package/src/actions/types/types.test.js +1 -1
  10. package/src/components/manage/Actions/Actions.test.jsx +5 -1
  11. package/src/components/manage/Add/Add.jsx +22 -20
  12. package/src/components/manage/Add/Add.test.jsx +6 -3
  13. package/src/components/manage/Aliases/Aliases.test.jsx +7 -7
  14. package/src/components/manage/Blocks/Block/BlocksForm.jsx +1 -0
  15. package/src/components/manage/Blocks/Block/BlocksForm.test.jsx +48 -16
  16. package/src/components/manage/Blocks/Block/Edit.jsx +2 -1
  17. package/src/components/manage/Blocks/Block/Settings.test.jsx +5 -1
  18. package/src/components/manage/Blocks/Block/StyleWrapper.jsx +11 -3
  19. package/src/components/manage/Blocks/Description/View.test.jsx +1 -1
  20. package/src/components/manage/Blocks/HTML/Edit.test.jsx +12 -5
  21. package/src/components/manage/Blocks/HTML/View.test.jsx +1 -1
  22. package/src/components/manage/Blocks/Image/ImageSidebar.test.jsx +6 -2
  23. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -1
  24. package/src/components/manage/Blocks/Listing/View.test.jsx +3 -1
  25. package/src/components/manage/Blocks/Maps/MapsSidebar.test.jsx +5 -1
  26. package/src/components/manage/Blocks/Search/components/DateRangeFacet.test.jsx +13 -7
  27. package/src/components/manage/Blocks/Search/components/SelectFacet.test.jsx +12 -6
  28. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +11 -1
  29. package/src/components/manage/Blocks/Video/VideoSidebar.test.jsx +5 -1
  30. package/src/components/manage/ConditionalLink/ConditionalLink.test.tsx +109 -0
  31. package/src/components/manage/ConditionalLink/ConditionalLink.tsx +36 -0
  32. package/src/components/manage/Contents/Contents.test.jsx +29 -13
  33. package/src/components/manage/Contents/ContentsPropertiesModal.test.jsx +5 -1
  34. package/src/components/manage/Contents/ContentsRenameModal.test.jsx +5 -1
  35. package/src/components/manage/Contents/ContentsTagsModal.test.jsx +5 -1
  36. package/src/components/manage/Contents/ContentsWorkflowModal.test.jsx +5 -1
  37. package/src/components/manage/Contents/__mocks__/index.tsx +16 -0
  38. package/src/components/manage/Contents/__mocks__/index.vitest.tsx +5 -0
  39. package/src/components/manage/Controlpanels/AddonsControlpanel.test.jsx +28 -3
  40. package/src/components/manage/Controlpanels/Aliases.test.jsx +35 -3
  41. package/src/components/manage/Controlpanels/ContentType.test.jsx +29 -3
  42. package/src/components/manage/Controlpanels/ContentTypeLayout.test.jsx +4 -2
  43. package/src/components/manage/Controlpanels/ContentTypes.test.jsx +25 -2
  44. package/src/components/manage/Controlpanels/Controlpanel.test.jsx +37 -6
  45. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +47 -3
  46. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.test.jsx +15 -9
  47. package/src/components/manage/Controlpanels/ModerateComments.test.jsx +31 -5
  48. package/src/components/manage/Controlpanels/Rules/AddRule.test.jsx +13 -4
  49. package/src/components/manage/Controlpanels/Rules/ConfigureRule.test.jsx +9 -5
  50. package/src/components/manage/Controlpanels/Rules/EditRule.test.jsx +12 -4
  51. package/src/components/manage/Controlpanels/Rules/Rules.test.jsx +7 -3
  52. package/src/components/manage/Controlpanels/UndoControlpanel.test.jsx +33 -4
  53. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.test.jsx +3 -1
  54. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +15 -9
  55. package/src/components/manage/Delete/Delete.test.jsx +45 -4
  56. package/src/components/manage/Diff/Diff.test.jsx +15 -6
  57. package/src/components/manage/Diff/DiffField.test.jsx +12 -6
  58. package/src/components/manage/Display/Display.test.jsx +17 -6
  59. package/src/components/manage/Edit/Edit.test.jsx +11 -3
  60. package/src/components/manage/Form/BlockDataForm.test.jsx +5 -1
  61. package/src/components/manage/Form/Form.test.jsx +5 -1
  62. package/src/components/manage/Form/InlineForm.test.jsx +5 -1
  63. package/src/components/manage/Form/ModalForm.test.jsx +5 -1
  64. package/src/components/manage/Form/__mocks__/index.tsx +17 -0
  65. package/src/components/manage/Form/__mocks__/index.vitest.tsx +73 -0
  66. package/src/components/manage/History/History.test.jsx +3 -1
  67. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +6 -4
  68. package/src/components/manage/MaybeWrap/MaybeWrap.tsx +15 -0
  69. package/src/components/manage/Multilingual/ManageTranslations.test.jsx +3 -2
  70. package/src/components/manage/Preferences/ChangePassword.test.jsx +9 -2
  71. package/src/components/manage/Preferences/PersonalInformation.test.jsx +3 -1
  72. package/src/components/manage/Preferences/PersonalPreferences.test.jsx +20 -7
  73. package/src/components/manage/Rules/Rules.test.jsx +6 -3
  74. package/src/components/manage/Sharing/Sharing.test.jsx +3 -1
  75. package/src/components/manage/Sidebar/ObjectBrowserNav.test.jsx +3 -3
  76. package/src/components/manage/Toolbar/More.test.jsx +6 -7
  77. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +196 -14
  78. package/src/components/manage/UniversalLink/UniversalLink.tsx +214 -0
  79. package/src/components/manage/Widgets/ArrayWidget.test.jsx +22 -5
  80. package/src/components/manage/Widgets/CheckboxGroupWidget.test.jsx +12 -5
  81. package/src/components/manage/Widgets/DatetimeWidget.test.jsx +21 -6
  82. package/src/components/manage/Widgets/ImageWidget.jsx +5 -2
  83. package/src/components/manage/Widgets/NumberWidget.test.jsx +8 -7
  84. package/src/components/manage/Widgets/ObjectListWidget.jsx +11 -1
  85. package/src/components/manage/Widgets/ObjectListWidget.test.jsx +18 -8
  86. package/src/components/manage/Widgets/ObjectWidget.test.jsx +5 -1
  87. package/src/components/manage/Widgets/RadioGroupWidget.test.jsx +12 -5
  88. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.test.jsx +12 -6
  89. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +43 -41
  90. package/src/components/manage/Widgets/SchemaWidget.test.jsx +12 -5
  91. package/src/components/manage/Widgets/SchemaWidgetFieldset.test.jsx +12 -5
  92. package/src/components/manage/Widgets/SelectAutoComplete.test.jsx +12 -6
  93. package/src/components/manage/Widgets/SelectWidget.test.jsx +12 -6
  94. package/src/components/manage/Widgets/TimeWidget.test.jsx +13 -5
  95. package/src/components/manage/Widgets/TokenWidget.test.jsx +12 -6
  96. package/src/components/manage/Widgets/VocabularyTermsWidget.test.jsx +18 -9
  97. package/src/components/manage/Widgets/__mocks__/index.tsx +16 -0
  98. package/src/components/manage/Widgets/__mocks__/index.vitest.tsx +41 -0
  99. package/src/components/manage/Workflow/Workflow.test.jsx +17 -7
  100. package/src/components/theme/App/App.test.jsx +21 -17
  101. package/src/components/theme/AppExtras/AppExtras.test.jsx +6 -6
  102. package/src/components/theme/Comments/CommentEditModal.test.jsx +5 -1
  103. package/src/components/theme/Comments/Comments.test.jsx +29 -12
  104. package/src/components/theme/ContactForm/ContactForm.test.jsx +8 -4
  105. package/src/components/theme/Header/Header.test.jsx +19 -13
  106. package/src/components/theme/Logout/Logout.test.jsx +1 -1
  107. package/src/components/theme/PasswordReset/PasswordReset.test.jsx +10 -1
  108. package/src/components/theme/PasswordReset/RequestPasswordReset.test.jsx +5 -1
  109. package/src/components/theme/Register/Register.test.jsx +5 -1
  110. package/src/components/theme/Search/Search.test.jsx +6 -4
  111. package/src/components/theme/TsTest/TsTest.test.tsx +0 -1
  112. package/src/components/theme/View/EventDatesInfo.test.jsx +12 -5
  113. package/src/components/theme/View/EventView.test.jsx +12 -5
  114. package/src/components/theme/View/ListingView.test.jsx +2 -0
  115. package/src/components/theme/View/SummaryView.test.jsx +10 -0
  116. package/src/components/theme/View/TabularView.test.jsx +1 -0
  117. package/src/components/theme/View/View.test.jsx +42 -23
  118. package/src/helpers/Api/Api.plone.rest.test.js +11 -9
  119. package/src/helpers/Api/Api.test.js +11 -14
  120. package/src/helpers/AsyncConnect/AsyncConnect.test.jsx +145 -189
  121. package/src/helpers/AuthToken/AuthToken.test.js +60 -22
  122. package/src/helpers/Blocks/Blocks.test.js +1 -1
  123. package/src/helpers/Html/Html.test.jsx +32 -28
  124. package/src/helpers/Loadable/__mocks__/Loadable.jsx +16 -1
  125. package/src/helpers/Loadable/__mocks__/Loadable.vitest.jsx +39 -0
  126. package/src/middleware/Api.test.js +47 -0
  127. package/src/middleware/api.js +1 -1
  128. package/src/middleware/storeProtectLoadUtils.test.js +90 -78
  129. package/test-setup-globals-vitest.js +46 -0
  130. package/tsconfig.declarations.json +12 -1
  131. package/tsconfig.json +2 -1
  132. package/types/components/manage/ConditionalLink/ConditionalLink.d.ts +11 -15
  133. package/types/components/manage/Contents/__mocks__/index.vitest.d.ts +2 -0
  134. package/types/components/manage/Form/__mocks__/index.vitest.d.ts +8 -0
  135. package/types/components/manage/MaybeWrap/MaybeWrap.d.ts +7 -5
  136. package/types/components/manage/UniversalLink/UniversalLink.d.ts +54 -20
  137. package/types/components/manage/Widgets/__mocks__/index.vitest.d.ts +33 -0
  138. package/types/helpers/Loadable/__mocks__/Loadable.vitest.d.ts +3 -0
  139. package/types/react-router-hash-link.d.ts +12 -0
  140. package/types/routes.d.ts +4 -0
  141. package/types/server.d.ts +1 -1
  142. package/vite-plugins/svg.mjs +81 -0
  143. package/vitest.config.mjs +77 -0
  144. package/src/components/manage/ConditionalLink/ConditionalLink.jsx +0 -27
  145. package/src/components/manage/ConditionalLink/ConditionalLink.test.jsx +0 -30
  146. package/src/components/manage/MaybeWrap/MaybeWrap.jsx +0 -9
  147. package/src/components/manage/UniversalLink/UniversalLink.jsx +0 -154
  148. package/src/components/manage/Widgets/FileWidget.test.jsx +0 -91
@@ -5,7 +5,12 @@ import { Provider } from 'react-intl-redux';
5
5
 
6
6
  import LeadImageSidebar from './LeadImageSidebar';
7
7
 
8
- jest.mock('@plone/volto/components/manage/Widgets');
8
+ vi.mock('@plone/volto/components/manage/Widgets');
9
+ vi.mock('@plone/volto/components/manage/Widgets', async () => {
10
+ return await import(
11
+ '@plone/volto/components/manage/Widgets/__mocks__/index.vitest.tsx'
12
+ );
13
+ });
9
14
 
10
15
  const mockStore = configureStore();
11
16
 
@@ -16,6 +21,7 @@ test('renders a Lead Image block Sidebar component', () => {
16
21
  messages: {},
17
22
  },
18
23
  });
24
+
19
25
  const component = renderer.create(
20
26
  <Provider store={store}>
21
27
  <LeadImageSidebar
@@ -45,6 +51,7 @@ test('renders a Lead Image block Sidebar component', () => {
45
51
  />
46
52
  </Provider>,
47
53
  );
54
+
48
55
  const json = component.toJSON();
49
56
  expect(json).toMatchSnapshot();
50
57
  });
@@ -2,7 +2,9 @@ import React from 'react';
2
2
  import renderer from 'react-test-renderer';
3
3
  import View from './View';
4
4
 
5
- jest.mock('./ListingBody', () => jest.fn(() => <div className="theblock" />));
5
+ vi.mock('./ListingBody', () => ({
6
+ default: () => <div className="theblock" />,
7
+ }));
6
8
 
7
9
  test('renders a view image component for the listing block', () => {
8
10
  const component = renderer.create(
@@ -5,7 +5,11 @@ import { Provider } from 'react-intl-redux';
5
5
 
6
6
  import MapsSidebar from './MapsSidebar';
7
7
 
8
- jest.mock('@plone/volto/components/manage/Form');
8
+ vi.mock('@plone/volto/components/manage/Form', async () => {
9
+ return await import(
10
+ '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
11
+ );
12
+ });
9
13
 
10
14
  const mockStore = configureStore();
11
15
 
@@ -2,18 +2,24 @@ import React from 'react';
2
2
  import configureStore from 'redux-mock-store';
3
3
  import { Provider } from 'react-intl-redux';
4
4
  import { waitFor, render, screen } from '@testing-library/react';
5
-
6
5
  import DateRangeFacet from './DateRangeFacet';
7
6
 
8
7
  const mockStore = configureStore();
9
8
 
10
- jest.mock('@plone/volto/helpers/Loadable/Loadable');
11
- beforeAll(
12
- async () =>
13
- await require('@plone/volto/helpers/Loadable/Loadable').__setLoadables(),
14
- );
9
+ vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
10
+ return await import(
11
+ '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
12
+ );
13
+ });
14
+
15
+ beforeAll(async () => {
16
+ const { __setLoadables } = await import(
17
+ '@plone/volto/helpers/Loadable/Loadable'
18
+ );
19
+ await __setLoadables();
20
+ });
15
21
 
16
- describe('DateRangeFaceg', () => {
22
+ describe('DateRangeFacet', () => {
17
23
  it('renders a facet component with a date range widget', async () => {
18
24
  const store = mockStore({
19
25
  userSession: { token: null },
@@ -2,16 +2,22 @@ import React from 'react';
2
2
  import configureStore from 'redux-mock-store';
3
3
  import { Provider } from 'react-intl-redux';
4
4
  import { waitFor, render, screen } from '@testing-library/react';
5
-
6
5
  import SelectFacet from './SelectFacet';
7
6
 
8
7
  const mockStore = configureStore();
9
8
 
10
- jest.mock('@plone/volto/helpers/Loadable/Loadable');
11
- beforeAll(
12
- async () =>
13
- await require('@plone/volto/helpers/Loadable/Loadable').__setLoadables(),
14
- );
9
+ vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
10
+ return await import(
11
+ '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
12
+ );
13
+ });
14
+
15
+ beforeAll(async () => {
16
+ const { __setLoadables } = await import(
17
+ '@plone/volto/helpers/Loadable/Loadable'
18
+ );
19
+ await __setLoadables();
20
+ });
15
21
 
16
22
  describe('SelectFacet', () => {
17
23
  it('renders a facet component with select dropdown', async () => {
@@ -8,6 +8,12 @@ const mockStore = configureStore();
8
8
 
9
9
  const data = { '@type': 'toc', variation: 'default' };
10
10
 
11
+ const properties = {
12
+ title: 'Table of Contents',
13
+ hide_title: false,
14
+ ordered: true,
15
+ };
16
+
11
17
  const tocEntries = [
12
18
  {
13
19
  level: 2,
@@ -35,7 +41,11 @@ test('renders a default toc renderer component', () => {
35
41
  const component = renderer.create(
36
42
  <Provider store={store}>
37
43
  <MemoryRouter>
38
- <DefaultTocRenderer data={data} tocEntries={tocEntries} />
44
+ <DefaultTocRenderer
45
+ properties={properties}
46
+ data={data}
47
+ tocEntries={tocEntries}
48
+ />
39
49
  </MemoryRouter>
40
50
  </Provider>,
41
51
  );
@@ -5,7 +5,11 @@ import { Provider } from 'react-intl-redux';
5
5
 
6
6
  import VideoSidebar from './VideoSidebar';
7
7
 
8
- jest.mock('@plone/volto/components/manage/Form');
8
+ vi.mock('@plone/volto/components/manage/Form', async () => {
9
+ return await import(
10
+ '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
11
+ );
12
+ });
9
13
 
10
14
  const mockStore = configureStore();
11
15
 
@@ -0,0 +1,109 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { MemoryRouter } from 'react-router-dom';
4
+ import { Provider } from 'react-intl-redux';
5
+ import configureStore from 'redux-mock-store';
6
+ import '@testing-library/jest-dom';
7
+
8
+ import ConditionalLink from './ConditionalLink';
9
+
10
+ const mockStore = configureStore();
11
+ const store = mockStore({
12
+ userSession: {
13
+ token: null,
14
+ },
15
+ intl: {
16
+ locale: 'en',
17
+ messages: {},
18
+ },
19
+ });
20
+
21
+ describe('ConditionalLink', () => {
22
+ it('renders a link when condition is true', () => {
23
+ render(
24
+ <Provider store={store}>
25
+ <MemoryRouter>
26
+ <ConditionalLink to="/test" condition={true}>
27
+ Link Text
28
+ </ConditionalLink>
29
+ </MemoryRouter>
30
+ </Provider>,
31
+ );
32
+
33
+ const link = screen.getByText('Link Text');
34
+ expect(link.tagName).toBe('A');
35
+ expect(link).toHaveAttribute('href', '/test');
36
+ });
37
+
38
+ it('renders a link when condition is true', () => {
39
+ render(
40
+ <Provider store={store}>
41
+ <MemoryRouter>
42
+ <ConditionalLink href="/test" condition={true}>
43
+ Link Text
44
+ </ConditionalLink>
45
+ </MemoryRouter>
46
+ </Provider>,
47
+ );
48
+
49
+ const link = screen.getByText('Link Text');
50
+ expect(link.tagName).toBe('A');
51
+ expect(link).toHaveAttribute('href', '/test');
52
+ });
53
+
54
+ it('renders a span when condition is false', () => {
55
+ render(
56
+ <Provider store={store}>
57
+ <MemoryRouter>
58
+ <ConditionalLink to="/test" condition={false}>
59
+ Link Text
60
+ </ConditionalLink>
61
+ </MemoryRouter>
62
+ </Provider>,
63
+ );
64
+
65
+ const span = screen.getByText('Link Text');
66
+ expect(span.tagName).toBe('DIV');
67
+ });
68
+
69
+ it('passes additional props when rendering a link', () => {
70
+ render(
71
+ <Provider store={store}>
72
+ <MemoryRouter>
73
+ <ConditionalLink
74
+ to="/test"
75
+ condition={true}
76
+ className="custom-class"
77
+ data-test="test-id"
78
+ >
79
+ Link Text
80
+ </ConditionalLink>
81
+ </MemoryRouter>
82
+ </Provider>,
83
+ );
84
+
85
+ const link = screen.getByText('Link Text');
86
+ expect(link).toHaveClass('custom-class');
87
+ expect(link).toHaveAttribute('data-test', 'test-id');
88
+ });
89
+
90
+ it('renders a component if no external (href) link is passed', () => {
91
+ render(
92
+ <Provider store={store}>
93
+ <MemoryRouter>
94
+ <ConditionalLink
95
+ condition={true}
96
+ item={{
97
+ '@id': 'http://localhost:3000/en/welcome-to-volto',
98
+ }}
99
+ >
100
+ <h1>Title</h1>
101
+ </ConditionalLink>
102
+ </MemoryRouter>
103
+ </Provider>,
104
+ );
105
+
106
+ const title = screen.getByText('Title');
107
+ expect(title.tagName).toBe('H1');
108
+ });
109
+ });
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import UniversalLink from '@plone/volto/components/manage/UniversalLink/UniversalLink';
3
+ import type { UniversalLinkProps } from '@plone/volto/components/manage/UniversalLink/UniversalLink';
4
+
5
+ type ConditionalLinkProps = {
6
+ condition?: boolean;
7
+ to?: string; // Alias for href
8
+ children: React.ReactNode;
9
+ } & Omit<UniversalLinkProps, 'href' | 'item'> & {
10
+ href?: string;
11
+ item?: UniversalLinkProps['item'];
12
+ };
13
+
14
+ const ConditionalLink = React.forwardRef<
15
+ HTMLAnchorElement | HTMLDivElement,
16
+ ConditionalLinkProps
17
+ >(function ConditionalLink(
18
+ { condition = true, to, href, item, children, ...rest },
19
+ ref,
20
+ ) {
21
+ if (!condition) {
22
+ return <>{children}</>;
23
+ }
24
+
25
+ // Normalize: prefer explicit href over "to"
26
+ const finalHref = href ?? to;
27
+
28
+ // Rebuild props safely to satisfy UniversalLinkProps union
29
+ const universalLinkProps: UniversalLinkProps = finalHref
30
+ ? { ...rest, href: finalHref, children }
31
+ : { ...rest, item: item!, children }; // assume item is defined if href isn't
32
+
33
+ return <UniversalLink ref={ref} {...universalLinkProps} />;
34
+ });
35
+
36
+ export default React.memo(ConditionalLink);
@@ -8,20 +8,29 @@ import { __test__ as Contents } from './Contents';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
11
- jest.mock('@plone/volto/helpers/Loadable/Loadable');
12
- beforeAll(
13
- async () =>
14
- await require('@plone/volto/helpers/Loadable/Loadable').__setLoadables(),
15
- );
11
+ vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
12
+ return await import(
13
+ '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
14
+ );
15
+ });
16
+
17
+ beforeAll(async () => {
18
+ const { __setLoadables } = await import(
19
+ '@plone/volto/helpers/Loadable/Loadable'
20
+ );
21
+ await __setLoadables();
22
+ });
16
23
 
17
- jest.mock('../Toolbar/Toolbar', () => jest.fn(() => <div id="Portal" />));
24
+ vi.mock('../Toolbar/Toolbar', () => ({
25
+ default: vi.fn(() => <div id="Portal" />),
26
+ }));
18
27
 
19
- jest.mock('../../theme/Pagination/Pagination', () =>
20
- jest.fn(() => <div className="Pagination" />),
21
- );
22
- jest.mock('./ContentsUploadModal', () =>
23
- jest.fn(() => <div className="UploadModal" />),
24
- );
28
+ vi.mock('../../theme/Pagination/Pagination', () => ({
29
+ default: vi.fn(() => <div className="Pagination" />),
30
+ }));
31
+ vi.mock('./ContentsUploadModal', () => ({
32
+ default: vi.fn(() => <div className="UploadModal" />),
33
+ }));
25
34
 
26
35
  describe('Contents', () => {
27
36
  it('renders a folder contents view component', () => {
@@ -87,7 +96,14 @@ describe('Contents', () => {
87
96
  },
88
97
  intl: {
89
98
  locale: 'en',
90
- messages: {},
99
+ messages: {
100
+ ID: 'ID',
101
+ Title: 'Title',
102
+ 'Publication date': 'Publication date',
103
+ 'Created on': 'Created on',
104
+ 'Last modified': 'Last modified',
105
+ Type: 'Type',
106
+ },
91
107
  },
92
108
  });
93
109
  const { container } = render(
@@ -7,7 +7,11 @@ import ContentsPropertiesModal from './ContentsPropertiesModal';
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('ContentsPropertiesModal', () => {
13
17
  it('renders a contents properties modal component', () => {
@@ -7,7 +7,11 @@ import ContentsRenameModal from './ContentsRenameModal';
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('ContentsRenameModal', () => {
13
17
  it('renders a contents rename modal component', () => {
@@ -7,7 +7,11 @@ import ContentsTagsModal from './ContentsTagsModal';
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('ContentsTagsModal', () => {
13
17
  it('renders a contents tags modal component', () => {
@@ -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']}>