@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile ;
import org.thingsboard.server.common.data.EntitySubtype ;
import org.thingsboard.server.common.data.OtaPackageInfo ;
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest ;
import org.thingsboard.server.common.data.SaveOtaPackageInfoRequest ;
import org.thingsboard.server.common.data.StringUtils ;
import org.thingsboard.server.common.data.Tenant ;
@ -55,6 +56,9 @@ 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.common.data.sync.ie.importing.csv.BulkImportColumnType ;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest ;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult ;
import org.thingsboard.server.dao.device.DeviceDao ;
import org.thingsboard.server.dao.exception.DataValidationException ;
import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException ;
@ -180,6 +184,58 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
Assert . assertEquals ( foundDevice . getName ( ) , savedDevice . getName ( ) ) ;
}
@Test
public void testSaveDeviceWithCredentials ( ) throws Exception {
String testToken = "TEST_TOKEN" ;
Device device = new Device ( ) ;
device . setName ( "My device" ) ;
device . setType ( "default" ) ;
DeviceCredentials deviceCredentials = new DeviceCredentials ( ) ;
deviceCredentials . setCredentialsType ( DeviceCredentialsType . ACCESS_TOKEN ) ;
deviceCredentials . setCredentialsId ( testToken ) ;
SaveDeviceWithCredentialsRequest saveRequest = new SaveDeviceWithCredentialsRequest ( device , deviceCredentials ) ;
Mockito . reset ( tbClusterService , auditLogService , gatewayNotificationsService ) ;
Device savedDevice = readResponse ( doPost ( "/api/device-with-credentials" , saveRequest ) . andExpect ( status ( ) . isOk ( ) ) , Device . class ) ;
Device oldDevice = new Device ( savedDevice ) ;
testNotifyEntityOneTimeMsgToEdgeServiceNever ( savedDevice , savedDevice . getId ( ) , savedDevice . getId ( ) ,
savedTenant . getId ( ) , tenantAdmin . getCustomerId ( ) , tenantAdmin . getId ( ) , tenantAdmin . getEmail ( ) ,
ActionType . ADDED ) ;
testNotificationUpdateGatewayNever ( ) ;
Assert . assertNotNull ( savedDevice ) ;
Assert . assertNotNull ( savedDevice . getId ( ) ) ;
Assert . assertTrue ( savedDevice . getCreatedTime ( ) > 0 ) ;
Assert . assertEquals ( savedTenant . getId ( ) , savedDevice . getTenantId ( ) ) ;
Assert . assertNotNull ( savedDevice . getCustomerId ( ) ) ;
Assert . assertEquals ( NULL_UUID , savedDevice . getCustomerId ( ) . getId ( ) ) ;
Assert . assertEquals ( device . getName ( ) , savedDevice . getName ( ) ) ;
DeviceCredentials foundDeviceCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) + "/credentials" , DeviceCredentials . class ) ;
Assert . assertNotNull ( foundDeviceCredentials ) ;
Assert . assertNotNull ( foundDeviceCredentials . getId ( ) ) ;
Assert . assertEquals ( savedDevice . getId ( ) , foundDeviceCredentials . getDeviceId ( ) ) ;
Assert . assertEquals ( DeviceCredentialsType . ACCESS_TOKEN , foundDeviceCredentials . getCredentialsType ( ) ) ;
Assert . assertEquals ( testToken , foundDeviceCredentials . getCredentialsId ( ) ) ;
Mockito . reset ( tbClusterService , auditLogService , gatewayNotificationsService ) ;
savedDevice . setName ( "My new device" ) ;
doPost ( "/api/device" , savedDevice , Device . class ) ;
testNotifyEntityAllOneTime ( savedDevice , savedDevice . getId ( ) , savedDevice . getId ( ) , savedTenant . getId ( ) ,
tenantAdmin . getCustomerId ( ) , tenantAdmin . getId ( ) , tenantAdmin . getEmail ( ) , ActionType . UPDATED ) ;
testNotificationUpdateGatewayOneTime ( savedDevice , oldDevice ) ;
}
@Test
public void saveDeviceWithViolationOfValidation ( ) throws Exception {
Device device = new Device ( ) ;
@ -1235,6 +1291,66 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
testEntityDaoWithRelationsTransactionalException ( deviceDao , savedTenant . getId ( ) , deviceId , "/api/device/" + deviceId ) ;
}
@Test
public void testBulkImportDeviceWithoutCredentials ( ) throws Exception {
String deviceName = "some_device" ;
String deviceType = "some_type" ;
BulkImportRequest request = new BulkImportRequest ( ) ;
request . setFile ( String . format ( "NAME,TYPE\n%s,%s" , deviceName , deviceType ) ) ;
BulkImportRequest . Mapping mapping = new BulkImportRequest . Mapping ( ) ;
BulkImportRequest . ColumnMapping name = new BulkImportRequest . ColumnMapping ( ) ;
name . setType ( BulkImportColumnType . NAME ) ;
BulkImportRequest . ColumnMapping type = new BulkImportRequest . ColumnMapping ( ) ;
type . setType ( BulkImportColumnType . TYPE ) ;
List < BulkImportRequest . ColumnMapping > columns = new ArrayList < > ( ) ;
columns . add ( name ) ;
columns . add ( type ) ;
mapping . setColumns ( columns ) ;
mapping . setDelimiter ( ',' ) ;
mapping . setUpdate ( true ) ;
mapping . setHeader ( true ) ;
request . setMapping ( mapping ) ;
BulkImportResult < Device > deviceBulkImportResult = doPostWithTypedResponse ( "/api/device/bulk_import" , request , new TypeReference < > ( ) { } ) ;
Assert . assertEquals ( 1 , deviceBulkImportResult . getCreated ( ) . get ( ) ) ;
Assert . assertEquals ( 0 , deviceBulkImportResult . getErrors ( ) . get ( ) ) ;
Assert . assertEquals ( 0 , deviceBulkImportResult . getUpdated ( ) . get ( ) ) ;
Assert . assertTrue ( deviceBulkImportResult . getErrorsList ( ) . isEmpty ( ) ) ;
Device savedDevice = doGet ( "/api/tenant/devices?deviceName=" + deviceName , Device . class ) ;
Assert . assertNotNull ( savedDevice ) ;
Assert . assertEquals ( deviceName , savedDevice . getName ( ) ) ;
Assert . assertEquals ( deviceType , savedDevice . getType ( ) ) ;
DeviceCredentials savedCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) + "/credentials" , DeviceCredentials . class ) ;
Assert . assertNotNull ( savedCredentials ) ;
Assert . assertNotNull ( savedCredentials . getId ( ) ) ;
Assert . assertEquals ( savedDevice . getId ( ) , savedCredentials . getDeviceId ( ) ) ;
Assert . assertEquals ( DeviceCredentialsType . ACCESS_TOKEN , savedCredentials . getCredentialsType ( ) ) ;
Assert . assertNotNull ( savedCredentials . getCredentialsId ( ) ) ;
Assert . assertEquals ( 20 , savedCredentials . getCredentialsId ( ) . length ( ) ) ;
deviceBulkImportResult = doPostWithTypedResponse ( "/api/device/bulk_import" , request , new TypeReference < > ( ) { } ) ;
Assert . assertEquals ( 0 , deviceBulkImportResult . getCreated ( ) . get ( ) ) ;
Assert . assertEquals ( 0 , deviceBulkImportResult . getErrors ( ) . get ( ) ) ;
Assert . assertEquals ( 1 , deviceBulkImportResult . getUpdated ( ) . get ( ) ) ;
Assert . assertTrue ( deviceBulkImportResult . getErrorsList ( ) . isEmpty ( ) ) ;
Device updatedDevice = doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) , Device . class ) ;
Assert . assertEquals ( savedDevice , updatedDevice ) ;
DeviceCredentials updatedCredentials =
doGet ( "/api/device/" + savedDevice . getId ( ) . getId ( ) + "/credentials" , DeviceCredentials . class ) ;
Assert . assertEquals ( savedCredentials , updatedCredentials ) ;
}
private Device createDevice ( String name ) {
Device device = new Device ( ) ;
device . setName ( name ) ;