@ -31,6 +31,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration ;
import org.springframework.test.context.ContextConfiguration ;
import org.springframework.test.web.servlet.ResultActions ;
import org.springframework.test.web.servlet.ResultActions ;
import org.thingsboard.server.common.data.Customer ;
import org.thingsboard.server.common.data.Customer ;
import org.thingsboard.server.common.data.Dashboard ;
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.User ;
import org.thingsboard.server.common.data.User ;
@ -42,6 +43,8 @@ import org.thingsboard.server.common.data.id.UserId;
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.security.Authority ;
import org.thingsboard.server.common.data.security.Authority ;
import org.thingsboard.server.common.data.settings.StarredDashboardInfo ;
import org.thingsboard.server.common.data.settings.UserDashboardsInfo ;
import org.thingsboard.server.dao.exception.DataValidationException ;
import org.thingsboard.server.dao.exception.DataValidationException ;
import org.thingsboard.server.dao.user.UserDao ;
import org.thingsboard.server.dao.user.UserDao ;
@ -356,7 +359,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
String userIdStr = savedUser . getId ( ) . getId ( ) . toString ( ) ;
String userIdStr = savedUser . getId ( ) . getId ( ) . toString ( ) ;
doGet ( "/api/user/" + userIdStr )
doGet ( "/api/user/" + userIdStr )
. andExpect ( status ( ) . isNotFound ( ) )
. andExpect ( status ( ) . isNotFound ( ) )
. andExpect ( statusReason ( containsString ( msgErrorNoFound ( "User" , userIdStr ) ) ) ) ;
. andExpect ( statusReason ( containsString ( msgErrorNoFound ( "User" , userIdStr ) ) ) ) ;
}
}
@Test
@Test
@ -574,9 +577,9 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
String email1 = "testEmail1" ;
String email1 = "testEmail1" ;
String email2 = "testEmail2" ;
String email2 = "testEmail2" ;
List < User > customerUsersEmail1 = new ArrayList < > ( ) ;
List < User > customerUsersEmail1 = new ArrayList < > ( ) ;
List < User > customerUsersEmail2 = new ArrayList < > ( ) ;
List < User > customerUsersEmail2 = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 45 ; i + + ) {
for ( int i = 0 ; i < 45 ; i + + ) {
User customerUser = createCustomerUser ( customerId ) ;
User customerUser = createCustomerUser ( customerId ) ;
customerUser . setEmail ( email1 + StringUtils . randomAlphanumeric ( ( int ) ( 5 + Math . random ( ) * 10 ) ) + "@thingsboard.org" ) ;
customerUser . setEmail ( email1 + StringUtils . randomAlphanumeric ( ( int ) ( 5 + Math . random ( ) * 10 ) ) + "@thingsboard.org" ) ;
customerUsersEmail1 . add ( doPost ( "/api/user" , customerUser , User . class ) ) ;
customerUsersEmail1 . add ( doPost ( "/api/user" , customerUser , User . class ) ) ;
@ -685,7 +688,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
JsonNode retrievedSettings = doGet ( "/api/user/settings" , JsonNode . class ) ;
JsonNode retrievedSettings = doGet ( "/api/user/settings" , JsonNode . class ) ;
Assert . assertEquals ( retrievedSettings , userSettings ) ;
Assert . assertEquals ( retrievedSettings , userSettings ) ;
}
}
@Test
@Test
public void testShouldNotSaveJsonWithRestrictedSymbols ( ) throws Exception {
public void testShouldNotSaveJsonWithRestrictedSymbols ( ) throws Exception {
@ -860,7 +863,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
List < UserEmailInfo > expectedUserInfos = customerUsersContainingWord . stream ( ) . map ( customerUser - > new UserEmailInfo ( customerUser . getId ( ) ,
List < UserEmailInfo > expectedUserInfos = customerUsersContainingWord . stream ( ) . map ( customerUser - > new UserEmailInfo ( customerUser . getId ( ) ,
customerUser . getEmail ( ) , customerUser . getFirstName ( ) = = null ? "" : customerUser . getFirstName ( ) ,
customerUser . getEmail ( ) , customerUser . getFirstName ( ) = = null ? "" : customerUser . getFirstName ( ) ,
customerUser . getLastName ( ) = = null ? "" : customerUser . getLastName ( ) ) )
customerUser . getLastName ( ) = = null ? "" : customerUser . getLastName ( ) ) )
. sorted ( userDataIdComparator ) . collect ( Collectors . toList ( ) ) ;
. sorted ( userDataIdComparator ) . collect ( Collectors . toList ( ) ) ;
usersInfo . sort ( userDataIdComparator ) ;
usersInfo . sort ( userDataIdComparator ) ;
@ -912,8 +915,8 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
List < UserEmailInfo > usersInfo = getUsersInfo ( pageLink ) ;
List < UserEmailInfo > usersInfo = getUsersInfo ( pageLink ) ;
List < UserEmailInfo > expectedUserInfos = usersContainingWord . stream ( ) . map ( customerUser - > new UserEmailInfo ( customerUser . getId ( ) ,
List < UserEmailInfo > expectedUserInfos = usersContainingWord . stream ( ) . map ( customerUser - > new UserEmailInfo ( customerUser . getId ( ) ,
customerUser . getEmail ( ) , customerUser . getFirstName ( ) = = null ? "" : customerUser . getFirstName ( ) ,
customerUser . getEmail ( ) , customerUser . getFirstName ( ) = = null ? "" : customerUser . getFirstName ( ) ,
customerUser . getLastName ( ) = = null ? "" : customerUser . getLastName ( ) ) )
customerUser . getLastName ( ) = = null ? "" : customerUser . getLastName ( ) ) )
. sorted ( userDataIdComparator ) . collect ( Collectors . toList ( ) ) ;
. sorted ( userDataIdComparator ) . collect ( Collectors . toList ( ) ) ;
usersInfo . sort ( userDataIdComparator ) ;
usersInfo . sort ( userDataIdComparator ) ;
@ -922,7 +925,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
// find user by full last name
// find user by full last name
pageLink = new PageLink ( 10 , 0 , searchText + "3" ) ;
pageLink = new PageLink ( 10 , 0 , searchText + "3" ) ;
usersInfo = getUsersInfo ( pageLink ) ;
usersInfo = getUsersInfo ( pageLink ) ;
Assert . assertEquals ( 2 , usersInfo . size ( ) ) ;
Assert . assertEquals ( 2 , usersInfo . size ( ) ) ;
//clear users
//clear users
doDelete ( "/api/customer/" + customerId . getId ( ) . toString ( ) )
doDelete ( "/api/customer/" + customerId . getId ( ) . toString ( ) )
@ -941,6 +944,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
private static User createCustomerUser ( CustomerId customerId ) {
private static User createCustomerUser ( CustomerId customerId ) {
return createCustomerUser ( null , null , customerId ) ;
return createCustomerUser ( null , null , customerId ) ;
}
}
private static User createCustomerUser ( String firstName , String lastName , CustomerId customerId ) {
private static User createCustomerUser ( String firstName , String lastName , CustomerId customerId ) {
String suffix = StringUtils . randomAlphanumeric ( ( int ) ( 5 + Math . random ( ) * 10 ) ) ;
String suffix = StringUtils . randomAlphanumeric ( ( int ) ( 5 + Math . random ( ) * 10 ) ) ;
return createCustomerUser ( firstName , lastName , "testMail" + suffix + "@thingsboard.org" , customerId ) ;
return createCustomerUser ( firstName , lastName , "testMail" + suffix + "@thingsboard.org" , customerId ) ;
@ -959,6 +963,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
private User createTenantAdminUser ( ) {
private User createTenantAdminUser ( ) {
return createTenantAdminUser ( null , null ) ;
return createTenantAdminUser ( null , null ) ;
}
}
private User createTenantAdminUser ( String firstName , String lastName ) {
private User createTenantAdminUser ( String firstName , String lastName ) {
String suffix = StringUtils . randomAlphanumeric ( ( int ) ( 5 + Math . random ( ) * 10 ) ) ;
String suffix = StringUtils . randomAlphanumeric ( ( int ) ( 5 + Math . random ( ) * 10 ) ) ;
@ -975,7 +980,8 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
List < UserEmailInfo > loadedCustomerUsers = new ArrayList < > ( ) ;
List < UserEmailInfo > loadedCustomerUsers = new ArrayList < > ( ) ;
PageData < UserEmailInfo > pageData = null ;
PageData < UserEmailInfo > pageData = null ;
do {
do {
pageData = doGetTypedWithPageLink ( "/api/users/info?" , new TypeReference < > ( ) { } , pageLink ) ;
pageData = doGetTypedWithPageLink ( "/api/users/info?" , new TypeReference < > ( ) {
} , pageLink ) ;
loadedCustomerUsers . addAll ( pageData . getData ( ) ) ;
loadedCustomerUsers . addAll ( pageData . getData ( ) ) ;
if ( pageData . hasNext ( ) ) {
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
pageLink = pageLink . nextPageLink ( ) ;
@ -984,4 +990,119 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
return loadedCustomerUsers ;
return loadedCustomerUsers ;
}
}
@Test
public void testEmptyDashboardSettings ( ) throws Exception {
loginCustomerUser ( ) ;
UserDashboardsInfo retrievedSettings = doGet ( "/api/user/dashboards" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( retrievedSettings ) ;
Assert . assertNotNull ( retrievedSettings . getLast ( ) ) ;
Assert . assertTrue ( retrievedSettings . getLast ( ) . isEmpty ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertTrue ( retrievedSettings . getStarred ( ) . isEmpty ( ) ) ;
}
@Test
public void testDashboardSettingsFlow ( ) throws Exception {
loginTenantAdmin ( ) ;
Dashboard dashboard1 = new Dashboard ( ) ;
dashboard1 . setTitle ( "My dashboard 1" ) ;
Dashboard savedDashboard1 = doPost ( "/api/dashboard" , dashboard1 , Dashboard . class ) ;
Dashboard dashboard2 = new Dashboard ( ) ;
dashboard2 . setTitle ( "My dashboard 2" ) ;
Dashboard savedDashboard2 = doPost ( "/api/dashboard" , dashboard2 , Dashboard . class ) ;
UserDashboardsInfo retrievedSettings = doGet ( "/api/user/dashboards" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( retrievedSettings ) ;
Assert . assertNotNull ( retrievedSettings . getLast ( ) ) ;
Assert . assertTrue ( retrievedSettings . getLast ( ) . isEmpty ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertTrue ( retrievedSettings . getStarred ( ) . isEmpty ( ) ) ;
UserDashboardsInfo newSettings = doGet ( "/api/user/dashboards/" + savedDashboard1 . getId ( ) . getId ( ) + "/visit" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( newSettings ) ;
Assert . assertNotNull ( newSettings . getLast ( ) ) ;
Assert . assertEquals ( 1 , newSettings . getLast ( ) . size ( ) ) ;
var lastVisited = newSettings . getLast ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard1 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard1 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertTrue ( retrievedSettings . getStarred ( ) . isEmpty ( ) ) ;
newSettings = doGet ( "/api/user/dashboards/" + savedDashboard2 . getId ( ) . getId ( ) + "/visit" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( newSettings ) ;
Assert . assertNotNull ( newSettings . getLast ( ) ) ;
Assert . assertEquals ( 2 , newSettings . getLast ( ) . size ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard2 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard2 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertTrue ( retrievedSettings . getStarred ( ) . isEmpty ( ) ) ;
newSettings = doGet ( "/api/user/dashboards" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( newSettings ) ;
Assert . assertNotNull ( newSettings . getLast ( ) ) ;
Assert . assertEquals ( 2 , newSettings . getLast ( ) . size ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard2 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard2 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertTrue ( retrievedSettings . getStarred ( ) . isEmpty ( ) ) ;
newSettings = doGet ( "/api/user/dashboards/" + savedDashboard1 . getId ( ) . getId ( ) + "/star" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( newSettings ) ;
Assert . assertNotNull ( newSettings . getLast ( ) ) ;
Assert . assertEquals ( 2 , newSettings . getLast ( ) . size ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard2 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard2 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertFalse ( lastVisited . isStarred ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 1 ) ;
Assert . assertEquals ( savedDashboard1 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard1 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertTrue ( lastVisited . isStarred ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertEquals ( 1 , newSettings . getStarred ( ) . size ( ) ) ;
StarredDashboardInfo starred = newSettings . getStarred ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard1 . getId ( ) . getId ( ) , starred . getId ( ) ) ;
Assert . assertEquals ( savedDashboard1 . getTitle ( ) , starred . getTitle ( ) ) ;
newSettings = doGet ( "/api/user/dashboards/" + savedDashboard2 . getId ( ) . getId ( ) + "/star" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( newSettings ) ;
Assert . assertNotNull ( newSettings . getLast ( ) ) ;
Assert . assertEquals ( 2 , newSettings . getLast ( ) . size ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard2 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard2 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertTrue ( lastVisited . isStarred ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 1 ) ;
Assert . assertEquals ( savedDashboard1 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard1 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertTrue ( lastVisited . isStarred ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertEquals ( 2 , newSettings . getStarred ( ) . size ( ) ) ;
starred = newSettings . getStarred ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard2 . getId ( ) . getId ( ) , starred . getId ( ) ) ;
Assert . assertEquals ( savedDashboard2 . getTitle ( ) , starred . getTitle ( ) ) ;
newSettings = doGet ( "/api/user/dashboards/" + savedDashboard1 . getId ( ) . getId ( ) + "/unstar" , UserDashboardsInfo . class ) ;
Assert . assertNotNull ( newSettings ) ;
Assert . assertNotNull ( newSettings . getLast ( ) ) ;
Assert . assertEquals ( 2 , newSettings . getLast ( ) . size ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard2 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard2 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertTrue ( lastVisited . isStarred ( ) ) ;
lastVisited = newSettings . getLast ( ) . get ( 1 ) ;
Assert . assertEquals ( savedDashboard1 . getId ( ) . getId ( ) , lastVisited . getId ( ) ) ;
Assert . assertEquals ( savedDashboard1 . getTitle ( ) , lastVisited . getTitle ( ) ) ;
Assert . assertFalse ( lastVisited . isStarred ( ) ) ;
Assert . assertNotNull ( retrievedSettings . getStarred ( ) ) ;
Assert . assertEquals ( 1 , newSettings . getStarred ( ) . size ( ) ) ;
starred = newSettings . getStarred ( ) . get ( 0 ) ;
Assert . assertEquals ( savedDashboard2 . getId ( ) . getId ( ) , starred . getId ( ) ) ;
Assert . assertEquals ( savedDashboard2 . getTitle ( ) , starred . getTitle ( ) ) ;
}
}
}