package io.lumify.sql.model.user;
import io.lumify.core.config.Configuration;
import io.lumify.core.config.HashMapConfigurationLoader;
import io.lumify.core.exception.LumifyException;
import io.lumify.core.model.user.AuthorizationRepository;
import io.lumify.core.model.user.UserListenerUtil;
import io.lumify.core.model.user.UserPasswordUtil;
import io.lumify.web.clientapi.model.UserStatus;
import io.lumify.core.user.User;
import io.lumify.sql.model.HibernateSessionManager;
import io.lumify.sql.model.workspace.SqlWorkspace;
import org.hibernate.Session;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.securegraph.inmemory.InMemoryGraph;
import org.securegraph.util.IterableUtils;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.*;
@RunWith(JUnit4.class)
public class SqlUserRepositoryTest {
private final String HIBERNATE_IN_MEM_CFG_XML = "hibernateInMem.cfg.xml";
private SqlUserRepository sqlUserRepository;
private static org.hibernate.cfg.Configuration configuration;
@Mock
private AuthorizationRepository authorizationRepository;
private InMemoryGraph graph;
private HibernateSessionManager sessionManager;
@Before
public void setup() {
graph = new InMemoryGraph();
configuration = new org.hibernate.cfg.Configuration();
configuration.configure(HIBERNATE_IN_MEM_CFG_XML);
ServiceRegistry serviceRegistryBuilder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionManager = new HibernateSessionManager(configuration.buildSessionFactory(serviceRegistryBuilder));
Map<?, ?> configMap = new HashMap<Object, Object>();
Configuration lumifyConfiguration = new HashMapConfigurationLoader(configMap).createConfiguration();
UserListenerUtil userListenerUtil = new UserListenerUtil();
sqlUserRepository = new SqlUserRepository(lumifyConfiguration, sessionManager, authorizationRepository, userListenerUtil, graph);
}
@After
public void teardown() {
sessionManager.clearSession();
}
@Test
public void testAddUser() throws Exception {
SqlUser sqlUser1 = (SqlUser) sqlUserRepository.addUser("abc", "test user1", null, "", new String[0]);
assertEquals("abc", sqlUser1.getUsername());
assertEquals("test user1", sqlUser1.getDisplayName());
assertEquals(UserStatus.OFFLINE, sqlUser1.getUserStatus());
SqlUser sqlUser2 = (SqlUser) sqlUserRepository.addUser("def", "test user2", null, null, new String[0]);
assertNull(sqlUser2.getPasswordHash());
assertNull(sqlUser2.getPasswordSalt());
assertEquals("def", sqlUser2.getUsername());
assertEquals("test user2", sqlUser2.getDisplayName());
assertEquals(UserStatus.OFFLINE, sqlUser2.getUserStatus());
SqlUser sqlUser3 = (SqlUser) sqlUserRepository.addUser("ghi", "test user3", null, "&gdja81", new String[0]);
byte[] salt = sqlUser3.getPasswordSalt();
byte[] passwordHash = UserPasswordUtil.hashPassword("&gdja81", salt);
assertTrue(UserPasswordUtil.validatePassword("&gdja81", salt, passwordHash));
assertEquals("ghi", sqlUser3.getUsername());
assertEquals("test user3", sqlUser3.getDisplayName());
assertEquals(UserStatus.OFFLINE, sqlUser3.getUserStatus());
}
@Test(expected = LumifyException.class)
public void testAddUserWithExisitingUsername() {
sqlUserRepository.addUser("123", "test user1", null, "&gdja81", new String[0]);
sqlUserRepository.addUser("123", "test user1", null, null, new String[0]);
}
@Test
public void testFindById() throws Exception {
SqlUser addedUser = (SqlUser) sqlUserRepository.addUser("12345", "test user", null, "&gdja81", new String[0]);
SqlUser user = (SqlUser) sqlUserRepository.findById(addedUser.getUserId());
byte[] salt = user.getPasswordSalt();
byte[] passwordHash = UserPasswordUtil.hashPassword("&gdja81", salt);
assertTrue(UserPasswordUtil.validatePassword("&gdja81", salt, passwordHash));
assertEquals("12345", user.getUsername());
assertEquals("test user", user.getDisplayName());
assertEquals(user.getUserId(), addedUser.getUserId());
assertEquals(UserStatus.OFFLINE, user.getUserStatus());
assertNull(sqlUserRepository.findById("2"));
}
@Test
public void testFindSkipLimit() throws Exception {
Iterable<User> userIterable = sqlUserRepository.find(0, 100);
assertTrue(IterableUtils.count(userIterable) == 0);
sqlUserRepository.addUser("123", "test user1", null, "&gdja81", new String[0]);
sqlUserRepository.addUser("456", "test user2", null, null, new String[0]);
sqlUserRepository.addUser("789", "test user3", null, null, new String[0]);
userIterable = sqlUserRepository.find(0, 100);
assertTrue(IterableUtils.count(userIterable) == 3);
userIterable = sqlUserRepository.find(1, 100);
assertTrue(IterableUtils.count(userIterable) == 2);
}
@Test
public void testSetPassword() throws Exception {
SqlUser testUser = (SqlUser) sqlUserRepository.addUser("abcd", "test user", null, "1234", new String[0]);
assertTrue(sqlUserRepository.findByUsername("abcd") != null);
assertTrue(UserPasswordUtil.validatePassword("1234", testUser.getPasswordSalt(), testUser.getPasswordHash()));
sqlUserRepository.setPassword(testUser, "ijk");
assertTrue(UserPasswordUtil.validatePassword("ijk", testUser.getPasswordSalt(), testUser.getPasswordHash()));
}
@Test(expected = LumifyException.class)
public void testSetPasswordWithNullUser() {
sqlUserRepository.setPassword(null, "1u201");
}
@Test(expected = NullPointerException.class)
public void testSetPasswordWithNullPassword() {
sqlUserRepository.setPassword(new SqlUser(), null);
}
@Test(expected = LumifyException.class)
public void testSetPasswordWithNoUserId() {
sqlUserRepository.setPassword(new SqlUser(), "123");
}
@Test(expected = LumifyException.class)
public void testSetPasswordWithNonExistingUser() {
SqlUser sqlUser = new SqlUser();
sqlUser.setUserId("1");
sqlUserRepository.setPassword(sqlUser, "123");
}
@Test
public void testIsPasswordValid() throws Exception {
SqlUser testUser = (SqlUser) sqlUserRepository.addUser("1234", "test user", null, null, new String[0]);
assertFalse(sqlUserRepository.isPasswordValid(testUser, ""));
sqlUserRepository.setPassword(testUser, "abc");
assertTrue(sqlUserRepository.isPasswordValid(testUser, "abc"));
}
@Test(expected = LumifyException.class)
public void testIsPasswordValidWithNullUser() {
sqlUserRepository.isPasswordValid(null, "1234");
}
@Test(expected = NullPointerException.class)
public void testIsPasswordValidWithNullPassword() {
sqlUserRepository.isPasswordValid(new SqlUser(), null);
}
@Test(expected = LumifyException.class)
public void testIsPasswordValidWithNonExisitingUser() {
sqlUserRepository.isPasswordValid(null, "123");
}
@Test
public void testSetCurrentWorkspace() throws Exception {
Session session = sessionManager.getSession();
SqlWorkspace sqlWorkspace = new SqlWorkspace();
sqlWorkspace.setWorkspaceId("WORKSPACE_1");
sqlWorkspace.setDisplayTitle("workspace1");
session.save(sqlWorkspace);
User user = sqlUserRepository.addUser("123", "abc", null, null, new String[0]);
sqlUserRepository.setCurrentWorkspace(user.getUserId(), sqlWorkspace.getWorkspaceId());
SqlUser testUser = (SqlUser) sqlUserRepository.findById(user.getUserId());
assertEquals("workspace1", testUser.getCurrentWorkspace().getDisplayTitle());
}
@Test(expected = LumifyException.class)
public void testSetCurrentWorkspaceWithNonExisitingUser() {
sqlUserRepository.setCurrentWorkspace("1", new SqlWorkspace().getWorkspaceId());
}
@Test
public void testSetStatus() throws Exception {
SqlUser user = (SqlUser)sqlUserRepository.addUser("123", "abc", null, null, new String[0]);
sqlUserRepository.setStatus(user.getUserId(), UserStatus.ACTIVE);
SqlUser testUser = (SqlUser) sqlUserRepository.findById(user.getUserId());
assertEquals(UserStatus.ACTIVE, testUser.getUserStatus());
}
@Test(expected = LumifyException.class)
public void testSetStatusWithNonExisitingUser() {
sqlUserRepository.setStatus("1", UserStatus.OFFLINE);
}
}