diff --git a/app/models/sponsors_search.rb b/app/queries/sponsors_search.rb similarity index 100% rename from app/models/sponsors_search.rb rename to app/queries/sponsors_search.rb diff --git a/spec/models/sponsors_search_spec.rb b/spec/models/sponsors_search_spec.rb deleted file mode 100644 index 5c79259f2..000000000 --- a/spec/models/sponsors_search_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -RSpec.describe SponsorsSearch do - let(:search_params) { { name: Faker::Name.name, chapter: Faker::Name.name } } - - describe 'initialization params' do - it 'configures its properties using the param hash' do - params = { name: Faker::Name.name, chapter: Faker::Name.name } - - sponsors_search = described_class.new(search_params) - - expect(sponsors_search.name).to eq(search_params[:name]) - end - end - - describe 'when search is called' do - it 'searches by_name if a name is specified' do - expect(Sponsor).to receive(:by_name) - - described_class.new(search_params).call - end - - it 'returns all sponsors when no filter is specified' do - expect(Sponsor).to_not receive(:by_name) - - described_class.new({ name: nil, chapter: nil}).call - end - end -end diff --git a/spec/queries/sponsors_search_spec.rb b/spec/queries/sponsors_search_spec.rb new file mode 100644 index 000000000..5a202c1ca --- /dev/null +++ b/spec/queries/sponsors_search_spec.rb @@ -0,0 +1,78 @@ +RSpec.describe SponsorsSearch do + describe 'initialization' do + it 'configures its properties from the param hash' do + search = described_class.new(name: 'Acme', chapter: 'London') + + expect(search.name).to eq('Acme') + expect(search.chapter).to eq('London') + end + + it 'handles nil params' do + search = described_class.new(name: nil, chapter: nil) + + expect(search.name).to be_nil + expect(search.chapter).to be_nil + end + end + + describe '#call' do + it 'returns all sponsors when no filter is specified' do + Fabricate.times(3, :sponsor) + + results = described_class.new(name: nil, chapter: nil).call + + expect(results.size).to eq(3) + expect(results).to all(be_a(Sponsor)) + end + + it 'filters by name' do + matching = Fabricate(:sponsor, name: 'Zebra Technologies') + Fabricate(:sponsor, name: 'Apple Inc') + + results = described_class.new(name: 'Zebra', chapter: nil).call + + expect(results).to contain_exactly(matching) + end + + it 'is case insensitive when filtering by name' do + matching = Fabricate(:sponsor, name: 'Zebra Technologies') + + results = described_class.new(name: 'zebra', chapter: nil).call + expect(results).to contain_exactly(matching) + + results = described_class.new(name: 'ZEBRA', chapter: nil).call + expect(results).to contain_exactly(matching) + end + + it 'filters by chapter' do + chapter = Fabricate(:chapter) + matching = Fabricate(:sponsor) + Fabricate(:workshop_sponsor, workshop: Fabricate(:workshop_no_sponsor, chapter: chapter), sponsor: matching) + Fabricate(:sponsor) + + results = described_class.new(name: nil, chapter: chapter.id.to_s).call + + expect(results).to contain_exactly(matching) + end + + it 'filters by name and chapter combined' do + chapter = Fabricate(:chapter) + matching = Fabricate(:sponsor, name: 'Zebra Technologies') + Fabricate(:workshop_sponsor, workshop: Fabricate(:workshop_no_sponsor, chapter: chapter), sponsor: matching) + Fabricate(:sponsor, name: 'Zebra Technologies') + Fabricate(:sponsor, name: 'Apple Inc') + + results = described_class.new(name: 'Zebra', chapter: chapter.id.to_s).call + + expect(results).to contain_exactly(matching) + end + + it 'returns an empty relation when nothing matches' do + Fabricate(:sponsor, name: 'Apple Inc') + + results = described_class.new(name: 'Nonexistent', chapter: nil).call + + expect(results).to be_empty + end + end +end