Skip to content

Commit a4a8d6f

Browse files
committed
JIRA-68: Filter id format is not consistent between bidimensional grid macro and other macros
* Ensure that all charts macro can use any filter id format
1 parent 95b7de4 commit a4a8d6f

File tree

6 files changed

+252
-4
lines changed

6 files changed

+252
-4
lines changed

jira-macro/jira-macro-charts/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<packaging>jar</packaging>
3333
<description>Display charts reusing JIRA statistics</description>
3434
<properties>
35-
<xwiki.jacoco.instructionRatio>0.15</xwiki.jacoco.instructionRatio>
35+
<xwiki.jacoco.instructionRatio>0.43</xwiki.jacoco.instructionRatio>
3636
<!-- Name to display by the Extension Manager -->
3737
<xwiki.extension.name>JIRA Charts Macros</xwiki.extension.name>
3838
<!-- The extension's category -->

jira-macro/jira-macro-charts/src/main/java/org/xwiki/contrib/jira/charts/internal/AbstractJIRAChartDataFetcher.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
public abstract class AbstractJIRAChartDataFetcher<T extends AbstractChartMacroParameters,
4848
U extends AbstractJIRADataSource> implements JIRAChartDataFetcher<T, U>
4949
{
50+
private static final String FILTER_ID_PREFIX = "filter-";
51+
5052
@Inject
5153
private JIRAURLHelper urlHelper;
5254

@@ -59,11 +61,10 @@ public abstract class AbstractJIRAChartDataFetcher<T extends AbstractChartMacroP
5961
@Override
6062
public U fetch(T parameters, Class<U> expectedType) throws MacroExecutionException
6163
{
62-
List<NameValuePair> parametersList = new ArrayList<NameValuePair>();
64+
List<NameValuePair> parametersList = new ArrayList<>();
6365

64-
// TODO: check format of filterId
6566
if (!StringUtils.isEmpty(parameters.getFilterId())) {
66-
parametersList.add(new BasicNameValuePair("filterId", parameters.getFilterId()));
67+
parametersList.add(handleFilterIdParameter(parameters.getFilterId()));
6768
} else {
6869
parametersList.add(new BasicNameValuePair("jql", parameters.getQuery()));
6970
}
@@ -79,6 +80,36 @@ public U fetch(T parameters, Class<U> expectedType) throws MacroExecutionExcepti
7980
}
8081
}
8182

83+
/**
84+
* Define the format of the filter ID value to be given to JIRA REST API. It accepts sometimes {@code filter
85+
* -XXX} and sometimes only {@code XXX}.
86+
*
87+
* @param providedFilterId the provided value
88+
* @param shoudUsePrefix {@code true} if {@code filter-} prefix is needed and should be added if missing, {@code
89+
* false} to remove that prefix if provided
90+
* @return the filter value to use in calls.
91+
*/
92+
public String computeFilterIdFormat(String providedFilterId, boolean shoudUsePrefix)
93+
{
94+
if (shoudUsePrefix && !providedFilterId.startsWith(FILTER_ID_PREFIX)) {
95+
return FILTER_ID_PREFIX + providedFilterId;
96+
} else if (!shoudUsePrefix && providedFilterId.startsWith(FILTER_ID_PREFIX)) {
97+
return providedFilterId.substring(FILTER_ID_PREFIX.length());
98+
} else {
99+
return providedFilterId;
100+
}
101+
}
102+
103+
/**
104+
* Define how to handle the filterId value.
105+
* @param filterIdValue the value given by the user
106+
* @return the {@link NameValuePair} used to perform the REST call.
107+
*/
108+
public NameValuePair handleFilterIdParameter(String filterIdValue)
109+
{
110+
return new BasicNameValuePair("filterId", computeFilterIdFormat(filterIdValue, false));
111+
}
112+
82113
/**
83114
* @return the type of requested gadget.
84115
*/

jira-macro/jira-macro-charts/src/main/java/org/xwiki/contrib/jira/charts/internal/bidimensionalgrid/JIRABiDimensionalGridChartDataFetcher.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,10 @@ public List<NameValuePair> getCustomQueryParameters(JIRABiDimensionalGridChartMa
6363
result.add(new BasicNameValuePair("numberToShow", String.valueOf(parameters.getNumberOfResults())));
6464
return result;
6565
}
66+
67+
@Override
68+
public NameValuePair handleFilterIdParameter(String filterIdValue)
69+
{
70+
return new BasicNameValuePair("filterId", computeFilterIdFormat(filterIdValue, true));
71+
}
6672
}

