@ -15,74 +15,79 @@
* /
package org.thingsboard.server.controller ;
import static org.hamcrest.Matchers.containsString ;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID ;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status ;
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.List ;
import com.datastax.oss.driver.api.core.uuid.Uuids ;
import com.fasterxml.jackson.core.type.TypeReference ;
import org.apache.commons.lang3.RandomStringUtils ;
import org.thingsboard.server.common.data.* ;
import org.junit.After ;
import org.junit.Assert ;
import org.junit.Before ;
import org.junit.Test ;
import org.thingsboard.server.common.data.Customer ;
import org.thingsboard.server.common.data.Device ;
import org.thingsboard.server.common.data.EntitySubtype ;
import org.thingsboard.server.common.data.Tenant ;
import org.thingsboard.server.common.data.User ;
import org.thingsboard.server.common.data.id.CustomerId ;
import org.thingsboard.server.common.data.id.DeviceCredentialsId ;
import org.thingsboard.server.common.data.id.DeviceId ;
import org.thingsboard.server.common.data.page.PageData ;
import org.thingsboard.server.common.data.page.PageLink ;
import org.thingsboard.server.common.data.relation.EntityRelation ;
import org.thingsboard.server.common.data.relation.RelationTypeGroup ;
import org.thingsboard.server.common.data.security.Authority ;
import org.thingsboard.server.common.data.security.DeviceCredentials ;
import org.thingsboard.server.common.data.security.DeviceCredentialsType ;
import org.thingsboard.server.dao.model.ModelConstants ;
import org.junit.After ;
import org.junit.Assert ;
import org.junit.Before ;
import org.junit.Test ;
import com.fasterxml.jackson.core.type.TypeReference ;
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.List ;
import static org.hamcrest.Matchers.containsString ;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status ;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID ;
public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
private IdComparator < Device > idComparator = new IdComparator < > ( ) ;
private Tenant savedTenant ;
private User tenantAdmin ;
@Before
public void beforeTest ( ) throws Exception {
loginSysAdmin ( ) ;
Tenant tenant = new Tenant ( ) ;
tenant . setTitle ( "My tenant" ) ;
savedTenant = doPost ( "/api/tenant" , tenant , Tenant . class ) ;
Assert . assertNotNull ( savedTenant ) ;
tenantAdmin = new User ( ) ;
tenantAdmin . setAuthority ( Authority . TENANT_ADMIN ) ;
tenantAdmin . setTenantId ( savedTenant . getId ( ) ) ;
tenantAdmin . setEmail ( "tenant2@thingsboard.org" ) ;
tenantAdmin . setFirstName ( "Joe" ) ;
tenantAdmin . setLastName ( "Downs" ) ;
tenantAdmin = createUserAndLogin ( tenantAdmin , "testPassword1" ) ;
}
@After
public void afterTest ( ) throws Exception {
loginSysAdmin ( ) ;
doDelete ( "/api/tenant/" + savedTenant . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
doDelete ( "/api/tenant/" + savedTenant . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
}
@Test
public void testSaveDevice ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
Assert . assertNotNull ( savedDevice ) ;
Assert . assertNotNull ( savedDevice . getId ( ) ) ;
Assert . assertTrue ( savedDevice . getCreatedTime ( ) > 0 ) ;
@ -90,9 +95,9 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertNotNull ( savedDevice . getCustomerId ( ) ) ;
Assert . assertEquals ( NULL_UUID , savedDevice . getCustomerId ( ) . getId ( ) ) ;
Assert . assertEquals ( device . getName ( ) , savedDevice . getName ( ) ) ;
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
Assert . assertNotNull ( deviceCredentials ) ;
Assert . assertNotNull ( deviceCredentials . getId ( ) ) ;
@ -100,10 +105,10 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertEquals ( DeviceCredentialsType . ACCESS_TOKEN , deviceCredentials . getCredentialsType ( ) ) ;
Assert . assertNotNull ( deviceCredentials . getCredentialsId ( ) ) ;
Assert . assertEquals ( 20 , deviceCredentials . getCredentialsId ( ) . length ( ) ) ;
savedDevice . setName ( "My new device" ) ;
doPost ( "/api/device" , savedDevice , Device . class ) ;
Device foundDevice = doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
Assert . assertEquals ( foundDevice . getName ( ) , savedDevice . getName ( ) ) ;
}
@ -115,10 +120,10 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
loginDifferentTenant ( ) ;
doPost ( "/api/device" , savedDevice , Device . class , status ( ) . isForbidden ( ) ) ;
doPost ( "/api/device" , savedDevice , Device . class , status ( ) . isNotFound ( ) ) ;
deleteDifferentTenant ( ) ;
}
@Test
public void testFindDeviceById ( ) throws Exception {
Device device = new Device ( ) ;
@ -133,26 +138,27 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
@Test
public void testFindDeviceTypesByTenantId ( ) throws Exception {
List < Device > devices = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 3 ; i + + ) {
for ( int i = 0 ; i < 3 ; i + + ) {
Device device = new Device ( ) ;
device . setName ( "My device B" + i ) ;
device . setName ( "My device B" + i ) ;
device . setType ( "typeB" ) ;
devices . add ( doPost ( "/api/device" , device , Device . class ) ) ;
}
for ( int i = 0 ; i < 7 ; i + + ) {
for ( int i = 0 ; i < 7 ; i + + ) {
Device device = new Device ( ) ;
device . setName ( "My device C" + i ) ;
device . setName ( "My device C" + i ) ;
device . setType ( "typeC" ) ;
devices . add ( doPost ( "/api/device" , device , Device . class ) ) ;
}
for ( int i = 0 ; i < 9 ; i + + ) {
for ( int i = 0 ; i < 9 ; i + + ) {
Device device = new Device ( ) ;
device . setName ( "My device A" + i ) ;
device . setName ( "My device A" + i ) ;
device . setType ( "typeA" ) ;
devices . add ( doPost ( "/api/device" , device , Device . class ) ) ;
}
List < EntitySubtype > deviceTypes = doGetTyped ( "/api/device/types" ,
new TypeReference < List < EntitySubtype > > ( ) { } ) ;
new TypeReference < List < EntitySubtype > > ( ) {
} ) ;
Assert . assertNotNull ( deviceTypes ) ;
Assert . assertEquals ( 3 , deviceTypes . size ( ) ) ;
@ -160,19 +166,19 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertEquals ( "typeB" , deviceTypes . get ( 1 ) . getType ( ) ) ;
Assert . assertEquals ( "typeC" , deviceTypes . get ( 2 ) . getType ( ) ) ;
}
@Test
public void testDeleteDevice ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
doDelete ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isNotFound ( ) ) ;
doDelete ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isNotFound ( ) ) ;
}
@Test
@ -189,52 +195,51 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Device device = new Device ( ) ;
device . setType ( "default" ) ;
doPost ( "/api/device" , device )
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Device name should be specified" ) ) ) ;
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Device name should be specified" ) ) ) ;
}
@Test
public void testAssignUnassignDeviceToCustomer ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
Customer customer = new Customer ( ) ;
customer . setTitle ( "My customer" ) ;
Customer savedCustomer = doPost ( "/api/customer" , customer , Customer . class ) ;
Device assignedDevice = doPost ( "/api/customer/" + savedCustomer . getId ( ) . getId ( ) . toString ( )
Device assignedDevice = doPost ( "/api/customer/" + savedCustomer . getId ( ) . getId ( ) . toString ( )
+ "/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
Assert . assertEquals ( savedCustomer . getId ( ) , assignedDevice . getCustomerId ( ) ) ;
Device foundDevice = doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
Assert . assertEquals ( savedCustomer . getId ( ) , foundDevice . getCustomerId ( ) ) ;
Device unassignedDevice =
Device unassignedDevice =
doDelete ( "/api/customer/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
Assert . assertEquals ( ModelConstants . NULL_UUID , unassignedDevice . getCustomerId ( ) . getId ( ) ) ;
foundDevice = doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
Assert . assertEquals ( ModelConstants . NULL_UUID , foundDevice . getCustomerId ( ) . getId ( ) ) ;
}
@Test
public void testAssignDeviceToNonExistentCustomer ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
doPost ( "/api/customer/" + Uuids . timeBased ( ) . toString ( )
+ "/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isNotFound ( ) ) ;
. andExpect ( status ( ) . isNotFound ( ) ) ;
}
@Test
public void testAssignDeviceToCustomerFromDifferentTenant ( ) throws Exception {
loginSysAdmin ( ) ;
Tenant tenant2 = new Tenant ( ) ;
tenant2 . setTitle ( "Different tenant" ) ;
Tenant savedTenant2 = doPost ( "/api/tenant" , tenant2 , Tenant . class ) ;
@ -246,103 +251,103 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
tenantAdmin2 . setEmail ( "tenant3@thingsboard.org" ) ;
tenantAdmin2 . setFirstName ( "Joe" ) ;
tenantAdmin2 . setLastName ( "Downs" ) ;
tenantAdmin2 = createUserAndLogin ( tenantAdmin2 , "testPassword1" ) ;
Customer customer = new Customer ( ) ;
customer . setTitle ( "Different customer" ) ;
Customer savedCustomer = doPost ( "/api/customer" , customer , Customer . class ) ;
login ( tenantAdmin . getEmail ( ) , "testPassword1" ) ;
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
doPost ( "/api/customer/" + savedCustomer . getId ( ) . getId ( ) . toString ( )
+ "/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isForbidden ( ) ) ;
. andExpect ( status ( ) . isForbidden ( ) ) ;
loginSysAdmin ( ) ;
doDelete ( "/api/tenant/" + savedTenant2 . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
doDelete ( "/api/tenant/" + savedTenant2 . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
}
@Test
public void testFindDeviceCredentialsByDeviceId ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
Assert . assertEquals ( savedDevice . getId ( ) , deviceCredentials . getDeviceId ( ) ) ;
}
@Test
public void testSaveDeviceCredentials ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
Assert . assertEquals ( savedDevice . getId ( ) , deviceCredentials . getDeviceId ( ) ) ;
deviceCredentials . setCredentialsType ( DeviceCredentialsType . ACCESS_TOKEN ) ;
deviceCredentials . setCredentialsId ( "access_token" ) ;
doPost ( "/api/device/credentials" , deviceCredentials )
. andExpect ( status ( ) . isOk ( ) ) ;
DeviceCredentials foundDeviceCredentials =
. andExpect ( status ( ) . isOk ( ) ) ;
DeviceCredentials foundDeviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
Assert . assertEquals ( deviceCredentials , foundDeviceCredentials ) ;
}
@Test
public void testSaveDeviceCredentialsWithEmptyDevice ( ) throws Exception {
DeviceCredentials deviceCredentials = new DeviceCredentials ( ) ;
doPost ( "/api/device/credentials" , deviceCredentials )
. andExpect ( status ( ) . isBadRequest ( ) ) ;
. andExpect ( status ( ) . isBadRequest ( ) ) ;
}
@Test
public void testSaveDeviceCredentialsWithEmptyCredentialsType ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
DeviceCredentials deviceCredentials =
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
deviceCredentials . setCredentialsType ( null ) ;
doPost ( "/api/device/credentials" , deviceCredentials )
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Device credentials type should be specified" ) ) ) ;
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Device credentials type should be specified" ) ) ) ;
}
@Test
public void testSaveDeviceCredentialsWithEmptyCredentialsId ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
DeviceCredentials deviceCredentials =
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
deviceCredentials . setCredentialsId ( null ) ;
doPost ( "/api/device/credentials" , deviceCredentials )
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Device credentials id should be specified" ) ) ) ;
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Device credentials id should be specified" ) ) ) ;
}
@Test
public void testSaveNonExistentDeviceCredentials ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
DeviceCredentials deviceCredentials =
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
DeviceCredentials newDeviceCredentials = new DeviceCredentials ( new DeviceCredentialsId ( Uuids . timeBased ( ) ) ) ;
newDeviceCredentials . setCreatedTime ( deviceCredentials . getCreatedTime ( ) ) ;
@ -350,29 +355,29 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
newDeviceCredentials . setCredentialsType ( deviceCredentials . getCredentialsType ( ) ) ;
newDeviceCredentials . setCredentialsId ( deviceCredentials . getCredentialsId ( ) ) ;
doPost ( "/api/device/credentials" , newDeviceCredentials )
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Unable to update non-existent device credentials" ) ) ) ;
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( statusReason ( containsString ( "Unable to update non-existent device credentials" ) ) ) ;
}
@Test
public void testSaveDeviceCredentialsWithNonExistentDevice ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
DeviceCredentials deviceCredentials =
DeviceCredentials deviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
deviceCredentials . setDeviceId ( new DeviceId ( Uuids . timeBased ( ) ) ) ;
doPost ( "/api/device/credentials" , deviceCredentials )
. andExpect ( status ( ) . isNotFound ( ) ) ;
. andExpect ( status ( ) . isNotFound ( ) ) ;
}
@Test
public void testFindTenantDevices ( ) throws Exception {
List < Device > devices = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 178 ; i + + ) {
for ( int i = 0 ; i < 178 ; i + + ) {
Device device = new Device ( ) ;
device . setName ( "Device" + i ) ;
device . setName ( "Device" + i ) ;
device . setType ( "default" ) ;
devices . add ( doPost ( "/api/device" , device , Device . class ) ) ;
}
@ -380,28 +385,29 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
PageLink pageLink = new PageLink ( 23 ) ;
PageData < Device > pageData = null ;
do {
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
loadedDevices . addAll ( pageData . getData ( ) ) ;
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
} while ( pageData . hasNext ( ) ) ;
Collections . sort ( devices , idComparator ) ;
Collections . sort ( loadedDevices , idComparator ) ;
Assert . assertEquals ( devices , loadedDevices ) ;
}
@Test
public void testFindTenantDevicesByName ( ) throws Exception {
String title1 = "Device title 1" ;
List < Device > devicesTitle1 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 143 ; i + + ) {
for ( int i = 0 ; i < 143 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title1 + suffix ;
String name = title1 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( "default" ) ;
@ -409,37 +415,37 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
}
String title2 = "Device title 2" ;
List < Device > devicesTitle2 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 75 ; i + + ) {
for ( int i = 0 ; i < 75 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title2 + suffix ;
String name = title2 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( "default" ) ;
devicesTitle2 . add ( doPost ( "/api/device" , device , Device . class ) ) ;
}
List < Device > loadedDevicesTitle1 = new ArrayList < > ( ) ;
PageLink pageLink = new PageLink ( 15 , 0 , title1 ) ;
PageData < Device > pageData = null ;
do {
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
loadedDevicesTitle1 . addAll ( pageData . getData ( ) ) ;
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
} while ( pageData . hasNext ( ) ) ;
Collections . sort ( devicesTitle1 , idComparator ) ;
Collections . sort ( loadedDevicesTitle1 , idComparator ) ;
Assert . assertEquals ( devicesTitle1 , loadedDevicesTitle1 ) ;
List < Device > loadedDevicesTitle2 = new ArrayList < > ( ) ;
pageLink = new PageLink ( 4 , 0 , title2 ) ;
do {
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
loadedDevicesTitle2 . addAll ( pageData . getData ( ) ) ;
if ( pageData . hasNext ( ) ) {
@ -449,25 +455,23 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Collections . sort ( devicesTitle2 , idComparator ) ;
Collections . sort ( loadedDevicesTitle2 , idComparator ) ;
Assert . assertEquals ( devicesTitle2 , loadedDevicesTitle2 ) ;
for ( Device device : loadedDevicesTitle1 ) {
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
}
pageLink = new PageLink ( 4 , 0 , title1 ) ;
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
Assert . assertFalse ( pageData . hasNext ( ) ) ;
Assert . assertEquals ( 0 , pageData . getData ( ) . size ( ) ) ;
for ( Device device : loadedDevicesTitle2 ) {
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
}
pageLink = new PageLink ( 4 , 0 , title2 ) ;
pageData = doGetTypedWithPageLink ( "/api/tenant/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
@ -480,10 +484,10 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
String title1 = "Device title 1" ;
String type1 = "typeA" ;
List < Device > devicesType1 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 143 ; i + + ) {
for ( int i = 0 ; i < 143 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title1 + suffix ;
String name = title1 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( type1 ) ;
@ -492,10 +496,10 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
String title2 = "Device title 2" ;
String type2 = "typeB" ;
List < Device > devicesType2 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 75 ; i + + ) {
for ( int i = 0 ; i < 75 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title2 + suffix ;
String name = title2 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( type2 ) ;
@ -536,7 +540,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertEquals ( devicesType2 , loadedDevicesType2 ) ;
for ( Device device : loadedDevicesType1 ) {
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
}
@ -547,7 +551,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertEquals ( 0 , pageData . getData ( ) . size ( ) ) ;
for ( Device device : loadedDevicesType2 ) {
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
}
@ -557,42 +561,42 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertFalse ( pageData . hasNext ( ) ) ;
Assert . assertEquals ( 0 , pageData . getData ( ) . size ( ) ) ;
}
@Test
public void testFindCustomerDevices ( ) throws Exception {
Customer customer = new Customer ( ) ;
customer . setTitle ( "Test customer" ) ;
customer = doPost ( "/api/customer" , customer , Customer . class ) ;
CustomerId customerId = customer . getId ( ) ;
List < Device > devices = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 128 ; i + + ) {
for ( int i = 0 ; i < 128 ; i + + ) {
Device device = new Device ( ) ;
device . setName ( "Device" + i ) ;
device . setName ( "Device" + i ) ;
device . setType ( "default" ) ;
device = doPost ( "/api/device" , device , Device . class ) ;
devices . add ( doPost ( "/api/customer/" + customerId . getId ( ) . toString ( )
+ "/device/" + device . getId ( ) . getId ( ) . toString ( ) , Device . class ) ) ;
devices . add ( doPost ( "/api/customer/" + customerId . getId ( ) . toString ( )
+ "/device/" + device . getId ( ) . getId ( ) . toString ( ) , Device . class ) ) ;
}
List < Device > loadedDevices = new ArrayList < > ( ) ;
PageLink pageLink = new PageLink ( 23 ) ;
PageData < Device > pageData = null ;
do {
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
loadedDevices . addAll ( pageData . getData ( ) ) ;
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
} while ( pageData . hasNext ( ) ) ;
Collections . sort ( devices , idComparator ) ;
Collections . sort ( loadedDevices , idComparator ) ;
Assert . assertEquals ( devices , loadedDevices ) ;
}
@Test
public void testFindCustomerDevicesByName ( ) throws Exception {
Customer customer = new Customer ( ) ;
@ -602,52 +606,52 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
String title1 = "Device title 1" ;
List < Device > devicesTitle1 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 125 ; i + + ) {
for ( int i = 0 ; i < 125 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title1 + suffix ;
String name = title1 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( "default" ) ;
device = doPost ( "/api/device" , device , Device . class ) ;
devicesTitle1 . add ( doPost ( "/api/customer/" + customerId . getId ( ) . toString ( )
devicesTitle1 . add ( doPost ( "/api/customer/" + customerId . getId ( ) . toString ( )
+ "/device/" + device . getId ( ) . getId ( ) . toString ( ) , Device . class ) ) ;
}
String title2 = "Device title 2" ;
List < Device > devicesTitle2 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 143 ; i + + ) {
for ( int i = 0 ; i < 143 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title2 + suffix ;
String name = title2 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( "default" ) ;
device = doPost ( "/api/device" , device , Device . class ) ;
devicesTitle2 . add ( doPost ( "/api/customer/" + customerId . getId ( ) . toString ( )
devicesTitle2 . add ( doPost ( "/api/customer/" + customerId . getId ( ) . toString ( )
+ "/device/" + device . getId ( ) . getId ( ) . toString ( ) , Device . class ) ) ;
}
List < Device > loadedDevicesTitle1 = new ArrayList < > ( ) ;
PageLink pageLink = new PageLink ( 15 , 0 , title1 ) ;
PageData < Device > pageData = null ;
do {
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
loadedDevicesTitle1 . addAll ( pageData . getData ( ) ) ;
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
} while ( pageData . hasNext ( ) ) ;
Collections . sort ( devicesTitle1 , idComparator ) ;
Collections . sort ( loadedDevicesTitle1 , idComparator ) ;
Assert . assertEquals ( devicesTitle1 , loadedDevicesTitle1 ) ;
List < Device > loadedDevicesTitle2 = new ArrayList < > ( ) ;
pageLink = new PageLink ( 4 , 0 , title2 ) ;
do {
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
loadedDevicesTitle2 . addAll ( pageData . getData ( ) ) ;
if ( pageData . hasNext ( ) ) {
@ -657,25 +661,23 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Collections . sort ( devicesTitle2 , idComparator ) ;
Collections . sort ( loadedDevicesTitle2 , idComparator ) ;
Assert . assertEquals ( devicesTitle2 , loadedDevicesTitle2 ) ;
for ( Device device : loadedDevicesTitle1 ) {
doDelete ( "/api/customer/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
}
pageLink = new PageLink ( 4 , 0 , title1 ) ;
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
Assert . assertFalse ( pageData . hasNext ( ) ) ;
Assert . assertEquals ( 0 , pageData . getData ( ) . size ( ) ) ;
for ( Device device : loadedDevicesTitle2 ) {
doDelete ( "/api/customer/device/" + device . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
}
pageLink = new PageLink ( 4 , 0 , title2 ) ;
pageData = doGetTypedWithPageLink ( "/api/customer/" + customerId . getId ( ) . toString ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , pageLink ) ;
@ -693,10 +695,10 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
String title1 = "Device title 1" ;
String type1 = "typeC" ;
List < Device > devicesType1 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 125 ; i + + ) {
for ( int i = 0 ; i < 125 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title1 + suffix ;
String name = title1 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( type1 ) ;
@ -707,10 +709,10 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
String title2 = "Device title 2" ;
String type2 = "typeD" ;
List < Device > devicesType2 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 143 ; i + + ) {
for ( int i = 0 ; i < 143 ; i + + ) {
Device device = new Device ( ) ;
String suffix = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String name = title2 + suffix ;
String name = title2 + suffix ;
name = i % 2 = = 0 ? name . toLowerCase ( ) : name . toUpperCase ( ) ;
device . setName ( name ) ;
device . setType ( type2 ) ;
@ -775,4 +777,54 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertEquals ( 0 , pageData . getData ( ) . size ( ) ) ;
}
@Test
public void testAssignDeviceToTenant ( ) throws Exception {
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
Device savedDevice = doPost ( "/api/device" , device , Device . class ) ;
Device anotherDevice = new Device ( ) ;
anotherDevice . setName ( "My device1" ) ;
anotherDevice . setType ( "default" ) ;
Device savedAnotherDevice = doPost ( "/api/device" , anotherDevice , Device . class ) ;
EntityRelation relation = new EntityRelation ( ) ;
relation . setFrom ( savedDevice . getId ( ) ) ;
relation . setTo ( savedAnotherDevice . getId ( ) ) ;
relation . setTypeGroup ( RelationTypeGroup . COMMON ) ;
relation . setType ( "Contains" ) ;
doPost ( "/api/relation" , relation ) . andExpect ( status ( ) . isOk ( ) ) ;
loginSysAdmin ( ) ;
Tenant tenant = new Tenant ( ) ;
tenant . setTitle ( "Different tenant" ) ;
Tenant savedDifferentTenant = doPost ( "/api/tenant" , tenant , Tenant . class ) ;
Assert . assertNotNull ( savedDifferentTenant ) ;
User user = new User ( ) ;
user . setAuthority ( Authority . TENANT_ADMIN ) ;
user . setTenantId ( savedDifferentTenant . getId ( ) ) ;
user . setEmail ( "tenant9@thingsboard.org" ) ;
user . setFirstName ( "Sam" ) ;
user . setLastName ( "Downs" ) ;
createUserAndLogin ( user , "testPassword1" ) ;
login ( "tenant2@thingsboard.org" , "testPassword1" ) ;
Device assignedDevice = doPost ( "/api/tenant/" + savedDifferentTenant . getId ( ) . getId ( ) + "/device/" + savedDevice . getId ( ) . getId ( ) , Device . class ) ;
doGet ( "/api/device/" + assignedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class , status ( ) . isNotFound ( ) ) ;
login ( "tenant9@thingsboard.org" , "testPassword1" ) ;
Device foundDevice1 = doGet ( "/api/device/" + assignedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
Assert . assertNotNull ( foundDevice1 ) ;
doGet ( "/api/relation?fromId=" + savedDevice . getId ( ) . getId ( ) + "&fromType=DEVICE&relationType=Contains&toId=" + savedAnotherDevice . getId ( ) . getId ( ) + "&toType=DEVICE" , EntityRelation . class , status ( ) . isNotFound ( ) ) ;
loginSysAdmin ( ) ;
doDelete ( "/api/tenant/" + savedDifferentTenant . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
}
}