per_page
end
- def api_offset_and_limit
- offset = nil
- if params[:offset].present?
- offset = params[:offset].to_i
+ # Returns offset and limit used to retrieve objects
+ # for an API response based on offset, limit and page parameters
+ def api_offset_and_limit(options=params)
+ if options[:offset].present?
+ offset = options[:offset].to_i
if offset < 0
offset = 0
end
end
- limit = params[:limit].to_i
+ limit = options[:limit].to_i
if limit < 1
limit = 25
elsif limit > 100
limit = 100
end
+ if offset.nil? && options[:page].present?
+ offset = (options[:page].to_i - 1) * limit
+ offset = 0 if offset < 0
+ end
+ offset ||= 0
+
[offset, limit]
end
def test_call_hook_mixed_in
assert @controller.respond_to?(:call_hook)
end
+
+ context "test_api_offset_and_limit" do
+ context "without params" do
+ should "return 0, 25" do
+ assert_equal [0, 25], @controller.api_offset_and_limit({})
+ end
+ end
+
+ context "with limit" do
+ should "return 0, limit" do
+ assert_equal [0, 30], @controller.api_offset_and_limit({:limit => 30})
+ end
+
+ should "not exceed 100" do
+ assert_equal [0, 100], @controller.api_offset_and_limit({:limit => 120})
+ end
+
+ should "not be negative" do
+ assert_equal [0, 25], @controller.api_offset_and_limit({:limit => -10})
+ end
+ end
+
+ context "with offset" do
+ should "return offset, 25" do
+ assert_equal [10, 25], @controller.api_offset_and_limit({:offset => 10})
+ end
+
+ should "not be negative" do
+ assert_equal [0, 25], @controller.api_offset_and_limit({:offset => -10})
+ end
+
+ context "and limit" do
+ should "return offset, limit" do
+ assert_equal [10, 50], @controller.api_offset_and_limit({:offset => 10, :limit => 50})
+ end
+ end
+ end
+
+ context "with page" do
+ should "return offset, 25" do
+ assert_equal [0, 25], @controller.api_offset_and_limit({:page => 1})
+ assert_equal [50, 25], @controller.api_offset_and_limit({:page => 3})
+ end
+
+ should "not be negative" do
+ assert_equal [0, 25], @controller.api_offset_and_limit({:page => 0})
+ assert_equal [0, 25], @controller.api_offset_and_limit({:page => -2})
+ end
+
+ context "and limit" do
+ should "return offset, limit" do
+ assert_equal [0, 100], @controller.api_offset_and_limit({:page => 1, :limit => 100})
+ assert_equal [200, 100], @controller.api_offset_and_limit({:page => 3, :limit => 100})
+ end
+ end
+ end
+ end
end