|
|
|
@ -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<ListenableFuture<Tenant>> 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<Tenant> 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<Tenant> 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); |
|
|
|
} |
|
|
|
} |
|
|
|
|