diff --git a/app/controllers/locations_controller.rb b/app/controllers/locations_controller.rb index d08a14209..4b12e3448 100644 --- a/app/controllers/locations_controller.rb +++ b/app/controllers/locations_controller.rb @@ -70,7 +70,7 @@ private def location_params required_params = params.require(:location).permit(:postcode, :name, :total_units, :type_of_unit, :wheelchair_adaptation, :add_another_location).merge(scheme_id: @scheme.id) - required_params[:postcode] = required_params[:postcode].delete(" ").upcase.encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "") if required_params[:postcode] + required_params[:postcode] = PostcodeService.clean(required_params[:postcode].delete(" ").upcase) if required_params[:postcode] required_params end end diff --git a/app/models/case_log.rb b/app/models/case_log.rb index d426e3d5d..305582db2 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -590,7 +590,7 @@ private postcode_lookup = nil begin # URI encoding only supports ASCII characters - ascii_postcode = postcode.encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "") + ascii_postcode = PostcodeService.clean(postcode) Timeout.timeout(5) { postcode_lookup = PIO.lookup(ascii_postcode) } rescue Timeout::Error Rails.logger.warn("Postcodes.io lookup timed out") diff --git a/app/services/postcode_service.rb b/app/services/postcode_service.rb new file mode 100644 index 000000000..418f14bd8 --- /dev/null +++ b/app/services/postcode_service.rb @@ -0,0 +1,6 @@ +class PostcodeService + + def self.clean(postcode) + postcode.encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "") + end +end diff --git a/spec/services/postcode_service_spec.rb b/spec/services/postcode_service_spec.rb new file mode 100644 index 000000000..838df76e6 --- /dev/null +++ b/spec/services/postcode_service_spec.rb @@ -0,0 +1,9 @@ +require "rails_helper" + +describe PostcodeService do + let(:postcode) { "SR81LS\u00A0" } + + it "triggers a validation error" do + expect(described_class.clean(postcode)).to eq "SR81LS" + end +end