Skip to content

Commit ab98e01

Browse files
test: fill in unit test coverage for DataExportParams validation predicates (#24469)
* test: fill in unit test coverage for DataExportParams validation predicates Follow-up from DHIS2-21821 / PR #24465. Before that fix, DataExportParams had no direct unit tests for any of its validation predicates, which is likely how the lastUpdated/lastUpdatedDuration branches were silently dropped from hasPeriodFilters() during the 2.43 SQL-export rewrite (#22406) without any test catching it. Coverage existed only indirectly via slow integration tests asserting the resulting ErrorCode. Adds direct unit tests for every branch of hasDataElementFilters, hasOrgUnitFilters, isExactOrgUnitsFilter, isPeriodOverSpecified, isDateRangeOutOfBounds, isLimitOutOfBounds, isOrgUnitGroupsOverSpecified, plus the previously-untested true-branches of hasPeriodFilters itself (periods, periodTypes, startDate+endDate, includedDate). Verified isPeriodOverSpecified and isDateRangeOutOfBounds tests aren't vacuous by temporarily dropping a conjunct from each in production code, confirming the corresponding _OnlyFalse test caught it, then restoring (net diff to DataExportParams.java is zero). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * test: cover startDate == endDate boundary for isDateRangeOutOfBounds Date.after() is strict (>), so a single-instant/single-day range (startDate == endDate) is currently treated as valid, not out of bounds. This boundary — the exact line between valid and invalid — wasn't covered by the earlier StartBeforeEndFalse/StartAfterEndTrue tests. Verified via mutation testing: swapped the strict startDate.after(endDate) check for an inclusive !startDate.before(endDate) in DataExportParams, confirmed only the new test failed (all 33 others stayed green), then restored (net diff to DataExportParams.java is zero). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
1 parent 6f686b3 commit ab98e01

1 file changed

Lines changed: 241 additions & 0 deletions

File tree

dhis-2/dhis-api/src/test/java/org/hisp/dhis/datavalue/DataExportParamsTest.java

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434

3535
import java.time.Duration;
3636
import java.util.Date;
37+
import java.util.List;
38+
import java.util.Set;
39+
import org.hisp.dhis.common.UID;
40+
import org.hisp.dhis.period.MonthlyPeriodType;
41+
import org.hisp.dhis.period.Period;
3742
import org.junit.jupiter.api.Test;
3843

3944
class DataExportParamsTest {
@@ -58,6 +63,44 @@ void testHasPeriodFilters_LastUpdatedAloneIsNotAPeriodFilter() {
5863
assertFalse(params.hasPeriodFilters());
5964
}
6065

66+
@Test
67+
void testHasPeriodFilters_PeriodsTrue() {
68+
DataExportParams params =
69+
DataExportParams.builder().periods(List.of(Period.of("202201"))).build();
70+
71+
assertTrue(params.hasPeriodFilters());
72+
}
73+
74+
@Test
75+
void testHasPeriodFilters_PeriodTypesTrue() {
76+
DataExportParams params =
77+
DataExportParams.builder().periodTypes(Set.of(new MonthlyPeriodType())).build();
78+
79+
assertTrue(params.hasPeriodFilters());
80+
}
81+
82+
@Test
83+
void testHasPeriodFilters_StartAndEndDateTrue() {
84+
DataExportParams params =
85+
DataExportParams.builder().startDate(new Date(0)).endDate(new Date(1)).build();
86+
87+
assertTrue(params.hasPeriodFilters());
88+
}
89+
90+
@Test
91+
void testHasPeriodFilters_StartDateAloneFalse() {
92+
DataExportParams params = DataExportParams.builder().startDate(new Date(0)).build();
93+
94+
assertFalse(params.hasPeriodFilters());
95+
}
96+
97+
@Test
98+
void testHasPeriodFilters_IncludedDateTrue() {
99+
DataExportParams params = DataExportParams.builder().includedDate(new Date()).build();
100+
101+
assertTrue(params.hasPeriodFilters());
102+
}
103+
61104
@Test
62105
void testHasLastUpdatedFilters_NoFiltersFalse() {
63106
DataExportParams params = DataExportParams.builder().build();
@@ -79,4 +122,202 @@ void testHasLastUpdatedFilters_LastUpdatedTrue() {
79122

80123
assertTrue(params.hasLastUpdatedFilters());
81124
}
125+
126+
@Test
127+
void testHasDataElementFilters_NoFiltersFalse() {
128+
DataExportParams params = DataExportParams.builder().build();
129+
130+
assertFalse(params.hasDataElementFilters());
131+
}
132+
133+
@Test
134+
void testHasDataElementFilters_DataSetsTrue() {
135+
DataExportParams params = DataExportParams.builder().dataSets(List.of(UID.generate())).build();
136+
137+
assertTrue(params.hasDataElementFilters());
138+
}
139+
140+
@Test
141+
void testHasDataElementFilters_DataElementsTrue() {
142+
DataExportParams params =
143+
DataExportParams.builder().dataElements(List.of(UID.generate())).build();
144+
145+
assertTrue(params.hasDataElementFilters());
146+
}
147+
148+
@Test
149+
void testHasDataElementFilters_DataElementGroupsTrue() {
150+
DataExportParams params =
151+
DataExportParams.builder().dataElementGroups(List.of(UID.generate())).build();
152+
153+
assertTrue(params.hasDataElementFilters());
154+
}
155+
156+
@Test
157+
void testHasOrgUnitFilters_NoFiltersFalse() {
158+
DataExportParams params = DataExportParams.builder().build();
159+
160+
assertFalse(params.hasOrgUnitFilters());
161+
}
162+
163+
@Test
164+
void testHasOrgUnitFilters_OrganisationUnitsTrue() {
165+
DataExportParams params =
166+
DataExportParams.builder().organisationUnits(List.of(UID.generate())).build();
167+
168+
assertTrue(params.hasOrgUnitFilters());
169+
}
170+
171+
@Test
172+
void testHasOrgUnitFilters_OrganisationUnitGroupsTrue() {
173+
DataExportParams params =
174+
DataExportParams.builder().organisationUnitGroups(List.of(UID.generate())).build();
175+
176+
assertTrue(params.hasOrgUnitFilters());
177+
}
178+
179+
@Test
180+
void testIsExactOrgUnitsFilter_OrgUnitsOnlyTrue() {
181+
DataExportParams params =
182+
DataExportParams.builder().organisationUnits(List.of(UID.generate())).build();
183+
184+
assertTrue(params.isExactOrgUnitsFilter());
185+
}
186+
187+
@Test
188+
void testIsExactOrgUnitsFilter_NoOrgUnitsFalse() {
189+
DataExportParams params = DataExportParams.builder().build();
190+
191+
assertFalse(params.isExactOrgUnitsFilter());
192+
}
193+
194+
@Test
195+
void testIsExactOrgUnitsFilter_IncludeDescendantsFalse() {
196+
DataExportParams params =
197+
DataExportParams.builder()
198+
.organisationUnits(List.of(UID.generate()))
199+
.includeDescendants(true)
200+
.build();
201+
202+
assertFalse(params.isExactOrgUnitsFilter());
203+
}
204+
205+
@Test
206+
void testIsExactOrgUnitsFilter_OrgUnitGroupsAlsoSetFalse() {
207+
DataExportParams params =
208+
DataExportParams.builder()
209+
.organisationUnits(List.of(UID.generate()))
210+
.organisationUnitGroups(List.of(UID.generate()))
211+
.build();
212+
213+
assertFalse(params.isExactOrgUnitsFilter());
214+
}
215+
216+
@Test
217+
void testIsPeriodOverSpecified_PeriodsAndStartEndDateTrue() {
218+
DataExportParams params =
219+
DataExportParams.builder()
220+
.periods(List.of(Period.of("202201")))
221+
.startDate(new Date(0))
222+
.endDate(new Date(1))
223+
.build();
224+
225+
assertTrue(params.isPeriodOverSpecified());
226+
}
227+
228+
@Test
229+
void testIsPeriodOverSpecified_PeriodsOnlyFalse() {
230+
DataExportParams params =
231+
DataExportParams.builder().periods(List.of(Period.of("202201"))).build();
232+
233+
assertFalse(params.isPeriodOverSpecified());
234+
}
235+
236+
@Test
237+
void testIsPeriodOverSpecified_StartEndDateOnlyFalse() {
238+
DataExportParams params =
239+
DataExportParams.builder().startDate(new Date(0)).endDate(new Date(1)).build();
240+
241+
assertFalse(params.isPeriodOverSpecified());
242+
}
243+
244+
@Test
245+
void testIsDateRangeOutOfBounds_StartAfterEndTrue() {
246+
DataExportParams params =
247+
DataExportParams.builder().startDate(new Date(1)).endDate(new Date(0)).build();
248+
249+
assertTrue(params.isDateRangeOutOfBounds());
250+
}
251+
252+
@Test
253+
void testIsDateRangeOutOfBounds_StartBeforeEndFalse() {
254+
DataExportParams params =
255+
DataExportParams.builder().startDate(new Date(0)).endDate(new Date(1)).build();
256+
257+
assertFalse(params.isDateRangeOutOfBounds());
258+
}
259+
260+
@Test
261+
void testIsDateRangeOutOfBounds_StartDateOnlyFalse() {
262+
DataExportParams params = DataExportParams.builder().startDate(new Date(1)).build();
263+
264+
assertFalse(params.isDateRangeOutOfBounds());
265+
}
266+
267+
@Test
268+
void testIsDateRangeOutOfBounds_StartEqualsEndFalse() {
269+
// Date.after() is strict (>), so a single-instant/single-day range (start == end) is a valid,
270+
// zero-width range, not an error.
271+
DataExportParams params =
272+
DataExportParams.builder().startDate(new Date(1)).endDate(new Date(1)).build();
273+
274+
assertFalse(params.isDateRangeOutOfBounds());
275+
}
276+
277+
@Test
278+
void testIsLimitOutOfBounds_NegativeTrue() {
279+
DataExportParams params = DataExportParams.builder().limit(-1).build();
280+
281+
assertTrue(params.isLimitOutOfBounds());
282+
}
283+
284+
@Test
285+
void testIsLimitOutOfBounds_ZeroFalse() {
286+
DataExportParams params = DataExportParams.builder().limit(0).build();
287+
288+
assertFalse(params.isLimitOutOfBounds());
289+
}
290+
291+
@Test
292+
void testIsLimitOutOfBounds_NullFalse() {
293+
DataExportParams params = DataExportParams.builder().build();
294+
295+
assertFalse(params.isLimitOutOfBounds());
296+
}
297+
298+
@Test
299+
void testIsOrgUnitGroupsOverSpecified_GroupsAndDescendantsTrue() {
300+
DataExportParams params =
301+
DataExportParams.builder()
302+
.organisationUnitGroups(List.of(UID.generate()))
303+
.includeDescendants(true)
304+
.build();
305+
306+
assertTrue(params.isOrgUnitGroupsOverSpecified());
307+
}
308+
309+
@Test
310+
void testIsOrgUnitGroupsOverSpecified_GroupsWithoutDescendantsFalse() {
311+
DataExportParams params =
312+
DataExportParams.builder().organisationUnitGroups(List.of(UID.generate())).build();
313+
314+
assertFalse(params.isOrgUnitGroupsOverSpecified());
315+
}
316+
317+
@Test
318+
void testIsOrgUnitGroupsOverSpecified_DescendantsWithoutGroupsFalse() {
319+
DataExportParams params = DataExportParams.builder().includeDescendants(true).build();
320+
321+
assertFalse(params.isOrgUnitGroupsOverSpecified());
322+
}
82323
}

0 commit comments

Comments
 (0)