Skip to content

Commit

Permalink
[EDR Workflows] Fix agent count on policy deploy modal (elastic#209593)
Browse files Browse the repository at this point in the history
## Summary

Fixes the agent count issue on the warning model when saving a Defend
package policy. Now it uses the same `active` field instead of `all`, as
the `AgentSummary` component.

Also, re-enables flaky unit test for `PolicySettingsLayout`:
closes: elastic#179984

### Checklist

Check the PR satisfies following conditions. 

Reviewers should verify this PR satisfies this list as well.


- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
  • Loading branch information
gergoabraham authored Feb 6, 2025
1 parent f299c9f commit 16fae1c
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import type { PolicyData } from '../../../../common/endpoint/types';
import { allFleetHttpMocks } from '../../mocks';
import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator';
import { useFetchAgentByAgentPolicySummary } from './use_fetch_endpoint_policy_agent_summary';
import type { GetAgentStatusResponse } from '@kbn/fleet-plugin/common';
import { agentRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common';

const useQueryMock = _useQuery as jest.Mock;
Expand Down Expand Up @@ -59,16 +60,19 @@ describe('When using the `useFetchEndpointPolicyAgentSummary()` hook', () => {
query: { policyId: policy.policy_ids[0] },
version: API_VERSIONS.public.v1,
});
expect(data).toEqual({
total: 50,
const expectedData: GetAgentStatusResponse['results'] = {
active: 50,
all: 0,
inactive: 5,
online: 40,
error: 0,
offline: 5,
updating: 0,
other: 0,
events: 0,
});
unenrolled: 0,
};
expect(data).toEqual(expectedData);
});

