Skip to content

Commit 4dc0c62

Browse files
authored
Merge branch 'staging' into feature/NU-2009
2 parents 7b05fa6 + b22e00b commit 4dc0c62

File tree

48 files changed

+2886
-1616
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2886
-1616
lines changed

designer/client/src/actions/actionTypes.ts

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export type ActionTypes =
2121
| "EDIT_LABELS"
2222
| "SHOW_METRICS"
2323
| "UPDATE_TEST_CAPABILITIES"
24-
| "UPDATE_TEST_FORM_PARAMETERS"
2524
| "UPDATE_TEST_TYPE"
2625
| "DISPLAY_PROCESS"
2726
| "GET_SCENARIO_ACTIVITIES"

designer/client/src/actions/nk/adhocTesting.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import HttpService, { SourceWithParametersTest } from "../../http/HttpService";
2-
import { Expression, NodeValidationError, ScenarioGraph, TypingResult, VariableTypes } from "../../types";
3-
41
import { debounce } from "lodash";
52

3+
import type { SourceWithParametersTest } from "../../http/HttpService";
4+
import HttpService from "../../http/HttpService";
5+
import type { Expression, NodeValidationError, ScenarioGraph, TypingResult, VariableTypes } from "../../types";
6+
67
export interface GenericValidationData {
78
validationErrors: NodeValidationError[];
89
validationPerformed: boolean;
@@ -20,7 +21,10 @@ export interface GenericValidationRequest {
2021
}
2122

2223
export interface TestAdhocValidationRequest {
23-
sourceParameters: SourceWithParametersTest;
24+
testData: {
25+
type: string;
26+
sourceParameters?: SourceWithParametersTest;
27+
};
2428
scenarioGraph: ScenarioGraph;
2529
}
2630

designer/client/src/actions/nk/displayTestResults.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export function testScenarioWithGeneratedData(testSampleSize: string, processNam
4242
});
4343
dispatch({ type: "TEST_RESULTS_LOADING" });
4444

