From 779e1550c7ed7a5ccdc04a5f6f6270c35d58a23f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Apr 2026 13:44:40 +0000 Subject: [PATCH 1/2] [frontend] fix(atomic-testing): use local state for target expectations to prevent cross-test result pollution Agent-Logs-Url: https://github.com/OpenAEV-Platform/openaev/sessions/b92ea6e7-35ac-46f5-bb88-f735d8e20b00 Co-authored-by: Seb-MIGUEL <203619865+Seb-MIGUEL@users.noreply.github.com> --- .../atomic_testings/atomic-testing-actions.ts | 4 +-- .../InjectExpectationAggregatedAgentsView.tsx | 33 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/openaev-front/src/actions/atomic_testings/atomic-testing-actions.ts b/openaev-front/src/actions/atomic_testings/atomic-testing-actions.ts index 47d8f4d99f0..aed122f02f0 100644 --- a/openaev-front/src/actions/atomic_testings/atomic-testing-actions.ts +++ b/openaev-front/src/actions/atomic_testings/atomic-testing-actions.ts @@ -54,9 +54,9 @@ export const fetchTargetResult = (injectId: string, targetId: string, targetType return simpleCall(uri); }; -export const fetchTargetResultAssetWithAgents = (injectId: string, targetId: string, expectationType: string) => (dispatch: Dispatch) => { +export const fetchTargetResultAssetWithAgents = (injectId: string, targetId: string, expectationType: string) => { const uri = `${ATOMIC_TESTING_URI}/${injectId}/target_results/${targetId}/asset_with_agents?expectationType=${expectationType}`; - return getReferential(schema.arrayOfInjectexpectations, uri)(dispatch); + return simpleCall(uri); }; export const createAtomicTesting = (data: AtomicTestingInput) => { diff --git a/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx b/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx index 7232fc9da9e..9850e9a21e5 100644 --- a/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx +++ b/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx @@ -1,21 +1,17 @@ import { Paper, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { fetchTargetResultAssetWithAgents } from '../../../../../actions/atomic_testings/atomic-testing-actions'; -import { type InjectHelper } from '../../../../../actions/injects/inject-helper'; import ExpandableSection from '../../../../../components/common/ExpandableSection'; import { useFormatter } from '../../../../../components/i18n'; import ItemStatus from '../../../../../components/ItemStatus'; import Loader from '../../../../../components/Loader'; -import { useHelper } from '../../../../../store'; import type { InjectExpectationAgentOutput, InjectResultOverviewOutput, InjectTarget, } from '../../../../../utils/api-types'; -import { useAppDispatch } from '../../../../../utils/hooks'; -import useDataLoader from '../../../../../utils/hooks/useDataLoader'; import { computeInjectExpectationLabel } from '../../../../../utils/statusUtils'; import type { InjectExpectationsStore } from '../../../common/injects/expectations/Expectation'; import InjectExpectationResultList from './InjectExpectationResultList'; @@ -27,18 +23,29 @@ interface Props { } const InjectExpectationAggregatedAgentsView = ({ inject, expectationType, target }: Props) => { - const dispatch = useAppDispatch(); const { t } = useFormatter(); const theme = useTheme(); - const [loading, setLoading] = useState(false); + const [loading, setLoading] = useState(true); + const [injectExpectationsWithAgents, setInjectExpectationsWithAgents] = useState([]); - useDataLoader(() => { + useEffect(() => { + let active = true; setLoading(true); - dispatch(fetchTargetResultAssetWithAgents(inject.inject_id, target.target_id, expectationType)).finally(() => setLoading(false)); - }); - - const { injectExpectationsWithAgents } = useHelper((helper: InjectHelper) => - ({ injectExpectationsWithAgents: helper.getInjectExpectationsByAsset(target.target_id, expectationType) })); + fetchTargetResultAssetWithAgents(inject.inject_id, target.target_id, expectationType) + .then((result: { data: InjectExpectationAgentOutput[] }) => { + if (active) { + setInjectExpectationsWithAgents(result.data ?? []); + } + }) + .finally(() => { + if (active) { + setLoading(false); + } + }); + return () => { + active = false; + }; + }, [inject.inject_id, target.target_id, expectationType]); if (loading) { return ; From 1918171344878b4a3ec96173b3ea0ba7c8fc32f4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 14:35:29 +0000 Subject: [PATCH 2/2] [backend] fix(test): use IGNORING_ARRAY_ORDER in InjectTargetSearchTest Agent-Logs-Url: https://github.com/OpenAEV-Platform/openaev/sessions/820c827e-404d-4733-802c-dc08a72b6345 Co-authored-by: Seb-MIGUEL <203619865+Seb-MIGUEL@users.noreply.github.com> --- .../java/io/openaev/rest/inject/InjectTargetSearchTest.java | 5 ++++- openaev-front/src/actions/Schema.js | 4 +--- openaev-front/src/actions/injects/inject-helper.d.ts | 5 +---- .../target_result/InjectExpectationAggregatedAgentsView.tsx | 1 + 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/openaev-api/src/test/java/io/openaev/rest/inject/InjectTargetSearchTest.java b/openaev-api/src/test/java/io/openaev/rest/inject/InjectTargetSearchTest.java index e046d2419df..71d5e489ca8 100644 --- a/openaev-api/src/test/java/io/openaev/rest/inject/InjectTargetSearchTest.java +++ b/openaev-api/src/test/java/io/openaev/rest/inject/InjectTargetSearchTest.java @@ -348,7 +348,10 @@ public void orFilterGroupCombinationShouldNotReturnAgentThatIsNotTargetOfInject( agent3Wrapper.get().getAsset().getId(), agent3Wrapper.get().getExecutor().getType())); - assertThatJson(response).node("content").isEqualTo(mapper.writeValueAsString(expected)); + assertThatJson(response) + .when(Option.IGNORING_ARRAY_ORDER) + .node("content") + .isEqualTo(mapper.writeValueAsString(expected)); } } diff --git a/openaev-front/src/actions/Schema.js b/openaev-front/src/actions/Schema.js index 6d0f8181dec..29461df5efd 100644 --- a/openaev-front/src/actions/Schema.js +++ b/openaev-front/src/actions/Schema.js @@ -361,9 +361,7 @@ export const storeHelper = state => ({ getExerciseInjectExpectations: id => entities('injectexpectations', state).filter( i => i.get('inject_expectation_exercise') === id, ), - getInjectExpectationsByAsset: (id, type) => entities('injectexpectations', state).filter( - i => (i.get('inject_expectation_asset') === id && i.get('inject_expectation_type') === type), - ), + getInjectExpectationsMap: () => maps('injectexpectations', state), // documents getDocuments: () => entities('documents', state), diff --git a/openaev-front/src/actions/injects/inject-helper.d.ts b/openaev-front/src/actions/injects/inject-helper.d.ts index 3cac21167d7..5bb5c529875 100644 --- a/openaev-front/src/actions/injects/inject-helper.d.ts +++ b/openaev-front/src/actions/injects/inject-helper.d.ts @@ -1,8 +1,7 @@ import { type Exercise, type Inject, - type InjectExpectation, type InjectExpectationAgentOutput, - type InjectTarget, + type InjectExpectation, type Scenario, type Team, } from '../../utils/api-types'; @@ -17,6 +16,4 @@ export interface InjectHelper { getScenarioInjects: (scenarioId: Scenario['scenario_id']) => Inject[]; getTeamScenarioInjects: (teamId: Team['team_id']) => Inject[]; - - getInjectExpectationsByAsset: (targetId: InjectTarget['target_id'], expectationType: string) => InjectExpectationAgentOutput[]; } diff --git a/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx b/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx index 9850e9a21e5..9641d4d796a 100644 --- a/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx +++ b/openaev-front/src/admin/components/atomic_testings/atomic_testing/target_result/InjectExpectationAggregatedAgentsView.tsx @@ -37,6 +37,7 @@ const InjectExpectationAggregatedAgentsView = ({ inject, expectationType, target setInjectExpectationsWithAgents(result.data ?? []); } }) + .catch(() => {}) // error already notified by simpleCall .finally(() => { if (active) { setLoading(false);