@griddo/ax 12.4.0 → 12.5.0

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 (35) hide show
  1. package/config/webpack.config.js +5 -0
  2. package/package.json +2 -2
  3. package/src/__tests__/components/ConfigPanel/Form/Form.test.tsx +47 -57
  4. package/src/__tests__/components/ConfigPanel/Header/Header.test.tsx +46 -42
  5. package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +6 -17
  6. package/src/__tests__/components/EmptyState/EmptyState.test.tsx +9 -9
  7. package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +60 -50
  8. package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +66 -58
  9. package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +222 -425
  10. package/src/__tests__/components/Fields/FileField/FileField.test.tsx +13 -14
  11. package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +275 -259
  12. package/src/__tests__/components/Fields/IntegrationsField/IntegrationsField.test.tsx +50 -48
  13. package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +9 -8
  14. package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +8 -12
  15. package/src/__tests__/components/Fields/TextArea/TextArea.test.tsx +6 -2
  16. package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +15 -23
  17. package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +8 -2
  18. package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +29 -21
  19. package/src/__tests__/components/Fields/Wysiwyg/Wysiwyg.config.test.tsx +103 -0
  20. package/src/__tests__/components/FieldsBehavior/FieldsBehavior.test.tsx +7 -2
  21. package/src/__tests__/components/ResizePanel/ResizePanel.test.tsx +8 -6
  22. package/src/__tests__/components/SideModal/SideModal.test.tsx +150 -104
  23. package/src/__tests__/components/TableFilters/LiveFilter/LiveFilter.test.tsx +15 -29
  24. package/src/__tests__/components/TableFilters/StatusFilter/StatusFilter.test.tsx +61 -36
  25. package/src/__tests__/components/Tabs/Tabs.test.tsx +65 -61
  26. package/src/__tests__/components/Toast/Toast.test.tsx +19 -21
  27. package/src/__tests__/modules/FramePreview/FramePreview.test.tsx +16 -0
  28. package/src/__tests__/modules/Sites/SitesList/ListView/BulkHeader/BulkHeader.test.tsx +24 -19
  29. package/src/__tests__/modules/Sites/SitesList/SitesList.test.tsx +15 -6
  30. package/src/__tests__/modules/Users/Roles/BulkHeader/BulkHeader.test.tsx +69 -64
  31. package/src/__tests__/modules/Users/Roles/Roles.test.tsx +7 -4
  32. package/src/components/Fields/Wysiwyg/config.tsx +68 -17
  33. package/src/components/Fields/Wysiwyg/helpers.tsx +2 -0
  34. package/src/components/Fields/Wysiwyg/index.tsx +41 -10
  35. package/src/components/ResizePanel/index.tsx +7 -2
@@ -23,28 +23,36 @@ const mockStore = configureStore(middlewares);
23
23
  vi.mock("axios");
24
24
  const mockedAxios = axios as MockedFunction<typeof axios>;
25
25
 