45-
HttpService.testScenarioWithGeneratedData(processName, testSampleSize, scenarioGraph)
45+
HttpService.testScenarioWithGeneratedData(processName, +testSampleSize, scenarioGraph)
4646
.then((response) => dispatch(displayTestResults(response.data)))
4747
.catch(() => {
4848
dispatch({ type: "LOADING_FAILED" });

designer/client/src/actions/nk/process.ts

-10
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,6 @@ export function loadProcessState(processName: ProcessName, processVersionId: num
5050
);
5151
}
5252

53-
export function fetchTestFormParameters(processName: ProcessName, scenarioGraph: ScenarioGraph) {
54-
return (dispatch) =>
55-
HttpService.getTestFormParameters(processName, scenarioGraph).then(({ data }) => {
56-
dispatch({
57-
type: "UPDATE_TEST_FORM_PARAMETERS",
58-
testFormParameters: data,
59-
});
60-
});
61-
}
62-
6353
export function displayTestCapabilities(processName: ProcessName, scenarioGraph: ScenarioGraph) {
6454
return (dispatch) =>
6555
HttpService.getTestCapabilities(processName, scenarioGraph).then(({ data }) =>

designer/client/src/common/TestResultUtils.ts

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable i18next/no-literal-string */
22
import { head, uniq, values } from "lodash";
3-
import { NodeId, UIParameter } from "../types";
3+
4+
import type { NodeId, UIParameter } from "../types";
45

56
export interface Variable {
67
original?: string;
@@ -29,9 +30,22 @@ interface ExternalInvocationResult {
2930
}
3031

3132
export interface TestCapabilities {
32-
canBeTested: boolean;
33-
canGenerateTestData: boolean;
34-
canTestWithForm: boolean;
33+
testWithParameters: TestWithParametersCapability;
34+
testWithGeneratedData: GenericCapability;
35+
}
36+
37+
export interface TestWithParametersCapability {
38+
status: TestCapabilityStatus;
39+
sourceParameters?: TestFormParameters[];
40+
}
41+
42+
export interface GenericCapability {
43+
status: TestCapabilityStatus;
44+
}
45+
46+
export enum TestCapabilityStatus {
47+
AVAILABLE = "AVAILABLE",
48+
NOT_AVAILABLE = "NOT_AVAILABLE",
3549
}
3650

3751
export interface TestFormParameters {
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
import { useEffect, useMemo } from "react";
12
import { useDispatch, useSelector } from "react-redux";
3+
4+
import { displayTestCapabilities } from "../../../actions/nk";
5+
import { TestCapabilityStatus } from "../../../common/TestResultUtils";
26
import {
37
getProcessName,
48
getScenarioGraph,
59
getTestCapabilities,
610
isLatestProcessVersion,
711
isProcessRenamed,
812
} from "../../../reducers/selectors/graph";
9-
import { useEffect, useMemo } from "react";
10-
import { displayTestCapabilities, fetchTestFormParameters } from "../../../actions/nk";
1113

1214
// TODO: fetch TestCapabilities and TestFormParameters in chain to avoid stupid errors
1315
export function useAdhocTestingAvailability(disabled: boolean) {
@@ -20,18 +22,13 @@ export function useAdhocTestingAvailability(disabled: boolean) {
2022
const scenarioGraph = useSelector(getScenarioGraph);
2123

2224
const isAvailable = useMemo(() => {
23-
return !disabled && processIsLatestVersion && testCapabilities?.canTestWithForm;
24-
}, [disabled, processIsLatestVersion, testCapabilities?.canTestWithForm]);
25+
return !disabled && processIsLatestVersion && testCapabilities?.testWithParameters.status == TestCapabilityStatus.AVAILABLE;
26+
}, [disabled, processIsLatestVersion, testCapabilities?.testWithParameters.status]);
2527

2628
useEffect(() => {
2729
if (isRenamed) return;
2830
dispatch(displayTestCapabilities(scenarioName, scenarioGraph));
2931
}, [dispatch, isRenamed, scenarioGraph, scenarioName]);
3032

31-
useEffect(() => {
32-
if (isRenamed || !isAvailable) return;
33-
dispatch(fetchTestFormParameters(scenarioName, scenarioGraph));
34-
}, [dispatch, isRenamed, scenarioName, scenarioGraph, isAvailable]);
35-
3633
return isAvailable;
3734
}

designer/client/src/components/modals/Testing/TestingForm.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import React, { useCallback, useMemo, useState } from "react";
55
import { Trans, useTranslation } from "react-i18next";
66
import { useDispatch, useSelector } from "react-redux";
77

8+
import { TestCapabilityStatus } from "../../../common/TestResultUtils";
89
import { getTestCapabilities, getTestType } from "../../../reducers/selectors/graph";
910
import type { WindowKind } from "../../../windowManager";
1011
import { CustomRadio } from "../../customRadio/CustomRadio";
@@ -35,9 +36,12 @@ export function TestingForm({ testingData, closeDialog }: TestingFormProps): JSX
3536
const dispatch = useDispatch();
3637

3738
const testCapabilities = useSelector(getTestCapabilities);
38-
const testWithParametersIsAvailable = useMemo(() => testCapabilities.canTestWithForm, [testCapabilities]);
39+
const testWithParametersIsAvailable = useMemo(
40+
() => testCapabilities.testWithParameters.status == TestCapabilityStatus.AVAILABLE,
41+
[testCapabilities],
42+
);
3943
const testWithGeneratedDataIsAvailable = useMemo(
40-
() => testCapabilities.canGenerateTestData && testCapabilities.canBeTested,
44+
() => testCapabilities.testWithGeneratedData.status == TestCapabilityStatus.AVAILABLE,
4145
[testCapabilities],
4246
);
4347

designer/client/src/components/toolbars/test/buttons/FromFileButton.tsx

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import React from "react";
22
import { useTranslation } from "react-i18next";
33
import { useDispatch, useSelector } from "react-redux";
4-
import { CapabilitiesToolbarButton } from "../../../toolbarComponents/CapabilitiesToolbarButton";
5-
import { getProcessName, getScenarioGraph, getTestCapabilities } from "../../../../reducers/selectors/graph";
6-
import Icon from "../../../../assets/img/toolbarButtons/from-file.svg";
7-
import { ToolbarButtonProps } from "../../types";
4+
85
import { testProcessFromFile } from "../../../../actions/nk/displayTestResults";
6+
import Icon from "../../../../assets/img/toolbarButtons/from-file.svg";
7+
import { TestCapabilityStatus } from "../../../../common/TestResultUtils";
8+
import { getProcessName, getScenarioGraph, getTestCapabilities } from "../../../../reducers/selectors/graph";
9+
import { CapabilitiesToolbarButton } from "../../../toolbarComponents/CapabilitiesToolbarButton";
10+
import type { ToolbarButtonProps } from "../../types";
911

1012
function FromFileButton(props: ToolbarButtonProps) {
1113
const dispatch = useDispatch();
@@ -15,7 +17,7 @@ function FromFileButton(props: ToolbarButtonProps) {
1517
const { disabled, type } = props;
1618
const { t } = useTranslation();
1719

18-
const available = !disabled && testCapabilities && testCapabilities.canBeTested;
20+
const available = !disabled && testCapabilities && testCapabilities.testWithGeneratedData.status == TestCapabilityStatus.AVAILABLE;
1921

2022
return (
2123
<CapabilitiesToolbarButton

designer/client/src/components/toolbars/test/buttons/GenerateAndTestButton.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import React from "react";
22
import { useTranslation } from "react-i18next";
33
import { useSelector } from "react-redux";
4+
45
import Icon from "../../../../assets/img/toolbarButtons/generate-and-test.svg";
6+
import { TestCapabilityStatus } from "../../../../common/TestResultUtils";
57
import { getTestCapabilities, isLatestProcessVersion } from "../../../../reducers/selectors/graph";
68
import { useWindows, WindowKind } from "../../../../windowManager";
79
import { CapabilitiesToolbarButton } from "../../../toolbarComponents/CapabilitiesToolbarButton";
8-
import { ToolbarButtonProps } from "../../types";
10+
import type { ToolbarButtonProps } from "../../types";
911

1012
type Props = ToolbarButtonProps;
1113

@@ -14,7 +16,11 @@ function GenerateAndTestButton(props: Props) {
1416
const { t } = useTranslation();
1517
const testCapabilities = useSelector(getTestCapabilities);
1618
const processIsLatestVersion = useSelector(isLatestProcessVersion);
17-
const available = !disabled && processIsLatestVersion && testCapabilities && testCapabilities.canGenerateTestData;
19+
const available =
20+
!disabled &&
21+
processIsLatestVersion &&
22+
testCapabilities &&
23+
testCapabilities.testWithGeneratedData.status == TestCapabilityStatus.AVAILABLE;
1824
const { open } = useWindows();
1925

2026
return (

designer/client/src/components/toolbars/test/buttons/GenerateButton.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import React from "react";
22
import { useTranslation } from "react-i18next";
33
import { useSelector } from "react-redux";
4+
45
import Icon from "../../../../assets/img/toolbarButtons/generate.svg";
6+
import { TestCapabilityStatus } from "../../../../common/TestResultUtils";
57
import { getTestCapabilities, isLatestProcessVersion } from "../../../../reducers/selectors/graph";
68
import { useWindows, WindowKind } from "../../../../windowManager";
79
import { CapabilitiesToolbarButton } from "../../../toolbarComponents/CapabilitiesToolbarButton";
8-
import { ToolbarButtonProps } from "../../types";
10+
import type { ToolbarButtonProps } from "../../types";
911

1012
type Props = ToolbarButtonProps;
1113

@@ -14,7 +16,11 @@ function GenerateButton(props: Props) {
1416
const { t } = useTranslation();
1517
const testCapabilities = useSelector(getTestCapabilities);
1618
const processIsLatestVersion = useSelector(isLatestProcessVersion);
17-
const available = !disabled && processIsLatestVersion && testCapabilities && testCapabilities.canGenerateTestData;
19+
const available =
20+
!disabled &&
21+
processIsLatestVersion &&
22+
testCapabilities &&
23+
testCapabilities.testWithGeneratedData.status == TestCapabilityStatus.AVAILABLE;
1824
const { open } = useWindows();
1925

2026
return (

designer/client/src/components/toolbars/test/buttons/ScenarioTestButton.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React, { useCallback } from "react";
33
import { useTranslation } from "react-i18next";
44
import { useSelector } from "react-redux";
55

6+
import { TestCapabilityStatus } from "../../../../common/TestResultUtils";
67
import { getTestCapabilities, getTestResultsLoading, isLatestProcessVersion } from "../../../../reducers/selectors/graph";
78
import { useWindows, WindowKind } from "../../../../windowManager";
89
import { useAdhocTestingAvailability } from "../../../modals/AdhocTesting/useAdhocTestingAvailability";
@@ -31,7 +32,10 @@ function ScenarioTestButton({ disabled, name, title, docs, markdownContent, type
3132
const testCapabilities = useSelector(getTestCapabilities);
3233
const processIsLatestVersion = useSelector(isLatestProcessVersion);
3334
const testFromGeneratedDataIsAvailable =
34-
!disabled && processIsLatestVersion && testCapabilities && testCapabilities.canGenerateTestData;
35+
!disabled &&
36+
processIsLatestVersion &&
37+
testCapabilities &&
38+
testCapabilities.testWithGeneratedData.status == TestCapabilityStatus.AVAILABLE;
3539

3640
const atLeastOneTypeOfTestIsAvailable = adhocTestIsAvailable || testFromGeneratedDataIsAvailable;
3741

designer/client/src/http/HttpService.ts

+25-27
Original file line numberDiff line numberDiff line change
@@ -572,10 +572,13 @@ class HttpService {
572572
scenarioGraph: ScenarioGraph,
573573
): Promise<AxiosResponse<ValidationData>> {
574574
const validationRequest: TestAdhocValidationRequest = {
575-
sourceParameters,
575+
testData: {
576+
type: "WITH_PARAMETERS",
577+
sourceParameters: sourceParameters,
578+
},
576579
scenarioGraph: this.#sanitizeScenarioGraph(scenarioGraph),
577580
};
578-
const promise = api.post(`/scenarioTesting/${encodeURIComponent(scenarioName)}/adhoc/validate`, validationRequest);
581+
const promise = api.post(`/scenarioTesting/${encodeURIComponent(scenarioName)}/validate`, validationRequest);
579582
promise.catch((error) =>
580583
this.#addError(
581584
i18next.t("notification.error.failedToValidateAdhocTestParameters", "Failed to validate parameters"),
@@ -683,21 +686,6 @@ class HttpService {
683686
return promise;
684687
}
685688

686-
getTestFormParameters(processName: string, scenarioGraph: ScenarioGraph) {
687-
const promise = api.post(
688-
`/scenarioTesting/${encodeURIComponent(processName)}/parameters`,
689-
this.#sanitizeScenarioGraph(scenarioGraph),
690-
);
691-
promise.catch((error) =>
692-
this.#addError(
693-
i18next.t("notification.error.failedToGetTestParameters", "Failed to get source test parameters definition"),
694-
error,
695-
true,
696-
),
697-
);
698-
return promise;
699-
}
700-
701689
getActionParameters(processName: string) {
702690
const promise = api.get(`/actionInfo/${encodeURIComponent(processName)}/parameters`);
703691
promise.catch((error) =>
@@ -712,8 +700,11 @@ class HttpService {
712700

713701
generateTestData(processName: string, testSampleSize: string, scenarioGraph: ScenarioGraph): Promise<AxiosResponse> {
714702
const promise = api.post(
715-
`/scenarioTesting/${encodeURIComponent(processName)}/generate/${testSampleSize}`,
716-
this.#sanitizeScenarioGraph(scenarioGraph),
703+
`/scenarioTesting/${encodeURIComponent(processName)}/generatedTestData`,
704+
{
705+
scenarioGraph: this.#sanitizeScenarioGraph(scenarioGraph),
706+
numberOfSamples: +testSampleSize,
707+
},
717708
{
718709
responseType: "blob",
719710
},
@@ -806,7 +797,7 @@ class HttpService {
806797
data.append("testData", file);
807798
data.append("scenarioGraph", new Blob([JSON.stringify(sanitized)], { type: "application/json" }));
808799

809-
const promise = api.post(`/processManagement/test/${encodeURIComponent(processName)}`, data);
800+
const promise = api.post(`/processManagement/test/${encodeURIComponent(processName)}?skipResultsPerTransition=true`, data);
810801
promise.catch((error: AxiosError) =>
811802
this.#addError(
812803
i18next.t("notification.error.failedToTest", "Failed to test due to: {{axiosError}}", {
@@ -826,11 +817,14 @@ class HttpService {
826817
): Promise<AxiosResponse<TestProcessResponse>> {
827818
const sanitized = this.#sanitizeScenarioGraph(scenarioGraph);
828819
const request = {
829-
sourceParameters: testData,
820+
testData: {
821+
type: "WITH_PARAMETERS",
822+
sourceParameters: testData,
823+
},
830824
scenarioGraph: sanitized,
831825
};
832826

833-
const promise = api.post(`/processManagement/testWithParameters/${encodeURIComponent(processName)}`, request);
827+
const promise = api.post(`/scenarioTesting/${encodeURIComponent(processName)}/performTest?skipResultsPerTransition=true`, request);
834828
promise.catch((error: AxiosError) =>
835829
this.#addError(
836830
i18next.t("notification.error.failedToTest", "Failed to test due to: {{axiosError}}", {
@@ -845,13 +839,17 @@ class HttpService {
845839

846840
testScenarioWithGeneratedData(
847841
processName: ProcessName,
848-
testSampleSize: string,
842+
testSampleSize: number,
849843
scenarioGraph: ScenarioGraph,
850844
): Promise<AxiosResponse<TestProcessResponse>> {
851-
const promise = api.post(
852-
`/processManagement/generateAndTest/${processName}/${testSampleSize}`,
853-
this.#sanitizeScenarioGraph(scenarioGraph),
854-
);
845+
const request = {
846+
testData: {
847+
type: "WITH_GENERATED_DATA",
848+
numberOfSamples: testSampleSize,
849+
},
850+
scenarioGraph: this.#sanitizeScenarioGraph(scenarioGraph),
851+
};
852+
const promise = api.post(`/scenarioTesting/${encodeURIComponent(processName)}/performTest?skipResultsPerTransition=true`, request);
855853
promise.catch((error: AxiosError) =>
856854
this.#addError(
857855
i18next.t("notification.error.failedToGenerateAndTest", "Failed to generate and test due to: {{axiosError}}", {

designer/client/src/reducers/graph/reducer.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,7 @@ const graphReducer: Reducer<GraphState> = (state = emptyGraphState, action) => {
9393
return {
9494
...state,
9595
testCapabilities: action.capabilities,
96-
};
97-
}
98-
case "UPDATE_TEST_FORM_PARAMETERS": {
99-
return {
100-
...state,
101-
testFormParameters: action.testFormParameters,
96+
testFormParameters: action.capabilities?.testWithParameters?.sourceParameters,
10297
};
10398
}
10499
case "UPDATE_TEST_TYPE": {
@@ -395,7 +390,7 @@ const undoableReducer = undoable<GraphState, Action>(reducer, {
395390
groupBy: batchGroupBy.init(),
396391
filter: combineFilters((action, nextState, prevState) => {
397392
return !isEqual(getUndoableState(nextState), getUndoableState(prevState._latestUnfiltered));
398-
}, excludeAction(["VALIDATION_RESULT", "STICKY_NOTE_SET_ERRORS", "UPDATE_IMPORTED_PROCESS", "PROCESS_STATE_LOADED", "UPDATE_TEST_CAPABILITIES", "UPDATE_BACKEND_NOTIFICATIONS", "PROCESS_DEFINITION_DATA", "PROCESS_TOOLBARS_CONFIGURATION_LOADED", "CORRECT_INVALID_SCENARIO", "GET_SCENARIO_ACTIVITIES", "LOGGED_USER", "REGISTER_TOOLBARS", "UI_SETTINGS", "MARK_BACKEND_NOTIFICATION_READ", "UPDATE_TEST_FORM_PARAMETERS"])),
393+
}, excludeAction(["VALIDATION_RESULT", "STICKY_NOTE_SET_ERRORS", "UPDATE_IMPORTED_PROCESS", "PROCESS_STATE_LOADED", "UPDATE_TEST_CAPABILITIES", "UPDATE_BACKEND_NOTIFICATIONS", "PROCESS_DEFINITION_DATA", "PROCESS_TOOLBARS_CONFIGURATION_LOADED", "CORRECT_INVALID_SCENARIO", "GET_SCENARIO_ACTIVITIES", "LOGGED_USER", "REGISTER_TOOLBARS", "UI_SETTINGS", "MARK_BACKEND_NOTIFICATION_READ"])),
399394
});
400395

401396
// apply only undoable changes for undo actions

0 commit comments

Comments
 (0)