diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java index 291c2cf316..71038e934f 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java @@ -48,10 +48,10 @@ import static org.thingsboard.common.util.DonAsynchron.withCallback; name = "calculate delta", relationTypes = {"Success", "Failure", "Other"}, configClazz = CalculateDeltaNodeConfiguration.class, nodeDescription = "Calculates and adds 'delta' value into message based on the incoming and previous value", - nodeDetails = "Calculates delta and period based on the previous time-series reading and current data. " + - "Delta calculation is done in scope of the message originator, e.g. device, asset or customer. " + - "If there is input key, the output relation will be 'Success' unless delta is negative and corresponding configuration parameter is set. " + - "If there is no input value key in the incoming message, the output relation will be 'Other'.", + nodeDetails = "Calculates delta and period based on the previous timeseries reading and current data. " + + "Delta calculation is done in scope of the message originator, e.g. device, asset or customer.

" + + "If there is input key, the output relation will be Success unless delta is negative and corresponding configuration parameter is set.
" + + "If there is no input value key in the incoming message, the output relation will be Other.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeCalculateDeltaConfig") public class CalculateDeltaNode implements TbNode { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java index 5615147fd0..4550a4f3f8 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java @@ -30,10 +30,13 @@ import static org.thingsboard.common.util.DonAsynchron.withCallback; @Slf4j public abstract class TbAbstractGetEntityDataNode extends TbAbstractGetMappedDataNode { - protected final static String DATA_TO_FETCH_PROPERTY_NAME = "dataToFetch"; - protected static final String OLD_DATA_TO_FETCH_PROPERTY_NAME = "telemetry"; - protected final static String DATA_MAPPING_PROPERTY_NAME = "dataMapping"; - protected static final String OLD_DATA_MAPPING_PROPERTY_NAME = "attrMapping"; + private final static String DATA_TO_FETCH_PROPERTY_NAME = "dataToFetch"; + private static final String OLD_DATA_TO_FETCH_PROPERTY_NAME = "telemetry"; + private final static String DATA_MAPPING_PROPERTY_NAME = "dataMapping"; + private static final String OLD_DATA_MAPPING_PROPERTY_NAME = "attrMapping"; + + private static final String DATA_TO_FETCH_VALIDATION_MSG = "DataToFetch property has invalid value: %s." + + " Only ATTRIBUTES and LATEST_TELEMETRY values supported!"; @Override public void onMsg(TbContext ctx, TbMsg msg) { @@ -45,7 +48,11 @@ public abstract class TbAbstractGetEntityDataNode extends Tb protected abstract ListenableFuture findEntityAsync(TbContext ctx, EntityId originator); - protected abstract void checkDataToFetchSupportedOrElseThrow(DataToFetch dataToFetch) throws TbNodeException; + protected void checkDataToFetchSupportedOrElseThrow(DataToFetch dataToFetch) throws TbNodeException { + if (dataToFetch == null || dataToFetch.equals(DataToFetch.FIELDS)) { + throw new TbNodeException(String.format(DATA_TO_FETCH_VALIDATION_MSG, dataToFetch)); + } + } protected void processDataAndTell(TbContext ctx, TbMsg msg, T entityId, ObjectNode msgDataAsJsonNode) { DataToFetch dataToFetch = config.getDataToFetch(); diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java index ec21706ff1..e044dcbae6 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java @@ -37,11 +37,10 @@ import java.util.concurrent.ExecutionException; type = ComponentType.ENRICHMENT, name = "fetch device credentials", configClazz = TbFetchDeviceCredentialsNodeConfiguration.class, - nodeDescription = "Enrich the message body or metadata with the device credentials", - nodeDetails = "Adds credentialsType and credentials properties to the message metadata if the " + - "configuration parameter fetchToMetadata is set to true, otherwise, adds properties " + - "to the message data. If originator type is not DEVICE or rule node failed to get device credentials " + - "- send Message via Failure chain, otherwise Success chain is used.", + nodeDescription = "Adds device credentials to the message or message metadata", + nodeDetails = "if message originator type is Device and device credentials was successfully fetched, " + + "rule node enriches message or message metadata with credentialsType and credentials properties " + + "and send message via Success chain. Otherwise message will be forwarded via Failure chain.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeFetchDeviceCredentialsConfig") public class TbFetchDeviceCredentialsNode extends TbAbstractNodeWithFetchTo { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java index 2d1f02acf8..42b0633cb2 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java @@ -36,11 +36,13 @@ import org.thingsboard.server.common.msg.TbMsg; @RuleNode(type = ComponentType.ENRICHMENT, name = "originator attributes", configClazz = TbGetAttributesNodeConfiguration.class, - nodeDescription = "Enrich the message body or metadata with the originator attributes and/or timeseries data", - nodeDetails = "If Attributes enrichment configured, CLIENT/SHARED/SERVER attributes are added into Message data/metadata " + - "with specific prefix: cs/shared/ss. Latest telemetry value added into Message data/metadata without prefix. " + - "To access those attributes in other nodes this template can be used " + - "metadata.cs_temperature or metadata.shared_limit ", + nodeDescription = "Adds originator attributes and/or latest timeseries data for the message originator to the message or message metadata", + nodeDetails = "If attributes enrichment configured, CLIENT/SHARED/SERVER attributes are added into message or message metadata " + + "with specific prefix: cs/shared/ss. Latest telemetry value adds without prefix.

