/*
* 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.portal.portlets;
import com.google.common.collect.SetMultimap;
import org.eclipse.sw360.datahandler.thrift.RequestStatus;
import org.eclipse.sw360.datahandler.thrift.ThriftClients;
import org.eclipse.sw360.datahandler.thrift.attachments.Attachment;
import org.eclipse.sw360.datahandler.thrift.components.ComponentService;
import org.eclipse.sw360.datahandler.thrift.components.Release;
import org.eclipse.sw360.datahandler.thrift.projects.Project;
import org.eclipse.sw360.datahandler.thrift.projects.ProjectRelationship;
import org.eclipse.sw360.datahandler.thrift.projects.ProjectService;
import org.eclipse.sw360.datahandler.thrift.users.User;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import javax.portlet.PortletException;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import java.io.IOException;
import java.util.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class FossologyAwarePortletTest extends TestCase {
@Mock
private ComponentService.Iface componentClient;
@Mock
private ProjectService.Iface projectClient;
@Mock
private ThriftClients thriftClients;
@Mock
private User user;
private final Map<String, Release> releaseMap = new HashMap<>();
private final Map<String, Project> projectMap = new HashMap<>();
Project p1;
Project p2;
Project p3;
Release r1;
Release r2;
Release r3;
Release r4;
FossologyAwarePortlet fossologyAwarePortlet;
@Before
@SuppressWarnings("unchecked")
public void setUp() throws Exception {
r1 = new Release().setId("r1").setName("r1");
r2 = new Release().setId("r2").setName("r2");
r3 = new Release().setId("r3").setName("r3");
r4 = new Release().setId("r4").setName("r4");
releaseMap.put(r1.getId(),r1);
releaseMap.put(r2.getId(),r2);
releaseMap.put(r3.getId(),r3);
releaseMap.put(r4.getId(),r4);
Map<String, String> releaseUsageMap1 = new HashMap<>();
releaseUsageMap1.put(r1.getId(), "Important r1");
releaseUsageMap1.put(r2.getId(), "More important r2");
Map<String, String> releaseUsageMap2 = new HashMap<>();
releaseUsageMap2.put(r1.getId(), "Important r1");
releaseUsageMap2.put( r3.getId(), "More r3");
Map<String, String> releaseUsageMap3 = new HashMap<>();
releaseUsageMap3.put(r2.getId(), "r2 is cool");
releaseUsageMap3.put(r4.getId(), "r4 is cooler" );
p1 = new Project().setReleaseIdToUsage(releaseUsageMap1).setId("p1");
p2 = new Project().setReleaseIdToUsage(releaseUsageMap2).setId("p2");
p3 = new Project().setReleaseIdToUsage(releaseUsageMap3).setId("p3");
projectMap.put(p1.getId(),p1);
projectMap.put(p2.getId(),p2);
projectMap.put(p3.getId(),p3);
Map<String, ProjectRelationship> projectRelationshipMap1 = new HashMap<>();
projectRelationshipMap1.put(p2.getId(), ProjectRelationship.CONTAINED);
projectRelationshipMap1.put(p3.getId(), ProjectRelationship.DUPLICATE);
Map<String, ProjectRelationship> projectRelationshipMap2 = new HashMap<>();
projectRelationshipMap2.put(p1.getId(), ProjectRelationship.DUPLICATE);
projectRelationshipMap2.put(p3.getId(), ProjectRelationship.REFERRED);
Map<String, ProjectRelationship> projectRelationshipMap3 = new HashMap<>();
projectRelationshipMap3.put(p1.getId(), ProjectRelationship.DUPLICATE);
projectRelationshipMap3.put(p2.getId(), ProjectRelationship.REFERRED);
p1.setLinkedProjects(projectRelationshipMap1);
p2.setLinkedProjects(projectRelationshipMap2);
p3.setLinkedProjects(projectRelationshipMap3);
when(thriftClients.makeComponentClient() ).thenReturn(componentClient);
when(thriftClients.makeProjectClient() ).thenReturn(projectClient);
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
String id = (String) arguments[0];
return releaseMap.get(id);
}
}).when(componentClient).getReleaseById(anyString(), any(User.class));
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
Set<String> ids = (Set) arguments[0];
User user1 = (User) arguments[1];
List<Release> releaseList = new ArrayList<>();
for (String id : ids) {
releaseList.add(componentClient.getReleaseById(id, user1));
}
return releaseList;
}
}).when(componentClient).getReleasesById(any(Set.class), any(User.class));
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
String id = (String) arguments[0];
return projectMap.get(id);
}
}).when(projectClient).getProjectById(anyString(), any(User.class));
fossologyAwarePortlet = new FossologyAwarePortlet(thriftClients) {
@Override
protected Set<Attachment> getAttachments(String documentId, String documentType, User user) {
return null;
}
@Override
protected void dealWithFossologyAction(ResourceRequest request, ResourceResponse response, String action) throws IOException, PortletException {
}
};
}
@After
public void tearDown() throws Exception {
}
@Test
public void testReleaseIdToProjects() throws Exception {
SetMultimap<String, Project> releaseIdToProjects = fossologyAwarePortlet.releaseIdToProjects(p1, user);
Set<String> releaseIds = releaseIdToProjects.keySet();
assertThat(releaseIds, containsInAnyOrder("r1", "r2","r3","r4"));
assertThat(releaseIdToProjects.get("r1"), containsInAnyOrder(p1,p2));
assertThat(releaseIdToProjects.get("r2"), containsInAnyOrder(p1,p3));
assertThat(releaseIdToProjects.get("r3"), containsInAnyOrder(p2));
assertThat(releaseIdToProjects.get("r4"), containsInAnyOrder(p3));
}
@Test
public void testReleaseIdToEmptyProjects() throws Exception {
SetMultimap<String, Project> releaseIdToProjects = fossologyAwarePortlet.releaseIdToProjects(new Project().setId("p4"), user);
Set<String> releaseIds = releaseIdToProjects.keySet();
assertTrue("Release IDs size", releaseIds.size() == 0);
}
}