From 98df2c5b5256df737c0c1809330c5340f7a0cea4 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Sat, 23 Jul 2016 14:27:31 +0200 Subject: [PATCH] Add tests on passing arrays to ransackers Follow-up to PR #692. --- .../adapters/active_record/base_spec.rb | 20 +++++++++++++++---- spec/support/schema.rb | 14 +++++++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/spec/ransack/adapters/active_record/base_spec.rb b/spec/ransack/adapters/active_record/base_spec.rb index 8e204f1..6282bb2 100644 --- a/spec/ransack/adapters/active_record/base_spec.rb +++ b/spec/ransack/adapters/active_record/base_spec.rb @@ -314,14 +314,26 @@ module Ransack context 'searching on an `in` predicate with a ransacker' do it 'should function correctly when passing an array of ids' do - s = Person.ransack(array_users_in: [1, 2]) - expect(s.result.count).to be 2 + s = Person.ransack(array_people_ids_in: true) + expect(s.result.count).to be > 0 + + s = Person.ransack(array_where_people_ids_in: [1, '2', 3]) + expect(s.result.count).to be 3 + expect(s.result.map(&:id)).to eq [3, 2, 1] end it 'should function correctly when passing an array of strings' do - Person.create!(name: Person.first.id.to_s) - s = Person.ransack(array_names_in: true) + a, b = Person.first.id.to_s, Person.second.id.to_s + + Person.create!(name: a) + s = Person.ransack(array_people_names_in: true) expect(s.result.count).to be > 0 + s = Person.ransack(array_where_people_names_in: a) + expect(s.result.count).to be 1 + + Person.create!(name: b) + s = Person.ransack(array_where_people_names_in: [a, b]) + expect(s.result.count).to be 2 end it 'should function correctly with an Arel SqlLiteral' do diff --git a/spec/support/schema.rb b/spec/support/schema.rb index a523067..4600303 100644 --- a/spec/support/schema.rb +++ b/spec/support/schema.rb @@ -66,16 +66,26 @@ class Person < ActiveRecord::Base parent.table[:name] end - ransacker :array_users, + ransacker :array_people_ids, + formatter: proc { |v| Person.first(2).map(&:id) } do |parent| + parent.table[:id] + end + + ransacker :array_where_people_ids, formatter: proc { |v| Person.where(id: v).map(&:id) } do |parent| parent.table[:id] end - ransacker :array_names, + ransacker :array_people_names, formatter: proc { |v| Person.first(2).map { |p| p.id.to_s } } do |parent| parent.table[:name] end + ransacker :array_where_people_names, + formatter: proc { |v| Person.where(id: v).map { |p| p.id.to_s } } do |parent| + parent.table[:name] + end + ransacker :doubled_name do |parent| Arel::Nodes::InfixOperation.new( '||', parent.table[:name], parent.table[:name]