26
- const defaultProps = mock<IIntegrationsFieldProps>();
27
- defaultProps.site = {
28
- id: 86,
29
- name: "Site 1",
30
- theme: "default-theme",
31
- author: "",
32
- pages: [],
33
- updated: true,
34
- home: "//cx.dev.griddo.io/pre-griddo/componentfolder",
35
- isPublished: false,
36
- bigAvatar: "http://images.dev.griddo.io/griddo-site-thumbnail-ec2ab0ba-9424-4424-8f60-222ec746902d_10",
37
- favicon: "https://images.dev.griddo.io/by-themascot-1920_2",
38
- published: "2021-11-03T10:42:32.000Z",
39
- smallAvatar: "http://images.dev.griddo.io/griddo-site-thumbnail-ec2ab0ba-9424-4424-8f60-222ec746902d_9",
40
- thumbnail: "http://images.dev.griddo.io/griddo-site-thumbnail-ec2ab0ba-9424-4424-8f60-222ec746902d_7",
41
- timezone: "Pacific/Pago_Pago",
42
- lastAccess: "2022-09-05T07:34:19.000Z",
43
- navigationModules: null,
44
- defaultLanguage: 1,
45
- path: "",
46
- domain: 1,
47
- };
26
+ // Antes había un `mock<IIntegrationsFieldProps>()` de módulo con el `site` puesto que todos los
27
+ // tests mutaban para fijar su `value`. Ahora cada uno construye los suyos.
28
+ const makeProps = (overrides: Partial<IIntegrationsFieldProps> = {}): IIntegrationsFieldProps =>
29
+ Object.assign(
30
+ mock<IIntegrationsFieldProps>(),
31
+ {
32
+ site: {
33
+ id: 86,
34
+ name: "Site 1",
35
+ theme: "default-theme",
36
+ author: "",
37
+ pages: [],
38
+ updated: true,
39
+ home: "//cx.dev.griddo.io/pre-griddo/componentfolder",
40
+ isPublished: false,
41
+ bigAvatar: "http://images.dev.griddo.io/griddo-site-thumbnail-ec2ab0ba-9424-4424-8f60-222ec746902d_10",
42
+ favicon: "https://images.dev.griddo.io/by-themascot-1920_2",
43
+ published: "2021-11-03T10:42:32.000Z",
44
+ smallAvatar: "http://images.dev.griddo.io/griddo-site-thumbnail-ec2ab0ba-9424-4424-8f60-222ec746902d_9",
45
+ thumbnail: "http://images.dev.griddo.io/griddo-site-thumbnail-ec2ab0ba-9424-4424-8f60-222ec746902d_7",
46
+ timezone: "Pacific/Pago_Pago",
47
+ lastAccess: "2022-09-05T07:34:19.000Z",
48
+ navigationModules: null,
49
+ defaultLanguage: 1,
50
+ path: "",
51
+ domain: 1,
52
+ },
53
+ },
54
+ overrides,
55
+ );
48
56
 
