From 3d4503945594427291240a2889a81b02ccf251ae Mon Sep 17 00:00:00 2001 From: desoliture Date: Fri, 14 Jan 2022 18:14:49 +0200 Subject: [PATCH] add test for tenant deletion method add corresponding test to make sure all related entities are also deleted when tenant is deleted --- .../dao/service/AbstractServiceTest.java | 4 + .../dao/service/BaseTenantServiceTest.java | 289 +++++++++++++++++- 2 files changed, 292 insertions(+), 1 deletion(-) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java index 2d4fd72179..fd497b7c50 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java @@ -59,6 +59,7 @@ import org.thingsboard.server.dao.event.EventService; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.resource.ResourceService; +import org.thingsboard.server.dao.rpc.RpcService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.settings.AdminSettingsService; import org.thingsboard.server.dao.tenant.TenantProfileService; @@ -163,6 +164,9 @@ public abstract class AbstractServiceTest { @Autowired protected OtaPackageService otaPackageService; + @Autowired + protected RpcService rpcService; + public class IdComparator implements Comparator { @Override public int compare(D o1, D o2) { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java index 066857f500..1a716fdac3 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java @@ -23,28 +23,70 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.server.common.data.ApiUsageState; import org.thingsboard.server.common.data.CacheConstants; +import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.Dashboard; +import org.thingsboard.server.common.data.DashboardInfo; +import org.thingsboard.server.common.data.Device; +import org.thingsboard.server.common.data.DeviceProfile; +import org.thingsboard.server.common.data.DeviceProfileType; +import org.thingsboard.server.common.data.DeviceTransportType; +import org.thingsboard.server.common.data.EntityView; +import org.thingsboard.server.common.data.OtaPackage; +import org.thingsboard.server.common.data.OtaPackageInfo; +import org.thingsboard.server.common.data.ResourceType; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.TbResourceInfo; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.TenantInfo; import org.thingsboard.server.common.data.TenantProfile; +import org.thingsboard.server.common.data.User; +import org.thingsboard.server.common.data.asset.Asset; +import org.thingsboard.server.common.data.device.profile.DeviceProfileData; +import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration; +import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.ota.ChecksumAlgorithm; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; +import org.thingsboard.server.common.data.rpc.Rpc; +import org.thingsboard.server.common.data.rpc.RpcStatus; +import org.thingsboard.server.common.data.rule.RuleChain; +import org.thingsboard.server.common.data.rule.RuleChainType; +import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; +import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.tenant.TenantDao; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Set; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; public abstract class BaseTenantServiceTest extends AbstractServiceTest { - + + public static final String TITLE = "My firmware"; + private static final String FILE_NAME = "filename.txt"; + private static final String VERSION = "v1.0"; + private static final String CONTENT_TYPE = "text/plain"; + private static final ChecksumAlgorithm CHECKSUM_ALGORITHM = ChecksumAlgorithm.SHA256; + private static final String CHECKSUM = "4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a"; + private static final long DATA_SIZE = 1L; + private static final ByteBuffer DATA = ByteBuffer.wrap(new byte[]{(int) DATA_SIZE}); + private static final String URL = "http://firmware.test.org"; + + private IdComparator idComparator = new IdComparator<>(); @SpyBean @@ -356,4 +398,249 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest { cachedTenant = Objects.requireNonNull(cacheManager.getCache(CacheConstants.TENANTS_CACHE), "Cache manager is null!").get(savedTenant.getId()); Assert.assertNull("Removing a Tenant doesn't evict the cache!", cachedTenant); } + + @Test + public void testDeleteTenantDeletingAllRelatedEntities() throws Exception { + TenantProfile tenantProfile = new TenantProfile(); + tenantProfile.setName("Test tenant profile"); + TenantProfile savedProfile = tenantProfileService.saveTenantProfile(TenantId.SYS_TENANT_ID, tenantProfile); + + Tenant tenant = new Tenant(); + tenant.setTitle("My tenant"); + tenant.setTenantProfileId(savedProfile.getId()); + Tenant savedTenant = tenantService.saveTenant(tenant); + + User user = new User(); + user.setAuthority(Authority.TENANT_ADMIN); + user.setEmail("tenantAdmin@test.com"); + user.setFirstName("tenantAdmin"); + user.setLastName("tenantAdmin"); + user.setTenantId(savedTenant.getId()); + User savedUser = userService.saveUser(user); + + Customer customer = new Customer(); + customer.setTitle("Test customer"); + customer.setTenantId(savedTenant.getId()); + customer.setEmail("testCustomer@test.com"); + Customer savedCustomer = customerService.saveCustomer(customer); + + WidgetsBundle widgetsBundle = new WidgetsBundle(); + widgetsBundle.setTenantId(savedTenant.getId()); + widgetsBundle.setTitle("Test widgets bundle"); + widgetsBundle.setAlias("TestWidgetsBundle"); + widgetsBundle.setDescription("Just a simple widgets bundle"); + WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle); + + DeviceProfile deviceProfile = new DeviceProfile(); + deviceProfile.setTenantId(savedTenant.getId()); + deviceProfile.setTransportType(DeviceTransportType.MQTT); + deviceProfile.setName("Test device profile"); + deviceProfile.setType(DeviceProfileType.DEFAULT); + + DeviceProfileData profileData = new DeviceProfileData(); + profileData.setTransportConfiguration(new MqttDeviceProfileTransportConfiguration()); + deviceProfile.setProfileData(profileData); + DeviceProfile savedDeviceProfile = deviceProfileService.saveDeviceProfile(deviceProfile); + + + Device device = new Device(); + device.setCustomerId(savedCustomer.getId()); + device.setTenantId(savedTenant.getId()); + device.setType("Test type"); + device.setName("TestType"); + device.setLabel("Test type"); + device.setDeviceProfileId(savedDeviceProfile.getId()); + Device savedDevice = deviceService.saveDevice(device); + + EntityView entityView = new EntityView(); + entityView.setEntityId(savedDevice.getId()); + entityView.setTenantId(savedTenant.getId()); + entityView.setCustomerId(savedCustomer.getId()); + entityView.setType("Test type"); + entityView.setName("Test entity view"); + entityView.setStartTimeMs(0); + entityView.setEndTimeMs(840000); + EntityView savedEntityView = entityViewService.saveEntityView(entityView); + + Asset asset = new Asset(); + asset.setTenantId(savedTenant.getId()); + asset.setCustomerId(savedCustomer.getId()); + asset.setType("Test asset type"); + asset.setName("Test asset type"); + asset.setLabel("Test asset type"); + Asset savedAsset = assetService.saveAsset(asset); + + Dashboard dashboard = new Dashboard(); + dashboard.setTenantId(savedTenant.getId()); + dashboard.setTitle("Test dashboard"); + dashboard.setAssignedCustomers(Set.of(savedCustomer.toShortCustomerInfo())); + Dashboard savedDashboard = dashboardService.saveDashboard(dashboard); + + RuleChain ruleChain = new RuleChain(); + ruleChain.setTenantId(savedTenant.getId()); + ruleChain.setName("Test rule chain"); + ruleChain.setType(RuleChainType.CORE); + RuleChain savedRuleChain = ruleChainService.saveRuleChain(ruleChain); + + Edge edge = constructEdge(savedTenant.getId(), "Test edge", "Simple"); + Edge savedEdge = edgeService.saveEdge(edge, false); + + OtaPackage otaPackage = createFirmware(savedTenant.getId(), "1", savedDeviceProfile.getId()); + OtaPackage savedOtaPackage = otaPackageService.saveOtaPackage(otaPackage); + + + TbResource resource = new TbResource(); + resource.setTenantId(savedTenant.getId()); + resource.setTitle("Test resource"); + resource.setResourceType(ResourceType.LWM2M_MODEL); + resource.setFileName(FILE_NAME); + resource.setResourceKey("Test resource key"); + resource.setData("Some super test data"); + TbResource savedResource = resourceService.saveResource(resource); + + ApiUsageState defaultApiUsageState = apiUsageStateService + .createDefaultApiUsageState(savedTenant.getId(), savedCustomer.getId()); + + Rpc rpc = new Rpc(); + rpc.setTenantId(savedTenant.getId()); + rpc.setDeviceId(savedDevice.getId()); + rpc.setStatus(RpcStatus.QUEUED); + rpc.setRequest(JacksonUtil.toJsonNode("{}")); + Rpc savedRpc = rpcService.save(rpc); + + + tenantService.deleteTenant(savedTenant.getId()); + + Assert.assertNull(tenantService.findTenantById(savedTenant.getId())); + Assert.assertNull(tenantService.findTenantById(savedTenant.getId())); + Assert.assertNull(customerService.findCustomerById(savedTenant.getId(), savedCustomer.getId())); + + + PageLink pageLinkCustomer = new PageLink(1000); + PageData pageDataCustomer = customerService + .findCustomersByTenantId(savedTenant.getId(), pageLinkCustomer); + Assert.assertFalse(pageDataCustomer.hasNext()); + Assert.assertEquals(0, pageDataCustomer.getTotalElements()); + + + Assert.assertNull( + widgetsBundleService.findWidgetsBundleById(savedTenant.getId(), savedWidgetsBundle.getId()) + ); + List widgetsBundlesByTenantId = + widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(savedTenant.getId()); + Assert.assertTrue(widgetsBundlesByTenantId.isEmpty()); + + + Assert.assertNull(entityViewService.findEntityViewById( + savedTenant.getId(), savedEntityView.getId() + )); + List entityViews = + entityViewService.findEntityViewsByTenantIdAndEntityId( + savedTenant.getId(), savedDevice.getId()); + Assert.assertTrue(entityViews.isEmpty()); + + + Assert.assertNull(assetService.findAssetById( + savedTenant.getId(), savedAsset.getId() + )); + PageLink pageLinkAssets = new PageLink(1000); + PageData assets = + assetService.findAssetsByTenantId(savedTenant.getId(), pageLinkAssets); + Assert.assertFalse(assets.hasNext()); + Assert.assertEquals(0, assets.getTotalElements()); + + + Assert.assertNull(deviceService.findDeviceById( + savedTenant.getId(), savedDevice.getId() + )); + PageLink pageLinkDevices = new PageLink(1000); + PageData devices = + deviceService.findDevicesByTenantId(savedTenant.getId(), pageLinkDevices); + Assert.assertFalse(devices.hasNext()); + Assert.assertEquals(0, devices.getTotalElements()); + + + Assert.assertNull(deviceProfileService.findDeviceProfileById( + savedTenant.getId(), savedDeviceProfile.getId() + )); + PageLink pageLinkDeviceProfiles = new PageLink(1000); + PageData profiles = + deviceProfileService.findDeviceProfiles(savedTenant.getId(), pageLinkDeviceProfiles); + Assert.assertFalse(profiles.hasNext()); + Assert.assertEquals(0, profiles.getTotalElements()); + + + Assert.assertNull(dashboardService.findDashboardById( + savedTenant.getId(), savedDashboard.getId() + )); + PageLink pageLinkDashboards = new PageLink(1000); + PageData dashboards = + dashboardService.findDashboardsByTenantId(savedTenant.getId(), pageLinkDashboards); + Assert.assertFalse(dashboards.hasNext()); + Assert.assertEquals(0, dashboards.getTotalElements()); + + + Assert.assertNull(edgeService.findEdgeById(savedTenant.getId(), savedEdge.getId())); + PageLink pageLinkEdges = new PageLink(1000); + PageData edges = edgeService.findEdgesByTenantId(savedTenant.getId(), pageLinkEdges); + Assert.assertFalse(edges.hasNext()); + Assert.assertEquals(0, edges.getTotalElements()); + + + PageLink pageLinkTenantAdmins = new PageLink(1000); + PageData tenantAdmins = + userService.findTenantAdmins(savedTenant.getId(), pageLinkTenantAdmins); + Assert.assertFalse(tenantAdmins.hasNext()); + Assert.assertEquals(0, tenantAdmins.getTotalElements()); + + + Assert.assertNull(userService.findUserById(savedTenant.getId(), savedUser.getId())); + PageLink pageLinkUsers = new PageLink(1000); + PageData users = + userService.findUsersByTenantId(savedTenant.getId(), pageLinkUsers); + Assert.assertFalse(users.hasNext()); + Assert.assertEquals(0, users.getTotalElements()); + + + Assert.assertNull(ruleChainService.findRuleChainById(savedTenant.getId(), savedRuleChain.getId())); + Assert.assertNull(apiUsageStateService.findTenantApiUsageState(savedTenant.getId())); + + + Assert.assertNull(resourceService.findResourceById(savedTenant.getId(), savedResource.getId())); + PageLink pageLinkResources = new PageLink(1000); + PageData tenantResources = + resourceService.findAllTenantResourcesByTenantId(savedTenant.getId(), pageLinkResources); + Assert.assertFalse(tenantResources.hasNext()); + Assert.assertEquals(0, tenantResources.getTotalElements()); + + + Assert.assertNull( + otaPackageService.findOtaPackageById( + savedTenant.getId(), savedOtaPackage.getId() + ) + ); + PageLink pageLinkOta = new PageLink(1000); + PageData pageDataOta = otaPackageService.findTenantOtaPackagesByTenantId(savedTenant.getId(), pageLinkOta); + Assert.assertFalse(pageDataOta.hasNext()); + Assert.assertEquals(0, pageDataOta.getTotalElements()); + + + Assert.assertNull(rpcService.findById(savedTenant.getId(), savedRpc.getId())); + } + + private OtaPackage createFirmware(TenantId tenantId, String version, DeviceProfileId deviceProfileId) { + OtaPackage firmware = new OtaPackage(); + firmware.setTenantId(tenantId); + firmware.setDeviceProfileId(deviceProfileId); + firmware.setType(FIRMWARE); + firmware.setTitle(TITLE); + firmware.setVersion(version); + firmware.setFileName(FILE_NAME); + firmware.setContentType(CONTENT_TYPE); + firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM); + firmware.setChecksum(CHECKSUM); + firmware.setData(DATA); + firmware.setDataSize(DATA_SIZE); + return otaPackageService.saveOtaPackage(firmware); + } }