lib/kaminari_rspec/test_helpers.rb in kaminari-rspec-0.14.1 vs lib/kaminari_rspec/test_helpers.rb in kaminari-rspec-0.16.1
- old
+ new
@@ -1,70 +1,94 @@
+require 'kaminari'
+require 'kaminari/models/array_extension'
+
module KaminariRspec
+
+
module TestHelpers
+ # Stubs the paginations method on the resource passed.
+ #
+ # @param resource [Object] A single object or a collection of objects
+ # @param options [Hash] The options controlling the stub behaviour
+ # @option options [String] :mock the mocking framework to be used, defaults to automatic detection based on RSpec configuration
+ # @option options [Integer] :current_page the desired current page number. Defaults to 1
+ # @option options [Integer] :per_page the desired amount of elements per page. Defaults to 25
+ # @option options [Integer] :total_count the desired total amount of elements (used to calculate the last page link)
def stub_pagination(resource, options={})
return nil unless resource
+ options[:current_page] ||= 1
+ options[:per_page] ||= 25
mock_framework = options[:mock] || discover_mock_framework
values = calculate_values(resource, options)
+ wrapped_resource = wrap_resource(resource, options)
case mock_framework
- when :rspec then stub_pagination_with_rspec(resource, values)
- when :rr then stub_pagination_with_rr(resource, values)
- when :mocha then stub_pagination_with_mocha(resource, values)
- when :flexmock then stub_pagination_with_flexmock(resource, values)
+ when :rspec then stub_pagination_with_rspec(wrapped_resource, values)
+ when :rr then stub_pagination_with_rr(wrapped_resource, values)
+ when :mocha then stub_pagination_with_mocha(wrapped_resource, values)
+ when :flexmock then stub_pagination_with_flexmock(wrapped_resource, values)
when :nothing then resource
else
raise ArgumentError, "Invalid mock argument #{options[:mock]} / framework not supported"
end
end
+ private
+
def discover_mock_framework
mock_framework = RSpec.configuration.mock_framework
return mock_framework.framework_name if mock_framework.respond_to? :framework_name
puts('WARNING: Could not detect mocking framework, defaulting to :nothing, use :mock option to override')
- return :nothing
+ :nothing
end
+ def wrap_resource(resource, options)
+ return resource if resource.respond_to? :total_count
+ wrappable = resource.respond_to?(:length) ? resource : [resource]
+ Kaminari::paginate_array(wrappable).page(1).per([wrappable.length, options[:per_page]].min)
+ end
- def calculate_values(resource, options={})
+ def calculate_values(resource, options)
+
values = {}
values[:total_count] = options[:total_count] || (resource.respond_to?(:length) ? resource.length : 1)
- values[:limit_value] = options[:per_page] || 25
- values[:total_pages] = (values[:total_count] / values[:limit_value]) + ((values[:total_count] % values[:limit_value]) == 0 ? 0 : 1)
- values[:current_page] = [(options[:current_page] || 1), values[:total_pages]].min
- return values
+ values[:limit] = options[:per_page]
+ values[:total_pages] = (values[:total_count] / values[:limit]) + ((values[:total_count] % values[:limit]) == 0 ? 0 : 1)
+ values[:current_page] = [options[:current_page], values[:total_pages]].min
+ values
end
def stub_pagination_with_rspec(resource, values)
values.each do |key, value |
allow(resource).to receive(key).and_return(value)
end
- return resource
+ resource
end
def stub_pagination_with_rr(resource, values)
values.each do |key, value|
eval "stub(resource).#{key} { #{value} }"
end
- return resource
+ resource
end
def stub_pagination_with_mocha(resource, values)
values.each do |key, value|
resource.stubs(key).returns(value)
end
- return resource
+ resource
end
def stub_pagination_with_flexmock(resource, values)
@@ -72,10 +96,10 @@
values.each do |key, value|
mock.should_receive(key).zero_or_more_times.and_return(value)
end
- return mock
+ mock
end
end
end