diff --git a/application/src/main/java/org/thingsboard/server/controller/BaseController.java b/application/src/main/java/org/thingsboard/server/controller/BaseController.java index 970100d938..92536b985a 100644 --- a/application/src/main/java/org/thingsboard/server/controller/BaseController.java +++ b/application/src/main/java/org/thingsboard/server/controller/BaseController.java @@ -93,6 +93,8 @@ import org.thingsboard.server.common.data.page.SortOrder; import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.plugin.ComponentDescriptor; import org.thingsboard.server.common.data.plugin.ComponentType; +import org.thingsboard.server.common.data.query.EntityDataSortOrder; +import org.thingsboard.server.common.data.query.EntityKey; import org.thingsboard.server.common.data.queue.Queue; import org.thingsboard.server.common.data.rpc.Rpc; import org.thingsboard.server.common.data.rule.RuleChain; @@ -160,6 +162,8 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; +import static org.thingsboard.server.common.data.StringUtils.isNotEmpty; +import static org.thingsboard.server.common.data.query.EntityKeyType.ENTITY_FIELD; import static org.thingsboard.server.controller.ControllerConstants.INCORRECT_TENANT_ID; import static org.thingsboard.server.controller.UserController.YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION; import static org.thingsboard.server.dao.service.Validator.validateId; @@ -987,4 +991,17 @@ public abstract class BaseController { }, MoreExecutors.directExecutor()); return deferredResult; } + + protected EntityDataSortOrder createEntityDataSortOrder(String sortProperty, String sortOrder) { + if (isNotEmpty(sortProperty)) { + EntityDataSortOrder entityDataSortOrder = new EntityDataSortOrder(); + entityDataSortOrder.setKey(new EntityKey(ENTITY_FIELD, sortProperty)); + if (isNotEmpty(sortOrder)) { + entityDataSortOrder.setDirection(EntityDataSortOrder.Direction.valueOf(sortOrder)); + } + return entityDataSortOrder; + } else { + return null; + } + } } diff --git a/application/src/main/java/org/thingsboard/server/controller/UserController.java b/application/src/main/java/org/thingsboard/server/controller/UserController.java index 032d664c1b..6177bdc74b 100644 --- a/application/src/main/java/org/thingsboard/server/controller/UserController.java +++ b/application/src/main/java/org/thingsboard/server/controller/UserController.java @@ -54,6 +54,7 @@ import org.thingsboard.server.common.data.query.EntityDataQuery; import org.thingsboard.server.common.data.query.EntityDataSortOrder; import org.thingsboard.server.common.data.query.EntityKey; import org.thingsboard.server.common.data.query.EntityTypeFilter; +import org.thingsboard.server.common.data.query.TsValue; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.UserSettings; @@ -73,6 +74,7 @@ import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.List; +import java.util.Map; import static org.thingsboard.server.common.data.StringUtils.isNotEmpty; import static org.thingsboard.server.common.data.query.EntityKeyType.ENTITY_FIELD; @@ -348,10 +350,13 @@ public class UserController extends BaseController { EntityDataQuery query = new EntityDataQuery(entityFilter, pageLink, entityFields, null, null); return entityQueryService.findEntityDataByQuery(securityUser, query).mapData(entityData -> - new UserData(UserId.fromString(entityData.getEntityId().getId().toString()), - entityData.getLatest().get(ENTITY_FIELD).get("email").getValue(), - entityData.getLatest().get(ENTITY_FIELD).get("firstName").getValue(), - entityData.getLatest().get(ENTITY_FIELD).get("lastName").getValue())); + { + Map keyValueMap = entityData.getLatest().get(ENTITY_FIELD); + return new UserData(UserId.fromString(entityData.getEntityId().getId().toString()), + keyValueMap.get("email").getValue(), + keyValueMap.get("firstName").getValue(), + keyValueMap.get("lastName").getValue()); + }); } @ApiOperation(value = "Get Tenant Users (getTenantAdmins)", @@ -485,16 +490,4 @@ public class UserController extends BaseController { userSettingsService.deleteUserSettings(currentUser.getTenantId(), currentUser.getId(), Arrays.asList(paths.split(","))); } - private EntityDataSortOrder createEntityDataSortOrder(String sortProperty, String sortOrder) { - if (isNotEmpty(sortProperty)) { - EntityDataSortOrder entityDataSortOrder = new EntityDataSortOrder(); - entityDataSortOrder.setKey(new EntityKey(ENTITY_FIELD, sortProperty)); - if (isNotEmpty(sortOrder)) { - entityDataSortOrder.setDirection(EntityDataSortOrder.Direction.valueOf(sortOrder)); - } - return entityDataSortOrder; - } else { - return null; - } - } } diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java index 4c7b783dc0..d78b8b08ef 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java @@ -18,6 +18,7 @@ package org.thingsboard.server.controller; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.jetbrains.annotations.NotNull; import org.junit.After; import org.junit.Assert; import org.junit.Ignore; @@ -87,21 +88,15 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { public void testSaveUser() throws Exception { loginSysAdmin(); - String email = "tenant2@thingsboard.org"; - User user = new User(); - user.setAuthority(Authority.TENANT_ADMIN); - user.setTenantId(tenantId); - user.setEmail(email); - user.setFirstName("Joe"); - user.setLastName("Downs"); - + User user = createTenantAdminUser(); + String email = user.getEmail(); Mockito.reset(tbClusterService, auditLogService); User savedUser = doPost("/api/user", user, User.class); Assert.assertNotNull(savedUser); Assert.assertNotNull(savedUser.getId()); Assert.assertTrue(savedUser.getCreatedTime() > 0); - Assert.assertEquals(user.getEmail(), savedUser.getEmail()); + Assert.assertEquals(email, savedUser.getEmail()); User foundUser = doGet("/api/user/" + savedUser.getId().getId().toString(), User.class); Assert.assertEquals(foundUser, savedUser); @@ -156,13 +151,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { Mockito.reset(tbClusterService, auditLogService); - String email = "tenant2@thingsboard.org"; - User user = new User(); - user.setAuthority(Authority.TENANT_ADMIN); - user.setTenantId(tenantId); - user.setEmail(email); - user.setFirstName(StringUtils.randomAlphabetic(300)); - user.setLastName("Downs"); + User user = createTenantAdminUser(StringUtils.randomAlphabetic(300), "Brown"); String msgError = msgErrorFieldLength("first name"); doPost("/api/user", user) .andExpect(status().isBadRequest()) @@ -189,12 +178,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { public void testUpdateUserFromDifferentTenant() throws Exception { loginSysAdmin(); - User tenantAdmin = new User(); - tenantAdmin.setAuthority(Authority.TENANT_ADMIN); - tenantAdmin.setTenantId(tenantId); - tenantAdmin.setEmail("tenant2@thingsboard.org"); - tenantAdmin.setFirstName("Joe"); - tenantAdmin.setLastName("Downs"); + User tenantAdmin = createTenantAdminUser(); tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1"); loginDifferentTenant(); @@ -214,14 +198,8 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { public void testResetPassword() throws Exception { loginSysAdmin(); - String email = "tenant2@thingsboard.org"; - User user = new User(); - user.setAuthority(Authority.TENANT_ADMIN); - user.setTenantId(tenantId); - user.setEmail(email); - user.setFirstName("Joe"); - user.setLastName("Downs"); - + User user = createTenantAdminUser(); + String email = user.getEmail(); User savedUser = createUserAndLogin(user, "testPassword1"); resetTokens(); @@ -266,13 +244,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { public void testFindUserById() throws Exception { loginSysAdmin(); - String email = "tenant2@thingsboard.org"; - User user = new User(); - user.setAuthority(Authority.TENANT_ADMIN); - user.setTenantId(tenantId); - user.setEmail(email); - user.setFirstName("Joe"); - user.setLastName("Downs"); + User user = createTenantAdminUser(); User savedUser = doPost("/api/user", user, User.class); User foundUser = doGet("/api/user/" + savedUser.getId().getId().toString(), User.class); @@ -286,15 +258,12 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { Mockito.reset(tbClusterService, auditLogService); - String email = TENANT_ADMIN_EMAIL; User user = new User(); user.setAuthority(Authority.TENANT_ADMIN); user.setTenantId(tenantId); - user.setEmail(email); - user.setFirstName("Joe"); - user.setLastName("Downs"); + user.setEmail(TENANT_ADMIN_EMAIL); - String msgError = "User with email '" + email + "' already present in database"; + String msgError = "User with email '" + TENANT_ADMIN_EMAIL + "' already present in database"; doPost("/api/user", user) .andExpect(status().isBadRequest()) .andExpect(statusReason(containsString(msgError))); @@ -311,12 +280,8 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { Mockito.reset(tbClusterService, auditLogService); String email = "tenant_thingsboard.org"; - User user = new User(); - user.setAuthority(Authority.TENANT_ADMIN); - user.setTenantId(tenantId); + User user = createTenantAdminUser(); user.setEmail(email); - user.setFirstName("Joe"); - user.setLastName("Downs"); String msgError = "Invalid email address format '" + email + "'"; doPost("/api/user", user) @@ -377,13 +342,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { public void testDeleteUser() throws Exception { loginSysAdmin(); - String email = "tenant2@thingsboard.org"; - User user = new User(); - user.setAuthority(Authority.TENANT_ADMIN); - user.setTenantId(tenantId); - user.setEmail(email); - user.setFirstName("Joe"); - user.setLastName("Downs"); + User user = createTenantAdminUser(); User savedUser = doPost("/api/user", user, User.class); User foundUser = doGet("/api/user/" + savedUser.getId().getId().toString(), User.class); @@ -565,20 +524,10 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { public void testFindCustomerUsers() throws Exception { loginSysAdmin(); - User tenantAdmin = new User(); - tenantAdmin.setAuthority(Authority.TENANT_ADMIN); - tenantAdmin.setTenantId(tenantId); - tenantAdmin.setEmail("tenant2@thingsboard.org"); - tenantAdmin.setFirstName("Joe"); - tenantAdmin.setLastName("Downs"); - + User tenantAdmin = createTenantAdminUser(); createUserAndLogin(tenantAdmin, "testPassword1"); - Customer customer = new Customer(); - customer.setTitle("My customer"); - Customer savedCustomer = doPost("/api/customer", customer, Customer.class); - - CustomerId customerId = savedCustomer.getId(); + CustomerId customerId = postCustomer(); List customerUsers = new ArrayList<>(); for (int i = 0; i < 56; i++) { @@ -615,47 +564,22 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { public void testFindCustomerUsersByEmail() throws Exception { loginSysAdmin(); - User tenantAdmin = new User(); - tenantAdmin.setAuthority(Authority.TENANT_ADMIN); - tenantAdmin.setTenantId(tenantId); - tenantAdmin.setEmail("tenant2@thingsboard.org"); - tenantAdmin.setFirstName("Joe"); - tenantAdmin.setLastName("Downs"); - + User tenantAdmin = createTenantAdminUser(); createUserAndLogin(tenantAdmin, "testPassword1"); - Customer customer = new Customer(); - customer.setTitle("My customer"); - Customer savedCustomer = doPost("/api/customer", customer, Customer.class); - - CustomerId customerId = savedCustomer.getId(); + CustomerId customerId = postCustomer(); String email1 = "testEmail1"; - List customerUsersEmail1 = new ArrayList<>(); - - for (int i = 0; i < 74; i++) { - User user = new User(); - user.setAuthority(Authority.CUSTOMER_USER); - user.setCustomerId(customerId); - String suffix = StringUtils.randomAlphanumeric((int) (5 + Math.random() * 10)); - String email = email1 + suffix + "@thingsboard.org"; - email = i % 2 == 0 ? email.toLowerCase() : email.toUpperCase(); - user.setEmail(email); - customerUsersEmail1.add(doPost("/api/user", user, User.class)); - } - String email2 = "testEmail2"; - List customerUsersEmail2 = new ArrayList<>(); - - for (int i = 0; i < 92; i++) { - User user = new User(); - user.setAuthority(Authority.CUSTOMER_USER); - user.setCustomerId(customerId); - String suffix = StringUtils.randomAlphanumeric((int) (5 + Math.random() * 10)); - String email = email2 + suffix + "@thingsboard.org"; - email = i % 2 == 0 ? email.toLowerCase() : email.toUpperCase(); - user.setEmail(email); - customerUsersEmail2.add(doPost("/api/user", user, User.class)); + List customerUsersEmail1 = new ArrayList<>(); + List customerUsersEmail2= new ArrayList<>(); + for (int i = 0; i < 45; i++) { + User customerUser = createCustomerUser( customerId); + customerUser.setEmail(email1 + StringUtils.randomAlphanumeric((int) (5 + Math.random() * 10)) + "@thingsboard.org"); + customerUsersEmail1.add(doPost("/api/user", customerUser, User.class)); + + customerUser.setEmail(email2 + StringUtils.randomAlphanumeric((int) (5 + Math.random() * 10)) + "@thingsboard.org"); + customerUsersEmail2.add(doPost("/api/user", customerUser, User.class)); } List loadedCustomerUsersEmail1 = new ArrayList<>(); @@ -723,14 +647,18 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { @Test public void testDeleteUserWithDeleteRelationsOk() throws Exception { - UserId userId = createUser().getId(); + loginSysAdmin(); + User tenantAdminUser = createTenantAdminUser(); + UserId userId = doPost("/api/user", tenantAdminUser, User.class).getId(); testEntityDaoWithRelationsOk(tenantId, userId, "/api/user/" + userId); } @Ignore @Test public void testDeleteUserExceptionWithRelationsTransactional() throws Exception { - UserId userId = createUser().getId(); + loginSysAdmin(); + User tenantAdminUser = createTenantAdminUser("Joe", "Downs"); + UserId userId = doPost("/api/user", tenantAdminUser, User.class).getId(); testEntityDaoWithRelationsTransactionalException(userDao, tenantId, userId, "/api/user/" + userId); } @@ -862,180 +790,177 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest { } @Test - public void shouldFindCustomerUsersByFirstName() throws Exception { + public void checkCustomerUserDoNotSeeTenantAndOtherCustomerUsers() throws Exception { loginSysAdmin(); - User tenantAdmin = new User(); - tenantAdmin.setAuthority(Authority.TENANT_ADMIN); - tenantAdmin.setTenantId(tenantId); - tenantAdmin.setEmail("tenant2@thingsboard.org"); - tenantAdmin.setFirstName("Joe"); - tenantAdmin.setLastName("Downs"); + User tenantAdmin = createTenantAdminUser("Joe", "Brown"); + createUserAndLogin(tenantAdmin, "testPassword1"); + + CustomerId customerId = postCustomer(); + User user = createCustomerUser("Joe", "Downs", customerId); + doPost("/api/user", user, User.class); + CustomerId customerId2 = postCustomer(); + User user2 = createCustomerUser(customerId2); + createUserAndLogin(user2, "testPassword2"); + + PageLink pageLink = new PageLink(10, 0, "Joe"); + List usersInfo = getUsersInfo(pageLink); + + Assert.assertEquals(usersInfo.size(), 0); + } + + @Test + public void shouldFindCustomerUsersByFirstName() throws Exception { + loginSysAdmin(); + User tenantAdmin = createTenantAdminUser(); createUserAndLogin(tenantAdmin, "testPassword1"); - Customer customer = new Customer(); - customer.setTitle("My customer"); - Customer savedCustomer = doPost("/api/customer", customer, Customer.class); - CustomerId customerId = savedCustomer.getId(); + String searchText = "Philip"; - Customer customer2 = new Customer(); - customer2.setTitle("My customer2"); - Customer savedCustomer2 = doPost("/api/customer", customer2, Customer.class); - CustomerId customerId2 = savedCustomer2.getId(); + CustomerId customerId = postCustomer(); + CustomerId customerId2 = postCustomer(); - List customerUsers = new ArrayList<>(); + List customerUsersContainingWord = new ArrayList<>(); for (int i = 0; i < 10; i++) { - User user = new User(); - user.setAuthority(Authority.CUSTOMER_USER); - user.setCustomerId(customerId); - user.setFirstName("Name" + i); - user.setLastName("Lastname" + i); - user.setEmail("testCustomer" + i + "@thingsboard.org"); - customerUsers.add(doPost("/api/user", user, User.class)); - } - for (int i = 0; i < 10; i++) { - User user = new User(); - user.setAuthority(Authority.CUSTOMER_USER); - user.setCustomerId(customerId2); - user.setFirstName("SecondCustomerName" + i); - user.setLastName("SecondCustomerLastname" + i); - user.setEmail("SecondCustomerUser" + i + "@thingsboard.org"); - doPost("/api/user", user, User.class); + String suffix = StringUtils.randomAlphabetic((int) (5 + Math.random() * 10)); + + customerUsersContainingWord.add(doPost("/api/user", createCustomerUser(searchText + i, "Last" + i, customerId), User.class)); + customerUsersContainingWord.add(doPost("/api/user", createCustomerUser(null, null, searchText + suffix + "@thingsboard.org", customerId), User.class)); + doPost("/api/user", createCustomerUser(null, null, customerId), User.class); + + doPost("/api/user", createCustomerUser(searchText + i, "Last" + i, customerId2), User.class); } - User user = new User(); - user.setAuthority(Authority.CUSTOMER_USER); - user.setCustomerId(customerId); - user.setEmail("testCustomerUser@thingsboard.org"); - createUserAndLogin(user, "testPassword2"); + createUserAndLogin(createCustomerUser(customerId), "testPassword2"); - // find user my name - List loadedCustomerUsers = new ArrayList<>(); - PageLink pageLink = new PageLink(10, 0, "Name"); - PageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/users/info?", - new TypeReference<>() { - }, pageLink); - loadedCustomerUsers.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageLink.nextPageLink(); - } - } while (pageData.hasNext()); + // find users by search text + PageLink pageLink = new PageLink(10, 0, searchText); + List usersInfo = getUsersInfo(pageLink); - List customerUserDatas = customerUsers.stream().map(customerUser -> new UserData(customerUser.getId(), - customerUser.getEmail(), customerUser.getFirstName(), customerUser.getLastName())) + List expectedUserInfos = customerUsersContainingWord.stream().map(customerUser -> new UserData(customerUser.getId(), + customerUser.getEmail(), customerUser.getFirstName() == null ? "" : customerUser.getFirstName(), + customerUser.getLastName() == null ? "" : customerUser.getLastName())) .sorted(userDataIdComparator).collect(Collectors.toList()); - loadedCustomerUsers.sort(userDataIdComparator); + usersInfo.sort(userDataIdComparator); - Assert.assertEquals(customerUserDatas, loadedCustomerUsers); + Assert.assertEquals(expectedUserInfos, usersInfo); - // find user my full name - loadedCustomerUsers.clear(); - pageLink = new PageLink(10, 0, "Name3"); - pageData = doGetTypedWithPageLink("/api/users/info?", - new TypeReference<>() { - }, pageLink); - loadedCustomerUsers.addAll(pageData.getData()); - Assert.assertEquals(pageData.getData().size(), 1); - Assert.assertEquals(pageData.getData().get(0).getEmail(), "testCustomer3@thingsboard.org"); + // find user by full name + pageLink = new PageLink(10, 0, searchText + "5"); + usersInfo = getUsersInfo(pageLink); + Assert.assertEquals(1, usersInfo.size()); //clear users loginUser(tenantAdmin.getEmail(), "testPassword1"); doDelete("/api/customer/" + customerId.getId().toString()) .andExpect(status().isOk()); + doDelete("/api/customer/" + customerId2.getId().toString()) + .andExpect(status().isOk()); } @Test - public void shouldFindTenantUsersByLastName() throws Exception { + public void shouldFindTenantUsersByTextFromLastName() throws Exception { loginSysAdmin(); - User tenantAdmin = new User(); - tenantAdmin.setAuthority(Authority.TENANT_ADMIN); - tenantAdmin.setTenantId(tenantId); - tenantAdmin.setEmail("tenant2@thingsboard.org"); - tenantAdmin.setFirstName("Joe"); - tenantAdmin.setLastName("Downs"); - + User tenantAdmin = createTenantAdminUser(); createUserAndLogin(tenantAdmin, "testPassword1"); + CustomerId customerId = postCustomer(); + CustomerId customerId2 = postCustomer(); - Customer customer = new Customer(); - customer.setTitle("My customer"); - Customer savedCustomer = doPost("/api/customer", customer, Customer.class); - CustomerId customerId = savedCustomer.getId(); - - Customer customer2 = new Customer(); - customer2.setTitle("My customer2"); - Customer savedCustomer2 = doPost("/api/customer", customer2, Customer.class); - CustomerId customerId2 = savedCustomer2.getId(); + String searchText = "Brown"; - List customerUsers = new ArrayList<>(); + List usersContainingWord = new ArrayList<>(); for (int i = 0; i < 10; i++) { - User user = new User(); - user.setAuthority(Authority.CUSTOMER_USER); - user.setCustomerId(customerId); - user.setFirstName("Name" + i); - user.setLastName("Lastname" + i); - user.setEmail("testCustomer" + i + "@thingsboard.org"); - customerUsers.add(doPost("/api/user", user, User.class)); - } - for (int i = 0; i < 10; i++) { - User user = new User(); - user.setAuthority(Authority.CUSTOMER_USER); - user.setCustomerId(customerId2); - user.setFirstName("SecondCustomerName" + i); - user.setLastName("SecondCustomerLastname" + i); - user.setEmail("SecondCustomerUser" + i + "@thingsboard.org"); - customerUsers.add(doPost("/api/user", user, User.class)); + String suffix = StringUtils.randomAlphabetic((int) (5 + Math.random() * 10)); + usersContainingWord.add(doPost("/api/user", createCustomerUser("First" + i, searchText + i, customerId), User.class)); + usersContainingWord.add(doPost("/api/user", createCustomerUser(null, null, searchText + suffix + "@thingsboard.org", customerId), User.class)); + + suffix = StringUtils.randomAlphabetic((int) (5 + Math.random() * 10)); + usersContainingWord.add(doPost("/api/user", createCustomerUser("First" + i, searchText + i, customerId2), User.class)); + usersContainingWord.add(doPost("/api/user", createCustomerUser(null, null, searchText + suffix + "@thingsboard.org", customerId2), User.class)); } - // find user my name - List loadedCustomerUsers = new ArrayList<>(); - PageLink pageLink = new PageLink(10, 0, "Name"); - PageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/users/info?", - new TypeReference<>() { - }, pageLink); - loadedCustomerUsers.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageLink.nextPageLink(); - } - } while (pageData.hasNext()); + loginDifferentTenant(); + CustomerId customerId3 = postCustomer(); + doPost("/api/user", createCustomerUser("Jane", searchText, customerId3), User.class); - List customerUserDatas = customerUsers.stream().map(customerUser -> new UserData(customerUser.getId(), - customerUser.getEmail(), customerUser.getFirstName(), customerUser.getLastName())) + // find users by search text + loginUser(tenantAdmin.getEmail(), "testPassword1"); + PageLink pageLink = new PageLink(10, 0, searchText); + List usersInfo = getUsersInfo(pageLink); + + List expectedUserInfos = usersContainingWord.stream().map(customerUser -> new UserData(customerUser.getId(), + customerUser.getEmail(), customerUser.getFirstName() == null ? "" : customerUser.getFirstName(), + customerUser.getLastName() == null ? "" : customerUser.getLastName())) .sorted(userDataIdComparator).collect(Collectors.toList()); - loadedCustomerUsers.sort(userDataIdComparator); + usersInfo.sort(userDataIdComparator); - Assert.assertEquals(customerUserDatas, loadedCustomerUsers); + Assert.assertEquals(expectedUserInfos, usersInfo); - // find user my full name - loadedCustomerUsers.clear(); - pageLink = new PageLink(10, 0, "SecondCustomerLastname3"); - pageData = doGetTypedWithPageLink("/api/users/info?", - new TypeReference<>() { - }, pageLink); - loadedCustomerUsers.addAll(pageData.getData()); - Assert.assertEquals(pageData.getData().size(), 1); - Assert.assertEquals(pageData.getData().get(0).getEmail(), "SecondCustomerUser3@thingsboard.org"); + // find user by full last name + pageLink = new PageLink(10, 0, searchText + "3"); + usersInfo = getUsersInfo(pageLink); + Assert.assertEquals(2, usersInfo.size()); //clear users - loginUser(tenantAdmin.getEmail(), "testPassword1"); doDelete("/api/customer/" + customerId.getId().toString()) .andExpect(status().isOk()); + doDelete("/api/customer/" + customerId2.getId().toString()) + .andExpect(status().isOk()); } - private User createUser() throws Exception { - loginSysAdmin(); - String email = "tenant2@thingsboard.org"; + private CustomerId postCustomer() { + Customer customer = new Customer(); + customer.setTitle(StringUtils.randomAlphabetic(9)); + Customer savedCustomer = doPost("/api/customer", customer, Customer.class); + return savedCustomer.getId(); + } + + private static User createCustomerUser(CustomerId customerId) { + return createCustomerUser(null, null, customerId); + } + private static User createCustomerUser(String firstName, String lastName, CustomerId customerId) { + String suffix = StringUtils.randomAlphanumeric((int) (5 + Math.random() * 10)); + return createCustomerUser(firstName, lastName, "testMail" + suffix + "@thingsboard.org", customerId); + } + + private static User createCustomerUser(String firstName, String lastName, String email, CustomerId customerId) { User user = new User(); - user.setAuthority(Authority.TENANT_ADMIN); - user.setTenantId(tenantId); + user.setAuthority(Authority.CUSTOMER_USER); + user.setFirstName(firstName); + user.setLastName(lastName); + user.setCustomerId(customerId); user.setEmail(email); - user.setFirstName("Joe"); - user.setLastName("Downs"); - return doPost("/api/user", user, User.class); + return user; + } + + private User createTenantAdminUser() { + return createTenantAdminUser(null, null); + } + private User createTenantAdminUser(String firstName, String lastName) { + String suffix = StringUtils.randomAlphanumeric((int) (5 + Math.random() * 10)); + + User tenantAdmin = new User(); + tenantAdmin.setAuthority(Authority.TENANT_ADMIN); + tenantAdmin.setTenantId(tenantId); + tenantAdmin.setEmail("testEmail" + suffix + "@thingsbord.org"); + tenantAdmin.setFirstName(firstName); + tenantAdmin.setLastName(lastName); + return tenantAdmin; } + + private List getUsersInfo(PageLink pageLink) throws Exception { + List loadedCustomerUsers = new ArrayList<>(); + PageData pageData = null; + do { + pageData = doGetTypedWithPageLink("/api/users/info?", new TypeReference<>() {}, pageLink); + loadedCustomerUsers.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageLink.nextPageLink(); + } + } while (pageData.hasNext()); + return loadedCustomerUsers; + } + }