|
|
|
@ -17,7 +17,7 @@ package org.thingsboard.rule.engine.action; |
|
|
|
|
|
|
|
import com.datastax.oss.driver.api.core.uuid.Uuids; |
|
|
|
import com.fasterxml.jackson.databind.JsonNode; |
|
|
|
import com.google.common.util.concurrent.Futures; |
|
|
|
import com.google.common.util.concurrent.FluentFuture; |
|
|
|
import org.junit.jupiter.api.BeforeEach; |
|
|
|
import org.junit.jupiter.api.DisplayName; |
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
@ -60,6 +60,8 @@ import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.concurrent.ExecutionException; |
|
|
|
|
|
|
|
import static com.google.common.util.concurrent.Futures.immediateFailedFuture; |
|
|
|
import static com.google.common.util.concurrent.Futures.immediateFuture; |
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
import static org.mockito.ArgumentMatchers.any; |
|
|
|
import static org.mockito.ArgumentMatchers.anyString; |
|
|
|
@ -67,6 +69,7 @@ import static org.mockito.BDDMockito.given; |
|
|
|
import static org.mockito.BDDMockito.then; |
|
|
|
import static org.mockito.Mockito.doReturn; |
|
|
|
import static org.mockito.Mockito.eq; |
|
|
|
import static org.mockito.Mockito.lenient; |
|
|
|
import static org.mockito.Mockito.never; |
|
|
|
|
|
|
|
@ExtendWith(MockitoExtension.class) |
|
|
|
@ -99,6 +102,8 @@ class TbCreateAlarmNodeTest { |
|
|
|
dbExecutor = new TestDbCallbackExecutor(); |
|
|
|
metadata = new TbMsgMetaData(); |
|
|
|
config = new TbCreateAlarmNodeConfiguration(); |
|
|
|
|
|
|
|
lenient().when(ctxMock.getDbCallbackExecutor()).thenReturn(dbExecutor); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
@ -212,10 +217,9 @@ class TbCreateAlarmNodeTest { |
|
|
|
// mocks
|
|
|
|
given(ctxMock.getTenantId()).willReturn(tenantId); |
|
|
|
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); |
|
|
|
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); |
|
|
|
given(ctxMock.getSelfId()).willReturn(ruleNodeSelfId); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndType(tenantId, msgOriginator, alarmType)).willReturn(existingAlarm); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(incomingMsg)).willReturn(Futures.immediateFuture(alarmDetails)); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndTypeAsync(tenantId, msgOriginator, alarmType)).willReturn(FluentFuture.from(immediateFuture(existingAlarm))); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(incomingMsg)).willReturn(immediateFuture(alarmDetails)); |
|
|
|
var apiCallResult = AlarmApiCallResult.builder() |
|
|
|
.successful(true) |
|
|
|
.created(true) |
|
|
|
@ -230,11 +234,11 @@ class TbCreateAlarmNodeTest { |
|
|
|
given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock); |
|
|
|
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) |
|
|
|
.willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
); |
|
|
|
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, TbAbstractAlarmNodeConfiguration.ALARM_DETAILS_BUILD_TBEL_TEMPLATE)).willReturn(alarmDetailsScriptMock); |
|
|
|
|
|
|
|
@ -384,10 +388,9 @@ class TbCreateAlarmNodeTest { |
|
|
|
// mocks
|
|
|
|
given(ctxMock.getTenantId()).willReturn(tenantId); |
|
|
|
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); |
|
|
|
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); |
|
|
|
given(ctxMock.getSelfId()).willReturn(ruleNodeSelfId); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndType(tenantId, msgOriginator, alarmType)).willReturn(existingClearedAlarm); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(incomingMsg)).willReturn(Futures.immediateFuture(alarmDetails)); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndTypeAsync(tenantId, msgOriginator, alarmType)).willReturn(FluentFuture.from(immediateFuture(existingClearedAlarm))); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(incomingMsg)).willReturn(immediateFuture(alarmDetails)); |
|
|
|
var apiCallResult = AlarmApiCallResult.builder() |
|
|
|
.successful(true) |
|
|
|
.created(true) |
|
|
|
@ -402,11 +405,11 @@ class TbCreateAlarmNodeTest { |
|
|
|
given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock); |
|
|
|
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) |
|
|
|
.willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
); |
|
|
|
given(ctxMock.createScriptEngine(ScriptLanguage.JS, config.getAlarmDetailsBuildJs())).willReturn(alarmDetailsScriptMock); |
|
|
|
|
|
|
|
@ -576,10 +579,9 @@ class TbCreateAlarmNodeTest { |
|
|
|
// mocks
|
|
|
|
given(ctxMock.getTenantId()).willReturn(tenantId); |
|
|
|
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); |
|
|
|
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); |
|
|
|
given(ctxMock.getSelfId()).willReturn(ruleNodeSelfId); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndType(tenantId, msgOriginator, alarmType)).willReturn(existingActiveAlarm); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(any())).willReturn(Futures.immediateFuture(newAlarmDetails)); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndTypeAsync(tenantId, msgOriginator, alarmType)).willReturn(FluentFuture.from(immediateFuture(existingActiveAlarm))); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(any())).willReturn(immediateFuture(newAlarmDetails)); |
|
|
|
doReturn(newEndTs).when(nodeSpy).currentTimeMillis(); |
|
|
|
var apiCallResult = AlarmApiCallResult.builder() |
|
|
|
.successful(true) |
|
|
|
@ -595,11 +597,11 @@ class TbCreateAlarmNodeTest { |
|
|
|
given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock); |
|
|
|
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) |
|
|
|
.willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
); |
|
|
|
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); |
|
|
|
|
|
|
|
@ -753,9 +755,8 @@ class TbCreateAlarmNodeTest { |
|
|
|
// mocks
|
|
|
|
given(ctxMock.getTenantId()).willReturn(tenantId); |
|
|
|
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); |
|
|
|
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); |
|
|
|
given(ctxMock.getSelfId()).willReturn(ruleNodeSelfId); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndType(tenantId, msgOriginator, alarmType)).willReturn(existingClearedAlarm); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndTypeAsync(tenantId, msgOriginator, alarmType)).willReturn(FluentFuture.from(immediateFuture(existingClearedAlarm))); |
|
|
|
var apiCallResult = AlarmApiCallResult.builder() |
|
|
|
.successful(true) |
|
|
|
.created(true) |
|
|
|
@ -770,11 +771,11 @@ class TbCreateAlarmNodeTest { |
|
|
|
given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock); |
|
|
|
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) |
|
|
|
.willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
); |
|
|
|
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); |
|
|
|
|
|
|
|
@ -941,10 +942,9 @@ class TbCreateAlarmNodeTest { |
|
|
|
// mocks
|
|
|
|
given(ctxMock.getTenantId()).willReturn(tenantId); |
|
|
|
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); |
|
|
|
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); |
|
|
|
given(ctxMock.getSelfId()).willReturn(ruleNodeSelfId); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndType(tenantId, msgOriginator, alarmType)).willReturn(existingActiveAlarm); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(any())).willReturn(Futures.immediateFuture(newAlarmDetails)); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndTypeAsync(tenantId, msgOriginator, alarmType)).willReturn(FluentFuture.from(immediateFuture(existingActiveAlarm))); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(any())).willReturn(immediateFuture(newAlarmDetails)); |
|
|
|
doReturn(newEndTs).when(nodeSpy).currentTimeMillis(); |
|
|
|
var apiCallResult = AlarmApiCallResult.builder() |
|
|
|
.successful(true) |
|
|
|
@ -960,11 +960,11 @@ class TbCreateAlarmNodeTest { |
|
|
|
given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock); |
|
|
|
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) |
|
|
|
.willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
); |
|
|
|
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); |
|
|
|
|
|
|
|
@ -1125,10 +1125,9 @@ class TbCreateAlarmNodeTest { |
|
|
|
// mocks
|
|
|
|
given(ctxMock.getTenantId()).willReturn(tenantId); |
|
|
|
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); |
|
|
|
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); |
|
|
|
given(ctxMock.getSelfId()).willReturn(ruleNodeSelfId); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndType(tenantId, msgOriginator, alarmType)).willReturn(existingActiveAlarm); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(any())).willReturn(Futures.immediateFuture(alarmDetails)); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndTypeAsync(tenantId, msgOriginator, alarmType)).willReturn(FluentFuture.from(immediateFuture(existingActiveAlarm))); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(any())).willReturn(immediateFuture(alarmDetails)); |
|
|
|
doReturn(endTs).when(nodeSpy).currentTimeMillis(); |
|
|
|
var apiCallResult = AlarmApiCallResult.builder() |
|
|
|
.successful(true) |
|
|
|
@ -1144,11 +1143,11 @@ class TbCreateAlarmNodeTest { |
|
|
|
given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock); |
|
|
|
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) |
|
|
|
.willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
.type(answer.getArgument(1, TbMsgType.class)) |
|
|
|
.originator(answer.getArgument(2, EntityId.class)) |
|
|
|
.metaData(answer.getArgument(3, TbMsgMetaData.class)) |
|
|
|
.data(answer.getArgument(4, String.class)) |
|
|
|
.build() |
|
|
|
); |
|
|
|
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); |
|
|
|
|
|
|
|
@ -1216,11 +1215,11 @@ class TbCreateAlarmNodeTest { |
|
|
|
|
|
|
|
given(ctxMock.getTenantId()).willReturn(tenantId); |
|
|
|
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); |
|
|
|
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); |
|
|
|
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); |
|
|
|
given(alarmServiceMock.findLatestActiveByOriginatorAndTypeAsync(tenantId, msgOriginator, config.getAlarmType())).willReturn(FluentFuture.from(immediateFuture(null))); |
|
|
|
|
|
|
|
var expectedException = new ExecutionException("Failed to execute script.", new RuntimeException("Something went wrong!")); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(incomingMsg)).willReturn(Futures.immediateFailedFuture(expectedException)); |
|
|
|
given(alarmDetailsScriptMock.executeJsonAsync(incomingMsg)).willReturn(immediateFailedFuture(expectedException)); |
|
|
|
|
|
|
|
nodeSpy.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); |
|
|
|
|
|
|
|
|