3400: test limit between server maxpagesize and 2x server maxpagesize.
authorTom Clegg <tom@curoverse.com>
Fri, 7 Nov 2014 03:52:44 +0000 (22:52 -0500)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Wed, 12 Nov 2014 18:13:01 +0000 (13:13 -0500)
Conflicts:
apps/workbench/test/unit/arvados_resource_list_test.rb

apps/workbench/test/unit/arvados_resource_list_test.rb
services/api/lib/load_param.rb

index 0955d525b63f3e9ec31cafff8ef750c8ad4fffa8..6494bc524f3218b8d07d1e4dca38e03e56224949 100644 (file)
@@ -35,13 +35,37 @@ class ResourceListTest < ActiveSupport::TestCase
     assert_equal 51, a
   end
 
-  test 'get limited items more than default page size' do
+  test 'get limited items, limit % page_size != 0' do
+    skip "Requires server MAX_LIMIT < 200 which is not currently the default"
+
     use_token :admin
+    max_page_size = Collection.
+      where(owner_uuid: 'zzzzz-j7d0g-0201collections').
+      limit(1000000000).
+      fetch_multiple_pages(false).
+      count
+    # Conditions necessary for this test to be valid:
+    assert_operator 200, :>, max_page_size
+    assert_operator 1, :<, max_page_size
+    # Verify that the server really sends max_page_size when asked for max_page_size+1
+    assert_equal max_page_size, Collection.
+      where(owner_uuid: 'zzzzz-j7d0g-0201collections').
+      limit(max_page_size+1).
+      fetch_multiple_pages(false).
+      results.
+      count
+    # Now that we know the max_page_size+1 is in the middle of page 2,
+    # make sure #each returns page 1 and only the requested part of
+    # page 2.
     a = 0
-    Collection.where(owner_uuid: 'zzzzz-j7d0g-0201collections').limit(110).each do
+    saw_uuid = {}
+    Collection.where(owner_uuid: 'zzzzz-j7d0g-0201collections').limit(max_page_size+1).each do |item|
       a += 1
+      saw_uuid[item.uuid] = true
     end
-    assert_equal 110, a
+    assert_equal max_page_size+1, a
+    # Ensure no overlap between pages
+    assert_equal max_page_size+1, saw_uuid.size
   end
 
   test 'get single page of items' do
index 8d5a9d21ee20d39bb9673d5e4671dfbdc97e3a2e..3f1a3b223a851f46c171a58d5b182a6790df12f1 100644 (file)
@@ -6,9 +6,12 @@
 #   @where, @filters, @limit, @offset, @orders
 module LoadParam
 
-  # Default limit on number of rows to return in a single query.
+  # Default number of rows to return in a single query.
   DEFAULT_LIMIT = 100
 
+  # Maximum number of rows to return in a single query, even if the client asks for more.
+  MAX_LIMIT = 1000
+
   # Load params[:where] into @where
   def load_where_param
     if params[:where].nil? or params[:where] == ""
@@ -55,7 +58,7 @@ module LoadParam
       unless params[:limit].to_s.match(/^\d+$/)
         raise ArgumentError.new("Invalid value for limit parameter")
       end
-      @limit = params[:limit].to_i
+      @limit = [params[:limit].to_i, MAX_LIMIT].min
     else
       @limit = DEFAULT_LIMIT
     end