Skip to content

Commit e3c4774

Browse files
committed
XWIKI-23355: Use query limits
* Increase the existing query limit in the security configuration. * Use the query limit in all REST services that concern several pages or the page history (so only results from a single document are still unlimited). * Add lots of tests for the REST query endpoints. * Enforce the limit in the Solr search and search suggestions, LiveTable results and document trees. * Add unit tests for LiveTable results. * Add integration tests for Solr search, search suggestions and document trees. * Use the query limit in all templates that use the query script service with a non-constant limit. * Replace QueryConfiguration by SecurityConfiguration. * Add Velocity macros to help validating query limits. * Use the new Velocity macros to simplify query limit validation. * Adapt tests.
1 parent 217d0c7 commit e3c4774

File tree

83 files changed

+1715
-217
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+1715
-217
lines changed

‎xwiki-platform-core/pom.xml‎

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,118 @@
150150
</revapi.differences>
151151
-->
152152

153-
153+
<revapi.differences>
154+
<justification>Removed default values as they're now handled by the implementation to allow
155+
dynamically setting the default values based on the configuration.</justification>
156+
<criticality>allowed</criticality>
157+
<differences>
158+
<item>
159+
<ignore>true</ignore>
160+
<code>java.annotation.removed</code>
161+
<old>parameter org.xwiki.rest.model.jaxb.Attachments org.xwiki.rest.resources.attachments.AttachmentHistoryResource::getAttachmentHistory(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===) throws org.xwiki.rest.XWikiRestException</old>
162+
<new>parameter org.xwiki.rest.model.jaxb.Attachments org.xwiki.rest.resources.attachments.AttachmentHistoryResource::getAttachmentHistory(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===) throws org.xwiki.rest.XWikiRestException</new>
163+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
164+
</item>
165+
<item>
166+
<ignore>true</ignore>
167+
<code>java.annotation.removed</code>
168+
<old>parameter org.xwiki.rest.model.jaxb.Attachments org.xwiki.rest.resources.attachments.AttachmentsResource::getAttachments(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.Boolean, java.lang.String, java.lang.String, java.lang.String) throws org.xwiki.rest.XWikiRestException</old>
169+
<new>parameter org.xwiki.rest.model.jaxb.Attachments org.xwiki.rest.resources.attachments.AttachmentsResource::getAttachments(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.Boolean, java.lang.String, java.lang.String, java.lang.String) throws org.xwiki.rest.XWikiRestException</new>
170+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
171+
</item>
172+
<item>
173+
<ignore>true</ignore>
174+
<code>java.annotation.removed</code>
175+
<old>parameter org.xwiki.rest.model.jaxb.Classes org.xwiki.rest.resources.classes.ClassesResource::getClasses(java.lang.String, java.lang.Integer, ===java.lang.Integer===) throws org.xwiki.rest.XWikiRestException</old>
176+
<new>parameter org.xwiki.rest.model.jaxb.Classes org.xwiki.rest.resources.classes.ClassesResource::getClasses(java.lang.String, java.lang.Integer, ===java.lang.Integer===) throws org.xwiki.rest.XWikiRestException</new>
177+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
178+
</item>
179+
<item>
180+
<ignore>true</ignore>
181+
<code>java.annotation.removed</code>
182+
<old>parameter org.xwiki.rest.model.jaxb.Objects org.xwiki.rest.resources.objects.AllObjectsForClassNameResource::getObjects(java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</old>
183+
<new>parameter org.xwiki.rest.model.jaxb.Objects org.xwiki.rest.resources.objects.AllObjectsForClassNameResource::getObjects(java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</new>
184+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
185+
</item>
186+
<item>
187+
<ignore>true</ignore>
188+
<code>java.annotation.removed</code>
189+
<old>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.pages.PageChildrenResource::getPageChildren(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.Boolean, java.lang.String, java.lang.String) throws org.xwiki.rest.XWikiRestException</old>
190+
<new>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.pages.PageChildrenResource::getPageChildren(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.Boolean, java.lang.String, java.lang.String) throws org.xwiki.rest.XWikiRestException</new>
191+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
192+
</item>
193+
<item>
194+
<ignore>true</ignore>
195+
<code>java.annotation.removed</code>
196+
<old>parameter org.xwiki.rest.model.jaxb.History org.xwiki.rest.resources.pages.PageHistoryResource::getPageHistory(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</old>
197+
<new>parameter org.xwiki.rest.model.jaxb.History org.xwiki.rest.resources.pages.PageHistoryResource::getPageHistory(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</new>
198+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
199+
</item>
200+
<item>
201+
<ignore>true</ignore>
202+
<code>java.annotation.removed</code>
203+
<old>parameter org.xwiki.rest.model.jaxb.History org.xwiki.rest.resources.pages.PageTranslationHistoryResource::getPageTranslationHistory(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</old>
204+
<new>parameter org.xwiki.rest.model.jaxb.History org.xwiki.rest.resources.pages.PageTranslationHistoryResource::getPageTranslationHistory(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</new>
205+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
206+
</item>
207+
<item>
208+
<ignore>true</ignore>
209+
<code>java.annotation.removed</code>
210+
<old>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.pages.PagesResource::getPages(java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</old>
211+
<new>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.pages.PagesResource::getPages(java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</new>
212+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
213+
</item>
214+
<item>
215+
<ignore>true</ignore>
216+
<code>java.annotation.removed</code>
217+
<old>parameter org.xwiki.rest.model.jaxb.Spaces org.xwiki.rest.resources.spaces.SpacesResource::getSpaces(java.lang.String, java.lang.Integer, ===java.lang.Integer===) throws org.xwiki.rest.XWikiRestException</old>
218+
<new>parameter org.xwiki.rest.model.jaxb.Spaces org.xwiki.rest.resources.spaces.SpacesResource::getSpaces(java.lang.String, java.lang.Integer, ===java.lang.Integer===) throws org.xwiki.rest.XWikiRestException</new>
219+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
220+
</item>
221+
<item>
222+
<ignore>true</ignore>
223+
<code>java.annotation.removed</code>
224+
<old>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.tags.PagesForTagsResource::getTags(java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</old>
225+
<new>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.tags.PagesForTagsResource::getTags(java.lang.String, java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</new>
226+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
227+
</item>
228+
<item>
229+
<ignore>true</ignore>
230+
<code>java.annotation.removed</code>
231+
<old>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.wikis.WikiChildrenResource::getChildren(java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String) throws org.xwiki.rest.XWikiRestException</old>
232+
<new>parameter org.xwiki.rest.model.jaxb.Pages org.xwiki.rest.resources.wikis.WikiChildrenResource::getChildren(java.lang.String, java.lang.Integer, ===java.lang.Integer===, java.lang.String) throws org.xwiki.rest.XWikiRestException</new>
233+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
234+
</item>
235+
<item>
236+
<ignore>true</ignore>
237+
<code>java.annotation.removed</code>
238+
<old>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikiSearchQueryResource::search(java.lang.String, java.lang.String, java.lang.String, ===java.lang.Integer===, java.lang.Integer, java.lang.Boolean, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.String) throws org.xwiki.rest.XWikiRestException</old>
239+
<new>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikiSearchQueryResource::search(java.lang.String, java.lang.String, java.lang.String, ===java.lang.Integer===, java.lang.Integer, java.lang.Boolean, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.String) throws org.xwiki.rest.XWikiRestException</new>
240+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
241+
</item>
242+
<item>
243+
<ignore>true</ignore>
244+
<code>java.annotation.removed</code>
245+
<old>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikiSearchResource::search(java.lang.String, java.lang.String, java.util.List&lt;java.lang.String&gt;, ===java.lang.Integer===, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</old>
246+
<new>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikiSearchResource::search(java.lang.String, java.lang.String, java.util.List&lt;java.lang.String&gt;, ===java.lang.Integer===, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</new>
247+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
248+
</item>
249+
<item>
250+
<ignore>true</ignore>
251+
<code>java.annotation.removed</code>
252+
<old>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikisSearchQueryResource::search(java.lang.String, ===java.lang.Integer===, java.lang.Integer, java.lang.Boolean, java.lang.String, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.String) throws org.xwiki.rest.XWikiRestException</old>
253+
<new>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikisSearchQueryResource::search(java.lang.String, ===java.lang.Integer===, java.lang.Integer, java.lang.Boolean, java.lang.String, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.String) throws org.xwiki.rest.XWikiRestException</new>
254+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
255+
</item>
256+
<item>
257+
<ignore>true</ignore>
258+
<code>java.annotation.removed</code>
259+
<old>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.spaces.SpaceSearchResource::search(java.lang.String, java.lang.String, java.lang.String, java.util.List&lt;java.lang.String&gt;, ===java.lang.Integer===, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</old>
260+
<new>parameter org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.spaces.SpaceSearchResource::search(java.lang.String, java.lang.String, java.lang.String, java.util.List&lt;java.lang.String&gt;, ===java.lang.Integer===, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException</new>
261+
<annotation>@javax.ws.rs.DefaultValue("-1")</annotation>
262+
</item>
263+
</differences>
264+
</revapi.differences>
154265
</analysisConfiguration>
155266
</configuration>
156267
</plugin>

‎xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/attachmentsjson.vm‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@
2626
#if (!$offset || $offset < 0)
2727
#set ($offset = 0)
2828
#end
29-
#set ($limit = $numbertool.toNumber($request.limit).intValue())
30-
#if (!$limit)
31-
#set ($limit = 15)
32-
#end
29+
#getAndValidateQueryLimitFromRequest('limit', 15, $limit)
3330
##
3431
## Apply live table filters.
3532
##

‎xwiki-platform-core/xwiki-platform-index/xwiki-platform-index-test/xwiki-platform-index-test-docker/src/test/it/org/xwiki/index/test/ui/docker/DocumentTreeMacroIT.java‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,37 @@ void sortWithCollation(TestUtils setup, TestReference testReference)
371371
}
372372
}
373373

374+
@Test
375+
@Order(5)
376+
voidtestLimit(TestUtilssetup, TestReferencetestReference)
377+
{
378+
DocumentReferencealice =
379+
newDocumentReference("WebHome", newSpaceReference("Alice", testReference.getLastSpaceReference()));
380+
DocumentReferencebob =
381+
newDocumentReference("WebHome", newSpaceReference("Bob", testReference.getLastSpaceReference()));
382+
DocumentReferencecarol =
383+
newDocumentReference("WebHome", newSpaceReference("Carol", testReference.getLastSpaceReference()));
384+
DocumentReferencedenis =
385+
newDocumentReference("WebHome", newSpaceReference("Denis", testReference.getLastSpaceReference()));
386+
387+
setup.loginAsSuperAdmin();
388+
setup.deletePage(testReference, true);
389+
390+
createPage(setup, alice, "Alice", "");
391+
createPage(setup, bob, "Bob", "");
392+
createPage(setup, carol, "Carol", "");
393+
createPage(setup, denis, "Denis", "");
394+
395+
// Limit to 2 nodes. We need at least 4 pages for this, as we show up to one more page than the limit.
396+
TreeElementtree = getDocumentTree(setup, testReference, Map.of("limit", "2"));
397+
assertNodeLabels(tree.getTopLevelNodes(), "Alice", "Bob", "2 more ...");
398+
399+
// Limit to 2000 nodes
400+
tree = getDocumentTree(setup, testReference, Map.of("limit", "2000"));
401+
// FIXME: the tree is simply empty when the limit is too high, the error that is returned is simply ignored.
402+
assertNodeLabels(tree.getTopLevelNodes());
403+
}
404+
374405
privateViewPagecreatePage(TestUtilssetup, DocumentReferencedocumentReference, Stringtitle, Stringcontent)
375406
{
376407
// We don't care what parent page is used, we just want to avoid creating orphan pages in order to not interfere

‎xwiki-platform-core/xwiki-platform-index/xwiki-platform-index-tree/xwiki-platform-index-tree-macro/src/main/resources/XWiki/DocumentTreeMacros.xml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@
190190
#set ($limit = $mathtool.max($numbertool.toNumber($request.limit).intValue(), 1))
191191
#if ("$!limit" == '')
192192
#set ($limit = 15)
193+
#else
194+
#validateQueryLimit($limit)
193195
#end
194196
#if ($nodeId == '#' &amp;&amp; $docTreeConfig.showRoot)
195197
#maybeAddNode($actualNodeId $children)

‎xwiki-platform-core/xwiki-platform-index/xwiki-platform-index-ui/src/main/resources/XWiki/AllAttachmentsResults.xml‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,7 @@
5151
#if (!$offset || $offset &lt; 0)
5252
#set ($offset = 0)
5353
#end
54-
#set ($limit = $numbertool.toNumber($request.limit).intValue())
55-
#if (!$limit)
56-
#set ($limit = 15)
57-
#end
54+
#getAndValidateQueryLimitFromRequest('limit', 15, $limit)
5855
##
5956
## Apply live table filters.
6057
##

‎xwiki-platform-core/xwiki-platform-index/xwiki-platform-index-ui/src/main/resources/XWiki/DeletedAttachments.xml‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,7 @@ $xwiki.jsx.use('XWiki.DeletedAttachments',{'minify' : 'false'})##
146146
#if (!$offset || $offset &lt; 0)
147147
#set ($offset = 0)
148148
#end
149-
#set ($limit = $numbertool.toNumber($request.get('limit')).intValue())
150-
#if (!$limit)
151-
#set ($limit = 15)
152-
#end
149+
#getAndValidateQueryLimitFromRequest('limit', 15, $limit)
153150
#set ($filenameFilter = $request.get('datt.filename'))
154151
#set ($docNameFilter = $request.get('datt.docName'))
155152
#set ($dateFilter = $request.get('datt.date'))

‎xwiki-platform-core/xwiki-platform-index/xwiki-platform-index-ui/src/main/resources/XWiki/DeletedDocumentsJSON.xml‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,7 @@ $response.setContentType('application/json')
5252
#if (!$offset || $offset &lt; 0)
5353
#set ($offset = 0)
5454
#end
55-
#set($limit = $numbertool.toNumber($request.get('limit')).intValue())
56-
#if (!$limit)
57-
#set ($limit = 15)
58-
#end
55+
#getAndValidateQueryLimitFromRequest('limit', 15, $limit)
5956
#set($docNameFilter = $request.get('ddoc.fullName'))
6057
#set($dateFilter = $request.get('ddoc.date'))
6158
#set($deleterFilter = $request.get('ddoc.deleter'))

‎xwiki-platform-core/xwiki-platform-livedata/xwiki-platform-livedata-rest/src/main/java/org/xwiki/livedata/internal/rest/DefaultLiveDataEntriesResource.java‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,11 @@ public Entries getEntries(String sourceId, String namespace, List<String> proper
7373
{
7474
this.contextInitializer.initialize(namespace);
7575

76-
LiveDataConfigurationconfig = initConfig(sourceId, properties, matchAll, sort, descending, offset, limit);
77-
returngetEntries(namespace, offset, limit, config);
76+
intvalidatedLimit = validateAndGetLimit(limit);
77+
78+
LiveDataConfigurationconfig =
79+
initConfig(sourceId, properties, matchAll, sort, descending, offset, validatedLimit);
80+
returngetEntries(namespace, offset, validatedLimit, config);
7881
}
7982

8083
@Override

‎xwiki-platform-core/xwiki-platform-livedata/xwiki-platform-livedata-rest/src/test/java/org/xwiki/livedata/internal/rest/DefaultLiveDataEntriesResourceTest.java‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
importorg.apache.commons.lang3.reflect.FieldUtils;
3535
importorg.junit.jupiter.api.BeforeEach;
3636
importorg.junit.jupiter.api.Test;
37+
importorg.junit.jupiter.params.ParameterizedTest;
38+
importorg.junit.jupiter.params.provider.ValueSource;
3739
importorg.mockito.ArgumentCaptor;
3840
importorg.mockito.Mock;
3941
importorg.xwiki.component.manager.ComponentManager;
@@ -51,6 +53,7 @@
5153
importorg.xwiki.livedata.rest.model.jaxb.Entries;
5254
importorg.xwiki.livedata.rest.model.jaxb.Entry;
5355
importorg.xwiki.livedata.rest.model.jaxb.StringMap;
56+
importorg.xwiki.security.SecurityConfiguration;
5457
importorg.xwiki.test.annotation.BeforeComponent;
5558
importorg.xwiki.test.junit5.mockito.ComponentTest;
5659
importorg.xwiki.test.junit5.mockito.InjectComponentManager;
@@ -102,7 +105,10 @@ class DefaultLiveDataEntriesResourceTest
102105

103106
@MockComponent
104107
privateProvider<XWikiContext> xcontextProvider;
105-
108+
109+
@MockComponent
110+
privateSecurityConfigurationsecurityConfiguration;
111+
106112
/*
107113
* Cannot be mocked by annotation because it is needed in the @BeforeComponent phase.
108114
*/
@@ -132,6 +138,8 @@ void configure() throws Exception
132138
executionContext.setProperty("xwikicontext", this.xcontext);
133139
when(execution.getContext()).thenReturn(executionContext);
134140
when(this.xcontextProvider.get()).thenReturn(this.xcontext);
141+
142+
when(this.securityConfiguration.getQueryItemsLimit()).thenReturn(1000);
135143
}
136144

137145
@BeforeEach
@@ -241,6 +249,21 @@ void getEntriesDataSourceNotFound() throws Exception
241249

242250
}
243251

252+
@ParameterizedTest
253+
@ValueSource(ints ={-1, 1001 })
254+
voidgetEntriesInvalidLimit(intlimit)
255+
{
256+
List<String> properties = emptyList();
257+
List<String> matchAll = emptyList();
258+
List<String> sort = emptyList();
259+
List<Boolean> descending = emptyList();
260+
261+
WebApplicationExceptionexception =
262+
assertThrows(WebApplicationException.class, () -> this.resource.getEntries("sourceId", null, properties,
263+
matchAll, sort, descending, 0, limit));
264+
assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), exception.getResponse().getStatus());
265+
}
266+
244267
@Test
245268
voidaddEntryMissingSource()
246269
{

0 commit comments

Comments
(0)