/*
* Sonar Mantis Plugin
* Copyright (C) 2011 Jérémie Lagarde
* dev@sonar.codehaus.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
*/
package org.sonar.plugins.mantis;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.math.BigInteger;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.configuration.MapConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.mockito.internal.stubbing.answers.CallsRealMethods;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.measures.Measure;
import org.sonar.api.measures.Metric;
import org.sonar.api.resources.Project;
import org.sonar.api.resources.Resource;
import org.sonar.plugins.mantis.soap.MantisSoapService;
import biz.futureware.mantis.rpc.soap.client.AccountData;
import biz.futureware.mantis.rpc.soap.client.FilterData;
import biz.futureware.mantis.rpc.soap.client.IssueData;
import biz.futureware.mantis.rpc.soap.client.MantisConnectLocator;
import biz.futureware.mantis.rpc.soap.client.MantisConnectPortType;
import biz.futureware.mantis.rpc.soap.client.ObjectRef;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
/**
* @author Jeremie Lagarde
* @since 0.1
*/
public class MantisSensorTest {
private MantisSensor sensor;
@Before
public void setUp() throws Exception {
final MantisSoapService service = new MantisSoapService(null) {
@Override
protected MantisConnectLocator createMantisConnectLocator() {
MantisConnectLocator locator = mock(MantisConnectLocator.class);
MantisConnectPortType portType = mock(MantisConnectPortType.class);
String[] status = new String[] { "new", "feedback", "acknowledged", "confirmed", "assigned", "resolved", "validated", "closed" };
String[] priorities = new String[] { "low", "normal", "high", "urgent", "immediate" };
String[] users = new String[] { "user1", "user2", "user3", "user4", "user5", "user6", "user7", "user8", "user9", "user10",
"user11", "user12", "user13", "user14", "user15", "user16", "user17", "user18", "user19", "user20" };
try {
List<IssueData> issues = new ArrayList<IssueData>();
for (int i = 0; i < 1000; i++) {
IssueData issue = new IssueData();
issue.setId(BigInteger.valueOf(i + 1));
issue.setPriority(new ObjectRef(BigInteger.valueOf(i% 5), priorities[i% 5]));
issue.setStatus(new ObjectRef(BigInteger.valueOf(i % 8), status[i % 8]));
issue.setHandler(new AccountData(BigInteger.valueOf(i % 20), users[i % 20], users[i % 20], users[i % 20] + "@gmail.com"));
issues.add(issue);
}
FilterData filter = new FilterData(BigInteger.ONE, null, BigInteger.ONE, true, "current-version", "", "");
when(locator.getMantisConnectPort()).thenReturn(portType);
when(portType.mc_project_get_id_from_name("jer", "pwd", "myproject")).thenReturn(BigInteger.ONE);
when(portType.mc_filter_get("jer", "pwd", BigInteger.ONE)).thenReturn(new FilterData[] { filter });
when(portType.mc_filter_get_issues("jer", "pwd", BigInteger.ONE, filter.getId(), BigInteger.ONE, BigInteger.valueOf(50)))
.thenReturn((IssueData[])issues.toArray(new IssueData[issues.size()]));
} catch (Exception e) {
fail();
}
return locator;
}
};
sensor = new MantisSensor() {
protected MantisSoapService createMantisSoapService() throws RemoteException {
return service;
}
};
}
@Test
public void testAnalyse() {
SensorContext context = mock(MockSensorContext.class, new CallsRealMethods());
Project project = mock(Project.class);
Map<String, String> config = new HashMap<String, String>();
config.put(MantisPlugin.SERVER_URL_PROPERTY, "http://localhost:1234/mantis/");
config.put(MantisPlugin.USERNAME_PROPERTY, "jer");
config.put(MantisPlugin.PASSWORD_PROPERTY, "pwd");
config.put(MantisPlugin.PROJECTNAME_PROPERTY, "myproject");
config.put(MantisPlugin.FILTER_PROPERTY, "current-version");
when(project.getConfiguration()).thenReturn(new MapConfiguration(config));
sensor.analyse(project, context);
assertThat(context.getMeasure(MantisMetrics.PRIORITIES).getValue(), is(Double.valueOf(1000)));
assertThat(context.getMeasure(MantisMetrics.PRIORITIES).getData(), is("low=200;normal=200;high=200;urgent=200;immediate=200"));
assertThat(context.getMeasure(MantisMetrics.STATUS).getValue(), is(Double.valueOf(1000)));
assertThat(context.getMeasure(MantisMetrics.STATUS).getData(), is("new=125;feedback=125;acknowledged=125;confirmed=125;assigned=125;resolved=125;validated=125;closed=125"));
assertThat(context.getMeasure(MantisMetrics.DEVELOPERS).getValue(), is(Double.valueOf(1000)));
assertThat(context.getMeasure(MantisMetrics.DEVELOPERS).getData(), is("user1=50;user10=50;user11=50;user12=50;user13=50;user14=50;user15=50;user16=50;user17=50;user18=50;user19=50;user2=50;user20=50;user3=50;user4=50;user5=50;user6=50;user7=50;user8=50;user9=50"));
}
abstract class MockSensorContext implements SensorContext {
Multimap<Resource, Measure> measures;
private Multimap<Resource, Measure> getMeasures() {
if (measures == null) {
measures = ArrayListMultimap.create();
}
return measures;
}
public Measure saveMeasure(Resource resource, Measure measure) {
getMeasures().put(resource, measure);
return measure;
}
public Measure saveMeasure(Measure measure) {
getMeasures().put(null, measure);
return measure;
}
public Measure saveMeasure(Metric metric, Double value) {
return saveMeasure(new Measure(metric, value));
}
public Measure getMeasure(Resource resource, Metric metric) {
for (Measure measure : getMeasures().get(resource)) {
if (measure.getMetric().equals(metric))
return measure;
}
return null;
}
public Measure getMeasure(Metric metric) {
return getMeasure(null, metric);
}
}
}