Browse Source

Search schemes by postcode (#691)

* Search by postcode

* remove the space removal for postcodes as we expect them to be saved without spaces

* lint
pull/699/head
kosiakkatrina 3 years ago committed by GitHub
parent
commit
46c879a42f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      app/models/scheme.rb
  2. 2
      spec/factories/location.rb
  3. 15
      spec/models/scheme_spec.rb
  4. 2
      spec/requests/organisations_controller_spec.rb
  5. 1
      spec/requests/schemes_controller_spec.rb

3
app/models/scheme.rb

@ -5,7 +5,8 @@ class Scheme < ApplicationRecord
scope :search_by_code, ->(code) { where("code ILIKE ?", "%#{code}%") } scope :search_by_code, ->(code) { where("code ILIKE ?", "%#{code}%") }
scope :search_by_service_name, ->(name) { where("service_name ILIKE ?", "%#{name}%") } scope :search_by_service_name, ->(name) { where("service_name ILIKE ?", "%#{name}%") }
scope :search_by, ->(param) { search_by_code(param).or(search_by_service_name(param)) } scope :search_by_postcode, ->(postcode) { joins(:locations).where("locations.postcode ILIKE ?", "%#{postcode.delete(' ')}%") }
scope :search_by, ->(param) { search_by_postcode(param).or(search_by_service_name(param)).or(search_by_code(param)).distinct }
SCHEME_TYPE = { SCHEME_TYPE = {
0 => "Missings", 0 => "Missings",

2
spec/factories/location.rb

@ -1,7 +1,7 @@
FactoryBot.define do FactoryBot.define do
factory :location do factory :location do
location_code { Faker::Name.initials(number: 10) } location_code { Faker::Name.initials(number: 10) }
postcode { Faker::Address.postcode } postcode { Faker::Address.postcode.delete(" ") }
address_line1 { Faker::Address.street_name } address_line1 { Faker::Address.street_name }
address_line2 { Faker::Address.city } address_line2 { Faker::Address.city }
type_of_unit { Faker::Lorem.word } type_of_unit { Faker::Lorem.word }

15
spec/models/scheme_spec.rb

@ -11,6 +11,8 @@ RSpec.describe Scheme, type: :model do
describe "scopes" do describe "scopes" do
let!(:scheme_1) { FactoryBot.create(:scheme) } let!(:scheme_1) { FactoryBot.create(:scheme) }
let!(:scheme_2) { FactoryBot.create(:scheme) } let!(:scheme_2) { FactoryBot.create(:scheme) }
let!(:location) { FactoryBot.create(:location, scheme: scheme_1) }
let!(:location_2) { FactoryBot.create(:location, scheme: scheme_2) }
context "when searching by code" do context "when searching by code" do
it "returns case insensitive matching records" do it "returns case insensitive matching records" do
@ -34,7 +36,18 @@ RSpec.describe Scheme, type: :model do
end end
end end
context "when searching by all searchable field" do context "when searching by postcode" do
it "returns case insensitive matching records" do
expect(described_class.search_by_postcode(location.postcode.upcase).count).to eq(1)
expect(described_class.search_by_postcode(location.postcode.downcase).count).to eq(1)
expect(described_class.search_by_postcode(location.postcode.downcase).first.locations.first.postcode).to eq(location.postcode)
expect(described_class.search_by_postcode(location_2.postcode.upcase).count).to eq(1)
expect(described_class.search_by_postcode(location_2.postcode.downcase).count).to eq(1)
expect(described_class.search_by_postcode(location_2.postcode.downcase).first.locations.first.postcode).to eq(location_2.postcode)
end
end
context "when searching by all searchable fields" do
it "returns case insensitive matching records" do it "returns case insensitive matching records" do
expect(described_class.search_by(scheme_1.code.upcase).count).to eq(1) expect(described_class.search_by(scheme_1.code.upcase).count).to eq(1)
expect(described_class.search_by(scheme_1.code.downcase).count).to eq(1) expect(described_class.search_by(scheme_1.code.downcase).count).to eq(1)

2
spec/requests/organisations_controller_spec.rb

@ -76,6 +76,7 @@ RSpec.describe OrganisationsController, type: :request do
let(:search_param) { "CODE321" } let(:search_param) { "CODE321" }
before do before do
FactoryBot.create(:location, scheme: searched_scheme)
allow(user).to receive(:need_two_factor_authentication?).and_return(false) allow(user).to receive(:need_two_factor_authentication?).and_return(false)
get "/organisations/#{organisation.id}/schemes?search=#{search_param}" get "/organisations/#{organisation.id}/schemes?search=#{search_param}"
end end
@ -144,6 +145,7 @@ RSpec.describe OrganisationsController, type: :request do
let(:search_param) { "CODE321" } let(:search_param) { "CODE321" }
before do before do
FactoryBot.create(:location, scheme: searched_scheme)
get "/organisations/#{organisation.id}/schemes?search=#{search_param}" get "/organisations/#{organisation.id}/schemes?search=#{search_param}"
end end

1
spec/requests/schemes_controller_spec.rb

@ -140,6 +140,7 @@ RSpec.describe SchemesController, type: :request do
let(:search_param) { "CODE321" } let(:search_param) { "CODE321" }
before do before do
FactoryBot.create(:location, scheme: searched_scheme)
get "/schemes?search=#{search_param}" get "/schemes?search=#{search_param}"
end end

Loading…
Cancel
Save