diff --git a/libnymea-core/ruleengine/ruleengine.cpp b/libnymea-core/ruleengine/ruleengine.cpp index 9befd5f6..9d0f1680 100644 --- a/libnymea-core/ruleengine/ruleengine.cpp +++ b/libnymea-core/ruleengine/ruleengine.cpp @@ -1005,7 +1005,7 @@ RuleEngine::RuleError RuleEngine::checkRuleAction(const RuleAction &ruleAction, // Verify all required params are given foreach (const ParamType ¶mType, 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()) { diff --git a/plugins/mock/extern-plugininfo.h b/plugins/mock/extern-plugininfo.h index beafb528..eafc85bb 100644 --- a/plugins/mock/extern-plugininfo.h +++ b/plugins/mock/extern-plugininfo.h @@ -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; diff --git a/plugins/mock/integrationpluginmock.json b/plugins/mock/integrationpluginmock.json index c10de548..cdf50458 100644 --- a/plugins/mock/integrationpluginmock.json +++ b/plugins/mock/integrationpluginmock.json @@ -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": "" } ] }, diff --git a/plugins/mock/plugininfo.h b/plugins/mock/plugininfo.h index 4e2d4d9a..5353d1b0 100644 --- a/plugins/mock/plugininfo.h +++ b/plugins/mock/plugininfo.h @@ -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"), diff --git a/tests/auto/rules/testrules.cpp b/tests/auto/rules/testrules.cpp index 5a336f11..14c87989 100644 --- a/tests/auto/rules/testrules.cpp +++ b/tests/auto/rules/testrules.cpp @@ -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("event"); QTest::addColumn("action"); QTest::addColumn("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);