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 5bf01211d5..2c7fe2302b 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 @@ -92,7 +92,7 @@ public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNode node.init(ctxMock, nodeConfiguration)); + + // THEN + assertThat(exception.getMessage()).isEqualTo("FetchTo cannot be null!"); + verify(ctxMock, never()).tellSuccess(any()); + } + + @Test + public void givenNoEntityDetailsSelected_whenInit_thenException() { + // GIVEN + var expectedExceptionMessage = "No entity details selected!"; + + config.setDetailsList(Collections.emptyList()); + nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config)); + + // WHEN + var exception = assertThrows(TbNodeException.class, () -> node.init(ctxMock, nodeConfiguration)); + + // THEN + assertThat(exception.getMessage()).isEqualTo(expectedExceptionMessage); + verify(ctxMock, never()).tellSuccess(any()); + } + + @Test + public void givenDefaultConfig_whenInit_thenOK() throws TbNodeException { + // GIVEN-WHEN + node.init(ctxMock, nodeConfiguration); + + // THEN + assertThat(node.config).isEqualTo(config); + assertThat(config.getDetailsList()).isEqualTo(List.of(EntityDetails.STATE, EntityDetails.CITY)); + assertThat(config.getFetchTo()).isEqualTo(FetchTo.DATA); + assertThat(node.fetchTo).isEqualTo(FetchTo.DATA); + } + + @Test + public void givenCustomConfig_whenInit_thenOK() throws TbNodeException { + // GIVEN + config.setDetailsList(List.of(EntityDetails.ID, EntityDetails.PHONE)); + config.setFetchTo(FetchTo.METADATA); + nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config)); + + // WHEN + node.init(ctxMock, nodeConfiguration); + + // THEN + assertThat(node.config).isEqualTo(config); + assertThat(config.getDetailsList()).isEqualTo(List.of(EntityDetails.ID, EntityDetails.PHONE)); + assertThat(config.getFetchTo()).isEqualTo(FetchTo.METADATA); + assertThat(node.fetchTo).isEqualTo(FetchTo.METADATA); + } + + @Test + public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { + // GIVEN + node.fetchTo = FetchTo.DATA; + msg = TbMsg.newMsg("SOME_MESSAGE_TYPE", DUMMY_DEVICE_ORIGINATOR, new TbMsgMetaData(), "[]"); + + // WHEN + var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); + + // THEN + assertThat(exception.getMessage()).isEqualTo("Message body is not an object!"); + verify(ctxMock, never()).tellSuccess(any()); + } + + @Test + public void givenEntityThatDoesNotBelongToTheCurrentTenant_whenOnMsg_thenException() { + // GIVEN + var expectedExceptionMessage = "Entity with id: '" + DUMMY_DEVICE_ORIGINATOR + + "' specified in the configuration doesn't belong to the current tenant."; + + doThrow(new RuntimeException(expectedExceptionMessage)).when(ctxMock).checkTenantEntity(DUMMY_DEVICE_ORIGINATOR); + msg = TbMsg.newMsg("SOME_MESSAGE_TYPE", DUMMY_DEVICE_ORIGINATOR, new TbMsgMetaData(), "{}"); + + // WHEN + var exception = assertThrows(RuntimeException.class, () -> node.onMsg(ctxMock, msg)); + + // THEN + assertThat(exception.getMessage()).isEqualTo(expectedExceptionMessage); + verify(ctxMock, never()).tellSuccess(any()); + } + + @Test + public void givenAllEntityDetailsAndFetchToData_whenOnMsg_thenShouldTellSuccessAndFetchAllToData() { + // GIVEN + var device = new Device(); + device.setId(new DeviceId(UUID.randomUUID())); + device.setCustomerId(customer.getId()); + + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.values()), device.getId()); + + when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); + when(deviceServiceMock.findDeviceByIdAsync(eq(TENANT_ID), eq(device.getId()))).thenReturn(Futures.immediateFuture(device)); + + mockFindCustomer(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + var expectedMsgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"," + + "\"customer_id\":\"" + customer.getId() + "\"," + + "\"customer_title\":\"" + customer.getTitle() + "\"," + + "\"customer_country\":\"" + customer.getCountry() + "\"," + + "\"customer_city\":\"" + customer.getCity() + "\"," + + "\"customer_state\":\"" + customer.getState() + "\"," + + "\"customer_zip\":\"" + customer.getZip() + "\"," + + "\"customer_address\":\"" + customer.getAddress() + "\"," + + "\"customer_address2\":\"" + customer.getAddress2() + "\"," + + "\"customer_phone\":\"" + customer.getPhone() + "\"," + + "\"customer_email\":\"" + customer.getEmail() + "\"," + + "\"customer_additionalInfo\":\"" + customer.getAdditionalInfo().get("description").asText() + "\"}"; + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(expectedMsgData); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + @Test + public void givenSomeEntityDetailsAndFetchToMetadata_whenOnMsg_thenShouldTellSuccessAndFetchSomeToMetaData() { + // GIVEN + var asset = new Asset(); + asset.setId(new AssetId(UUID.randomUUID())); + asset.setCustomerId(customer.getId()); + + prepareMsgAndConfig(FetchTo.METADATA, List.of(EntityDetails.ID, EntityDetails.TITLE, EntityDetails.PHONE), asset.getId()); + + when(ctxMock.getAssetService()).thenReturn(assetServiceMock); + when(assetServiceMock.findAssetByIdAsync(eq(TENANT_ID), eq(asset.getId()))).thenReturn(Futures.immediateFuture(asset)); + + mockFindCustomer(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + var expectedMsgMetaData = new TbMsgMetaData(msg.getMetaData().getData()); + expectedMsgMetaData.putValue("customer_id", customer.getId().getId().toString()); + expectedMsgMetaData.putValue("customer_title", customer.getTitle()); + expectedMsgMetaData.putValue("customer_phone", customer.getPhone()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(expectedMsgMetaData); + } + + @Test + public void givenNoEntityDetailsAndFetchToMetadata_whenOnMsg_thenShouldTellSuccessAndFetchNothingToMetaData() { + // GIVEN + var entityView = new EntityView(); + entityView.setId(new EntityViewId(UUID.randomUUID())); + entityView.setCustomerId(customer.getId()); + + prepareMsgAndConfig(FetchTo.METADATA, Collections.emptyList(), entityView.getId()); + + when(ctxMock.getEntityViewService()).thenReturn(entityViewServiceMock); + when(entityViewServiceMock.findEntityViewByIdAsync(eq(TENANT_ID), eq(entityView.getId()))).thenReturn(Futures.immediateFuture(entityView)); + + mockFindCustomer(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + @Test + public void givenNotPresentEntityDetailsAndFetchToData_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { + // GIVEN + customer.setZip(null); + customer.setAddress(null); + customer.setAddress2(null); + + var user = new User(); + user.setId(new UserId(UUID.randomUUID())); + user.setCustomerId(customer.getId()); + + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2), user.getId()); + + when(ctxMock.getUserService()).thenReturn(userServiceMock); + when(userServiceMock.findUserByIdAsync(eq(TENANT_ID), eq(user.getId()))).thenReturn(Futures.immediateFuture(user)); + + mockFindCustomer(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + @Test + public void givenDidNotFindCustomer_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { + // GIVEN + var edge = new Edge(); + edge.setId(new EdgeId(UUID.randomUUID())); + edge.setCustomerId(customer.getId()); + + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2), edge.getId()); + + when(ctxMock.getEdgeService()).thenReturn(edgeServiceMock); + when(edgeServiceMock.findEdgeByIdAsync(eq(TENANT_ID), eq(edge.getId()))).thenReturn(Futures.immediateFuture(edge)); + + when(ctxMock.getTenantId()).thenReturn(TENANT_ID); + when(ctxMock.getCustomerService()).thenReturn(customerServiceMock); + when(customerServiceMock.findCustomerByIdAsync(eq(TENANT_ID), eq(customer.getId()))).thenReturn(Futures.immediateFuture(null)); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + @Test + public void givenDidNotFindOriginator_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { + // GIVEN + var edge = new Edge(); + edge.setId(new EdgeId(UUID.randomUUID())); + edge.setCustomerId(customer.getId()); + + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2), edge.getId()); + + when(ctxMock.getTenantId()).thenReturn(TENANT_ID); + + when(ctxMock.getEdgeService()).thenReturn(edgeServiceMock); + when(edgeServiceMock.findEdgeByIdAsync(eq(TENANT_ID), eq(edge.getId()))).thenReturn(Futures.immediateFuture(null)); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + @Test + public void givenOriginatorNotAssignedToCustomer_whenOnMsg_thenShouldTellFailureAndFetchNothingToData() { + // GIVEN + var device = new Device(); + device.setId(new DeviceId(UUID.randomUUID())); + + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2), device.getId()); + + when(ctxMock.getTenantId()).thenReturn(TENANT_ID); + + when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); + when(deviceServiceMock.findDeviceByIdAsync(eq(TENANT_ID), eq(device.getId()))).thenReturn(Futures.immediateFuture(device)); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellFailure(actualMessageCaptor.capture(), any()); + verify(ctxMock, never()).tellSuccess(any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + @Test + public void givenNullDescriptionAndAddInfoEntityDetails_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { + // GIVEN + customer.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":null}")); + + var device = new Device(); + device.setId(new DeviceId(UUID.randomUUID())); + device.setCustomerId(customer.getId()); + + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ADDITIONAL_INFO), device.getId()); + + when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); + when(deviceServiceMock.findDeviceByIdAsync(eq(TENANT_ID), eq(device.getId()))).thenReturn(Futures.immediateFuture(device)); + + mockFindCustomer(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + @Test + public void givenUnsupportedEntityType_whenOnMsg_thenShouldTellFailureAndFetchNothingToMetaData() { + // GIVEN + var dashboard = new Dashboard(); + dashboard.setId(new DashboardId(UUID.randomUUID())); + + prepareMsgAndConfig(FetchTo.METADATA, List.of(EntityDetails.STATE), dashboard.getId()); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellFailure(actualMessageCaptor.capture(), any()); + verify(ctxMock, never()).tellSuccess(any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } + + private void prepareMsgAndConfig(FetchTo fetchTo, List detailsList, EntityId originator) { + config.setDetailsList(detailsList); + config.setFetchTo(fetchTo); + + node.config = config; + node.fetchTo = fetchTo; + + var msgMetaData = new TbMsgMetaData(); + msgMetaData.putValue("metaKey1", "metaValue1"); + msgMetaData.putValue("metaKey2", "metaValue2"); + + var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; + + msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", originator, msgMetaData, msgData); + } + + private void mockFindCustomer() { + when(ctxMock.getTenantId()).thenReturn(TENANT_ID); + when(ctxMock.getCustomerService()).thenReturn(customerServiceMock); + when(customerServiceMock.findCustomerByIdAsync(eq(TENANT_ID), eq(customer.getId()))).thenReturn(Futures.immediateFuture(customer)); + } + +} diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNodeTest.java index 5611e36d4b..d05ad23db6 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNodeTest.java @@ -27,7 +27,6 @@ import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.util.EntityDetails; -import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; @@ -61,12 +60,25 @@ public class TbGetTenantDetailsNodeTest { private TbGetTenantDetailsNodeConfiguration config; private TbNodeConfiguration nodeConfiguration; private TbMsg msg; + private Tenant tenant; @BeforeEach public void setUp() { node = new TbGetTenantDetailsNode(); config = new TbGetTenantDetailsNodeConfiguration().defaultConfiguration(); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config)); + tenant = new Tenant(); + tenant.setId(new TenantId(UUID.randomUUID())); + tenant.setTitle("Tenant title"); + tenant.setCountry("Tenant country"); + tenant.setCity("Tenant city"); + tenant.setState("Tenant state"); + tenant.setZip("123456"); + tenant.setAddress("Tenant address 1"); + tenant.setAddress2("Tenant address 2"); + tenant.setPhone("+123456789"); + tenant.setEmail("email@tenant.com"); + tenant.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":\"Tenant description\"}")); } @Test @@ -84,10 +96,24 @@ public class TbGetTenantDetailsNodeTest { } @Test - public void givenDefaultConfig_whenInit_thenOK() throws TbNodeException { + public void givenNoEntityDetailsSelected_whenInit_thenException() { // GIVEN + var expectedExceptionMessage = "No entity details selected!"; + + config.setDetailsList(Collections.emptyList()); + nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config)); // WHEN + var exception = assertThrows(TbNodeException.class, () -> node.init(ctxMock, nodeConfiguration)); + + // THEN + assertThat(exception.getMessage()).isEqualTo(expectedExceptionMessage); + verify(ctxMock, never()).tellSuccess(any()); + } + + @Test + public void givenDefaultConfig_whenInit_thenOK() throws TbNodeException { + // GIVEN-WHEN node.init(ctxMock, nodeConfiguration); // THEN @@ -130,11 +156,10 @@ public class TbGetTenantDetailsNodeTest { @Test public void givenEntityThatDoesNotBelongToTheCurrentTenant_whenOnMsg_thenException() { - // SETUP + // GIVEN var expectedExceptionMessage = "Entity with id: '" + DUMMY_DEVICE_ORIGINATOR + "' specified in the configuration doesn't belong to the current tenant."; - // GIVEN doThrow(new RuntimeException(expectedExceptionMessage)).when(ctxMock).checkTenantEntity(DUMMY_DEVICE_ORIGINATOR); msg = TbMsg.newMsg("SOME_MESSAGE_TYPE", DUMMY_DEVICE_ORIGINATOR, new TbMsgMetaData(), "{}"); @@ -149,43 +174,9 @@ public class TbGetTenantDetailsNodeTest { @Test public void givenAllEntityDetailsAndFetchToData_whenOnMsg_thenShouldTellSuccessAndFetchAllToData() { // GIVEN - var tenant = new Tenant(); - tenant.setId(new TenantId(UUID.randomUUID())); - tenant.setTitle("Tenant title"); - tenant.setCountry("Tenant country"); - tenant.setCity("Tenant city"); - tenant.setState("Tenant state"); - tenant.setZip("123456"); - tenant.setAddress("Tenant address 1"); - tenant.setAddress2("Tenant address 2"); - tenant.setPhone("+123456789"); - tenant.setEmail("email@tenant.com"); - tenant.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":\"Tenant description\"}")); - - var device = new Device(); - device.setId(new DeviceId(UUID.randomUUID())); - device.setTenantId(tenant.getId()); - device.setName("Test device"); - device.setType("Test device type"); - - config.setDetailsList(List.of(EntityDetails.values())); - config.setFetchTo(FetchTo.DATA); - - node.config = config; - node.fetchTo = FetchTo.DATA; - - var msgMetaData = new TbMsgMetaData(); - msgMetaData.putValue("metaKey1", "metaValue1"); - msgMetaData.putValue("metaKey2", "metaValue2"); + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.values())); - var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; - - msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", device.getId(), msgMetaData, msgData); - - when(ctxMock.getTenantId()).thenReturn(tenant.getId()); - - when(ctxMock.getTenantService()).thenReturn(tenantServiceMock); - when(tenantServiceMock.findTenantByIdAsync(eq(tenant.getId()), eq(tenant.getId()))).thenReturn(Futures.immediateFuture(tenant)); + mockFindTenant(); // WHEN node.onMsg(ctxMock, msg); @@ -210,49 +201,15 @@ public class TbGetTenantDetailsNodeTest { "\"tenant_additionalInfo\":\"" + tenant.getAdditionalInfo().get("description").asText() + "\"}"; assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(expectedMsgData); - assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msgMetaData); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); } @Test public void givenSomeEntityDetailsAndFetchToMetadata_whenOnMsg_thenShouldTellSuccessAndFetchSomeToMetaData() { // GIVEN - var tenant = new Tenant(); - tenant.setId(new TenantId(UUID.randomUUID())); - tenant.setTitle("Tenant title"); - tenant.setCountry("Tenant country"); - tenant.setCity("Tenant city"); - tenant.setState("Tenant state"); - tenant.setZip("123456"); - tenant.setAddress("Tenant address 1"); - tenant.setAddress2("Tenant address 2"); - tenant.setPhone("+123456789"); - tenant.setEmail("email@tenant.com"); - tenant.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":\"Tenant description\"}")); - - var device = new Device(); - device.setId(new DeviceId(UUID.randomUUID())); - device.setTenantId(tenant.getId()); - device.setName("Test device"); - device.setType("Test device type"); - - config.setDetailsList(List.of(EntityDetails.ID, EntityDetails.TITLE, EntityDetails.PHONE)); - config.setFetchTo(FetchTo.METADATA); - - node.config = config; - node.fetchTo = FetchTo.METADATA; + prepareMsgAndConfig(FetchTo.METADATA, List.of(EntityDetails.ID, EntityDetails.TITLE, EntityDetails.PHONE)); - var msgMetaData = new TbMsgMetaData(); - msgMetaData.putValue("metaKey1", "metaValue1"); - msgMetaData.putValue("metaKey2", "metaValue2"); - - var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; - - msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", device.getId(), msgMetaData, msgData); - - when(ctxMock.getTenantId()).thenReturn(tenant.getId()); - - when(ctxMock.getTenantService()).thenReturn(tenantServiceMock); - when(tenantServiceMock.findTenantByIdAsync(eq(tenant.getId()), eq(tenant.getId()))).thenReturn(Futures.immediateFuture(tenant)); + mockFindTenant(); // WHEN node.onMsg(ctxMock, msg); @@ -263,55 +220,21 @@ public class TbGetTenantDetailsNodeTest { verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); verify(ctxMock, never()).tellFailure(any(), any()); - var expectedMsgMetaData = new TbMsgMetaData(msgMetaData.getData()); + var expectedMsgMetaData = new TbMsgMetaData(msg.getMetaData().getData()); expectedMsgMetaData.putValue("tenant_id", tenant.getId().getId().toString()); expectedMsgMetaData.putValue("tenant_title", tenant.getTitle()); expectedMsgMetaData.putValue("tenant_phone", tenant.getPhone()); - assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msgData); + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(expectedMsgMetaData); } @Test public void givenNoEntityDetailsAndFetchToMetadata_whenOnMsg_thenShouldTellSuccessAndFetchNothingToMetaData() { // GIVEN - var tenant = new Tenant(); - tenant.setId(new TenantId(UUID.randomUUID())); - tenant.setTitle("Tenant title"); - tenant.setCountry("Tenant country"); - tenant.setCity("Tenant city"); - tenant.setState("Tenant state"); - tenant.setZip("123456"); - tenant.setAddress("Tenant address 1"); - tenant.setAddress2("Tenant address 2"); - tenant.setPhone("+123456789"); - tenant.setEmail("email@tenant.com"); - tenant.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":\"Tenant description\"}")); - - var device = new Device(); - device.setId(new DeviceId(UUID.randomUUID())); - device.setTenantId(tenant.getId()); - device.setName("Test device"); - device.setType("Test device type"); + prepareMsgAndConfig(FetchTo.METADATA, Collections.emptyList()); - config.setDetailsList(Collections.emptyList()); - config.setFetchTo(FetchTo.METADATA); - - node.config = config; - node.fetchTo = FetchTo.METADATA; - - var msgMetaData = new TbMsgMetaData(); - msgMetaData.putValue("metaKey1", "metaValue1"); - msgMetaData.putValue("metaKey2", "metaValue2"); - - var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; - - msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", device.getId(), msgMetaData, msgData); - - when(ctxMock.getTenantId()).thenReturn(tenant.getId()); - - when(ctxMock.getTenantService()).thenReturn(tenantServiceMock); - when(tenantServiceMock.findTenantByIdAsync(eq(tenant.getId()), eq(tenant.getId()))).thenReturn(Futures.immediateFuture(tenant)); + mockFindTenant(); // WHEN node.onMsg(ctxMock, msg); @@ -322,47 +245,20 @@ public class TbGetTenantDetailsNodeTest { verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); verify(ctxMock, never()).tellFailure(any(), any()); - assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msgData); - assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msgMetaData); + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); } @Test public void givenNotPresentEntityDetailsAndFetchToData_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { // GIVEN - var tenant = new Tenant(); - tenant.setId(new TenantId(UUID.randomUUID())); - tenant.setTitle("Tenant title"); - tenant.setCountry("Tenant country"); - tenant.setCity("Tenant city"); - tenant.setState("Tenant state"); - tenant.setPhone("+123456789"); - tenant.setEmail("email@tenant.com"); - tenant.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":\"Tenant description\"}")); - - var device = new Device(); - device.setId(new DeviceId(UUID.randomUUID())); - device.setTenantId(tenant.getId()); - device.setName("Test device"); - device.setType("Test device type"); - - config.setDetailsList(List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2)); - config.setFetchTo(FetchTo.DATA); - - node.config = config; - node.fetchTo = FetchTo.DATA; + tenant.setZip(null); + tenant.setAddress(null); + tenant.setAddress2(null); - var msgMetaData = new TbMsgMetaData(); - msgMetaData.putValue("metaKey1", "metaValue1"); - msgMetaData.putValue("metaKey2", "metaValue2"); + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2)); - var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; - - msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", device.getId(), msgMetaData, msgData); - - when(ctxMock.getTenantId()).thenReturn(tenant.getId()); - - when(ctxMock.getTenantService()).thenReturn(tenantServiceMock); - when(tenantServiceMock.findTenantByIdAsync(eq(tenant.getId()), eq(tenant.getId()))).thenReturn(Futures.immediateFuture(tenant)); + mockFindTenant(); // WHEN node.onMsg(ctxMock, msg); @@ -373,45 +269,16 @@ public class TbGetTenantDetailsNodeTest { verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); verify(ctxMock, never()).tellFailure(any(), any()); - assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msgData); - assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msgMetaData); + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); } @Test public void givenDidNotFindTenant_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { // GIVEN - var tenant = new Tenant(); - tenant.setId(new TenantId(UUID.randomUUID())); - tenant.setTitle("Tenant title"); - tenant.setCountry("Tenant country"); - tenant.setCity("Tenant city"); - tenant.setState("Tenant state"); - tenant.setPhone("+123456789"); - tenant.setEmail("email@tenant.com"); - tenant.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":\"Tenant description\"}")); - - var device = new Device(); - device.setId(new DeviceId(UUID.randomUUID())); - device.setTenantId(tenant.getId()); - device.setName("Test device"); - device.setType("Test device type"); - - config.setDetailsList(List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2)); - config.setFetchTo(FetchTo.DATA); - - node.config = config; - node.fetchTo = FetchTo.DATA; - - var msgMetaData = new TbMsgMetaData(); - msgMetaData.putValue("metaKey1", "metaValue1"); - msgMetaData.putValue("metaKey2", "metaValue2"); - - var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; - - msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", device.getId(), msgMetaData, msgData); + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ZIP, EntityDetails.ADDRESS, EntityDetails.ADDRESS2)); when(ctxMock.getTenantId()).thenReturn(tenant.getId()); - when(ctxMock.getTenantService()).thenReturn(tenantServiceMock); when(tenantServiceMock.findTenantByIdAsync(eq(tenant.getId()), eq(tenant.getId()))).thenReturn(Futures.immediateFuture(null)); @@ -424,34 +291,38 @@ public class TbGetTenantDetailsNodeTest { verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); verify(ctxMock, never()).tellFailure(any(), any()); - assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msgData); - assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msgMetaData); + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); } @Test - public void givenNullDescription_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { + public void givenNullDescriptionAndAddInfoEntityDetails_whenOnMsg_thenShouldTellSuccessAndFetchNothingToData() { // GIVEN - var tenant = new Tenant(); - tenant.setId(new TenantId(UUID.randomUUID())); - tenant.setTitle("Tenant title"); - tenant.setCountry("Tenant country"); - tenant.setCity("Tenant city"); - tenant.setState("Tenant state"); - tenant.setPhone("+123456789"); - tenant.setEmail("email@tenant.com"); tenant.setAdditionalInfo(JacksonUtil.toJsonNode("{\"someProperty\":\"someValue\",\"description\":null}")); - var device = new Device(); - device.setId(new DeviceId(UUID.randomUUID())); - device.setTenantId(tenant.getId()); - device.setName("Test device"); - device.setType("Test device type"); + prepareMsgAndConfig(FetchTo.DATA, List.of(EntityDetails.ADDITIONAL_INFO)); + + mockFindTenant(); + + // WHEN + node.onMsg(ctxMock, msg); + + // THEN + var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); + + verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); + verify(ctxMock, never()).tellFailure(any(), any()); + + assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msg.getData()); + assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msg.getMetaData()); + } - config.setDetailsList(List.of(EntityDetails.ADDITIONAL_INFO)); - config.setFetchTo(FetchTo.DATA); + private void prepareMsgAndConfig(FetchTo fetchTo, List detailsList) { + config.setDetailsList(detailsList); + config.setFetchTo(fetchTo); node.config = config; - node.fetchTo = FetchTo.DATA; + node.fetchTo = fetchTo; var msgMetaData = new TbMsgMetaData(); msgMetaData.putValue("metaKey1", "metaValue1"); @@ -459,24 +330,13 @@ public class TbGetTenantDetailsNodeTest { var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; - msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", device.getId(), msgMetaData, msgData); + msg = TbMsg.newMsg("POST_TELEMETRY_REQUEST", DUMMY_DEVICE_ORIGINATOR, msgMetaData, msgData); + } + private void mockFindTenant() { when(ctxMock.getTenantId()).thenReturn(tenant.getId()); - when(ctxMock.getTenantService()).thenReturn(tenantServiceMock); when(tenantServiceMock.findTenantByIdAsync(eq(tenant.getId()), eq(tenant.getId()))).thenReturn(Futures.immediateFuture(tenant)); - - // WHEN - node.onMsg(ctxMock, msg); - - // THEN - var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class); - - verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture()); - verify(ctxMock, never()).tellFailure(any(), any()); - - assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(msgData); - assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msgMetaData); } }