/* * Copyright Siemens AG, 2013-2015. Part of the SW360 Portal Project. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.sw360.datahandler.db; import org.eclipse.sw360.datahandler.TestUtils; import org.eclipse.sw360.datahandler.common.DatabaseSettings; import org.eclipse.sw360.datahandler.couchdb.DatabaseConnector; import org.eclipse.sw360.datahandler.entitlement.ProjectModerator; import org.eclipse.sw360.datahandler.thrift.RequestStatus; import org.eclipse.sw360.datahandler.thrift.projects.Project; import org.eclipse.sw360.datahandler.thrift.users.User; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; import java.util.List; import java.util.Map; import static org.eclipse.sw360.datahandler.common.SW360Utils.printName; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; import static org.eclipse.sw360.datahandler.TestUtils.assertTestString; @RunWith(MockitoJUnitRunner.class) public class ProjectDatabaseHandlerTest { private static final String dbName = DatabaseSettings.COUCH_DB_DATABASE; private static final String attachmentDbName = DatabaseSettings.COUCH_DB_ATTACHMENTS; private static final String attachmentsDbName = DatabaseSettings.COUCH_DB_ATTACHMENTS; private static final User user1 = new User().setEmail("user1").setDepartment("AB CD EF"); private static final User user2 = new User().setEmail("user2").setDepartment("AB CD FE"); private static final User user3 = new User().setEmail("user3").setDepartment("AB CD EF"); ProjectModerator moderator = Mockito.mock(ProjectModerator.class); ProjectDatabaseHandler handler; @Before public void setUp() throws Exception { assertTestString(dbName); assertTestString(attachmentsDbName); List<Project> projects = new ArrayList<>(); projects.add(new Project().setId("P1").setName("Project1").setBusinessUnit("AB CD EF").setCreatedBy("user1")); projects.add(new Project().setId("P2").setName("Project2").setBusinessUnit("AB CD FE").setCreatedBy("user2")); projects.get(1).addToContributors("user1"); projects.add(new Project().setId("P3").setName("Project3").setBusinessUnit("AB CD EF").setCreatedBy("user3")); // Create the database TestUtils.createDatabase(DatabaseSettings.getConfiguredHttpClient(), dbName); // Prepare the database DatabaseConnector databaseConnector = new DatabaseConnector(DatabaseSettings.getConfiguredHttpClient(), dbName); for (Project project : projects) { databaseConnector.add(project); } ComponentDatabaseHandler componentHandler = new ComponentDatabaseHandler(DatabaseSettings.getConfiguredHttpClient(), dbName, attachmentsDbName); handler = new ProjectDatabaseHandler(DatabaseSettings.getConfiguredHttpClient(), dbName, attachmentDbName, moderator, componentHandler); } @After public void tearDown() throws Exception { // Delete the database TestUtils.deleteDatabase(DatabaseSettings.getConfiguredHttpClient(), dbName); } @Test public void testUpdateProject2_1() throws Exception { Project project2 = handler.getProjectById("P2", user1); project2.setName("Project2new"); Mockito.doReturn(RequestStatus.SENT_TO_MODERATOR).when(moderator).updateProject(project2, user1); RequestStatus status = handler.updateProject(project2, user1); // Now contributors can also change the project assertEquals(RequestStatus.SUCCESS, status); } @Test public void testDeleteProject1_3() throws Exception { when(moderator.deleteProject(any(Project.class), eq(user3))).thenReturn(RequestStatus.SENT_TO_MODERATOR); RequestStatus status = handler.deleteProject("P1", user3); assertEquals(RequestStatus.SENT_TO_MODERATOR, status); assertEquals(2, handler.getMyProjectsSummary(user1.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user2.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user3.getEmail()).size()); assertEquals(2, handler.getBUProjectsSummary(user1.getDepartment()).size()); assertEquals(1, handler.getBUProjectsSummary(user2.getDepartment()).size()); assertEquals(2, handler.getBUProjectsSummary(user3.getDepartment()).size()); assertEquals(3, handler.getAccessibleProjectsSummary(user1).size()); assertEquals(1, handler.getAccessibleProjectsSummary(user2).size()); assertEquals(2, handler.getAccessibleProjectsSummary(user3).size()); boolean deleted = (handler.getProjectById("P1", user1) == null); assertEquals(false, deleted); } @Test public void testDeleteProject2_1() throws Exception { when(moderator.deleteProject(any(Project.class), eq(user1))).thenReturn(RequestStatus.SENT_TO_MODERATOR); RequestStatus status = handler.deleteProject("P2", user1); assertEquals(RequestStatus.SENT_TO_MODERATOR, status); assertEquals(2, handler.getMyProjectsSummary(user1.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user2.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user3.getEmail()).size()); assertEquals(2, handler.getBUProjectsSummary(user1.getDepartment()).size()); assertEquals(1, handler.getBUProjectsSummary(user2.getDepartment()).size()); assertEquals(2, handler.getBUProjectsSummary(user3.getDepartment()).size()); assertEquals(3, handler.getAccessibleProjectsSummary(user1).size()); assertEquals(1, handler.getAccessibleProjectsSummary(user2).size()); assertEquals(2, handler.getAccessibleProjectsSummary(user3).size()); boolean deleted = (handler.getProjectById("P2", user2) == null); assertEquals(false, deleted); } @Test public void testDeleteProject2_3() throws Exception { when(moderator.deleteProject(any(Project.class), eq(user3))).thenReturn(RequestStatus.SENT_TO_MODERATOR); RequestStatus status = handler.deleteProject("P2", user3); assertEquals(RequestStatus.SENT_TO_MODERATOR, status); assertEquals(2, handler.getMyProjectsSummary(user1.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user2.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user3.getEmail()).size()); assertEquals(2, handler.getBUProjectsSummary(user1.getDepartment()).size()); assertEquals(1, handler.getBUProjectsSummary(user2.getDepartment()).size()); assertEquals(2, handler.getBUProjectsSummary(user3.getDepartment()).size()); assertEquals(3, handler.getAccessibleProjectsSummary(user1).size()); assertEquals(1, handler.getAccessibleProjectsSummary(user2).size()); assertEquals(2, handler.getAccessibleProjectsSummary(user3).size()); boolean deleted = (handler.getProjectById("P2", user2) == null); assertEquals(false, deleted); } @Test public void testDeleteProject3_1() throws Exception { when(moderator.deleteProject(any(Project.class), eq(user1))).thenReturn(RequestStatus.SENT_TO_MODERATOR); RequestStatus status = handler.deleteProject("P3", user1); assertEquals(RequestStatus.SENT_TO_MODERATOR, status); assertEquals(2, handler.getMyProjectsSummary(user1.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user2.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user3.getEmail()).size()); assertEquals(2, handler.getBUProjectsSummary(user1.getDepartment()).size()); assertEquals(1, handler.getBUProjectsSummary(user2.getDepartment()).size()); assertEquals(2, handler.getBUProjectsSummary(user3.getDepartment()).size()); assertEquals(3, handler.getAccessibleProjectsSummary(user1).size()); assertEquals(1, handler.getAccessibleProjectsSummary(user2).size()); assertEquals(2, handler.getAccessibleProjectsSummary(user3).size()); boolean deleted = (handler.getProjectById("P3", user3) == null); assertEquals(false, deleted); } @Test public void testDeleteProject3_2() throws Exception { when(moderator.deleteProject(any(Project.class), eq(user2))).thenReturn(RequestStatus.SENT_TO_MODERATOR); RequestStatus status = handler.deleteProject("P3", user2); assertEquals(RequestStatus.SENT_TO_MODERATOR, status); assertEquals(2, handler.getMyProjectsSummary(user1.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user2.getEmail()).size()); assertEquals(1, handler.getMyProjectsSummary(user3.getEmail()).size()); assertEquals(2, handler.getBUProjectsSummary(user1.getDepartment()).size()); assertEquals(1, handler.getBUProjectsSummary(user2.getDepartment()).size()); assertEquals(2, handler.getBUProjectsSummary(user3.getDepartment()).size()); assertEquals(3, handler.getAccessibleProjectsSummary(user1).size()); assertEquals(1, handler.getAccessibleProjectsSummary(user2).size()); assertEquals(2, handler.getAccessibleProjectsSummary(user3).size()); boolean deleted = (handler.getProjectById("P3", user3) == null); assertEquals(false, deleted); } @Ignore("One is no longer able to create duplicate projects in the db") public void testDuplicateProjectIsFound() throws Exception { String originalProjectId = "P1"; final Project tmp = handler.getProjectById(originalProjectId, user1); tmp.unsetId(); tmp.unsetRevision(); String newProjectId = handler.addProject(tmp, user1).getId(); final Map<String, List<String>> duplicateProjects = handler.getDuplicateProjects(); assertThat(duplicateProjects.size(), is(1)); assertThat(duplicateProjects.get(printName(tmp)), containsInAnyOrder(newProjectId,originalProjectId)); } }