diff --git a/app/controllers/api/v1/customers_controller.rb b/app/controllers/api/v1/customers_controller.rb index da3037ff75..3a5dc0cc44 100644 --- a/app/controllers/api/v1/customers_controller.rb +++ b/app/controllers/api/v1/customers_controller.rb @@ -107,17 +107,25 @@ module Api street_address_1: :address1, street_address_2: :address2, postal_code: :zipcode, locality: :city, - region: :state_name, + region: :state, country: :country, }.with_indifferent_access[key] end - if address[:state_name].present? - address[:state] = Spree::State.find_by(name: address[:state_name][:name]) + if address[:state].present? + address[:state] = Spree::State.find_by( + "LOWER(abbr) = ? OR LOWER(name) = ?", + address.dig(:state, :code)&.downcase, + address.dig(:state, :name)&.downcase, + ) end if address[:country].present? - address[:country] = Spree::Country.find_by(name: address[:country][:name]) + address[:country] = Spree::Country.find_by( + "LOWER(iso) = ? OR LOWER(name) = ?", + address.dig(:country, :code)&.downcase, + address.dig(:country, :name)&.downcase, + ) end attributes["#{to}_attributes"] = address diff --git a/app/json_schemas/customer_schema.rb b/app/json_schemas/customer_schema.rb index 264caf93fc..ecced41793 100644 --- a/app/json_schemas/customer_schema.rb +++ b/app/json_schemas/customer_schema.rb @@ -42,7 +42,7 @@ class CustomerSchema < JsonApiSchema postal_code: "1234", locality: "Melbourne", region: { code: "Vic", name: "Victoria" }, - country: { code: "AUS", name: "Australia" }, + country: { code: "AU", name: "Australia" }, } end diff --git a/app/serializers/api/v1/address_serializer.rb b/app/serializers/api/v1/address_serializer.rb index 91dff2d701..72b800e960 100644 --- a/app/serializers/api/v1/address_serializer.rb +++ b/app/serializers/api/v1/address_serializer.rb @@ -20,7 +20,7 @@ module Api attribute :country do |object| { name: object.country.name, - code: object.country.iso3, + code: object.country.iso, } end end diff --git a/spec/requests/api/v1/customers_spec.rb b/spec/requests/api/v1/customers_spec.rb index 58ae41945d..047c5e0438 100644 --- a/spec/requests/api/v1/customers_spec.rb +++ b/spec/requests/api/v1/customers_spec.rb @@ -302,6 +302,59 @@ describe "Customers", type: :request do end end + describe "address" do + it "matches by country and state code" do + put "/api/v1/customers/#{customer1.id}", params: { + customer: { + shipping_address: CustomerSchema.address_example.merge( + region: { code: "Vic" }, + country: { code: "AU" }, + ), + } + } + + expect(response).to have_http_status :ok + expect(json_response.dig(:data, :attributes, :shipping_address)).to include( + region: { code: "Vic", name: "Victoria" }, + country: { code: "AU", name: "Australia" }, + ) + end + + it "matches by country and state name" do + put "/api/v1/customers/#{customer1.id}", params: { + customer: { + shipping_address: CustomerSchema.address_example.merge( + region: { name: "Victoria" }, + country: { name: "Australia" }, + ), + } + } + + expect(response).to have_http_status :ok + expect(json_response.dig(:data, :attributes, :shipping_address)).to include( + region: { code: "Vic", name: "Victoria" }, + country: { code: "AU", name: "Australia" }, + ) + end + + it "matches country and state case-insensitive" do + put "/api/v1/customers/#{customer1.id}", params: { + customer: { + shipping_address: CustomerSchema.address_example.merge( + region: { code: "VIC" }, + country: { name: "AUSTRALIA" }, + ), + } + } + + expect(response).to have_http_status :ok + expect(json_response.dig(:data, :attributes, :shipping_address)).to include( + region: { code: "Vic", name: "Victoria" }, + country: { code: "AU", name: "Australia" }, + ) + end + end + response "422", "Unprocessable entity" do param(:id) { customer1.id } param(:customer) { {} } diff --git a/swagger/v1/swagger.yaml b/swagger/v1/swagger.yaml index 911fa13e74..2909306e6e 100644 --- a/swagger/v1/swagger.yaml +++ b/swagger/v1/swagger.yaml @@ -91,8 +91,12 @@ components: street_address_2: '' postal_code: '1234' locality: Melbourne - region: Victoria - country: Australia + region: + code: Vic + name: Victoria + country: + code: AU + name: Australia required: - id - enterprise_id @@ -200,8 +204,12 @@ components: street_address_2: '' postal_code: '1234' locality: Melbourne - region: Victoria - country: Australia + region: + code: Vic + name: Victoria + country: + code: AU + name: Australia required: - id - enterprise_id @@ -372,8 +380,12 @@ paths: street_address_2: '' postal_code: '1234' locality: Melbourne - region: Victoria - country: Australia + region: + code: Vic + name: Victoria + country: + code: AU + name: Australia required: - enterprise_id - email @@ -478,8 +490,12 @@ paths: street_address_2: '' postal_code: '1234' locality: Melbourne - region: Victoria - country: Australia + region: + code: Vic + name: Victoria + country: + code: AU + name: Australia required: - enterprise_id - email