@ -16,6 +16,7 @@
package org.thingsboard.server.controller ;
package org.thingsboard.server.controller ;
import com.fasterxml.jackson.core.type.TypeReference ;
import com.fasterxml.jackson.core.type.TypeReference ;
import org.awaitility.Awaitility ;
import org.junit.Assert ;
import org.junit.Assert ;
import org.junit.Test ;
import org.junit.Test ;
import org.mockito.ArgumentMatcher ;
import org.mockito.ArgumentMatcher ;
@ -25,9 +26,12 @@ import org.thingsboard.server.common.data.EntityInfo;
import org.thingsboard.server.common.data.StringUtils ;
import org.thingsboard.server.common.data.StringUtils ;
import org.thingsboard.server.common.data.Tenant ;
import org.thingsboard.server.common.data.Tenant ;
import org.thingsboard.server.common.data.TenantProfile ;
import org.thingsboard.server.common.data.TenantProfile ;
import org.thingsboard.server.common.data.audit.AuditLog ;
import org.thingsboard.server.common.data.audit.ActionType ;
import org.thingsboard.server.common.data.id.TenantProfileId ;
import org.thingsboard.server.common.data.id.TenantProfileId ;
import org.thingsboard.server.common.data.page.PageData ;
import org.thingsboard.server.common.data.page.PageData ;
import org.thingsboard.server.common.data.page.PageLink ;
import org.thingsboard.server.common.data.page.PageLink ;
import org.thingsboard.server.common.data.page.TimePageLink ;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent ;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent ;
import org.thingsboard.server.common.data.queue.ProcessingStrategy ;
import org.thingsboard.server.common.data.queue.ProcessingStrategy ;
import org.thingsboard.server.common.data.queue.ProcessingStrategyType ;
import org.thingsboard.server.common.data.queue.ProcessingStrategyType ;
@ -47,6 +51,7 @@ import java.util.Collections;
import java.util.List ;
import java.util.List ;
import java.util.Map ;
import java.util.Map ;
import java.util.UUID ;
import java.util.UUID ;
import java.util.concurrent.TimeUnit ;
import java.util.function.Function ;
import java.util.function.Function ;
import java.util.stream.Collectors ;
import java.util.stream.Collectors ;
@ -81,12 +86,17 @@ public class TenantProfileControllerTest extends AbstractControllerTest {
testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( savedTenantProfile , ComponentLifecycleEvent . CREATED , 1 ) ;
testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( savedTenantProfile , ComponentLifecycleEvent . CREATED , 1 ) ;
awaitAuditLog ( "Wait for async audit log to be persisted (ADDED expected)" , savedTenantProfile . getId ( ) , ActionType . ADDED ) ;
savedTenantProfile . setName ( "New tenant profile" ) ;
savedTenantProfile . setName ( "New tenant profile" ) ;
doPost ( "/api/tenantProfile" , savedTenantProfile , TenantProfile . class ) ;
doPost ( "/api/tenantProfile" , savedTenantProfile , TenantProfile . class ) ;
TenantProfile foundTenantProfile = doGet ( "/api/tenantProfile/" + savedTenantProfile . getId ( ) . getId ( ) . toString ( ) , TenantProfile . class ) ;
TenantProfile foundTenantProfile = doGet ( "/api/tenantProfile/" + savedTenantProfile . getId ( ) . getId ( ) . toString ( ) , TenantProfile . class ) ;
Assert . assertEquals ( foundTenantProfile . getName ( ) , savedTenantProfile . getName ( ) ) ;
Assert . assertEquals ( foundTenantProfile . getName ( ) , savedTenantProfile . getName ( ) ) ;
testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( savedTenantProfile , ComponentLifecycleEvent . UPDATED , 1 ) ;
testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( savedTenantProfile , ComponentLifecycleEvent . UPDATED , 1 ) ;
awaitAuditLog ( "Wait for async audit log to be persisted (UPDATED expected)" , savedTenantProfile . getId ( ) , ActionType . UPDATED ) ;
}
}
@Test
@Test
@ -180,6 +190,8 @@ public class TenantProfileControllerTest extends AbstractControllerTest {
Assert . assertNotNull ( foundDefaultTenantProfile ) ;
Assert . assertNotNull ( foundDefaultTenantProfile ) ;
Assert . assertEquals ( savedTenantProfile . getName ( ) , foundDefaultTenantProfile . getName ( ) ) ;
Assert . assertEquals ( savedTenantProfile . getName ( ) , foundDefaultTenantProfile . getName ( ) ) ;
Assert . assertEquals ( savedTenantProfile . getId ( ) , foundDefaultTenantProfile . getId ( ) ) ;
Assert . assertEquals ( savedTenantProfile . getId ( ) , foundDefaultTenantProfile . getId ( ) ) ;
awaitAuditLog ( "Wait for async audit log to be persisted (UPDATED expected for NEW DEFAULT Tenant Profile)" , savedTenantProfile . getId ( ) , ActionType . UPDATED ) ;
}
}
@Test
@Test
@ -245,6 +257,8 @@ public class TenantProfileControllerTest extends AbstractControllerTest {
doDelete ( "/api/tenantProfile/" + savedTenantProfile . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/tenantProfile/" + savedTenantProfile . getId ( ) . getId ( ) . toString ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
awaitAuditLog ( "Wait for async audit log to be persisted for deleted tenant profile" , savedTenantProfile . getId ( ) , ActionType . DELETED ) ;
testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( savedTenantProfile , ComponentLifecycleEvent . DELETED , 1 ) ;
testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( savedTenantProfile , ComponentLifecycleEvent . DELETED , 1 ) ;
doGet ( "/api/tenantProfile/" + savedTenantProfile . getId ( ) . getId ( ) . toString ( ) )
doGet ( "/api/tenantProfile/" + savedTenantProfile . getId ( ) . getId ( ) . toString ( ) )
@ -393,6 +407,22 @@ public class TenantProfileControllerTest extends AbstractControllerTest {
testBroadcastEntityStateChangeEventNeverTenantProfile ( ) ;
testBroadcastEntityStateChangeEventNeverTenantProfile ( ) ;
}
}
private void awaitAuditLog ( String awaitMessage , TenantProfileId tenantProfileId , ActionType expectedAction ) throws Exception {
Awaitility . await ( awaitMessage )
. atMost ( TIMEOUT , TimeUnit . SECONDS )
. until ( ( ) - >
doGetTypedWithTimePageLink (
"/api/audit/logs/entity/TENANT_PROFILE/" + tenantProfileId . getId ( ) + "?" ,
new TypeReference < PageData < AuditLog > > ( ) {
} ,
new TimePageLink ( 5 ) )
. getData ( )
. stream ( )
. anyMatch ( log - > log . getActionType ( ) = = expectedAction )
) ;
}
private TenantProfile createTenantProfile ( String name ) {
private TenantProfile createTenantProfile ( String name ) {
TenantProfile tenantProfile = new TenantProfile ( ) ;
TenantProfile tenantProfile = new TenantProfile ( ) ;
tenantProfile . setName ( name ) ;
tenantProfile . setName ( name ) ;
@ -429,7 +459,6 @@ public class TenantProfileControllerTest extends AbstractControllerTest {
tenantProfile . setProfileData ( profileData ) ;
tenantProfile . setProfileData ( profileData ) ;
}
}
private void testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( TenantProfile tenantProfile , ComponentLifecycleEvent event , int cntTime ) {
private void testBroadcastEntityStateChangeEventTimeManyTimeTenantProfile ( TenantProfile tenantProfile , ComponentLifecycleEvent event , int cntTime ) {
ArgumentMatcher < TenantProfile > matcherTenantProfile = cntTime = = 1 ? argument - > argument . equals ( tenantProfile ) :
ArgumentMatcher < TenantProfile > matcherTenantProfile = cntTime = = 1 ? argument - > argument . equals ( tenantProfile ) :
argument - > argument . getClass ( ) . equals ( TenantProfile . class ) ;
argument - > argument . getClass ( ) . equals ( TenantProfile . class ) ;