/* * Copyright 2014-2016 CyberVision, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kaaproject.kaa.server.control; import org.junit.Assert; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.kaaproject.kaa.common.dto.KaaAuthorityDto; import org.kaaproject.kaa.common.dto.admin.UserDto; import org.springframework.web.client.HttpClientErrorException; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * The Class ControlServerUserIT. */ public class ControlServerUserIT extends AbstractTestControlServer { @Rule public ExpectedException expectedException = ExpectedException.none(); /* (non-Javadoc) * @see org.kaaproject.kaa.server.control.AbstractTestControlServer#createTenantDeveloperNeeded() */ @Override protected boolean createTenantDeveloperNeeded() { return false; } /** * Test create user. * Kaa admin creates tenant admin user. * * @throws Exception the exception */ @Test public void testKaaAdminCreateTenantAdmin() throws Exception { loginKaaAdmin(); UserDto user = new UserDto(); String username = generateString(USERNAME); user.setUsername(username); user.setMail(username + "@demoproject.org"); user.setFirstName(generateString("Test")); user.setLastName(generateString("User")); user.setAuthority(KaaAuthorityDto.TENANT_ADMIN); user.setTenantId(tenantAdminDto.getTenantId()); user = client.editUser(user); UserDto storedUser = client.getUser(user.getId()); Assert.assertNotNull(storedUser); Assert.assertEquals(storedUser.getAuthority(), KaaAuthorityDto.TENANT_ADMIN); assertUsersEquals(user, storedUser); } /** * Test create user. * Kaa admin is not able to create users except of tenant admin. * * @throws Exception the exception */ @Test public void testFailKaaAdminCreateOtherUser() throws Exception { expectedException.expect(HttpClientErrorException.class); expectedException.expectMessage("You do not have permission to perform this operation!"); loginKaaAdmin(); UserDto user = new UserDto(); String username = generateString(USERNAME); user.setUsername(username); user.setMail(username + "@demoproject.org"); user.setFirstName(generateString("Test")); user.setLastName(generateString("User")); user.setAuthority(KaaAuthorityDto.TENANT_DEVELOPER); user.setTenantId(tenantAdminDto.getTenantId()); client.editUser(user); } /** * Test create user. * Tenant admin create other users (neither kaa admin nor tenant admin). * Tenant id should reflect. * * @throws Exception the exception */ @Test public void testTenantAdminCreateOtherUser() throws Exception { loginTenantAdmin(tenantAdminDto.getUsername()); UserDto user = createUser(KaaAuthorityDto.TENANT_DEVELOPER); UserDto storedUser = client.getUser(user.getId()); Assert.assertEquals(storedUser.getAuthority(), KaaAuthorityDto.TENANT_DEVELOPER); Assert.assertNotNull(storedUser); assertUsersEquals(user, storedUser); Assert.assertEquals(tenantAdminDto.getTenantId(), storedUser.getTenantId()); } /** * Test create user. * Tenant admin is not able to create other users, which tenant id are not reflect. * * @throws Exception the exception */ @Ignore("Tenant id got from current user, so no way to set wrong tenant id") @Test public void testFailTenantAdminCreateOtherUser() throws Exception { expectedException.expect(HttpClientErrorException.class); expectedException.expectMessage("403 Forbidden"); loginTenantAdmin(tenantAdminDto.getUsername()); UserDto user = new UserDto(); String username = generateString(USERNAME); user.setUsername(username); user.setMail(username + "@demoproject.org"); user.setFirstName(generateString("Test")); user.setLastName(generateString("User")); user.setAuthority(KaaAuthorityDto.TENANT_DEVELOPER); user.setTenantId(tenantAdminDto.getTenantId() + 1); client.editUser(user); } /** * Test create user. * Tenant admin is not able to create another tenant admin. * * @throws Exception the exception */ @Test public void testFailTenantAdminCreateTenantAdmin() throws Exception { expectedException.expect(HttpClientErrorException.class); expectedException.expectMessage("You do not have permission to perform this operation!"); loginTenantAdmin(tenantAdminDto.getUsername()); UserDto user = createUser(KaaAuthorityDto.TENANT_ADMIN); } @Test public void testFailCreateUserOnEmailValidation() throws Exception { expectedException.expect(HttpClientErrorException.class); expectedException.expectMessage("400 Bad Request"); loginTenantAdmin(tenantAdminDto.getUsername()); UserDto user = new UserDto(); String username = generateString(USERNAME); user.setUsername(username); user.setMail("invalid email!"); user.setFirstName(generateString("firstName")); user.setLastName(generateString("lastName")); user.setAuthority(KaaAuthorityDto.TENANT_DEVELOPER); client.editUser(user); } /** * Test create user. * Users unable to have the same email addresses. * * @throws Exception the exception */ @Test public void testFailCreateUserOnDuplicatedEmail() throws Exception { expectedException.expect(HttpClientErrorException.class); expectedException.expectMessage("Entered email is already used by another user!"); loginTenantAdmin(tenantAdminDto.getUsername()); UserDto user = new UserDto(); String username = generateString(USERNAME); user.setUsername(username); String email = username + "@demoproject.org"; user.setMail(email); user.setFirstName(generateString("Test")); user.setLastName(generateString("User")); user.setAuthority(KaaAuthorityDto.TENANT_DEVELOPER); UserDto userWithSameEmail = new UserDto(); String username2 = generateString(USERNAME); userWithSameEmail.setUsername(username2); userWithSameEmail.setMail(email); userWithSameEmail.setFirstName(generateString("Test")); userWithSameEmail.setLastName(generateString("User")); userWithSameEmail.setAuthority(KaaAuthorityDto.TENANT_DEVELOPER); client.editUser(user); client.editUser(userWithSameEmail); } /** * Test get user. * * @throws Exception the exception */ @Test public void testGetUser() throws Exception { UserDto user = createUser(KaaAuthorityDto.TENANT_DEVELOPER); UserDto storedUser = client.getUser(user.getId()); Assert.assertNotNull(storedUser); assertUsersEquals(user, storedUser); } /** * Test get users. * * @throws Exception the exception */ @Test public void testGetUsers() throws Exception { loginTenantAdmin(tenantAdminDto.getUsername()); List<UserDto> users = new ArrayList<UserDto>(10); for (int i=0;i<10;i++) { UserDto user = createUser(tenantAdminDto, i%2==0 ? KaaAuthorityDto.TENANT_DEVELOPER : KaaAuthorityDto.TENANT_USER); users.add(user); } Collections.sort(users, new IdComparator()); List<UserDto> storedUsers = client.getUsers(); Collections.sort(storedUsers, new IdComparator()); Assert.assertEquals(users.size(), storedUsers.size()); for (int i=0;i<users.size();i++) { UserDto user = users.get(i); UserDto storedUser = storedUsers.get(i); assertUsersEquals(user, storedUser); } } /** * Test update user. * * @throws Exception the exception */ @Test public void testUpdateUser() throws Exception { UserDto user = createUser(KaaAuthorityDto.TENANT_DEVELOPER); final String PASSWORD = "test_password"; client.changePassword(user.getUsername(), user.getTempPassword(), PASSWORD); client.login(user.getUsername(), PASSWORD); user.setFirstName(generateString("NewFirst")); user.setLastName(generateString("NewLast")); UserDto updatedUser = client.editUser(user); assertUsersEquals(updatedUser, user); } /** * Test fail update user due to access policy. * User credentials should be changed by owner only. * Expected: HttpClientErrorException (403 Forbidden) * * @throws Exception the exception */ @Test public void testFailEditUser() throws Exception { expectedException.expect(HttpClientErrorException.class); expectedException.expectMessage("403 Forbidden"); UserDto user = createUser(KaaAuthorityDto.TENANT_DEVELOPER); user.setFirstName(generateString("NewFirst")); user.setLastName(generateString("NewLast")); UserDto updatedUser = client.editUser(user); } /** * Test delete user. * * @throws Exception the exception */ @Test public void testDeleteUser() throws Exception { final UserDto user = createUser(KaaAuthorityDto.TENANT_DEVELOPER); client.deleteUser(user.getId()); checkNotFound(new TestRestCall() { @Override public void executeRestCall() throws Exception { client.getUser(user.getId()); } }); } /** * Assert users equals. * * @param user the user * @param otherUser the other user */ private void assertUsersEquals(UserDto user, UserDto otherUser) { Assert.assertEquals(user.getId(), otherUser.getId()); Assert.assertEquals(user.getUsername(), otherUser.getUsername()); Assert.assertEquals(user.getMail(), otherUser.getMail()); Assert.assertEquals(user.getFirstName(), otherUser.getFirstName()); Assert.assertEquals(user.getLastName(), otherUser.getLastName()); Assert.assertEquals(user.getExternalUid(), otherUser.getExternalUid()); Assert.assertEquals(user.getTenantId(), otherUser.getTenantId()); Assert.assertEquals(user.getAuthority(), otherUser.getAuthority()); } }