Skip to content

Commit 356fc4e

Browse files
upcoming: [DI-27663]: Resetting stale dimension filter values from the from (linode#13018)
* upcoming: [DI-27663] - Hook to remove invalidate dimension filter values from form * renaming the hook * removed unnecessary comment * add changesets * upcmong: [DI-27663] - Added unit tests to the cleanup hook * fix tense in changeset
1 parent 40219ce commit 356fc4e

7 files changed

Lines changed: 550 additions & 2 deletions
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/manager": Upcoming Features
3+
---
4+
5+
ACLP-Alerting: Add hook to cleanup stale value from Alerting form ([#13018](https://github.com/linode/manager/pull/13018))

packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/DimensionFilterValue/FirewallDimensionFilterAutocomplete.test.tsx

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { screen } from '@testing-library/react';
1+
import { screen, waitFor } from '@testing-library/react';
22
import userEvent from '@testing-library/user-event';
33
import React from 'react';
44
import { vi } from 'vitest';
@@ -242,4 +242,115 @@ describe('<FirewallDimensionFilterAutocomplete />', () => {
242242
await screen.findByRole('option', { name: 'us-east' })
243243
).toBeVisible();
244244
});
245+
it('cleans up invalid single value (string)', async () => {
246+
queryMocks.useFirewallFetchOptions.mockReturnValue({
247+
values: [{ label: 'Linode-1', value: '1' }],
248+
isLoading: false,
249+
isError: false,
250+
});
251+
const fieldOnChange = vi.fn();
252+
const { rerender } = renderWithTheme(
253+
<FirewallDimensionFilterAutocomplete
254+
{...defaultProps}
255+
fieldOnChange={fieldOnChange}
256+
fieldValue="invalid"
257+
multiple={false}
258+
/>
259+
);
260+
// Simulate update to trigger effect
261+
queryMocks.useFirewallFetchOptions.mockReturnValue({
262+
values: [{ label: 'Linode-1', value: '1' }],
263+
isLoading: false,
264+
isError: false,
265+
});
266+
rerender(
267+
<FirewallDimensionFilterAutocomplete
268+
{...defaultProps}
269+
fieldOnChange={fieldOnChange}
270+
fieldValue="invalid"
271+
multiple={false}
272+
/>
273+
);
274+
await waitFor(() => {
275+
expect(fieldOnChange).toHaveBeenCalledWith(null);
276+
});
277+
});
278+
279+
it('cleans up invalid multi value (comma-separated string)', async () => {
280+
queryMocks.useFirewallFetchOptions.mockReturnValue({
281+
values: [
282+
{ label: 'Linode-1', value: '1' },
283+
{ label: 'Linode-2', value: '2' },
284+
],
285+
isLoading: false,
286+
isError: false,
287+
});
288+
const fieldOnChange = vi.fn();
289+
const { rerender } = renderWithTheme(
290+
<FirewallDimensionFilterAutocomplete
291+
{...defaultProps}
292+
fieldOnChange={fieldOnChange}
293+
fieldValue="1,3,2"
294+
multiple={true}
295+
/>
296+
);
297+
queryMocks.useFirewallFetchOptions.mockReturnValue({
298+
values: [
299+
{ label: 'Linode-1', value: '1' },
300+
{ label: 'Linode-2', value: '2' },
301+
],
302+
isLoading: false,
303+
isError: false,
304+
});
305+
rerender(
306+
<FirewallDimensionFilterAutocomplete
307+
{...defaultProps}
308+
fieldOnChange={fieldOnChange}
309+
fieldValue="1,3,2"
310+
multiple={true}
311+
/>
312+
);
313+
await waitFor(() => {
314+
expect(fieldOnChange).toHaveBeenCalledWith('1,2');
315+
});
316+
});
317+
318+
it('cleans up all invalid multi values (comma-separated string)', async () => {
319+
queryMocks.useFirewallFetchOptions.mockReturnValue({
320+
values: [
321+
{ label: 'Linode-1', value: '1' },
322+
{ label: 'Linode-2', value: '2' },
323+
],
324+
isLoading: false,
325+
isError: false,
326+
});
327+
const fieldOnChange = vi.fn();
328+
const { rerender } = renderWithTheme(
329+
<FirewallDimensionFilterAutocomplete
330+
{...defaultProps}
331+
fieldOnChange={fieldOnChange}
332+
fieldValue="3,4"
333+
multiple={true}
334+
/>
335+
);
336+
queryMocks.useFirewallFetchOptions.mockReturnValue({
337+
values: [
338+
{ label: 'Linode-1', value: '1' },
339+
{ label: 'Linode-2', value: '2' },
340+
],
341+
isLoading: false,
342+
isError: false,
343+
});
344+
rerender(
345+
<FirewallDimensionFilterAutocomplete
346+
{...defaultProps}
347+
fieldOnChange={fieldOnChange}
348+
fieldValue="3,4"
349+
multiple={true}
350+
/>
351+
);
352+
await waitFor(() => {
353+
expect(fieldOnChange).toHaveBeenCalledWith('');
354+
});
355+
});
245356
});

packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/DimensionFilterValue/FirewallDimensionFilterAutocomplete.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useRegionsQuery } from '@linode/queries';
22
import { Autocomplete } from '@linode/ui';
33
import React from 'react';
44

5+
import { useCleanupStaleValues } from './useCleanupStaleValues';
56
import { useFirewallFetchOptions } from './useFirewallFetchOptions';
67
import { handleValueChange, resolveSelectedValues } from './utils';
78

@@ -39,6 +40,15 @@ export const FirewallDimensionFilterAutocomplete = (
3940
type,
4041
scope,
4142
});
43+
44+
useCleanupStaleValues({
45+
options: values,
46+
fieldValue,
47+
multiple,
48+
onChange: fieldOnChange,
49+
isLoading,
50+
});
51+
4252
return (
4353
<Autocomplete
4454
data-qa-dimension-filter={`${name}-value`}

packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/DimensionFilterValue/ObjectStorageDimensionFilterAutocomplete.test.tsx

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { screen } from '@testing-library/react';
1+
import { screen, waitFor } from '@testing-library/react';
22
import userEvent from '@testing-library/user-event';
33
import React from 'react';
44
import { vi } from 'vitest';
@@ -220,4 +220,49 @@ describe('<ObjectStorageDimensionFilterAutocomplete />', () => {
220220
'us-east-1.linodeobjects.com,us-west-1.linodeobjects.com'
221221
);
222222
});
223+
it('field cleanup removes invalid values', async () => {
224+
queryMocks.useObjectStorageFetchOptions.mockReturnValue({
225+
values: [
226+
{
227+
label: 'us-east-1.linodeobjects.com',
228+
value: 'us-east-1.linodeobjects.com',
229+
},
230+
],
231+
isLoading: false,
232+
isError: false,
233+
});
234+
235+
const fieldOnChange = vi.fn();
236+
237+
const { rerender } = renderWithTheme(
238+
<ObjectStorageDimensionFilterAutocomplete
239+
{...defaultProps}
240+
fieldOnChange={fieldOnChange}
241+
fieldValue="invalid-endpoint.linodeobjects.com"
242+
/>
243+
);
244+
245+
queryMocks.useObjectStorageFetchOptions.mockReturnValue({
246+
values: [
247+
{
248+
label: 'us-west-1.linodeobjects.com',
249+
value: 'us-west-1.linodeobjects.com',
250+
},
251+
],
252+
isLoading: false,
253+
isError: false,
254+
});
255+
// Trigger the effect by rerendering with the same props
256+
rerender(
257+
<ObjectStorageDimensionFilterAutocomplete
258+
{...defaultProps}
259+
fieldOnChange={fieldOnChange}
260+
fieldValue="invalid-endpoint.linodeobjects.com"
261+
/>
262+
);
263+
// fieldOnChange should be called to clean up the invalid value
264+
await waitFor(() => {
265+
expect(fieldOnChange).toHaveBeenCalledWith(null);
266+
});
267+
});
223268
});

packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/DimensionFilterValue/ObjectStorageDimensionFilterAutocomplete.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useRegionsQuery } from '@linode/queries';
22
import { Autocomplete } from '@linode/ui';
33
import React from 'react';
44

5+
import { useCleanupStaleValues } from './useCleanupStaleValues';
56
import { useObjectStorageFetchOptions } from './useObjectStorageFetchOptions';
67
import { handleValueChange, resolveSelectedValues } from './utils';
78

@@ -41,6 +42,14 @@ export const ObjectStorageDimensionFilterAutocomplete = (
4142
serviceType,
4243
});
4344

45+
useCleanupStaleValues({
46+
options: values,
47+
fieldValue,
48+
multiple,
49+
onChange: fieldOnChange,
50+
isLoading,
51+
});
52+
4453
return (
4554
<Autocomplete
4655
data-qa-dimension-filter={`${name}-value`}

0 commit comments

Comments
 (0)