From 6339f0ce633509bed1ae7805628e714c4c3deab5 Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Tue, 28 May 2024 18:48:56 +0300 Subject: [PATCH] refactored tests --- .../telemetry/TbMsgTimeseriesNodeTest.java | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java index f3d2486027..d4bdcae878 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.rule.engine.telemetry; +import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -32,12 +33,14 @@ import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantProfileId; +import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; +import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -46,15 +49,17 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class TbMsgTimeseriesNodeTest { + private final TenantId TENANT_ID = TenantId.fromUUID(UUID.fromString("c8f34868-603a-4433-876a-7d356e5cf377")); private final DeviceId DEVICE_ID = new DeviceId(UUID.fromString("e5095e9a-04f4-44c9-b443-1cf1b97d3384")); - private final TenantId TENANT_ID = new TenantId(UUID.fromString("c8f34868-603a-4433-876a-7d356e5cf377")); private TbMsgTimeseriesNode node; private TbMsgTimeseriesNodeConfiguration config; @@ -70,9 +75,9 @@ public class TbMsgTimeseriesNodeTest { node = new TbMsgTimeseriesNode(); config = new TbMsgTimeseriesNodeConfiguration().defaultConfiguration(); var configuration = new TbNodeConfiguration(JacksonUtil.valueToTree(config)); - TenantProfile tenantProfile = new TenantProfile(new TenantProfileId(UUID.fromString("8c45d0fe-d437-40e9-8c31-b695b315bf40"))); - TenantProfileData tenantProfileData = new TenantProfileData(); - DefaultTenantProfileConfiguration tenantProfileConfiguration = new DefaultTenantProfileConfiguration(); + var tenantProfile = new TenantProfile(new TenantProfileId(UUID.fromString("8c45d0fe-d437-40e9-8c31-b695b315bf40"))); + var tenantProfileData = new TenantProfileData(); + var tenantProfileConfiguration = new DefaultTenantProfileConfiguration(); tenantProfileData.setConfiguration(tenantProfileConfiguration); tenantProfile.setProfileData(tenantProfileData); when(ctxMock.getTenantProfile()).thenReturn(tenantProfile); @@ -86,33 +91,18 @@ public class TbMsgTimeseriesNodeTest { @ParameterizedTest @EnumSource(TbMsgType.class) - void givenUnsupportedMsgType_whenOnMsg_thenTellFailure(TbMsgType msgType) { + void givenMsgTypeAndEmptyMsgData_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) { TbMsg msg = TbMsg.newMsg(msgType, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); + node.onMsg(ctxMock, msg); + ArgumentCaptor throwableCaptor = ArgumentCaptor.forClass(Throwable.class); + verify(ctxMock).tellFailure(eq(msg), throwableCaptor.capture()); if (TbMsgType.POST_TELEMETRY_REQUEST.equals(msgType)) { + assertThat(throwableCaptor.getValue()).isInstanceOf(IllegalArgumentException.class).hasMessage("Msg body is empty: " + msg.getData()); return; } - - node.onMsg(ctxMock, msg); - - ArgumentCaptor captor = ArgumentCaptor.forClass(Throwable.class); - verify(ctxMock).tellFailure(eq(msg), captor.capture()); - Throwable throwable = captor.getValue(); - assertThat(throwable).isInstanceOf(IllegalArgumentException.class); - assertThat(throwable.getMessage()).isEqualTo("Unsupported msg type: " + msgType); - } - - @Test - void givenEmptyMsgData_whenOnMsg_thenTellFailure() { - TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); - - node.onMsg(ctxMock, msg); - - ArgumentCaptor captor = ArgumentCaptor.forClass(Throwable.class); - verify(ctxMock).tellFailure(eq(msg), captor.capture()); - Throwable throwable = captor.getValue(); - assertThat(throwable).isInstanceOf(IllegalArgumentException.class); - assertThat(throwable.getMessage()).isEqualTo("Msg body is empty: " + msg.getData()); + assertThat(throwableCaptor.getValue()).isInstanceOf(IllegalArgumentException.class).hasMessage("Unsupported msg type: " + msgType); + verifyNoMoreInteractions(ctxMock); } @Test @@ -135,8 +125,14 @@ public class TbMsgTimeseriesNodeTest { node.onMsg(ctxMock, msg); - verify(telemetryServiceMock).saveAndNotify(eq(TENANT_ID), eq(null), eq(DEVICE_ID), anyList(), eq(tenantProfileDefaultStorageTtl), any(TelemetryNodeCallback.class)); + ArgumentCaptor> entryListCaptor = ArgumentCaptor.forClass(List.class); + verify(telemetryServiceMock).saveAndNotify( + eq(TENANT_ID), isNull(), eq(DEVICE_ID), entryListCaptor.capture(), eq(tenantProfileDefaultStorageTtl), any(TelemetryNodeCallback.class)); + List entryListCaptorValue = entryListCaptor.getValue(); + assertThat(entryListCaptorValue.size()).isEqualTo(2); + verifyTimeseriesToSave(entryListCaptorValue, msg); verify(ctxMock).tellSuccess(eq(msg)); + verifyNoMoreInteractions(ctxMock, telemetryServiceMock); } @Test @@ -163,7 +159,24 @@ public class TbMsgTimeseriesNodeTest { node.onMsg(ctxMock, msg); - verify(telemetryServiceMock).saveWithoutLatestAndNotify(eq(TENANT_ID), eq(null), eq(DEVICE_ID), anyList(), eq(tenantProfileDefaultStorageTtl), any(TelemetryNodeCallback.class)); + ArgumentCaptor> entryListCaptor = ArgumentCaptor.forClass(List.class); + verify(telemetryServiceMock).saveWithoutLatestAndNotify( + eq(TENANT_ID), isNull(), eq(DEVICE_ID), entryListCaptor.capture(), eq(tenantProfileDefaultStorageTtl), any(TelemetryNodeCallback.class)); + List entryListCaptorValue = entryListCaptor.getValue(); + assertThat(entryListCaptorValue.size()).isEqualTo(2); + verifyTimeseriesToSave(entryListCaptorValue, msg); verify(ctxMock).tellSuccess(eq(msg)); + verifyNoMoreInteractions(ctxMock, telemetryServiceMock); } + + private void verifyTimeseriesToSave(List tsKvEntryList, TbMsg incomingMsg) { + JsonNode msgData = JacksonUtil.toJsonNode(incomingMsg.getData()); + tsKvEntryList.forEach(tsKvEntry -> { + String key = tsKvEntry.getKey(); + assertThat(msgData.has(key)).isTrue(); + String value = tsKvEntry.getValueAsString(); + assertThat(value).isEqualTo(msgData.findValue(key).asText()); + }); + } + }