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 // Verify all required params are given
foreach (const ParamType &paramType, actionType.paramTypes()) { foreach (const ParamType &paramType, actionType.paramTypes()) {
bool found = false; bool found = !paramType.defaultValue().isNull();
foreach (const RuleActionParam &ruleActionParam, ruleAction.ruleActionParams()) { foreach (const RuleActionParam &ruleActionParam, ruleAction.ruleActionParams()) {
if (ruleActionParam.paramTypeId() == paramType.id() if (ruleActionParam.paramTypeId() == paramType.id()
|| ruleActionParam.paramName() == paramType.name()) { || ruleActionParam.paramName() == paramType.name()) {

View File

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

View File

@ -251,6 +251,13 @@
"name": "param2", "name": "param2",
"displayName": "mockActionParam2", "displayName": "mockActionParam2",
"type": "bool" "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}"); ActionTypeId mockWithParamsActionTypeId = ActionTypeId("{dea0f4e1-65e3-4981-8eaa-2701c53a9185}");
ParamTypeId mockWithParamsActionParam1ParamTypeId = ParamTypeId("{a2d3a256-a551-4712-a65b-ecd5a436a1cb}"); ParamTypeId mockWithParamsActionParam1ParamTypeId = ParamTypeId("{a2d3a256-a551-4712-a65b-ecd5a436a1cb}");
ParamTypeId mockWithParamsActionParam2ParamTypeId = ParamTypeId("{304a4899-18be-4e3b-94f4-d03be52f3233}"); 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 mockWithoutParamsActionTypeId = ActionTypeId("{defd3ed6-1a0d-400b-8879-a0202cf39935}");
ActionTypeId mockAsyncActionTypeId = ActionTypeId("{fbae06d3-7666-483e-a39e-ec50fe89054e}"); ActionTypeId mockAsyncActionTypeId = ActionTypeId("{fbae06d3-7666-483e-a39e-ec50fe89054e}");
ActionTypeId mockFailingActionTypeId = ActionTypeId("{df3cf33d-26d5-4577-9132-9823bd33fad0}"); 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}) //: The name of the plugin mock ({727a4a9a-c187-446f-aadf-f1b2220607d1})
QT_TRANSLATE_NOOP("mock", "Mocked things"), 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}) //: The name of the ParamType (ThingClass: inputTypeMock, Type: thing, ID: {e5c0d14b-c9f1-4aca-a56e-85bfa6977150})
QT_TRANSLATE_NOOP("mock", "Password text"), QT_TRANSLATE_NOOP("mock", "Password text"),

View File

@ -121,8 +121,8 @@ private slots:
void testRuleActionParams_data(); void testRuleActionParams_data();
void testRuleActionParams(); void testRuleActionParams();
void testRuleActionPAramsFromEventParameter_data(); void testRuleActionParamsFromEventParameter_data();
void testRuleActionPAramsFromEventParameter(); void testRuleActionParamsFromEventParameter();
void testInitStatesActive(); void testInitStatesActive();
@ -422,9 +422,28 @@ void TestRules::addRemoveRules_data()
validActionNoParams.insert("actionTypeId", mockWithoutParamsActionTypeId); validActionNoParams.insert("actionTypeId", mockWithoutParamsActionTypeId);
validActionNoParams.insert("thingId", m_mockThingId); validActionNoParams.insert("thingId", m_mockThingId);
QVariantMap invalidAction; QVariantMap invalidActionTypeId;
invalidAction.insert("actionTypeId", ActionTypeId("f32c7efb-38b6-4576-a496-c75bbb23132f")); invalidActionTypeId.insert("actionTypeId", ActionTypeId("f32c7efb-38b6-4576-a496-c75bbb23132f"));
invalidAction.insert("thingId", m_mockThingId); 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 // RuleExitAction
QVariantMap validExitActionNoParams; QVariantMap validExitActionNoParams;
@ -553,9 +572,11 @@ void TestRules::addRemoveRules_data()
// Rules without exit actions // 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. 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("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"; 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); verifyRuleError(response, error);
} }
void TestRules::testRuleActionPAramsFromEventParameter_data() { void TestRules::testRuleActionParamsFromEventParameter_data() {
QTest::addColumn<QVariantMap>("event"); QTest::addColumn<QVariantMap>("event");
QTest::addColumn<QVariantMap>("action"); QTest::addColumn<QVariantMap>("action");
QTest::addColumn<RuleEngine::RuleError>("error"); QTest::addColumn<RuleEngine::RuleError>("error");
@ -2716,7 +2737,7 @@ void TestRules::testRuleActionPAramsFromEventParameter_data() {
QTest::newRow("int -> bool") << intEvent << boolAction << RuleEngine::RuleErrorNoError; QTest::newRow("int -> bool") << intEvent << boolAction << RuleEngine::RuleErrorNoError;
} }
void TestRules::testRuleActionPAramsFromEventParameter() void TestRules::testRuleActionParamsFromEventParameter()
{ {
QFETCH(QVariantMap, event); QFETCH(QVariantMap, event);
QFETCH(QVariantMap, action); QFETCH(QVariantMap, action);