diff options
author | Jared Norman <jared@super.gd> | 2020-07-08 19:25:48 -0700 |
---|---|---|
committer | Jared Norman <jared@super.gd> | 2020-07-14 13:07:55 -0700 |
commit | c348c0be29f772b4a0ca32ee3061f74a602e2bd9 (patch) | |
tree | 688c4a54220a52204f9e6cb13571da4d986d5507 | |
parent | bec2e97f97c5abafaa7704d562cde2e21ddb6fb3 (diff) |
Add convenient class for normalizing addresses
-rw-r--r-- | lib/super_good/solidus_taxjar.rb | 1 | ||||
-rw-r--r-- | lib/super_good/solidus_taxjar/addresses.rb | 41 | ||||
-rw-r--r-- | spec/super_good/solidus_taxjar/addresses_spec.rb | 124 |
3 files changed, 166 insertions, 0 deletions
diff --git a/lib/super_good/solidus_taxjar.rb b/lib/super_good/solidus_taxjar.rb index f45db80..7bdeb03 100644 --- a/lib/super_good/solidus_taxjar.rb +++ b/lib/super_good/solidus_taxjar.rb @@ -9,6 +9,7 @@ require "super_good/solidus_taxjar/calculator_helper" require "super_good/solidus_taxjar/tax_calculator" require "super_good/solidus_taxjar/tax_rate_calculator" require "super_good/solidus_taxjar/discount_calculator" +require "super_good/solidus_taxjar/addresses" module SuperGood module SolidusTaxJar diff --git a/lib/super_good/solidus_taxjar/addresses.rb b/lib/super_good/solidus_taxjar/addresses.rb new file mode 100644 index 0000000..8103269 --- /dev/null +++ b/lib/super_good/solidus_taxjar/addresses.rb @@ -0,0 +1,41 @@ +module SuperGood + module SolidusTaxJar + class Addresses + class << self + def normalize(spree_address) + new.normalize(spree_address) + end + end + + def initialize(api: ::SuperGood::SolidusTaxJar.api) + @api = api + end + + def normalize(spree_address) + taxjar_address = api.validate_spree_address(spree_address).first + + return if taxjar_address.nil? + + Spree::Address.immutable_merge(spree_address, { + country: us, # TaxJar only supports the US currently. + state: state(taxjar_address.state), + zipcode: taxjar_address.zip, + city: taxjar_address.city, + address1: taxjar_address.street + }) + end + + private + + attr_reader :api + + def us + Spree::Country.find_by iso: "US" + end + + def state(abbr) + us.states.find_by_abbr abbr + end + end + end +end diff --git a/spec/super_good/solidus_taxjar/addresses_spec.rb b/spec/super_good/solidus_taxjar/addresses_spec.rb new file mode 100644 index 0000000..b0c0c76 --- /dev/null +++ b/spec/super_good/solidus_taxjar/addresses_spec.rb @@ -0,0 +1,124 @@ +require "spec_helper" + +RSpec.describe SuperGood::SolidusTaxJar::Addresses do + describe "#normalize" do + subject { described_class.new(api: dummy_api).normalize(spree_address) } + + let(:spree_address) { + create( + :address, + address1: "475 North Beverly Drive", + city: "Los Angeles", + country: country_us, + first_name: "Chuck", + last_name: "Schuldiner", + phone: "1-250-555-4444", + state: state_california, + zipcode: "90210" + ) + } + + let(:country_us) { + Spree::Country.create!( + iso3: "USA", + iso: "US", + iso_name: "UNITED STATES", + name: "United States", + numcode: 840, + states_required: true + ) + } + + let(:state_california) { + Spree::State.create!( + abbr: "CA", + country: country_us, + name: "California" + ) + } + + let(:dummy_api) { + instance_double ::SuperGood::SolidusTaxJar::API + } + + before do + allow(dummy_api) + .to receive(:validate_spree_address) + .with(spree_address) + .and_return(results) + end + + context "when there are no possibilities for the address" do + let(:results) { [] } + + it { is_expected.to be_nil } + end + + context "when there is one possibility for the address" do + let(:results) { + [ + Taxjar::Address.new( + country: "US", + state: "CA", + zip: "90210-4606", + city: "Beverly Hills", + street: "475 N Beverly Dr" + ) + ] + } + + it "returns a sanitized address" do + expect(subject).to eq( + build( + :address, + address1: "475 N Beverly Dr", + city: "Beverly Hills", + country: country_us, + first_name: "Chuck", + last_name: "Schuldiner", + phone: "1-250-555-4444", + state: state_california, + zipcode: "90210-4606" + ) + ) + end + end + + context "when there are multiple possibilities for the address" do + let(:results) { + [ + Taxjar::Address.new( + country: "US", + state: "CA", + zip: "90210-4606", + city: "Beverly Hills", + street: "475 N Beverly Dr" + ), + Taxjar::Address.new( + country: "US", + state: "AZ", + zip: "90213-4606", + city: "Beverly Hills", + street: "475 N Beverly Dr" + ) + ] + } + + it "uses the first result to sanitize the addrses" do + expect(subject).to eq( + build( + :address, + address1: "475 N Beverly Dr", + city: "Beverly Hills", + country: country_us, + first_name: "Chuck", + last_name: "Schuldiner", + phone: "1-250-555-4444", + state: state_california, + zipcode: "90210-4606" + ) + ) + end + end + end +end |