/**
* This file is part of lavagna.
*
* lavagna is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* lavagna is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with lavagna. If not, see <http://www.gnu.org/licenses/>.
*/
package io.lavagna.service;
import io.lavagna.config.PersistenceAndServiceConfig;
import io.lavagna.model.Permission;
import io.lavagna.model.Project;
import io.lavagna.model.Role;
import io.lavagna.model.User;
import io.lavagna.service.config.TestServiceConfig;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestServiceConfig.class, PersistenceAndServiceConfig.class })
@Transactional
public class UserRepositoryTest {
private static final String TEST_USER_NAME = "test-user";
@Autowired
private UserRepository userRepository;
@Autowired
private ProjectService projectService;
@Autowired
private PermissionService permissionService;
@Test
public void createUserTest() {
int res = Helper.createUser(userRepository, "test", TEST_USER_NAME);
Assert.assertEquals(1, res);
}
@Test
public void createUserFullTeste() {
int res = userRepository.createUser("test", TEST_USER_NAME, null,"test@test", "ds", false);
Assert.assertEquals(1, res);
}
@Test(expected = DuplicateKeyException.class)
public void testUserNameUniquenessConstraint() {
Assert.assertEquals(1, Helper.createUser(userRepository, "test", TEST_USER_NAME));
Helper.createUser(userRepository, "test", TEST_USER_NAME);
}
@Test
public void findExistingUser() {
Helper.createUser(userRepository, "test", TEST_USER_NAME);
User user = userRepository.findUserByName("test", TEST_USER_NAME);
Assert.assertNotNull(user);
Assert.assertEquals(TEST_USER_NAME, user.getUsername());
Assert.assertEquals("test", user.getProvider());
}
@Test
public void findById() {
Helper.createUser(userRepository, "test", TEST_USER_NAME);
User user = userRepository.findUserByName("test", TEST_USER_NAME);
User uid = userRepository.findById(user.getId());
Assert.assertNotNull(uid);
Assert.assertEquals(user.getId(), uid.getId());
Assert.assertEquals(user.getProvider(), uid.getProvider());
Assert.assertEquals(user.getUsername(), uid.getUsername());
}
@Test
public void findByIds() {
Helper.createUser(userRepository, "test", TEST_USER_NAME + "1");
Helper.createUser(userRepository, "test", TEST_USER_NAME + "2");
User user1 = userRepository.findUserByName("test", TEST_USER_NAME + "1");
User user2 = userRepository.findUserByName("test", TEST_USER_NAME + "2");
List<User> res = userRepository.findByIds(Arrays.asList(user1.getId(), user2.getId()));
Assert.assertTrue(res.size() == 2);
Assert.assertTrue(res.contains(user1));
Assert.assertTrue(res.contains(user2));
Assert.assertTrue(userRepository.findByIds(Collections.<Integer>emptyList()).isEmpty());
}
@Test
public void existUserAndEnabled() {
Assert.assertFalse(userRepository.userExistsAndEnabled("test", TEST_USER_NAME));
Helper.createUser(userRepository, "test", TEST_USER_NAME);
Assert.assertTrue(userRepository.userExistsAndEnabled("test", TEST_USER_NAME));
User u = userRepository.findUserByName("test", TEST_USER_NAME);
userRepository.toggle(u.getId(), false);
Assert.assertFalse(userRepository.userExistsAndEnabled("test", TEST_USER_NAME));
userRepository.toggle(u.getId(), true);
Assert.assertTrue(userRepository.userExistsAndEnabled("test", TEST_USER_NAME));
}
@Test
public void existUser() {
Assert.assertFalse(userRepository.userExists("test", TEST_USER_NAME));
Helper.createUser(userRepository, "test", TEST_USER_NAME);
Assert.assertTrue(userRepository.userExists("test", TEST_USER_NAME));
User u = userRepository.findUserByName("test", TEST_USER_NAME);
userRepository.toggle(u.getId(), false);
Assert.assertTrue(userRepository.userExists("test", TEST_USER_NAME));
userRepository.toggle(u.getId(), true);
Assert.assertTrue(userRepository.userExists("test", TEST_USER_NAME));
}
@Test
public void updateProfile() {
Helper.createUser(userRepository, "test", TEST_USER_NAME);
User user = userRepository.findUserByName("test", TEST_USER_NAME);
Assert.assertNull(user.getEmail());
Assert.assertNull(user.getDisplayName());
userRepository.updateProfile(user, "email@email.getEmail()", "display name", true, true);
User userUpdate = userRepository.findUserByName("test", TEST_USER_NAME);
Assert.assertEquals("email@email.getEmail()", userUpdate.getEmail());
Assert.assertEquals("display name", userUpdate.getDisplayName());
userRepository.updateProfile(user, null, null, true, true);
User userUpdate2 = userRepository.findUserByName("test", TEST_USER_NAME);
Assert.assertNull(userUpdate2.getEmail());
Assert.assertNull(userUpdate2.getDisplayName());
}
@Test
public void findUsers() {
Assert.assertTrue(userRepository.findUsers("-us").isEmpty());
Helper.createUser(userRepository, "test", TEST_USER_NAME);
Assert.assertFalse(userRepository.findUsers("-us").isEmpty());
Assert.assertFalse(userRepository.findUsers("test-user").isEmpty());
Assert.assertTrue(userRepository.findUsers("test-user-").isEmpty());
}
@Test
public void findUsersInProject() {
Project project = projectService.create("TEST", "TEST", "desc");
Assert.assertTrue(userRepository.findUsers("-us", project.getId(), Permission.READ).isEmpty());
Helper.createUser(userRepository, "test", TEST_USER_NAME);
//user does not have role READ
Assert.assertTrue(userRepository.findUsers("-us", project.getId(), Permission.READ).isEmpty());
User user = userRepository.findUserByName("test", TEST_USER_NAME);
Role globalRead = new Role("READ");
permissionService.createRole(globalRead);
permissionService.updatePermissionsToRole(globalRead, EnumSet.of(Permission.READ));
permissionService.assignRoleToUsers(globalRead, Collections.singleton(user.getId()));
Assert.assertEquals(1, userRepository.findUsers("-us", project.getId(), Permission.READ).size());
Helper.createUser(userRepository, "test", TEST_USER_NAME + "2");
User user2 = userRepository.findUserByName("test", TEST_USER_NAME+"2");
Role projectRead = new Role("READ");
permissionService.createRoleInProjectId(projectRead, project.getId());
permissionService.updatePermissionsToRoleInProjectId(projectRead, EnumSet.of(Permission.READ), project.getId());
permissionService.assignRoleToUsersInProjectId(projectRead, Collections.singleton(user2.getId()), project.getId());
Assert.assertEquals(2, userRepository.findUsers("-us", project.getId(), Permission.READ).size());
}
@Test
public void findAll() {
int initialCount = userRepository.findAll().size();
Helper.createUser(userRepository, "test", TEST_USER_NAME + "0");
Helper.createUser(userRepository, "test", TEST_USER_NAME + "1");
Assert.assertTrue(userRepository.findAll().size() == initialCount + 2);
}
@Test
public void testToggle() {
Helper.createUser(userRepository, "test", TEST_USER_NAME);
User u = userRepository.findUserByName("test", TEST_USER_NAME);
Assert.assertTrue(u.getEnabled());
userRepository.toggle(u.getId(), false);
Assert.assertFalse(userRepository.findUserByName("test", TEST_USER_NAME).getEnabled());
userRepository.toggle(u.getId(), true);
Assert.assertTrue(userRepository.findUserByName("test", TEST_USER_NAME).getEnabled());
}
@Test(expected = EmptyResultDataAccessException.class)
public void findNonExistingUser() {
userRepository.findUserByName("test", TEST_USER_NAME);
}
@Test
public void testFindUsersId() {
Helper.createUser(userRepository, "test-1", TEST_USER_NAME + "0");
Helper.createUser(userRepository, "test-2", TEST_USER_NAME + "1");
Map<String, Integer> found = userRepository.findUsersId(Arrays.asList("test-1:" + TEST_USER_NAME + "0",
"test-2:" + TEST_USER_NAME + "1", "testtest"));
User u1 = userRepository.findUserByName("test-1", TEST_USER_NAME + "0");
User u2 = userRepository.findUserByName("test-2", TEST_USER_NAME + "1");
Assert.assertEquals(found.get("test-1:" + TEST_USER_NAME + "0").intValue(), u1.getId());
Assert.assertEquals(found.get("test-2:" + TEST_USER_NAME + "1").intValue(), u2.getId());
Assert.assertFalse(found.containsKey("testtest"));
}
@Test
public void testDeleteAllTokens() {
Helper.createUser(userRepository, "test", TEST_USER_NAME);
User u = userRepository.findUserByName("test", TEST_USER_NAME);
String token1 = userRepository.createRememberMeToken(u.getId());
String token2 = userRepository.createRememberMeToken(u.getId());
String token3 = userRepository.createRememberMeToken(u.getId());
Assert.assertTrue(userRepository.rememberMeTokenExists(u.getId(), token1));
Assert.assertTrue(userRepository.rememberMeTokenExists(u.getId(), token2));
Assert.assertTrue(userRepository.rememberMeTokenExists(u.getId(), token3));
userRepository.clearAllTokens(u);
Assert.assertFalse(userRepository.rememberMeTokenExists(u.getId(), token1));
Assert.assertFalse(userRepository.rememberMeTokenExists(u.getId(), token2));
Assert.assertFalse(userRepository.rememberMeTokenExists(u.getId(), token3));
}
@Test
public void testRememberMeTokenFlow() {
Helper.createUser(userRepository, "test", TEST_USER_NAME);
User u = userRepository.findUserByName("test", TEST_USER_NAME);
Assert.assertFalse(userRepository.rememberMeTokenExists(u.getId(), "42"));
String token = userRepository.createRememberMeToken(u.getId());
Assert.assertTrue(userRepository.rememberMeTokenExists(u.getId(), token));
userRepository.deleteRememberMeToken(u.getId(), token);
Assert.assertFalse(userRepository.rememberMeTokenExists(u.getId(), token));
}
}