Browse Source

fixed saveDeviceWithAccessToken method to delete device if credentials saving failed

pull/10146/head
dashevchenko 3 years ago
parent
commit
f51df3211d
  1. 1
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
  2. 27
      dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java

1
dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java

@ -157,6 +157,7 @@ public class DeviceServiceImpl extends AbstractCachedEntityService<DeviceCacheKe
() -> deviceDao.findDeviceByTenantIdAndName(tenantId.getId(), name).orElse(null), true);
}
@Transactional
@Override
public Device saveDeviceWithAccessToken(Device device, String accessToken) {
return doSaveDevice(device, accessToken, true);

27
dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceTest.java

@ -35,8 +35,6 @@ import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
@ -50,6 +48,7 @@ import org.thingsboard.server.dao.device.DeviceCredentialsService;
import org.thingsboard.server.dao.device.DeviceProfileService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException;
import org.thingsboard.server.dao.ota.OtaPackageService;
import org.thingsboard.server.dao.tenant.TenantProfileService;
@ -129,6 +128,30 @@ public class DeviceServiceTest extends AbstractServiceTest {
});
}
@Test
public void testSaveDevicesWithTheSameAccessToken() {
Device device = new Device();
device.setTenantId(tenantId);
device.setName(StringUtils.randomAlphabetic(10));
device.setType("default");
String accessToken = StringUtils.generateSafeToken(10);
Device savedDevice = deviceService.saveDeviceWithAccessToken(device, accessToken);
DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, savedDevice.getId());
Assert.assertEquals(accessToken, deviceCredentials.getCredentialsId());
Device duplicatedDevice = new Device();
duplicatedDevice.setTenantId(tenantId);
duplicatedDevice.setName(StringUtils.randomAlphabetic(10));
duplicatedDevice.setType("default");
assertThatThrownBy(() -> deviceService.saveDeviceWithAccessToken(duplicatedDevice, accessToken))
.isInstanceOf(DeviceCredentialsValidationException.class)
.hasMessageContaining("Device credentials are already assigned to another device!");
Device deviceByName = deviceService.findDeviceByTenantIdAndName(tenantId, duplicatedDevice.getName());
Assertions.assertNull(deviceByName);
}
@Test
public void testCountByTenantId() {
Assert.assertEquals(0, deviceService.countByTenantId(tenantId));

Loading…
Cancel
Save