From 5b10aafcd57492ef8abafbbd8cd00cc3b1062074 Mon Sep 17 00:00:00 2001 From: nickAS21 Date: Thu, 7 Jul 2022 18:37:08 +0300 Subject: [PATCH] refactoring: tests Tenant --- .../controller/AbstractNotifyEntityTest.java | 6 +- .../controller/BaseTenantControllerTest.java | 82 +++++++++++++++++-- 2 files changed, 79 insertions(+), 9 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java index a32ec3c427..87d41b8e2f 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java @@ -381,7 +381,9 @@ public abstract class AbstractNotifyEntityTest extends AbstractWebTest { } protected void testBroadcastEntityStateChangeEventTime(EntityId entityId, TenantId tenantId, int cntTime) { - Mockito.verify(tbClusterService, times(cntTime)).broadcastEntityStateChangeEvent(Mockito.eq(tenantId), + ArgumentMatcher matcherTenantIdId = cntTime == 1 ? argument -> argument.equals(tenantId) : + argument -> argument.getClass().equals(TenantId.class); + Mockito.verify(tbClusterService, times(cntTime)).broadcastEntityStateChangeEvent(Mockito.argThat(matcherTenantIdId), Mockito.any(entityId.getClass()), Mockito.any(ComponentLifecycleEvent.class)); } @@ -612,7 +614,7 @@ public abstract class AbstractNotifyEntityTest extends AbstractWebTest { return result; } - private EntityId createEntityId_NULL_UUID(HasName entity) { + protected EntityId createEntityId_NULL_UUID(HasName entity) { return EntityIdFactory.getByTypeAndUuid(entityClassToEntityTypeName(entity), ModelConstants.NULL_UUID); } diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java index 9a12653d16..a59d8612d1 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java @@ -26,6 +26,8 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentMatcher; +import org.mockito.Mockito; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.ResultActions; import org.thingsboard.common.util.ThingsBoardExecutors; @@ -33,8 +35,10 @@ 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.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.queue.ProcessingStrategy; import org.thingsboard.server.common.data.queue.ProcessingStrategyType; import org.thingsboard.server.common.data.queue.Queue; @@ -56,6 +60,8 @@ import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.containsString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @TestPropertySource(properties = { @@ -86,17 +92,28 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { loginSysAdmin(); Tenant tenant = new Tenant(); tenant.setTitle("My tenant"); + + Mockito.reset(tbClusterService, auditLogService); + Tenant savedTenant = doPost("/api/tenant", tenant, Tenant.class); Assert.assertNotNull(savedTenant); Assert.assertNotNull(savedTenant.getId()); Assert.assertTrue(savedTenant.getCreatedTime() > 0); Assert.assertEquals(tenant.getTitle(), savedTenant.getTitle()); + + testBroadcastEntityStateChangeEventTimeManyTimeTenant(savedTenant, ComponentLifecycleEvent.CREATED, 1); + savedTenant.setTitle("My new tenant"); doPost("/api/tenant", savedTenant, Tenant.class); Tenant foundTenant = doGet("/api/tenant/" + savedTenant.getId().getId().toString(), Tenant.class); Assert.assertEquals(foundTenant.getTitle(), savedTenant.getTitle()); + + testBroadcastEntityStateChangeEventTimeManyTimeTenant(savedTenant, ComponentLifecycleEvent.UPDATED, 1); + doDelete("/api/tenant/" + savedTenant.getId().getId().toString()) .andExpect(status().isOk()); + + testBroadcastEntityStateChangeEventTimeManyTimeTenant(savedTenant, ComponentLifecycleEvent.DELETED, 1); } @Test @@ -104,7 +121,14 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { loginSysAdmin(); Tenant tenant = new Tenant(); tenant.setTitle(RandomStringUtils.randomAlphanumeric(300)); - doPost("/api/tenant", tenant).andExpect(statusReason(containsString("length of title must be equal or less than 255"))); + + Mockito.reset(tbClusterService, auditLogService); + + doPost("/api/tenant", tenant) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString(msgErrorFieldLength("title")))); + + testBroadcastEntityStateChangeEventNeverTenant(); } @Test @@ -136,21 +160,31 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { @Test public void testSaveTenantWithEmptyTitle() throws Exception { loginSysAdmin(); + + Mockito.reset(tbClusterService, auditLogService); + Tenant tenant = new Tenant(); doPost("/api/tenant", tenant) .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("Tenant title should be specified"))); + .andExpect(statusReason(containsString("Tenant title " + msgErrorShouldBeSpecified))); + + testBroadcastEntityStateChangeEventNeverTenant(); } @Test public void testSaveTenantWithInvalidEmail() throws Exception { loginSysAdmin(); + + Mockito.reset(tbClusterService, auditLogService); + Tenant tenant = new Tenant(); tenant.setTitle("My tenant"); tenant.setEmail("invalid@mail"); doPost("/api/tenant", tenant) .andExpect(status().isBadRequest()) .andExpect(statusReason(containsString("Invalid email address format"))); + + testBroadcastEntityStateChangeEventNeverTenant(); } @Test @@ -159,10 +193,13 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { Tenant tenant = new Tenant(); tenant.setTitle("My tenant"); Tenant savedTenant = doPost("/api/tenant", tenant, Tenant.class); - doDelete("/api/tenant/" + savedTenant.getId().getId().toString()) + + String tenantIdStr = savedTenant.getId().getId().toString(); + doDelete("/api/tenant/" + tenantIdStr) .andExpect(status().isOk()); - doGet("/api/tenant/" + savedTenant.getId().getId().toString()) - .andExpect(status().isNotFound()); + doGet("/api/tenant/" + tenantIdStr) + .andExpect(status().isNotFound()) + .andExpect(statusReason(containsString(msgErrorNoFound("Tenant", tenantIdStr)))); } @Test @@ -175,8 +212,11 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { Assert.assertEquals(1, pageData.getData().size()); tenants.addAll(pageData.getData()); + Mockito.reset(tbClusterService, auditLogService); + + int cntEntity = 56; List> createFutures = new ArrayList<>(56); - for (int i = 0; i < 56; i++) { + for (int i = 0; i < cntEntity; i++) { Tenant tenant = new Tenant(); tenant.setTitle("Tenant" + i); createFutures.add(executor.submit(() -> @@ -184,6 +224,8 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { } tenants.addAll(Futures.allAsList(createFutures).get(TIMEOUT, TimeUnit.SECONDS)); + testBroadcastEntityStateChangeEventTimeManyTimeTenant(new Tenant(), ComponentLifecycleEvent.CREATED, cntEntity); + List loadedTenants = new ArrayList<>(); pageLink = new PageLink(17); do { @@ -200,6 +242,8 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { .filter((t) -> !TEST_TENANT_NAME.equals(t.getTitle())) .collect(Collectors.toList()), executor).get(TIMEOUT, TimeUnit.SECONDS); + testBroadcastEntityStateChangeEventTimeManyTimeTenant(new Tenant(), ComponentLifecycleEvent.DELETED, cntEntity); + pageLink = new PageLink(17); pageData = doGetTypedWithPageLink("/api/tenants?", PAGE_DATA_TENANT_TYPE_REF, pageLink); Assert.assertFalse(pageData.hasNext()); @@ -464,7 +508,9 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { login(username, password); for (Queue queue : foundTenantQueues) { - doGet("/api/queues/" + queue.getId()).andExpect(status().isNotFound()); + doGet("/api/queues/" + queue.getId()) + .andExpect(status().isNotFound()) + .andExpect(statusReason(containsString(msgErrorNotFound))); } loginSysAdmin(); @@ -519,4 +565,26 @@ public abstract class BaseTenantControllerTest extends AbstractControllerTest { } return result; } + + private void testBroadcastEntityStateChangeEventTimeManyTimeTenant(Tenant tenant, ComponentLifecycleEvent event, int cntTime) { + ArgumentMatcher matcherTenant = cntTime == 1 ? argument -> argument.equals(tenant) : + argument -> argument.getClass().equals(Tenant.class); + if (ComponentLifecycleEvent.DELETED.equals(event)) { + Mockito.verify(tbClusterService, times( cntTime)).onTenantDelete(Mockito.argThat(matcherTenant), + Mockito.isNull()); + } else { + Mockito.verify(tbClusterService, times( cntTime)).onTenantChange(Mockito.argThat(matcherTenant), + Mockito.isNull()); + } + TenantId tenantId = cntTime == 1 ? tenant.getId() : (TenantId) createEntityId_NULL_UUID(tenant); + testBroadcastEntityStateChangeEventTime(tenantId, tenantId, cntTime); + Mockito.reset(tbClusterService, auditLogService); + } + + private void testBroadcastEntityStateChangeEventNeverTenant() { + Mockito.verify(tbClusterService, never()).onTenantChange(Mockito.any(Tenant.class), + Mockito.isNull()); + testBroadcastEntityStateChangeEventNever(createEntityId_NULL_UUID(new Tenant())); + Mockito.reset(tbClusterService, auditLogService); + } }