4 changed files with 258 additions and 3 deletions
@ -0,0 +1,117 @@ |
|||
package org.thingsboard.rule.engine.util; |
|||
|
|||
import com.google.common.util.concurrent.Futures; |
|||
import org.junit.jupiter.api.Test; |
|||
import org.junit.jupiter.api.extension.ExtendWith; |
|||
import org.mockito.Mock; |
|||
import org.mockito.junit.jupiter.MockitoExtension; |
|||
import org.thingsboard.rule.engine.api.TbContext; |
|||
import org.thingsboard.rule.engine.data.DeviceRelationsQuery; |
|||
import org.thingsboard.server.common.data.Device; |
|||
import org.thingsboard.server.common.data.device.DeviceSearchQuery; |
|||
import org.thingsboard.server.common.data.id.DeviceId; |
|||
import org.thingsboard.server.common.data.id.EntityId; |
|||
import org.thingsboard.server.common.data.id.TenantId; |
|||
import org.thingsboard.server.common.data.relation.EntityRelation; |
|||
import org.thingsboard.server.common.data.relation.EntitySearchDirection; |
|||
import org.thingsboard.server.common.data.relation.RelationsSearchParameters; |
|||
import org.thingsboard.server.dao.device.DeviceService; |
|||
|
|||
import java.util.List; |
|||
import java.util.UUID; |
|||
|
|||
import static org.junit.jupiter.api.Assertions.assertEquals; |
|||
import static org.junit.jupiter.api.Assertions.assertNotNull; |
|||
import static org.mockito.ArgumentMatchers.eq; |
|||
import static org.mockito.Mockito.times; |
|||
import static org.mockito.Mockito.verify; |
|||
import static org.mockito.Mockito.when; |
|||
|
|||
@ExtendWith(MockitoExtension.class) |
|||
public class EntitiesRelatedDeviceIdAsyncLoaderTest { |
|||
|
|||
private static final EntityId DUMMY_ORIGINATOR = new DeviceId(UUID.randomUUID()); |
|||
private static final TenantId TENANT_ID = new TenantId(UUID.randomUUID()); |
|||
@Mock |
|||
private TbContext ctxMock; |
|||
@Mock |
|||
private DeviceService deviceServiceMock; |
|||
|
|||
@Test |
|||
public void givenDeviceRelationsQuery_whenFindDeviceAsync_ShouldBuildCorrectDeviceSearchQuery() { |
|||
// GIVEN
|
|||
var deviceRelationsQuery = new DeviceRelationsQuery(); |
|||
deviceRelationsQuery.setDeviceTypes(List.of("Device type 1", "Device type 2", "default")); |
|||
deviceRelationsQuery.setDirection(EntitySearchDirection.FROM); |
|||
deviceRelationsQuery.setMaxLevel(2); |
|||
deviceRelationsQuery.setRelationType(EntityRelation.CONTAINS_TYPE); |
|||
|
|||
var expectedDeviceSearchQuery = new DeviceSearchQuery(); |
|||
var parameters = new RelationsSearchParameters( |
|||
DUMMY_ORIGINATOR, |
|||
deviceRelationsQuery.getDirection(), |
|||
deviceRelationsQuery.getMaxLevel(), |
|||
deviceRelationsQuery.isFetchLastLevelOnly() |
|||
); |
|||
expectedDeviceSearchQuery.setParameters(parameters); |
|||
expectedDeviceSearchQuery.setRelationType(deviceRelationsQuery.getRelationType()); |
|||
expectedDeviceSearchQuery.setDeviceTypes(deviceRelationsQuery.getDeviceTypes()); |
|||
|
|||
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); |
|||
when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); |
|||
when(deviceServiceMock.findDevicesByQuery(eq(TENANT_ID), eq(expectedDeviceSearchQuery))) |
|||
.thenReturn(Futures.immediateFuture(null)); |
|||
|
|||
// WHEN
|
|||
EntitiesRelatedDeviceIdAsyncLoader.findDeviceAsync(ctxMock, DUMMY_ORIGINATOR, deviceRelationsQuery); |
|||
|
|||
// THEN
|
|||
verify(deviceServiceMock, times(1)).findDevicesByQuery(eq(TENANT_ID), eq(expectedDeviceSearchQuery)); |
|||
} |
|||
|
|||
@Test |
|||
public void givenSeveralDevicesFound_whenFindDeviceAsync_ShouldKeepOneAndDiscardOthers() throws Exception { |
|||
// GIVEN
|
|||
var deviceRelationsQuery = new DeviceRelationsQuery(); |
|||
deviceRelationsQuery.setDeviceTypes(List.of("Device type 1", "Device type 2", "default")); |
|||
deviceRelationsQuery.setDirection(EntitySearchDirection.FROM); |
|||
deviceRelationsQuery.setMaxLevel(2); |
|||
deviceRelationsQuery.setRelationType(EntityRelation.CONTAINS_TYPE); |
|||
|
|||
var expectedDeviceSearchQuery = new DeviceSearchQuery(); |
|||
var parameters = new RelationsSearchParameters( |
|||
DUMMY_ORIGINATOR, |
|||
deviceRelationsQuery.getDirection(), |
|||
deviceRelationsQuery.getMaxLevel(), |
|||
deviceRelationsQuery.isFetchLastLevelOnly() |
|||
); |
|||
expectedDeviceSearchQuery.setParameters(parameters); |
|||
expectedDeviceSearchQuery.setRelationType(deviceRelationsQuery.getRelationType()); |
|||
expectedDeviceSearchQuery.setDeviceTypes(deviceRelationsQuery.getDeviceTypes()); |
|||
|
|||
var device1 = new Device(new DeviceId(UUID.randomUUID())); |
|||
device1.setName("Device 1"); |
|||
var device2 = new Device(new DeviceId(UUID.randomUUID())); |
|||
device1.setName("Device 2"); |
|||
var device3 = new Device(new DeviceId(UUID.randomUUID())); |
|||
device1.setName("Device 3"); |
|||
|
|||
var devicesList = List.of(device1, device2, device3); |
|||
|
|||
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); |
|||
when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); |
|||
when(deviceServiceMock.findDevicesByQuery(eq(TENANT_ID), eq(expectedDeviceSearchQuery))) |
|||
.thenReturn(Futures.immediateFuture(devicesList)); |
|||
|
|||
// WHEN
|
|||
var entityIdFuture = EntitiesRelatedDeviceIdAsyncLoader.findDeviceAsync(ctxMock, DUMMY_ORIGINATOR, deviceRelationsQuery); |
|||
|
|||
// THEN
|
|||
assertNotNull(entityIdFuture); |
|||
|
|||
var actualEntityId = entityIdFuture.get(); |
|||
assertNotNull(actualEntityId); |
|||
assertEquals(device1.getId(), actualEntityId); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,138 @@ |
|||
package org.thingsboard.rule.engine.util; |
|||
|
|||
import com.google.common.util.concurrent.Futures; |
|||
import org.junit.jupiter.api.Test; |
|||
import org.junit.jupiter.api.extension.ExtendWith; |
|||
import org.mockito.Mock; |
|||
import org.mockito.junit.jupiter.MockitoExtension; |
|||
import org.thingsboard.rule.engine.api.TbContext; |
|||
import org.thingsboard.rule.engine.data.RelationsQuery; |
|||
import org.thingsboard.server.common.data.Device; |
|||
import org.thingsboard.server.common.data.EntityType; |
|||
import org.thingsboard.server.common.data.asset.Asset; |
|||
import org.thingsboard.server.common.data.id.AssetId; |
|||
import org.thingsboard.server.common.data.id.DeviceId; |
|||
import org.thingsboard.server.common.data.id.EntityId; |
|||
import org.thingsboard.server.common.data.id.TenantId; |
|||
import org.thingsboard.server.common.data.relation.EntityRelation; |
|||
import org.thingsboard.server.common.data.relation.EntityRelationsQuery; |
|||
import org.thingsboard.server.common.data.relation.EntitySearchDirection; |
|||
import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter; |
|||
import org.thingsboard.server.common.data.relation.RelationsSearchParameters; |
|||
import org.thingsboard.server.dao.relation.RelationService; |
|||
|
|||
import java.util.Collections; |
|||
import java.util.List; |
|||
import java.util.UUID; |
|||
|
|||
import static org.junit.jupiter.api.Assertions.assertEquals; |
|||
import static org.junit.jupiter.api.Assertions.assertNotNull; |
|||
import static org.mockito.ArgumentMatchers.eq; |
|||
import static org.mockito.Mockito.times; |
|||
import static org.mockito.Mockito.verify; |
|||
import static org.mockito.Mockito.when; |
|||
|
|||
@ExtendWith(MockitoExtension.class) |
|||
public class EntitiesRelatedEntitiesIdAsyncLoaderTest { |
|||
|
|||
private static final EntityId DUMMY_ORIGINATOR = new DeviceId(UUID.randomUUID()); |
|||
private static final TenantId TENANT_ID = new TenantId(UUID.randomUUID()); |
|||
@Mock |
|||
private TbContext ctxMock; |
|||
@Mock |
|||
private RelationService relationServiceMock; |
|||
|
|||
@Test |
|||
public void givenRelationsQuery_whenFindEntityAsync_ShouldBuildCorrectEntityRelationsQuery() { |
|||
// GIVEN
|
|||
var relationsQuery = new RelationsQuery(); |
|||
var relationEntityTypeFilter = new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.emptyList()); |
|||
relationsQuery.setDirection(EntitySearchDirection.FROM); |
|||
relationsQuery.setMaxLevel(1); |
|||
relationsQuery.setFilters(Collections.singletonList(relationEntityTypeFilter)); |
|||
|
|||
var expectedEntityRelationsQuery = new EntityRelationsQuery(); |
|||
var parameters = new RelationsSearchParameters( |
|||
DUMMY_ORIGINATOR, |
|||
relationsQuery.getDirection(), |
|||
relationsQuery.getMaxLevel(), |
|||
relationsQuery.isFetchLastLevelOnly() |
|||
); |
|||
expectedEntityRelationsQuery.setParameters(parameters); |
|||
expectedEntityRelationsQuery.setFilters(relationsQuery.getFilters()); |
|||
|
|||
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); |
|||
when(ctxMock.getRelationService()).thenReturn(relationServiceMock); |
|||
when(relationServiceMock.findByQuery(eq(TENANT_ID), eq(expectedEntityRelationsQuery))) |
|||
.thenReturn(Futures.immediateFuture(null)); |
|||
|
|||
// WHEN
|
|||
EntitiesRelatedEntityIdAsyncLoader.findEntityAsync(ctxMock, DUMMY_ORIGINATOR, relationsQuery); |
|||
|
|||
// THEN
|
|||
verify(relationServiceMock, times(1)).findByQuery(eq(TENANT_ID), eq(expectedEntityRelationsQuery)); |
|||
} |
|||
|
|||
@Test |
|||
public void givenSeveralEntitiesFound_whenFindEntityAsync_ShouldKeepOneAndDiscardOthers() throws Exception { |
|||
// GIVEN
|
|||
var relationsQuery = new RelationsQuery(); |
|||
var relationEntityTypeFilter = new RelationEntityTypeFilter( |
|||
EntityRelation.CONTAINS_TYPE, |
|||
List.of(EntityType.DEVICE, EntityType.ASSET) |
|||
); |
|||
relationsQuery.setDirection(EntitySearchDirection.FROM); |
|||
relationsQuery.setMaxLevel(2); |
|||
relationsQuery.setFilters(Collections.singletonList(relationEntityTypeFilter)); |
|||
|
|||
var expectedEntityRelationsQuery = new EntityRelationsQuery(); |
|||
var parameters = new RelationsSearchParameters( |
|||
DUMMY_ORIGINATOR, |
|||
relationsQuery.getDirection(), |
|||
relationsQuery.getMaxLevel(), |
|||
relationsQuery.isFetchLastLevelOnly() |
|||
); |
|||
expectedEntityRelationsQuery.setParameters(parameters); |
|||
expectedEntityRelationsQuery.setFilters(relationsQuery.getFilters()); |
|||
|
|||
var device1 = new Device(new DeviceId(UUID.randomUUID())); |
|||
device1.setName("Device 1"); |
|||
var device2 = new Device(new DeviceId(UUID.randomUUID())); |
|||
device1.setName("Device 2"); |
|||
var asset = new Asset(new AssetId(UUID.randomUUID())); |
|||
asset.setName("Asset"); |
|||
|
|||
var entityRelationDevice1 = new EntityRelation(); |
|||
entityRelationDevice1.setFrom(DUMMY_ORIGINATOR); |
|||
entityRelationDevice1.setTo(device1.getId()); |
|||
entityRelationDevice1.setType(EntityRelation.CONTAINS_TYPE); |
|||
|
|||
var entityRelationDevice2 = new EntityRelation(); |
|||
entityRelationDevice2.setFrom(DUMMY_ORIGINATOR); |
|||
entityRelationDevice2.setTo(device2.getId()); |
|||
entityRelationDevice2.setType(EntityRelation.CONTAINS_TYPE); |
|||
|
|||
var entityRelationAsset = new EntityRelation(); |
|||
entityRelationAsset.setFrom(DUMMY_ORIGINATOR); |
|||
entityRelationAsset.setTo(asset.getId()); |
|||
entityRelationAsset.setType(EntityRelation.CONTAINS_TYPE); |
|||
|
|||
var expectedEntityRelationsList = List.of(entityRelationDevice1, entityRelationDevice2, entityRelationAsset); |
|||
|
|||
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); |
|||
when(ctxMock.getRelationService()).thenReturn(relationServiceMock); |
|||
when(relationServiceMock.findByQuery(eq(TENANT_ID), eq(expectedEntityRelationsQuery))) |
|||
.thenReturn(Futures.immediateFuture(expectedEntityRelationsList)); |
|||
|
|||
// WHEN
|
|||
var deviceIdFuture = EntitiesRelatedEntityIdAsyncLoader.findEntityAsync(ctxMock, DUMMY_ORIGINATOR, relationsQuery); |
|||
|
|||
// THEN
|
|||
assertNotNull(deviceIdFuture); |
|||
|
|||
var actualDeviceId = deviceIdFuture.get(); |
|||
assertNotNull(actualDeviceId); |
|||
assertEquals(device1.getId(), actualDeviceId); |
|||
} |
|||
|
|||
} |
|||
Loading…
Reference in new issue