" + + "See the following examples of accessing those attributes in other nodes:
" + + "metadata.cs_serialNumber - to access client side attribute 'serialNumber' that was fetched to message metadata.
" + + "metadata.shared_limit - to access shared side attribute 'limit' that was fetched to message metadata.
" + + "msg.temperature - to access latest telemetry 'temperature' that was fetched to message.
", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeOriginatorAttributesConfig") public class TbGetAttributesNode extends TbAbstractGetAttributesNode { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java index e693dab684..1deae1f5fb 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java @@ -35,16 +35,17 @@ import org.thingsboard.server.common.data.util.TbPair; type = ComponentType.ENRICHMENT, name = "customer attributes", configClazz = TbGetEntityDataNodeConfiguration.class, - nodeDescription = "Add Originators Customer Attributes or Latest Telemetry into Message or Metadata", - nodeDetails = "Enrich the Message or Metadata with the corresponding customer's latest attributes or telemetry value. " + - "The customer is selected based on the originator of the message: device, asset, etc. " + - "
" + + nodeDescription = "Adds message originator customer attributes or latest telemetry into message or message metadata", + nodeDetails = "Enriches incoming message or message metadata with the customer's attributes or latest telemetry values.

" + + "The customer is selected based on the originator of the message. " + + "Supported originator types:

" + + "Customer, User, Asset, Device.

" + "Useful when you store some parameters on the customer level and would like to use them for message processing.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeCustomerAttributesConfig") public class TbGetCustomerAttributeNode extends TbAbstractGetEntityDataNode { - private static final String CUSTOMER_NOT_FOUND_MESSAGE = "Failed to find customer for entity with id %s and type %s"; + private static final String CUSTOMER_NOT_FOUND_MESSAGE = "Failed to find customer for entity with id: %s and type: %s"; @Override protected TbGetEntityDataNodeConfiguration loadNodeConfiguration(TbNodeConfiguration configuration) throws TbNodeException { @@ -54,14 +55,6 @@ public class TbGetCustomerAttributeNode extends TbAbstractGetEntityDataNode findEntityAsync(TbContext ctx, EntityId originator) { return Futures.transformAsync(EntitiesCustomerIdAsyncLoader.findEntityIdAsync(ctx, originator), diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java index c31f9cbcef..a86aed66d5 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java @@ -44,10 +44,13 @@ import java.util.NoSuchElementException; @RuleNode(type = ComponentType.ENRICHMENT, name = "customer details", configClazz = TbGetCustomerDetailsNodeConfiguration.class, - nodeDescription = "Enrich the message body or metadata with the corresponding customer details: title, address, email, phone, etc.", - nodeDetails = "If checkbox: Add selected details to the message metadata is selected, existing fields will be added to the message metadata instead of message data.

" + - "Note: only Device, Asset, and Entity View type are allowed.

" + - "If the originator of the message is not assigned to Customer, or originator type is not supported - Message will be forwarded to Failure chain, otherwise, Success chain will be used.", + nodeDescription = "Adds originator customer details into message or message metadata", + nodeDetails = "Enriches incoming message or message metadata with the corresponding customer details. " + + "Selected details adds to the message with predefined prefix: customer_. Examples: customer_title, customer_address, etc.

" + + "The customer is selected based on the originator of the message. Supported originator types:

" + + "Device, Asset, Entity view, User, Edge.

" + + "If message originator is not assigned to customer, or originator is not supported - " + + "message will be forwarded via Failure chain, otherwise, Success chain will be used.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeEntityDetailsConfig") public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNode { @@ -96,9 +99,9 @@ public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNodecs/shared/ss. Latest telemetry value added into Message data/metadata without prefix. " + - "To access those attributes in other nodes this template can be used " + - "metadata.cs_temperature or metadata.shared_limit ", + nodeDescription = "Add originators related device attributes and latest telemetry values into message or message metadata", + nodeDetails = "Related device lookup based on the configured relation query. " + + "If multiple related devices are found, only first device is used for message enrichment, other entities are discarded.

" + + "If Attributes enrichment configured, CLIENT/SHARED/SERVER attributes are added into message or message metadata " + + "with specific prefix: cs/shared/ss. Latest telemetry value adds into message or message metadata without prefix.

" + + "See the following examples of accessing those attributes in other nodes:
" + + "metadata.cs_serialNumber - to access client side attribute 'serialNumber' that was fetched to message metadata.
" + + "metadata.shared_limit - to access shared side attribute 'limit' that was fetched to message metadata.
" + + "msg.temperature - to access latest telemetry 'temperature' that was fetched to message.
", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeDeviceAttributesConfig") public class TbGetDeviceAttrNode extends TbAbstractGetAttributesNode { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java index f777d98bcb..b0a282af1f 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java @@ -37,9 +37,12 @@ import java.util.concurrent.ExecutionException; @RuleNode(type = ComponentType.ENRICHMENT, name = "originator fields", configClazz = TbGetOriginatorFieldsConfiguration.class, - nodeDescription = "Add Message Originator fields values into Message Metadata or Message Data", - nodeDetails = "Will fetch fields values specified in mapping. If specified field is not part of originator fields it will be ignored. " + - "This node supports only following originator types: TENANT, CUSTOMER, USER, ASSET, DEVICE, ALARM, RULE_CHAIN, ENTITY_VIEW.", + nodeDescription = "Adds message originator fields values into message or message metadata", + nodeDetails = "Fetches fields values specified in the mapping. If specified field is not part of originator fields it will be ignored. " + + "Supported originator types:

" + + "Tenant, Customer, User, Asset, Device, Alarm, Rule chain, Entity view.

" + + "If message originator is not supported - message will be forwarded via Failure chain, " + + "otherwise, Success chain will be used.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeOriginatorFieldsConfig") public class TbGetOriginatorFieldsNode extends TbAbstractGetMappedDataNode { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java index 3c508bda14..109c47dcac 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java @@ -34,15 +34,18 @@ import java.util.Arrays; @Slf4j @RuleNode( type = ComponentType.ENRICHMENT, - name = "related attributes", + name = "related entity data", configClazz = TbGetRelatedDataNodeConfiguration.class, - nodeDescription = "Add Originators Related Entity Attributes or Latest Telemetry into Message Metadata/Data", - nodeDetails = "Related Entity found using configured relation direction and Relation Type. " + - "If multiple Related Entities are found, only first Entity is used for attributes enrichment, other entities are discarded. " + - "If Attributes enrichment configured, server scope attributes are added into Message Metadata/Data. " + - "If Latest Telemetry enrichment configured, latest telemetry added into Metadata/Data. " + - "To access those attributes in other nodes this template can be used " + - "metadata.temperature.", + nodeDescription = "Adds originators related entity data into message or message metadata", + nodeDetails = "Related entity lookup based on the configured relation query. " + + "If multiple related entities are found, only first entity is used for message enrichment, other entities are discarded.

" + + "Data to fetch configuration:

" + + "Attributes - rule node fetches server scope attributes configured in mapping and adds them into message or message metadata. " + + "Access example in other nodes: metadata.serialNumber, msg.serialNumber.
" + + "Latest telemetry - rule node fetches latest telemetry configured in mapping and adds them into message or message metadata. " + + "Access example in other nodes: metadata.temperature, msg.temperature.
" + + "Fields - rule node fetches fields configured in mapping and adds them into message or message metadata. " + + "Access example in other nodes: metadata.entityName, msg.entityName.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeRelatedAttributesConfig") public class TbGetRelatedAttributeNode extends TbAbstractGetEntityDataNode { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java index b43aeb4e4b..97f08ce8fd 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java @@ -54,13 +54,17 @@ import static org.thingsboard.rule.engine.metadata.TbGetTelemetryNodeConfigurati @RuleNode(type = ComponentType.ENRICHMENT, name = "originator telemetry", configClazz = TbGetTelemetryNodeConfiguration.class, - nodeDescription = "Add Message Originator Telemetry for selected time range into Message Metadata\n", - nodeDetails = "The node allows you to select fetch mode: FIRST/LAST/ALL to fetch telemetry of certain time range that are added into Message metadata without any prefix. " + - "If selected fetch mode ALL Telemetry will be added like array into Message Metadata where key is Timestamp and value is value of Telemetry.
" + - "If selected fetch mode FIRST or LAST Telemetry will be added like string without Timestamp.
" + - "Also, the rule node allows you to select telemetry sampling order: ASC or DESC.
" + - "Aggregation feature allows you to fetch aggregated telemetry as a single value by AVG, COUNT, SUM, MIN, MAX, NONE.
" + - "Note: The maximum size of the fetched array is 1000 records.\n ", + nodeDescription = "Adds message originator telemetry for selected time range into message metadata", + nodeDetails = "The node allows you to configure fetch interval and fetch strategy. Fetch strategy section allows you to select fetch mode: First/Last/All

" + + "If selected fetch mode First rule node will retrieve the closest telemetry to the fetch interval's start.
" + + "If selected fetch mode Last rule node will retrieve the closest telemetry to the fetch interval's end.
" + + "If selected fetch mode All rule node will retrieve telemetry from the fetch interval with configurable query parameters.

" + + "Query parameters:

" + + "Data aggregation function: Min/Max/Average/Sum/Count/None. " + + "If selected aggregation function None rule node allows you to configure additional query parameters:

" + + "Order by timestamp: Ascending/Descending

" + + "Limit: Min value - 2, max value - 1000.

" + + "Other data aggregation functions useful when you need to get the aggregated telemetry data as a single value for the configured fetch interval.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeGetTelemetryFromDatabase") public class TbGetTelemetryNode implements TbNode { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java index aac8d8d3bf..df1ae1b371 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java @@ -34,11 +34,9 @@ import org.thingsboard.server.common.data.util.TbPair; type = ComponentType.ENRICHMENT, name = "tenant attributes", configClazz = TbGetEntityDataNodeConfiguration.class, - nodeDescription = "Add Originators Tenant Attributes or Latest Telemetry into Message Metadata/Data", - nodeDetails = "If Attributes enrichment configured, server scope attributes are added into Message Metadata/Data. " + - "If Latest Telemetry enrichment configured, latest telemetry added into Metadata/Data. " + - "To access those attributes in other nodes this template can be used " + - "metadata.temperature.", + nodeDescription = "Adds message originator tenant attributes or latest telemetry into message or message metadata", + nodeDetails = "Enriches incoming message or message metadata with the tenant's attributes or latest telemetry values. " + + "Useful when you store some parameters on the tenant level and would like to use them for message processing.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeTenantAttributesConfig") public class TbGetTenantAttributeNode extends TbAbstractGetEntityDataNode { @@ -56,14 +54,6 @@ public class TbGetTenantAttributeNode extends TbAbstractGetEntityDataNode upgrade(int fromVersion, JsonNode oldConfiguration) throws TbNodeException { return fromVersion == 0 ? upgradeToUseFetchToAndDataToFetch(oldConfiguration) : new TbPair<>(false, oldConfiguration); diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java index 759a91785c..e6433b541e 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java @@ -33,10 +33,9 @@ import org.thingsboard.server.common.msg.TbMsg; @RuleNode(type = ComponentType.ENRICHMENT, name = "tenant details", configClazz = TbGetTenantDetailsNodeConfiguration.class, - nodeDescription = "Adds fields from Tenant details to the message body or metadata", - nodeDetails = "If checkbox: Add selected details to the message metadata is selected, existing fields will be added to the message metadata instead of message data.

" + - "Note: only Device, Asset, and Entity View type are allowed.

" + - "If the originator of the message is not assigned to Tenant, or originator type is not supported - Message will be forwarded to Failure chain, otherwise, Success chain will be used.", + nodeDescription = "Adds originator tenant details into message or message metadata", + nodeDetails = "Enriches incoming message or message metadata with the corresponding tenant details. " + + "Selected details adds to the message with predefined prefix: tenant_, Examples: tenant_title or tenant_address, etc.", uiResources = {"static/rulenode/rulenode-core-config.js"}, configDirective = "tbEnrichmentNodeEntityDetailsConfig") public class TbGetTenantDetailsNode extends TbAbstractGetEntityDetailsNode { diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java index 54e2f3bd4b..e1b799552c 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java @@ -262,7 +262,7 @@ public class TbGetCustomerAttributeNodeTest { var actualException = actualExceptionCaptor.getValue(); var expectedExceptionMessage = String.format( - "Failed to find customer for entity with id %s and type %s", + "Failed to find customer for entity with id: %s and type: %s", userId.getId(), userId.getEntityType().getNormalName()); assertEquals(msg, actualMessage); diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java index 901172d344..bfbfd83051 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java @@ -385,7 +385,7 @@ public class TbGetCustomerDetailsNodeTest { assertThat(actualMsg.getMetaData()).isEqualTo(msg.getMetaData()); assertThat(actualException).isInstanceOf(RuntimeException.class); - assertThat(actualException.getMessage()).isEqualTo("Device with name 'Thermostat' is not assigned to Customer."); + assertThat(actualException.getMessage()).isEqualTo("Device with name 'Thermostat' is not assigned to Customer!"); } @Test