package io.lumify.sql.model.workspace;
import com.google.common.collect.Lists;
import io.lumify.core.config.Configuration;
import io.lumify.core.config.HashMapConfigurationLoader;
import io.lumify.core.exception.LumifyAccessDeniedException;
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.workspace.Workspace;
import io.lumify.core.model.workspace.WorkspaceEntity;
import io.lumify.core.model.workspace.WorkspaceUser;
import io.lumify.sql.model.HibernateSessionManager;
import io.lumify.sql.model.user.SqlUser;
import io.lumify.sql.model.user.SqlUserRepository;
import io.lumify.web.clientapi.model.GraphPosition;
import io.lumify.web.clientapi.model.WorkspaceAccess;
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.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.securegraph.inmemory.InMemoryGraph;
import org.securegraph.util.IterableUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
@RunWith(MockitoJUnitRunner.class)
public class SqlWorkspaceRepositoryTest {
private static final String HIBERNATE_IN_MEM_CFG_XML = "hibernateInMem.cfg.xml";
private SqlWorkspaceRepository sqlWorkspaceRepository;
private SqlUserRepository sqlUserRepository;
private SqlUser testUser;
@Mock
private AuthorizationRepository authorizationRepository;
@Mock
private UserListenerUtil userListenerUtil;
private HibernateSessionManager sessionManager;
@Before
public void setUp() throws Exception {
InMemoryGraph graph = InMemoryGraph.create();
org.hibernate.cfg.Configuration 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();
sqlUserRepository = new SqlUserRepository(lumifyConfiguration, sessionManager, authorizationRepository, userListenerUtil, graph);
sqlWorkspaceRepository = new SqlWorkspaceRepository(sqlUserRepository, sessionManager, graph);
testUser = (SqlUser) sqlUserRepository.addUser("123", "user 1", null, null, new String[0]);
}
@After
public void teardown() {
sessionManager.clearSession();
}
@Test
public void testDelete() throws Exception {
SqlWorkspace workspace = (SqlWorkspace) sqlWorkspaceRepository.add("test workspace 1", testUser);
sqlWorkspaceRepository.delete(workspace, testUser);
assertNull(sqlWorkspaceRepository.findById("1", testUser));
}
@Test(expected = LumifyAccessDeniedException.class)
public void testDeleteWithUserPermissions() {
SqlWorkspace workspace = (SqlWorkspace) sqlWorkspaceRepository.add("test workspace 1", testUser);
SqlUser sqlUser = new SqlUser();
sqlUser.setUserId("2");
sqlWorkspaceRepository.delete(workspace, sqlUser);
}
@Test
public void testDeleteWhenUsersHaveCurrentWorkspaceReference() {
SqlWorkspace workspace = (SqlWorkspace) sqlWorkspaceRepository.add("test workspace 1", testUser);
sqlUserRepository.setCurrentWorkspace(testUser.getUserId(), workspace.getWorkspaceId());
sqlWorkspaceRepository.delete(workspace, testUser);
sessionManager.getSession().refresh(testUser);
assertNull(testUser.getCurrentWorkspaceId());
}
@Test
public void testAdd() throws Exception {
SqlWorkspace workspace = (SqlWorkspace) sqlWorkspaceRepository.add("test workspace", testUser);
assertEquals(testUser.getUserId(), workspace.getWorkspaceCreator().getUserId());
assertEquals("test workspace", workspace.getDisplayTitle());
assertEquals(1, workspace.getSqlWorkspaceUserList().size());
SqlWorkspaceUser sqlWorkspaceUser = workspace.getSqlWorkspaceUserList().iterator().next();
assertEquals(WorkspaceAccess.WRITE.toString(), sqlWorkspaceUser.getWorkspaceAccess());
assertEquals(workspace.getWorkspaceId(), sqlWorkspaceUser.getWorkspace().getWorkspaceId());
}
@Test
public void testFindById() throws Exception {
SqlWorkspace workspace = (SqlWorkspace) sqlWorkspaceRepository.add("test workspace", testUser);
SqlWorkspace workspace2 = (SqlWorkspace) sqlWorkspaceRepository.add("test workspace 2", testUser);
SqlWorkspace testWorkspace = (SqlWorkspace) sqlWorkspaceRepository.findById(workspace.getWorkspaceId(), testUser);
SqlWorkspace testWorkspace2 = (SqlWorkspace) sqlWorkspaceRepository.findById(workspace2.getWorkspaceId(), testUser);
assertEquals(workspace.getWorkspaceCreator().getUserId(), testWorkspace.getWorkspaceCreator().getUserId());
assertEquals(workspace2.getWorkspaceCreator().getUserId(), testWorkspace2.getWorkspaceCreator().getUserId());
}
@Test
public void testFindAll() throws Exception {
Iterable<Workspace> userIterable = sqlWorkspaceRepository.findAllForUser(testUser);
assertTrue(IterableUtils.count(userIterable) == 0);
sqlWorkspaceRepository.add("test workspace 1", testUser);
sqlWorkspaceRepository.add("test workspace 2", testUser);
sqlWorkspaceRepository.add("test workspace 3", testUser);
userIterable = sqlWorkspaceRepository.findAllForUser(testUser);
assertTrue(IterableUtils.count(userIterable) == 3);
}
@Test
public void testSetTitle() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
assertEquals("test", sqlWorkspace.getDisplayTitle());
sqlWorkspaceRepository.setTitle(sqlWorkspace, "changed title", testUser);
SqlWorkspace modifiedWorkspace = (SqlWorkspace) sqlWorkspaceRepository.findById(sqlWorkspace.getWorkspaceId(), testUser);
assertEquals("changed title", modifiedWorkspace.getDisplayTitle());
}
@Test(expected = LumifyException.class)
public void testSetTitleWithInvalidWorkspace() {
sqlWorkspaceRepository.setTitle(new SqlWorkspace(), "test", new SqlUser());
}
@Test(expected = LumifyAccessDeniedException.class)
public void testSetTitleWithoutUserPermissions() {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
SqlUser sqlUser1 = new SqlUser();
sqlUser1.setUserId("2");
sqlWorkspaceRepository.setTitle(sqlWorkspace, "test", sqlUser1);
}
@Test
public void testFindUsersWithAccess() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
List<WorkspaceUser> workspaceUsers = sqlWorkspaceRepository.findUsersWithAccess(sqlWorkspace.getWorkspaceId(), testUser);
assertFalse(workspaceUsers.isEmpty());
assertEquals(testUser.getUserId(), workspaceUsers.get(0).getUserId());
assertTrue(workspaceUsers.get(0).isCreator());
}
@Test(expected = LumifyAccessDeniedException.class)
public void testFindUsersWithAccessWithoutUserPermissions() {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
SqlUser sqlUser = new SqlUser();
sqlUser.setUserId("2");
sqlWorkspaceRepository.findUsersWithAccess(sqlWorkspace.getWorkspaceId(), sqlUser);
}
@Test(expected = LumifyAccessDeniedException.class)
public void testUpdateUserOnWorkspace() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
sqlWorkspaceRepository.updateUserOnWorkspace(sqlWorkspace, testUser.getUserId(), WorkspaceAccess.WRITE, testUser);
List<WorkspaceUser> workspaceUsers = sqlWorkspaceRepository.findUsersWithAccess(sqlWorkspace.getWorkspaceId(), testUser);
assertTrue(workspaceUsers.size() == 1);
assertEquals(workspaceUsers.get(0).getWorkspaceAccess(), WorkspaceAccess.WRITE);
SqlUser testUser2 = (SqlUser) sqlUserRepository.addUser("456", "qwe", null, "", new String[0]);
sqlWorkspaceRepository.updateUserOnWorkspace(sqlWorkspace, "2", WorkspaceAccess.READ, testUser2);
workspaceUsers = sqlWorkspaceRepository.findUsersWithAccess(sqlWorkspace.getWorkspaceId(), testUser2);
assertTrue(workspaceUsers.size() == 2);
assertEquals(workspaceUsers.get(1).getWorkspaceAccess(), WorkspaceAccess.READ);
sqlWorkspaceRepository.updateUserOnWorkspace(sqlWorkspace, "1", WorkspaceAccess.NONE, testUser);
workspaceUsers = sqlWorkspaceRepository.findUsersWithAccess(sqlWorkspace.getWorkspaceId(), testUser);
assertEquals(workspaceUsers.get(0).getWorkspaceAccess(), WorkspaceAccess.NONE);
}
@Test(expected = LumifyAccessDeniedException.class)
public void testUpdateUserOnWorkspaceWithoutPermissions() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
SqlUser sqlUser = new SqlUser();
sqlUser.setUserId("2");
sqlWorkspaceRepository.updateUserOnWorkspace(sqlWorkspace, "2", WorkspaceAccess.WRITE, sqlUser);
}
@Test
public void testSoftDeleteEntityFromWorkspace() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
String vertexId = "1234";
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, vertexId, true, new GraphPosition(0, 0), testUser);
List<SqlWorkspaceVertex> sqlWorkspaceVertexSet = sqlWorkspaceRepository.getSqlWorkspaceVertices(sqlWorkspace);
assertTrue(sqlWorkspaceVertexSet.size() == 1);
SqlWorkspaceVertex sqlWorkspaceVertex = sqlWorkspaceVertexSet.iterator().next();
assertTrue(sqlWorkspaceVertex.isVisible());
sqlWorkspaceRepository.softDeleteEntitiesFromWorkspace(sqlWorkspace, Lists.newArrayList("1234"), testUser);
sqlWorkspaceVertexSet = sqlWorkspaceRepository.getSqlWorkspaceVertices(sqlWorkspace);
assertTrue(sqlWorkspaceVertexSet.size() == 1);
sqlWorkspaceVertex = sqlWorkspaceVertexSet.iterator().next();
assertFalse(sqlWorkspaceVertex.isVisible());
}
@Test
public void testUpdateEntityOnWorkspace() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
String vertexId = "1234";
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, vertexId, true, new GraphPosition(0, 0), testUser);
List<SqlWorkspaceVertex> sqlWorkspaceVertexSet = sqlWorkspaceRepository.getSqlWorkspaceVertices(sqlWorkspace);
assertTrue(sqlWorkspaceVertexSet.size() == 1);
SqlWorkspaceVertex sqlWorkspaceVertex = sqlWorkspaceVertexSet.iterator().next();
assertEquals("1234", sqlWorkspaceVertex.getVertexId());
assertEquals(0, sqlWorkspaceVertex.getGraphPositionX().intValue());
assertEquals(0, sqlWorkspaceVertex.getGraphPositionY().intValue());
assertTrue(sqlWorkspaceVertex.isVisible());
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, vertexId, false, new GraphPosition(1, 10), testUser);
sqlWorkspaceVertexSet = sqlWorkspaceRepository.getSqlWorkspaceVertices(sqlWorkspace);
assertTrue(sqlWorkspaceVertexSet.size() == 1);
sqlWorkspaceVertex = sqlWorkspaceVertexSet.iterator().next();
assertEquals("1234", sqlWorkspaceVertex.getVertexId());
assertEquals(1, sqlWorkspaceVertex.getGraphPositionX().intValue());
assertEquals(10, sqlWorkspaceVertex.getGraphPositionY().intValue());
assertFalse(sqlWorkspaceVertex.isVisible());
}
@Test
public void testFindEntities() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, "123", true, new GraphPosition(0, 0), testUser);
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, "345", true, new GraphPosition(1, 0), testUser);
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, "678", true, new GraphPosition(2, 0), testUser);
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, "910", true, new GraphPosition(3, 0), testUser);
List<WorkspaceEntity> workspaceEntities = sqlWorkspaceRepository.findEntities(sqlWorkspace, testUser);
assertTrue(workspaceEntities.size() == 4);
}
@Test
public void testCopy() throws Exception {
SqlWorkspace sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.add("test", testUser);
assertTrue(IterableUtils.count(sqlWorkspaceRepository.findAllForUser(testUser)) == 1);
sqlWorkspaceRepository.updateEntityOnWorkspace(sqlWorkspace, "123", true, new GraphPosition(0, 0), testUser);
sqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.findById(sqlWorkspace.getWorkspaceId(), testUser);
SqlWorkspace copySqlWorkspace = (SqlWorkspace) sqlWorkspaceRepository.copy(sqlWorkspace, testUser);
assertTrue(IterableUtils.count(sqlWorkspaceRepository.findAllForUser(testUser)) == 2);
assertEquals("Copy of test", copySqlWorkspace.getDisplayTitle());
assertTrue(copySqlWorkspace.getSqlWorkspaceVertices().size() == 1);
}
}