it('should apply default values to api returned data', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -415,17 +415,19 @@ export const fleetGetAgentStatusHttpMock =
id: 'agentStatus',
path: AGENT_API_ROUTES.STATUS_PATTERN,
method: 'get',
handler: () => {
handler: (): GetAgentStatusResponse => {
return {
results: {
total: 50,
active: 50,
inactive: 5,
online: 40,
error: 0,
offline: 5,
updating: 0,
other: 0,
events: 0,
unenrolled: 0,
all: 0,
},
};
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { cloneDeep } from 'lodash';
import { set } from '@kbn/safer-lodash-set';
import { ProtectionModes } from '../../../../../../common/endpoint/types';
import { waitFor, cleanup } from '@testing-library/react';
import type { GetAgentStatusResponse } from '@kbn/fleet-plugin/common';
import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common';
import { getPolicyDataForUpdate } from '../../../../../../common/endpoint/service/policy';
import { getDeferred } from '../../../../mocks/utils';
Expand All @@ -34,8 +35,7 @@ jest.mock('../../../../../common/components/user_privileges');

const useUserPrivilegesMock = _useUserPrivileges as jest.Mock;

// Failing: See https://github.com/elastic/kibana/issues/179984
describe.skip('When rendering PolicySettingsLayout', () => {
describe('When rendering PolicySettingsLayout', () => {
jest.setTimeout(15000);

const testSubj = getPolicySettingsFormTestSubjects();
Expand Down Expand Up @@ -84,6 +84,14 @@ describe.skip('When rendering PolicySettingsLayout', () => {
}
};

/**
* Performs a minimal number of updates to make 'Save' button enabled.
*/
const makeMinimalUpdates = async () => {
const { getByTestId } = renderResult;
await userEvent.click(getByTestId(testSubj.malware.enableDisableSwitch));
};

/**
* Makes updates to the policy form on the UI and return back a new (cloned) `PolicyData`
* with the updates reflected in it
Expand Down Expand Up @@ -114,9 +122,11 @@ describe.skip('When rendering PolicySettingsLayout', () => {
await userEvent.type(getByTestId(testSubj.ransomware.notifyCustomMessage), 'foo message');
set(policySettings, 'windows.popup.ransomware.message', 'foo message');

await userEvent.click(getByTestId(testSubj.advancedSection.showHideButton));
await userEvent.type(getByTestId('linux.advanced.agent.connection_delay'), '1000');
set(policySettings, 'linux.advanced.agent.connection_delay', '1000');
// skipping Advanced Options as changing them takes too long.
// todo: re-enable them with this issue: https://github.com/elastic/security-team/issues/11765
// await userEvent.click(getByTestId(testSubj.advancedSection.showHideButton));
// await userEvent.type(getByTestId('linux.advanced.agent.connection_delay'), '1000');
// set(policySettings, 'linux.advanced.agent.connection_delay', '1000');

return expectedUpdates;
};
Expand All @@ -131,7 +141,7 @@ describe.skip('When rendering PolicySettingsLayout', () => {

it('should render layout with expected content when changes have been made', async () => {
const { getByTestId } = render();
await makeUpdates();
await makeMinimalUpdates();
expect(getByTestId('endpointPolicyForm'));
expect(getByTestId('policyDetailsCancelButton')).not.toBeDisabled();
expect(getByTestId('policyDetailsSaveButton')).not.toBeDisabled();
Expand All @@ -153,7 +163,7 @@ describe.skip('When rendering PolicySettingsLayout', () => {
const deferred = getDeferred();
apiMocks.responseProvider.updateEndpointPolicy.mockDelay.mockReturnValue(deferred.promise);
const { getByTestId } = render();
await makeUpdates();
await makeMinimalUpdates();
await clickSave(true, false);

await waitFor(() => {
Expand All @@ -164,13 +174,11 @@ describe.skip('When rendering PolicySettingsLayout', () => {
expect(
getByTestId('policyDetailsSaveButton').querySelector('.euiLoadingSpinner')
).not.toBeNull();

deferred.resolve();
});

it('should show success toast on update success', async () => {
render();
await makeUpdates();
await makeMinimalUpdates();
await clickSave();

await waitFor(() => {
Expand All @@ -189,7 +197,7 @@ describe.skip('When rendering PolicySettingsLayout', () => {
throw new Error('oh oh!');
});
render();
await makeUpdates();
await makeMinimalUpdates();
await clickSave();

await waitFor(() => {
Expand All @@ -202,6 +210,39 @@ describe.skip('When rendering PolicySettingsLayout', () => {
title: 'Failed!',
});
});

it('should not show warning about endpoints if there are no active endpoints', async () => {
apiMocks.responseProvider.agentStatus.mockReturnValue({
results: { active: 0 },
} as GetAgentStatusResponse);

const { getByTestId, queryByTestId } = render();
await makeMinimalUpdates();

await userEvent.click(getByTestId('policyDetailsSaveButton'));
await waitFor(() => {
expect(getByTestId('confirmModalConfirmButton')).toBeInTheDocument();
});
expect(queryByTestId('policyDetailsWarningCallout')).not.toBeInTheDocument();
});

it('should show warning about endpoints with the number of active endpoints', async () => {
apiMocks.responseProvider.agentStatus.mockReturnValue({
results: { active: 6 },
} as GetAgentStatusResponse);

const { getByTestId } = render();
await makeMinimalUpdates();

await userEvent.click(getByTestId('policyDetailsSaveButton'));
await waitFor(() => {
expect(getByTestId('confirmModalConfirmButton')).toBeInTheDocument();
});

const callout = getByTestId('policyDetailsWarningCallout');
expect(callout).toBeInTheDocument();
expect(callout.textContent).toContain('This action will update 6 endpoints');
});
});

describe('and user has View Only permissions', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ export const PolicySettingsLayout = memo<PolicySettingsLayoutProps>(
<>
{showConfirm && (
<ConfirmUpdate
endpointCount={agentSummaryData ? agentSummaryData.all : 0}
endpointCount={agentSummaryData ? agentSummaryData.active : 0}
onCancel={handleSaveCancel}
onConfirm={handleSaveConfirmation}
/>
Expand Down

0 comments on commit 16fae1c

Please sign in to comment.