activerecord-hackery--ransack/spec/ransack/adapters/active_record/base_spec.rb

279 lines
9.6 KiB
Ruby
Raw Normal View History

2011-03-31 00:31:39 +00:00
require 'spec_helper'
module Ransack
module Adapters
module ActiveRecord
describe Base do
2011-07-17 23:40:07 +00:00
subject { ::ActiveRecord::Base }
2011-03-31 00:31:39 +00:00
2011-07-17 23:40:07 +00:00
it { should respond_to :ransack }
it { should respond_to :search }
2011-03-31 00:31:39 +00:00
describe '#search' do
2011-07-17 23:40:07 +00:00
subject { Person.search }
2011-03-31 00:31:39 +00:00
2011-07-17 23:40:07 +00:00
it { should be_a Search }
it 'has a Relation as its object' do
expect(subject.object).to be_an ::ActiveRecord::Relation
2011-03-31 00:31:39 +00:00
end
context 'with scopes' do
before do
Person.stub :ransackable_scopes => [:active, :over_age]
end
it "applies true scopes" do
search = Person.search('active' => true)
search.result.to_sql.should include "active = 1"
end
it "ignores unlisted scopes" do
search = Person.search('restricted' => true)
search.result.to_sql.should_not include "restricted"
end
it "ignores false scopes" do
search = Person.search('active' => false)
search.result.to_sql.should_not include "active"
end
it "passes values to scopes" do
search = Person.search('over_age' => 18)
search.result.to_sql.should include "age > 18"
end
it "chains scopes" do
search = Person.search('over_age' => 18, 'active' => true)
search.result.to_sql.should include "age > 18"
search.result.to_sql.should include "active = 1"
end
end
2011-03-31 00:31:39 +00:00
end
describe '#ransacker' do
2013-12-07 00:51:55 +00:00
# For infix tests
def self.sane_adapter?
case ::ActiveRecord::Base.connection.adapter_name
when "SQLite3", "PostgreSQL"
true
else
false
end
end
2011-07-17 23:40:07 +00:00
# in schema.rb, class Person:
2013-08-04 13:13:41 +00:00
# ransacker :reversed_name, formatter: proc { |v| v.reverse } do |parent|
2011-07-17 23:40:07 +00:00
# parent.table[:name]
# end
#
# ransacker :doubled_name do |parent|
# Arel::Nodes::InfixOperation.new(
# '||', parent.table[:name], parent.table[:name]
# )
2011-07-17 23:40:07 +00:00
# end
it 'creates ransack attributes' do
s = Person.search(:reversed_name_eq => 'htimS cirA')
expect(s.result.size).to eq(1)
expect(s.result.first).to eq Person.where(name: 'Aric Smith').first
end
2011-04-11 16:59:26 +00:00
2011-07-17 23:40:07 +00:00
it 'can be accessed through associations' do
s = Person.search(:children_reversed_name_eq => 'htimS cirA')
expect(s.result.to_sql).to match(
/#{quote_table_name("children_people")}.#{
quote_column_name("name")} = 'Aric Smith'/
2013-12-07 00:51:55 +00:00
)
2011-04-11 16:59:26 +00:00
end
it 'allows an "attribute" to be an InfixOperation' do
s = Person.search(:doubled_name_eq => 'Aric SmithAric Smith')
expect(s.result.first).to eq Person.where(name: 'Aric Smith').first
2013-12-07 00:51:55 +00:00
end if defined?(Arel::Nodes::InfixOperation) && sane_adapter?
2012-08-22 23:17:45 +00:00
it "doesn't break #count if using InfixOperations" do
s = Person.search(:doubled_name_eq => 'Aric SmithAric Smith')
expect(s.result.count).to eq 1
2013-12-07 00:51:55 +00:00
end if defined?(Arel::Nodes::InfixOperation) && sane_adapter?
it "should remove empty key value pairs from the params hash" do
s = Person.search(:children_reversed_name_eq => '')
expect(s.result.to_sql).not_to match /LEFT OUTER JOIN/
end
it "should keep proper key value pairs in the params hash" do
s = Person.search(:children_reversed_name_eq => 'Testing')
expect(s.result.to_sql).to match /LEFT OUTER JOIN/
end
it "should function correctly when nil is passed in" do
s = Person.search(nil)
end
it "should function correctly when a blank string is passed in" do
2014-05-14 06:51:22 +00:00
s = Person.search('')
end
2013-12-07 00:51:55 +00:00
it "should function correctly when using fields with dots in them" do
s = Person.search(:email_cont => "example.com")
expect(s.result.exists?).to be true
2013-12-07 00:51:55 +00:00
end
it "should function correctly when using fields with % in them" do
Person.create!(:name => "110%-er")
s = Person.search(:name_cont => "10%")
expect(s.result.exists?).to be true
2013-12-07 00:51:55 +00:00
end
it "should function correctly when using fields with backslashes in them" do
Person.create!(:name => "\\WINNER\\")
s = Person.search(:name_cont => "\\WINNER\\")
expect(s.result.exists?).to be true
2013-12-07 00:51:55 +00:00
end
it 'allows sort by "only_sort" field' do
s = Person.search(
"s" => { "0" => { "dir" => "asc", "name" => "only_sort" } }
)
expect(s.result.to_sql).to match(
/ORDER BY #{quote_table_name("people")}.#{
quote_column_name("only_sort")} ASC/
2013-12-07 00:51:55 +00:00
)
end
it "doesn't sort by 'only_search' field" do
s = Person.search(
"s" => { "0" => { "dir" => "asc", "name" => "only_search" } }
)
expect(s.result.to_sql).not_to match(
/ORDER BY #{quote_table_name("people")}.#{
quote_column_name("only_search")} ASC/
2013-12-07 00:51:55 +00:00
)
end
it 'allows search by "only_search" field' do
s = Person.search(:only_search_eq => 'htimS cirA')
expect(s.result.to_sql).to match(
/WHERE #{quote_table_name("people")}.#{
quote_column_name("only_search")} = 'htimS cirA'/
2013-12-07 00:51:55 +00:00
)
end
it "can't be searched by 'only_sort'" do
s = Person.search(:only_sort_eq => 'htimS cirA')
expect(s.result.to_sql).not_to match(
/WHERE #{quote_table_name("people")}.#{
quote_column_name("only_sort")} = 'htimS cirA'/
2013-12-07 00:51:55 +00:00
)
end
it 'allows sort by "only_admin" field, if auth_object: :admin' do
s = Person.search(
{ "s" => { "0" => { "dir" => "asc", "name" => "only_admin" } } },
{ auth_object: :admin }
)
expect(s.result.to_sql).to match(
/ORDER BY #{quote_table_name("people")}.#{
quote_column_name("only_admin")} ASC/
2013-12-07 00:51:55 +00:00
)
end
it "doesn't sort by 'only_admin' field, if auth_object: nil" do
s = Person.search(
"s" => { "0" => { "dir" => "asc", "name" => "only_admin" } }
)
expect(s.result.to_sql).not_to match(
/ORDER BY #{quote_table_name("people")}.#{
quote_column_name("only_admin")} ASC/
2013-12-07 00:51:55 +00:00
)
end
it 'allows search by "only_admin" field, if auth_object: :admin' do
s = Person.search(
{ :only_admin_eq => 'htimS cirA' },
{ :auth_object => :admin }
2013-12-07 00:51:55 +00:00
)
expect(s.result.to_sql).to match(
/WHERE #{quote_table_name("people")}.#{
quote_column_name("only_admin")} = 'htimS cirA'/
2013-12-07 00:51:55 +00:00
)
end
it "can't be searched by 'only_admin', if auth_object: nil" do
s = Person.search(:only_admin_eq => 'htimS cirA')
expect(s.result.to_sql).not_to match(
/WHERE #{quote_table_name("people")}.#{
quote_column_name("only_admin")} = 'htimS cirA'/
2013-12-07 00:51:55 +00:00
)
end
end
2011-07-17 23:40:07 +00:00
describe '#ransackable_attributes' do
2013-12-07 00:51:55 +00:00
context 'when auth_object is nil' do
subject { Person.ransackable_attributes }
it { should include 'name' }
it { should include 'reversed_name' }
it { should include 'doubled_name' }
it { should include 'only_search' }
it { should_not include 'only_sort' }
it { should_not include 'only_admin' }
end
context 'with auth_object :admin' do
subject { Person.ransackable_attributes(:admin) }
2011-07-17 23:40:07 +00:00
2013-12-07 00:51:55 +00:00
it { should include 'name' }
it { should include 'reversed_name' }
it { should include 'doubled_name' }
it { should include 'only_search' }
it { should_not include 'only_sort' }
it { should include 'only_admin' }
end
end
describe '#ransortable_attributes' do
context 'when auth_object is nil' do
subject { Person.ransortable_attributes }
it { should include 'name' }
it { should include 'reversed_name' }
it { should include 'doubled_name' }
it { should include 'only_sort' }
it { should_not include 'only_search' }
it { should_not include 'only_admin' }
end
context 'with auth_object :admin' do
subject { Person.ransortable_attributes(:admin) }
it { should include 'name' }
it { should include 'reversed_name' }
it { should include 'doubled_name' }
it { should include 'only_sort' }
it { should_not include 'only_search' }
it { should include 'only_admin' }
end
2011-07-17 23:40:07 +00:00
end
describe '#ransackable_associations' do
subject { Person.ransackable_associations }
it { should include 'parent' }
it { should include 'children' }
it { should include 'articles' }
end
describe '#ransackable_scopes' do
subject { Person.ransackable_scopes }
it { should eq [] }
end
2011-03-31 00:31:39 +00:00
end
end
end
end