Fix creating rules without giving action params that have a default value

This commit is contained in:
Michael Zanetti 2022-09-07 20:25:33 +02:00
parent 84163288b0
commit 327fba5797
5 changed files with 43 additions and 10 deletions

View File

@ -1005,7 +1005,7 @@ RuleEngine::RuleError RuleEngine::checkRuleAction(const RuleAction &ruleAction,
// Verify all required params are given
foreach (const ParamType &paramType, actionType.paramTypes()) {
bool found = false;
bool found = !paramType.defaultValue().isNull();
foreach (const RuleActionParam &ruleActionParam, ruleAction.ruleActionParams()) {
if (ruleActionParam.paramTypeId() == paramType.id()
|| ruleActionParam.paramName() == paramType.name()) {

View File

@ -57,6 +57,7 @@ extern ParamTypeId mockUpdateStatusActionUpdateStatusParamTypeId;
extern ActionTypeId mockWithParamsActionTypeId;
extern ParamTypeId mockWithParamsActionParam1ParamTypeId;
extern ParamTypeId mockWithParamsActionParam2ParamTypeId;
extern ParamTypeId mockWithParamsActionParam3ParamTypeId;
extern ActionTypeId mockWithoutParamsActionTypeId;
extern ActionTypeId mockAsyncActionTypeId;
extern ActionTypeId mockFailingActionTypeId;

View File

@ -251,6 +251,13 @@
"name": "param2",
"displayName": "mockActionParam2",
"type": "bool"
},
{
"id": "d1e428ae-eb8c-45aa-b1b0-e3d7de659c3a",
"name": "param3",
"displayName": "Param with default value",
"type": "QString",
"defaultValue": ""
}
]
},

View File

@ -61,6 +61,7 @@ ParamTypeId mockUpdateStatusActionUpdateStatusParamTypeId = ParamTypeId("{ebc413
ActionTypeId mockWithParamsActionTypeId = ActionTypeId("{dea0f4e1-65e3-4981-8eaa-2701c53a9185}");
ParamTypeId mockWithParamsActionParam1ParamTypeId = ParamTypeId("{a2d3a256-a551-4712-a65b-ecd5a436a1cb}");
ParamTypeId mockWithParamsActionParam2ParamTypeId = ParamTypeId("{304a4899-18be-4e3b-94f4-d03be52f3233}");
ParamTypeId mockWithParamsActionParam3ParamTypeId = ParamTypeId("{d1e428ae-eb8c-45aa-b1b0-e3d7de659c3a}");
ActionTypeId mockWithoutParamsActionTypeId = ActionTypeId("{defd3ed6-1a0d-400b-8879-a0202cf39935}");
ActionTypeId mockAsyncActionTypeId = ActionTypeId("{fbae06d3-7666-483e-a39e-ec50fe89054e}");
ActionTypeId mockFailingActionTypeId = ActionTypeId("{df3cf33d-26d5-4577-9132-9823bd33fad0}");
@ -449,6 +450,9 @@ const QString translations[] {
//: The name of the plugin mock ({727a4a9a-c187-446f-aadf-f1b2220607d1})
QT_TRANSLATE_NOOP("mock", "Mocked things"),
//: The name of the ParamType (ThingClass: mock, ActionType: withParams, ID: {d1e428ae-eb8c-45aa-b1b0-e3d7de659c3a})
QT_TRANSLATE_NOOP("mock", "Param with default value"),
//: The name of the ParamType (ThingClass: inputTypeMock, Type: thing, ID: {e5c0d14b-c9f1-4aca-a56e-85bfa6977150})
QT_TRANSLATE_NOOP("mock", "Password text"),

View File

@ -121,8 +121,8 @@ private slots:
void testRuleActionParams_data();
void testRuleActionParams();
void testRuleActionPAramsFromEventParameter_data();
void testRuleActionPAramsFromEventParameter();
void testRuleActionParamsFromEventParameter_data();
void testRuleActionParamsFromEventParameter();
void testInitStatesActive();
@ -422,9 +422,28 @@ void TestRules::addRemoveRules_data()
validActionNoParams.insert("actionTypeId", mockWithoutParamsActionTypeId);
validActionNoParams.insert("thingId", m_mockThingId);
QVariantMap invalidAction;
invalidAction.insert("actionTypeId", ActionTypeId("f32c7efb-38b6-4576-a496-c75bbb23132f"));
invalidAction.insert("thingId", m_mockThingId);
QVariantMap invalidActionTypeId;
invalidActionTypeId.insert("actionTypeId", ActionTypeId("f32c7efb-38b6-4576-a496-c75bbb23132f"));
invalidActionTypeId.insert("thingId", m_mockThingId);
QVariantMap invalidActionMissingParam; // mockWithParamsActionType has 2 required and 1 optional param
invalidActionMissingParam.insert("actionTypeId", mockWithParamsActionTypeId);
invalidActionMissingParam.insert("thingId", m_mockThingId);
QVariantMap invalidActionMissingParamParam1;
invalidActionMissingParamParam1.insert("paramTypeId", mockWithParamsActionParam1ParamTypeId);
invalidActionMissingParamParam1.insert("value", 5);
invalidActionMissingParam.insert("ruleActionParams", QVariantList() << invalidActionMissingParamParam1);
QVariantMap validActionWithParams; // mockWithParamsActionType has 2 required and 1 optional param
validActionWithParams.insert("actionTypeId", mockWithParamsActionTypeId);
validActionWithParams.insert("thingId", m_mockThingId);
QVariantMap validActionWithParamsParam1;
validActionWithParamsParam1.insert("paramTypeId", mockWithParamsActionParam1ParamTypeId);
validActionWithParamsParam1.insert("value", 5);
QVariantMap validActionWithParamsParam2;
validActionWithParamsParam2.insert("paramTypeId", mockWithParamsActionParam2ParamTypeId);
validActionWithParamsParam2.insert("value", true);
validActionWithParams.insert("ruleActionParams", QVariantList() << validActionWithParamsParam1 << validActionWithParamsParam2);
// RuleExitAction
QVariantMap validExitActionNoParams;
@ -553,9 +572,11 @@ void TestRules::addRemoveRules_data()
// Rules without exit actions
QTest::newRow("valid rule. enabled, 1 EventDescriptor, StateEvaluator, 1 Action, name") << true << validActionNoParams << QVariantMap() << validEventDescriptor1 << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorNoError << true << "TestRule";
QTest::newRow("valid rule. disabled, 1 EventDescriptor, StateEvaluator, 1 Action, name") << false << validActionNoParams << QVariantMap() << validEventDescriptor1 << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorNoError << true << "TestRule";
QTest::newRow("valid rule. disabled, 1 EventDescriptor, StateEvaluator, 1 Action, name") << false << validActionNoParams << QVariantMap() << validEventDescriptor1 << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorNoError << true << "TestRule";
QTest::newRow("valid rule. 2 EventDescriptors, 1 Action, name") << true << validActionNoParams << QVariantMap() << QVariantMap() << eventDescriptorList << validStateEvaluator << RuleEngine::RuleErrorNoError << true << "TestRule";
QTest::newRow("invalid action") << true << invalidAction << QVariantMap() << validEventDescriptor1 << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorActionTypeNotFound << false << "TestRule";
QTest::newRow("invalid action (invalid actionTypeId)") << true << invalidActionTypeId << QVariantMap() << validEventDescriptor1 << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorActionTypeNotFound << false << "TestRule";
QTest::newRow("invalid action (missing param)") << true << invalidActionMissingParam<< QVariantMap() << validEventDescriptor1 << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorMissingParameter << false << "TestRule";
QTest::newRow("valid action (with params)") << true << validActionWithParams << QVariantMap() << validEventDescriptor1 << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorNoError << false << "TestRule";
QTest::newRow("invalid event descriptor") << true << validActionNoParams << QVariantMap() << invalidEventDescriptor << QVariantList() << validStateEvaluator << RuleEngine::RuleErrorThingNotFound << false << "TestRule";
}
@ -2673,7 +2694,7 @@ void TestRules::testRuleActionParams()
verifyRuleError(response, error);
}
void TestRules::testRuleActionPAramsFromEventParameter_data() {
void TestRules::testRuleActionParamsFromEventParameter_data() {
QTest::addColumn<QVariantMap>("event");
QTest::addColumn<QVariantMap>("action");
QTest::addColumn<RuleEngine::RuleError>("error");
@ -2716,7 +2737,7 @@ void TestRules::testRuleActionPAramsFromEventParameter_data() {
QTest::newRow("int -> bool") << intEvent << boolAction << RuleEngine::RuleErrorNoError;
}
void TestRules::testRuleActionPAramsFromEventParameter()
void TestRules::testRuleActionParamsFromEventParameter()
{
QFETCH(QVariantMap, event);
QFETCH(QVariantMap, action);