jira-macro/jira-macro-charts/src/main/java/org/xwiki/contrib/jira/charts/internal/createdvsresolved/JIRACreatedVsResolvedDataFetcher.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,10 @@ public List<NameValuePair> getCustomQueryParameters(JIRACreatedVsResolvedMacroPa
7171
}
7272
return result;
7373
}
74+
75+
@Override
76+
public NameValuePair handleFilterIdParameter(String filterIdValue)
77+
{
78+
return new BasicNameValuePair("jql", String.format("filter=%s", computeFilterIdFormat(filterIdValue, false)));
79+
}
7480
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*
2+
* See the NOTICE file distributed with this work for additional
3+
* information regarding copyright ownership.
4+
*
5+
* This is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU Lesser General Public License as
7+
* published by the Free Software Foundation; either version 2.1 of
8+
* the License, or (at your option) any later version.
9+
*
10+
* This software is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13+
* Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public
16+
* License along with this software; if not, write to the Free
17+
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18+
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19+
*/
20+
package org.xwiki.contrib.jira.charts.internal.bidimensionalgrid;
21+
22+
import java.util.List;
23+
24+
import org.apache.http.NameValuePair;
25+
import org.apache.http.message.BasicNameValuePair;
26+
import org.junit.jupiter.api.Test;
27+
import org.mockito.Mock;
28+
import org.xwiki.contrib.jira.charts.bidimensionalgrid.JIRABiDimensionalGridChartMacroParameter;
29+
import org.xwiki.contrib.jira.charts.bidimensionalgrid.JIRAField;
30+
import org.xwiki.contrib.jira.charts.internal.bidimensionalgrid.source.JIRABiDimensionalGridChartJIRADataSource;
31+
import org.xwiki.contrib.jira.config.JIRAServer;
32+
import org.xwiki.contrib.jira.macro.internal.HTTPJIRAFetcher;
33+
import org.xwiki.contrib.jira.macro.internal.JIRAURLHelper;
34+
import org.xwiki.contrib.jira.macro.internal.source.JIRAServerResolver;
35+
import org.xwiki.test.junit5.mockito.ComponentTest;
36+
import org.xwiki.test.junit5.mockito.InjectMockComponents;
37+
import org.xwiki.test.junit5.mockito.MockComponent;
38+
39+
import static org.junit.jupiter.api.Assertions.*;
40+
import static org.mockito.ArgumentMatchers.any;
41+
import static org.mockito.Mockito.mock;
42+
import static org.mockito.Mockito.verify;
43+
import static org.mockito.Mockito.when;
44+
45+
/**
46+
* Tests for {@link JIRABiDimensionalGridChartDataFetcher}.
47+
*
48+
* @version $Id$
49+
*/
50+
@ComponentTest
51+
class JIRABiDimensionalGridChartDataFetcherTest
52+
{
53+
@InjectMockComponents
54+
private JIRABiDimensionalGridChartDataFetcher dataFetcher;
55+
56+
@MockComponent
57+
private JIRAURLHelper urlHelper;
58+
59+
@MockComponent
60+
private HTTPJIRAFetcher httpjiraFetcher;
61+
62+
@MockComponent
63+
private JIRAServerResolver jiraServerResolver;
64+
65+
@Mock
66+
JIRAServer jiraServer;
67+
68+
@Test
69+
void fetch() throws Exception
70+
{
71+
JIRABiDimensionalGridChartMacroParameter parameters = new JIRABiDimensionalGridChartMacroParameter();
72+
parameters.setId("myjira");
73+
parameters.setFilterId("43434");
74+
parameters.setxAxisField(JIRAField.STATUS);
75+
parameters.setyAxisField(JIRAField.ASSIGNEE);
76+
parameters.setSortNatural(true);
77+
parameters.setNumberOfResults(21);
78+
parameters.setSortAscending(false);
79+
80+
when(this.jiraServerResolver.resolve(any())).thenReturn(this.jiraServer);
81+
List<NameValuePair> expectedParameters = List.of(
82+
new BasicNameValuePair("filterId", "filter-43434"),
83+
new BasicNameValuePair("xstattype", "statuses"),
84+
new BasicNameValuePair("ystattype", "assignees"),
85+
new BasicNameValuePair("sortDirection", "desc"),
86+
new BasicNameValuePair("sortBy", "natural"),
87+
new BasicNameValuePair("numberToShow", "21")
88+
);
89+
90+
when(this.urlHelper.getChartURL(any(), any(), any())).thenReturn("myurl");
91+
92+
JIRABiDimensionalGridChartJIRADataSource expectedResult = mock(JIRABiDimensionalGridChartJIRADataSource.class);
93+
when(this.httpjiraFetcher.fetchJSON("myurl", this.jiraServer, JIRABiDimensionalGridChartJIRADataSource.class))
94+
.thenReturn(expectedResult);
95+
96+
assertSame(expectedResult, this.dataFetcher.fetch(parameters, JIRABiDimensionalGridChartJIRADataSource.class));
97+
verify(this.urlHelper).getChartURL(jiraServer, JIRAURLHelper.GadgetType.BIDIMENSIONAL_CHARTS,
98+
expectedParameters);
99+
100+
}
101+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
* See the NOTICE file distributed with this work for additional
3+
* information regarding copyright ownership.
4+
*
5+
* This is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU Lesser General Public License as
7+
* published by the Free Software Foundation; either version 2.1 of
8+
* the License, or (at your option) any later version.
9+
*
10+
* This software is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13+
* Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public
16+
* License along with this software; if not, write to the Free
17+
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18+
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19+
*/
20+
package org.xwiki.contrib.jira.charts.internal.createdvsresolved;
21+
22+
import java.util.List;
23+
24+
import org.apache.http.NameValuePair;
25+
import org.apache.http.message.BasicNameValuePair;
26+
import org.junit.jupiter.api.Test;
27+
import org.mockito.Mock;
28+
import org.xwiki.contrib.jira.charts.createdvsresolved.ChartPeriod;
29+
import org.xwiki.contrib.jira.charts.createdvsresolved.DisplayVersion;
30+
import org.xwiki.contrib.jira.charts.createdvsresolved.JIRACreatedVsResolvedMacroParameters;
31+
import org.xwiki.contrib.jira.charts.internal.createdvsresolved.source.JIRACreatedVsResolvedDataSource;
32+
import org.xwiki.contrib.jira.config.JIRAServer;
33+
import org.xwiki.contrib.jira.macro.internal.HTTPJIRAFetcher;
34+
import org.xwiki.contrib.jira.macro.internal.JIRAURLHelper;
35+
import org.xwiki.contrib.jira.macro.internal.source.JIRAServerResolver;
36+
import org.xwiki.test.junit5.mockito.ComponentTest;
37+
import org.xwiki.test.junit5.mockito.InjectMockComponents;
38+
import org.xwiki.test.junit5.mockito.MockComponent;
39+
40+
import static org.junit.jupiter.api.Assertions.*;
41+
import static org.mockito.ArgumentMatchers.any;
42+
import static org.mockito.Mockito.mock;
43+
import static org.mockito.Mockito.verify;
44+
import static org.mockito.Mockito.when;
45+
46+
/**
47+
* Tests for {@link JIRACreatedVsResolvedDataFetcher}.
48+
*
49+
* @version $Id$
50+
*/
51+
@ComponentTest
52+
class JIRACreatedVsResolvedDataFetcherTest
53+
{
54+
@InjectMockComponents
55+
private JIRACreatedVsResolvedDataFetcher dataFetcher;
56+
57+
@MockComponent
58+
private JIRAURLHelper urlHelper;
59+
60+
@MockComponent
61+
private HTTPJIRAFetcher httpjiraFetcher;
62+
63+
@MockComponent
64+
private JIRAServerResolver jiraServerResolver;
65+
66+
@Mock
67+
JIRAServer jiraServer;
68+
69+
@Test
70+
void fetch() throws Exception
71+
{
72+
JIRACreatedVsResolvedMacroParameters parameters = new JIRACreatedVsResolvedMacroParameters();
73+
parameters.setId("myjira");
74+
parameters.setFilterId("filter-43434");
75+
parameters.setCount(true);
76+
parameters.setDaysPreviously(23);
77+
parameters.setPeriod(ChartPeriod.HOURLY);
78+
parameters.setDisplayTrend(true);
79+
parameters.setDisplayVersion(DisplayVersion.ONLY_MAJOR);
80+
81+
when(this.jiraServerResolver.resolve(any())).thenReturn(this.jiraServer);
82+
List<NameValuePair> expectedParameters = List.of(
83+
new BasicNameValuePair("jql", "filter=43434"),
84+
new BasicNameValuePair("field", "created"),
85+
new BasicNameValuePair("field", "resolved"),
86+
new BasicNameValuePair("field", "unresolvedTrend"),
87+
new BasicNameValuePair("period", "hourly"),
88+
new BasicNameValuePair("operation", "count"),
89+
new BasicNameValuePair("daysprevious", "23"),
90+
new BasicNameValuePair("includeVersions", "true")
91+
);
92+
93+
when(this.urlHelper.getChartURL(any(), any(), any())).thenReturn("myurl");
94+
95+
JIRACreatedVsResolvedDataSource expectedResult = mock(JIRACreatedVsResolvedDataSource.class);
96+
when(this.httpjiraFetcher.fetchJSON("myurl", this.jiraServer, JIRACreatedVsResolvedDataSource.class))
97+
.thenReturn(expectedResult);
98+
99+
assertSame(expectedResult, this.dataFetcher.fetch(parameters, JIRACreatedVsResolvedDataSource.class));
100+
verify(this.urlHelper).getChartURL(jiraServer, JIRAURLHelper.GadgetType.CREATED_VS_RESOLVED,
101+
expectedParameters);
102+
103+
}
104+
}

0 commit comments

Comments
 (0)