49
57
  const initialStore = {
50
58
  dataPacks: { activated: [] },
@@ -193,8 +201,6 @@ const initialStore = {
193
201
 
194
202
  describe("IntegrationsField component rendering", () => {
195
203
  test("should render the component IntegrationsField", async () => {
196
- const initialState = { ...defaultProps };
197
- defaultProps.value = [];
198
204
  const store = mockStore(initialStore);
199
205
 
200
206
  const data = {
@@ -209,7 +215,7 @@ describe("IntegrationsField component rendering", () => {
209
215
  await act(async () => {
210
216
  render(
211
217
  <ThemeProvider theme={parseTheme(globalTheme)}>
212
- <IntegrationsField {...{ ...initialState, ...defaultProps }} />
218
+ <IntegrationsField {...makeProps({ value: [] })} />
213
219
  </ThemeProvider>,
214
220
  { store },
215
221
  );
@@ -219,8 +225,6 @@ describe("IntegrationsField component rendering", () => {
219
225
  });
220
226
 
221
227
  test("should render the component IntegrationsField with integrations", async () => {
222
- const initialState = { ...defaultProps };
223
- defaultProps.value = [...initialStore.integrations.integrations];
224
228
  const store = mockStore(initialStore);
225
229
 
226
230
  const data = {
@@ -235,7 +239,7 @@ describe("IntegrationsField component rendering", () => {
235
239
  await act(async () => {
236
240
  render(
237
241
  <ThemeProvider theme={parseTheme(globalTheme)}>
238
- <IntegrationsField {...{ ...initialState, ...defaultProps }} />
242
+ <IntegrationsField {...makeProps({ value: [...initialStore.integrations.integrations] })} />
239
243
  </ThemeProvider>,
240
244
  { store },
241
245
  );
@@ -245,8 +249,6 @@ describe("IntegrationsField component rendering", () => {
245
249
  });
246
250
 
247
251
  test("should render the component IntegrationsField with custom code integration", async () => {
248
- const initialState = { ...defaultProps };
249
-
250
252
  const customOption = {
251
253
  name: "",
252
254
  contentHead: "",
@@ -255,7 +257,6 @@ describe("IntegrationsField component rendering", () => {
255
257
  contentPresence: { presenceType: "page-manual", relatedPages: null },
256
258
  };
257
259
 
258
- defaultProps.value = [...initialStore.integrations.integrations, customOption];
259
260
  const store = mockStore(initialStore);
260
261
 
261
262
  const data = {
@@ -270,7 +271,7 @@ describe("IntegrationsField component rendering", () => {
270
271
  await act(async () => {
271
272
  render(
272
273
  <ThemeProvider theme={parseTheme(globalTheme)}>
273
- <IntegrationsField {...{ ...initialState, ...defaultProps }} />
274
+ <IntegrationsField {...makeProps({ value: [...initialStore.integrations.integrations, customOption] })} />
274
275
  </ThemeProvider>,
275
276
  { store },
276
277
  );
@@ -282,8 +283,6 @@ describe("IntegrationsField component rendering", () => {
282
283
 
283
284
  describe("Events", () => {
284
285
  test("should delete a integration", async () => {
285
- const initialState = { ...defaultProps };
286
- defaultProps.value = [...initialStore.integrations.integrations];
287
286
  const store = mockStore(initialStore);
288
287
  const onChange = vi.fn();
289
288
 
@@ -299,7 +298,10 @@ describe("Events", () => {
299
298
  await act(async () => {
300
299
  render(
301
300
  <ThemeProvider theme={parseTheme(globalTheme)}>
302
- <IntegrationsField {...{ ...initialState, ...defaultProps }} onChange={onChange} />
301
+ <IntegrationsField
302
+ {...makeProps({ value: [...initialStore.integrations.integrations] })}
303
+ onChange={onChange}
304
+ />
303
305
  </ThemeProvider>,
304
306
  { store },
305
307
  );
@@ -321,8 +323,6 @@ describe("Events", () => {
321
323
  });
322
324
 
323
325
  test("should add an integration", async () => {
324
- const initialState = { ...defaultProps };
325
- defaultProps.value = [];
326
326
  const store = mockStore(initialStore);
327
327
  const onChange = vi.fn();
328
328
 
@@ -338,7 +338,7 @@ describe("Events", () => {
338
338
  await act(async () => {
339
339
  render(
340
340
  <ThemeProvider theme={parseTheme(globalTheme)}>
341
- <IntegrationsField {...{ ...initialState, ...defaultProps }} onChange={onChange} />
341
+ <IntegrationsField {...makeProps({ value: [] })} onChange={onChange} />
342
342
  </ThemeProvider>,
343
343
  { store },
344
344
  );
@@ -356,8 +356,6 @@ describe("Events", () => {
356
356
  });
357
357
 
358
358
  test("should add an custom code integration", async () => {
359
- const initialState = { ...defaultProps };
360
- defaultProps.value = [];
361
359
  const store = mockStore(initialStore);
362
360
  const onChange = vi.fn();
363
361
 
@@ -373,7 +371,7 @@ describe("Events", () => {
373
371
  await act(async () => {
374
372
  render(
375
373
  <ThemeProvider theme={parseTheme(globalTheme)}>
376
- <IntegrationsField {...{ ...initialState, ...defaultProps }} onChange={onChange} />
374
+ <IntegrationsField {...makeProps({ value: [] })} onChange={onChange} />
377
375
  </ThemeProvider>,
378
376
  { store },
379
377
  );
@@ -398,10 +396,11 @@ describe("Events", () => {
398
396
  });
399
397
 
400
398
  test("should paste a custom code integration", async () => {
401
- const initialState = { ...defaultProps };
402
- defaultProps.value = [];
403
- const _initialStore: any = { ...initialStore };
404
- _initialStore.integrations.integrationCopy = {
399
+ // `{ ...initialStore }` es una copia superficial: `integrations` seguía
400
+ // siendo el mismo objeto, así que escribir `integrationCopy` dentro dejaba
401
+ // el botón de pegar visible en todos los tests posteriores y su
402
+ // `getByTestId("icon-action-component")` encontraba dos botones.
403
+ const integrationCopy = {
405
404
  date: new Date(),
406
405
  integration: {
407
406
  id: 29,
@@ -418,7 +417,10 @@ describe("Events", () => {
418
417
  active: true,
419
418
  },
420
419
  };
421
- const store = mockStore(initialStore);
420
+ const store = mockStore({
421
+ ...initialStore,
422
+ integrations: { ...initialStore.integrations, integrationCopy },
423
+ });
422
424
  const onChange = vi.fn();
423
425
 
424
426
  const data = {
@@ -434,7 +436,7 @@ describe("Events", () => {
434
436
  render(
435
437
  <Router history={history}>
436
438
  <ThemeProvider theme={parseTheme(globalTheme)}>
437
- <IntegrationsField {...{ ...initialState, ...defaultProps }} onChange={onChange} />
439
+ <IntegrationsField {...makeProps({ value: [] })} onChange={onChange} />
438
440
  </ThemeProvider>
439
441
  </Router>,
440
442
  { store },
@@ -444,6 +446,6 @@ describe("Events", () => {
444
446
  const iconActionComponents = screen.getAllByTestId("icon-action-component");
445
447
  fireEvent.click(iconActionComponents[0]);
446
448
 
447
- expect(onChange).toHaveBeenLastCalledWith([_initialStore.integrations.integrationCopy.integration]);
449
+ expect(onChange).toHaveBeenLastCalledWith([integrationCopy.integration]);
448
450
  });
449
451
  });
@@ -8,14 +8,17 @@ import { mock } from "vitest-mock-extended";
8
8
 
9
9
  afterEach(cleanup);
10
10
 
11
- const defaultProps = mock<INoteFieldProps>();
12
- defaultProps.value = { text: "This is the text" };
11
+ // `value` se construye por test: el último escribía `value.title` sobre el
12
+ // objeto compartido, así que "should not render title" fallaba en cuanto se
13
+ // ejecutaba después de él.
14
+ const makeProps = (value: INoteFieldProps["value"] = { text: "This is the text" }): INoteFieldProps =>
15
+ Object.assign(mock<INoteFieldProps>(), { value });
13
16
 
14
17
  describe("NoteField component rendering", () => {
15
18
  it("should render the component", () => {
16
19
  render(
17
20
  <ThemeProvider theme={parseTheme(globalTheme)}>
18
- <NoteField {...defaultProps} />
21
+ <NoteField {...makeProps()} />
19
22
  </ThemeProvider>,
20
23
  );
21
24
 
@@ -27,7 +30,7 @@ describe("NoteField component rendering", () => {
27
30
  it("should render text value", () => {
28
31
  render(
29
32
  <ThemeProvider theme={parseTheme(globalTheme)}>
30
- <NoteField {...defaultProps} />
33
+ <NoteField {...makeProps()} />
31
34
  </ThemeProvider>,
32
35
  );
33
36
 
@@ -37,7 +40,7 @@ describe("NoteField component rendering", () => {
37
40
  it("should not render title", () => {
38
41
  render(
39
42
  <ThemeProvider theme={parseTheme(globalTheme)}>
40
- <NoteField {...defaultProps} />
43
+ <NoteField {...makeProps()} />
41
44
  </ThemeProvider>,
42
45
  );
43
46
 
@@ -47,11 +50,9 @@ describe("NoteField component rendering", () => {
47
50
  });
48
51
 
49
52
  it("should render title", () => {
50
- defaultProps.value.title = "Super title";
51
-
52
53
  render(
53
54
  <ThemeProvider theme={parseTheme(globalTheme)}>
54
- <NoteField {...defaultProps} />
55
+ <NoteField {...makeProps({ text: "This is the text", title: "Super title" })} />
55
56
  </ThemeProvider>,
56
57
  );
57
58
 
@@ -9,14 +9,15 @@ import userEvent from "@testing-library/user-event";
9
9
 
10
10
  afterEach(cleanup);
11
11
 
12
- const defaultProps = mock<INumberFieldProps>();
12
+ const makeProps = (overrides: Partial<INumberFieldProps> = {}): INumberFieldProps =>
13
+ Object.assign(mock<INumberFieldProps>(), overrides);
13
14
  const user = userEvent.setup();
14
15
 
15
16
  describe("NumberField component rendering", () => {
16
17
  it("should render the component", () => {
17
18
  render(
18
19
  <ThemeProvider theme={parseTheme(globalTheme)}>
19
- <NumberField {...defaultProps} />
20
+ <NumberField {...makeProps()} />
20
21
  </ThemeProvider>,
21
22
  );
22
23
 
@@ -32,7 +33,7 @@ describe("onClick events", () => {
32
33
 
33
34
  render(
34
35
  <ThemeProvider theme={parseTheme(globalTheme)}>
35
- <NumberField {...defaultProps} onChange={onChange} />
36
+ <NumberField {...makeProps()} onChange={onChange} />
36
37
  </ThemeProvider>,
37
38
  );
38
39
 
@@ -42,13 +43,11 @@ describe("onClick events", () => {
42
43
  });
43
44
 
44
45
  it("should call onChange when clicking arrow down", () => {
45
- defaultProps.value = 2;
46
- defaultProps.min = 1;
47
46
  const onChange = vi.fn();
48
47
 
49
48
  render(
50
49
  <ThemeProvider theme={parseTheme(globalTheme)}>
51
- <NumberField {...defaultProps} onChange={onChange} />
50
+ <NumberField {...makeProps({ value: 2, min: 1 })} onChange={onChange} />
52
51
  </ThemeProvider>,
53
52
  );
54
53
 
@@ -67,7 +66,7 @@ describe("onBlur events", () => {
67
66
 
68
67
  render(
69
68
  <ThemeProvider theme={parseTheme(globalTheme)}>
70
- <NumberField {...defaultProps} handleValidation={handleValidation} onBlur={onBlur} />
69
+ <NumberField {...makeProps()} handleValidation={handleValidation} onBlur={onBlur} />
71
70
  </ThemeProvider>,
72
71
  );
73
72
 
@@ -79,14 +78,12 @@ describe("onBlur events", () => {
79
78
 
80
79
  describe("onChange events", () => {
81
80
  it("should call onChange on change", () => {
82
- defaultProps.max = 7;
83
- defaultProps.error = true;
84
81
  const onChange = vi.fn();
85
82
  const handleValidation = vi.fn();
86
83
 
87
84
  render(
88
85
  <ThemeProvider theme={parseTheme(globalTheme)}>
89
- <NumberField {...defaultProps} onChange={onChange} handleValidation={handleValidation} />
86
+ <NumberField {...makeProps({ max: 7, error: true })} onChange={onChange} handleValidation={handleValidation} />
90
87
  </ThemeProvider>,
91
88
  );
92
89
 
@@ -97,12 +94,11 @@ describe("onChange events", () => {
97
94
  });
98
95
 
99
96
  it("should call onChange with undefined", async () => {
100
- defaultProps.value = undefined;
101
97
  const onChange = vi.fn();
102
98
 
103
99
  render(
104
100
  <ThemeProvider theme={parseTheme(globalTheme)}>
105
- <NumberField {...defaultProps} onChange={onChange} />
101
+ <NumberField {...makeProps({ value: undefined })} onChange={onChange} />
106
102
  </ThemeProvider>,
107
103
  );
108
104
 
@@ -26,6 +26,12 @@ describe("TextArea component rendering", () => {
26
26
  });
27
27
 
28
28
  describe("TextArea events", () => {
29
+ // Solo un test falsea los timers, pero restaurarlos en un hook evita que se
30
+ // queden falsos para el resto del describe si una aserción falla antes.
31
+ afterEach(() => {
32
+ vi.useRealTimers();
33
+ });
34
+
29
35
  // Asserts the observable contract instead of spying on React.useState: an ESM
30
36
  // namespace is immutable, so `vi.spyOn(React, ...)` no longer intercepts the
31
37
  // hook the component imported. onChange is debounced by 300ms.
@@ -44,8 +50,6 @@ describe("TextArea events", () => {
44
50
  fireEvent.change(textAreaComponent, { target: { value: "test" } });
45
51
  vi.advanceTimersByTime(300);
46
52
  expect(onChange).toHaveBeenCalledWith("test");
47
-
48
- vi.useRealTimers();
49
53
  });
50
54
 
51
55
  test("should call the onBlur", () => {
@@ -10,13 +10,14 @@ import globalTheme from "@ax/themes/theme.json";
10
10
 
11
11
  afterEach(cleanup);
12
12
 
13
- const defaultProps = mock<IToggleFieldProps>();
13
+ const makeProps = (overrides: Partial<IToggleFieldProps> = {}): IToggleFieldProps =>
14
+ Object.assign(mock<IToggleFieldProps>(), overrides);
14
15
 
15
16
  describe("ToggleField component rendering", () => {
16
17
  it("should render the component", () => {
17
18
  render(
18
19
  <ThemeProvider theme={parseTheme(globalTheme)}>
19
- <ToggleField {...defaultProps} />
20
+ <ToggleField {...makeProps()} />
20
21
  </ThemeProvider>,
21
22
  );
22
23
 
@@ -29,11 +30,9 @@ describe("ToggleField component rendering", () => {
29
30
  });
30
31
 
31
32
  it("should render input as checked", () => {
32
- defaultProps.value = true;
33
-
34
33
  render(
35
34
  <ThemeProvider theme={parseTheme(globalTheme)}>
36
- <ToggleField {...defaultProps} />
35
+ <ToggleField {...makeProps({ value: true })} />
37
36
  </ThemeProvider>,
38
37
  );
39
38
 
@@ -42,11 +41,9 @@ describe("ToggleField component rendering", () => {
42
41
  });
43
42
 
44
43
  it("should render input as disabled", () => {
45
- defaultProps.disabled = true;
46
-
47
44
  render(
48
45
  <ThemeProvider theme={parseTheme(globalTheme)}>
49
- <ToggleField {...defaultProps} />
46
+ <ToggleField {...makeProps({ disabled: true })} />
50
47
  </ThemeProvider>,
51
48
  );
52
49
 
@@ -55,11 +52,9 @@ describe("ToggleField component rendering", () => {
55
52
  });
56
53
 
57
54
  it("should render input with name", () => {
58
- defaultProps.name = "This is the name";
59
-
60
55
  render(
61
56
  <ThemeProvider theme={parseTheme(globalTheme)}>
62
- <ToggleField {...defaultProps} />
57
+ <ToggleField {...makeProps({ name: "This is the name" })} />
63
58
  </ThemeProvider>,
64
59
  );
65
60
 
@@ -68,11 +63,9 @@ describe("ToggleField component rendering", () => {
68
63
  });
69
64
 
70
65
  it("should render the auxText", () => {
71
- defaultProps.auxText = "This is the new text";
72
-
73
66
  render(
74
67
  <ThemeProvider theme={parseTheme(globalTheme)}>
75
- <ToggleField {...defaultProps} />
68
+ <ToggleField {...makeProps({ auxText: "This is the new text" })} />
76
69
  </ThemeProvider>,
77
70
  );
78
71
 
@@ -81,11 +74,9 @@ describe("ToggleField component rendering", () => {
81
74
  });
82
75
 
83
76
  it("should render with the background", () => {
84
- defaultProps.background = true;
85
-
86
77
  render(
87
78
  <ThemeProvider theme={parseTheme(globalTheme)}>
88
- <ToggleField {...defaultProps} />
79
+ <ToggleField {...makeProps({ background: true })} />
89
80
  </ThemeProvider>,
90
81
  );
91
82
 
@@ -98,29 +89,30 @@ describe("ToggleField component rendering", () => {
98
89
 
99
90
  describe("onClick events", () => {
100
91
  it("should call onChange function with value true", () => {
101
- defaultProps.value = false;
102
- defaultProps.onChange = vi.fn();
92
+ const onChange = vi.fn();
103
93
 
104
94
  render(
105
95
  <ThemeProvider theme={parseTheme(globalTheme)}>
106
- <ToggleField {...defaultProps} />
96
+ <ToggleField {...makeProps({ value: false, onChange })} />
107
97
  </ThemeProvider>,
108
98
  );
109
99
 
110
100
  const toggleFieldInput = screen.getByTestId("toggle-field-input");
111
101
  fireEvent.click(toggleFieldInput);
112
- expect(defaultProps.onChange).toHaveBeenCalledWith(true);
102
+ expect(onChange).toHaveBeenCalledWith(true);
113
103
  });
114
104
 
115
105
  it("should not call onChange function", () => {
106
+ const onChange = vi.fn();
107
+
116
108
  render(
117
109
  <ThemeProvider theme={parseTheme(globalTheme)}>
118
- <ToggleField {...defaultProps} onChange={undefined} />
110
+ <ToggleField {...makeProps({ onChange })} onChange={undefined} />
119
111
  </ThemeProvider>,
120
112
  );
121
113
 
122
114
  const toggleFieldInput = screen.getByTestId("toggle-field-input");
123
115
  fireEvent.click(toggleFieldInput);
124
- expect(defaultProps.onChange).not.toHaveBeenCalled();
116
+ expect(onChange).not.toHaveBeenCalled();
125
117
  });
126
118
  });
@@ -45,8 +45,15 @@ describe("Tooltip component rendering", () => {
45
45
  });
46
46
 
47
47
  describe("Tooltip events triggering", () => {
48
- it("should render the component and Tip Component is still visible when doing click", () => {
48
+ beforeEach(() => {
49
49
  vi.useFakeTimers();
50
+ });
51
+
52
+ afterEach(() => {
53
+ vi.useRealTimers();
54
+ });
55
+
56
+ it("should render the component and Tip Component is still visible when doing click", () => {
50
57
  defaultProps.content = "content";
51
58
  defaultProps.children = <Icon name="modified" size="16px" />;
52
59
 
@@ -97,7 +104,6 @@ describe("Tooltip events triggering", () => {
97
104
  });
98
105
 
99
106
  it("should render the component and change visibility of Tip Component when click", () => {
100
- vi.useFakeTimers();
101
107
  defaultProps.content = "content";
102
108
  defaultProps.children = <Icon name="modified" size="16px" />;
103
109
 
@@ -10,40 +10,48 @@ import { mock } from "vitest-mock-extended";
10
10
 
11
11
  afterEach(cleanup);
12
12
 
13
- const defaultProps = mock<IImageSelectionProps & IScrollableSelectionProps>();
14
- defaultProps.theme = "default-theme";
15
- defaultProps.options = [
16
- {
17
- value: "primary",
18
- img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/primaryStyle",
19
- },
20
- {
21
- value: "secondary",
22
- img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/secondaryStyle",
23
- },
24
- {
25
- value: "link",
26
- img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/linkStyle",
27
- },
28
- ];
13
+ type Props = IImageSelectionProps & IScrollableSelectionProps;
14
+
15
+ // Props por test: el segundo dejaba `elementUniqueSelection` puesto en el objeto
16
+ // compartido, así que el primero rendrizaba el componente equivocado cuando se
17
+ // ejecutaba después.
18
+ const makeProps = (overrides: Partial<Props> = {}): Props =>
19
+ Object.assign(
20
+ mock<Props>(),
21
+ {
22
+ theme: "default-theme",
23
+ options: [
24
+ {
25
+ value: "primary",
26
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/primaryStyle",
27
+ },
28
+ {
29
+ value: "secondary",
30
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/secondaryStyle",
31
+ },
32
+ {
33
+ value: "link",
34
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/linkStyle",
35
+ },
36
+ ],
37
+ },
38
+ overrides,
39
+ );
29
40
 
30
41
  describe("VisualUniqueSelection component rendering", () => {
31
42
  test("should render the component with ImageSelection", () => {
32
43
  render(
33
44
  <ThemeProvider theme={parseTheme(globalTheme)}>
34
- <VisualUniqueSelection {...defaultProps} />
45
+ <VisualUniqueSelection {...makeProps()} />
35
46
  </ThemeProvider>,
36
47
  );
37
48
  expect(screen.getByTestId("imageSelectionComponent")).toBeTruthy();
38
49
  });
39
50
 
40
51
  test("should render the component with ScrollableSelection", () => {
41
- defaultProps.elementUniqueSelection = true;
42
- defaultProps.columns = 2;
43
-
44
52
  render(
45
53
  <ThemeProvider theme={parseTheme(globalTheme)}>
46
- <VisualUniqueSelection {...defaultProps} />
54
+ <VisualUniqueSelection {...makeProps({ elementUniqueSelection: true, columns: 2 })} />
47
55
  </ThemeProvider>,
48
56
  );
49
57