require 'spree/testing_support/factories/state_factory'
require 'spree/testing_support/factories/country_factory'
require 'twitter_cldr'

FactoryGirl.define do
  factory :address, class: Spree::Address do
    transient do
      # There's `Spree::Address#country_iso=`, prohibiting me from using `country_iso` here
      country_iso_code 'US'
      state_code 'AL'
    end

    firstname 'John'
    lastname nil
    company 'Company'
    address1 '10 Lovely Street'
    address2 'Northwest'
    city 'Herndon'
    zipcode { TwitterCldr::Shared::PostalCodes.for_territory(country_iso_code).sample.first }
    phone '555-555-0199'
    alternative_phone '555-555-0199'

    state do |address|
      Spree::State.joins(:country).where('spree_countries.iso = (?)', country_iso_code).find_by(abbr: state_code) ||
        address.association(:state, country_iso: country_iso_code, state_code: state_code)
    end

    country do |address|
      if address.state
        address.state.country
      else
        address.association(:country, iso: country_iso_code)
      end
    end
  end

  factory :ship_address, parent: :address do
    address1 'A Different Road'
  end

  factory :bill_address, parent: :address do
    address1 'PO Box 1337'
  end
end

require 'spree/testing_support/factories/state_factory'
require 'spree/testing_support/factories/country_factory'

FactoryGirl.define do
  factory :address, class: Spree::Address do
    transient do
      # There's `Spree::Address#country_iso=`, prohibiting me from using `country_iso` here
      country_iso_code 'US'
      state_code 'AL'
    end

    firstname 'John'
    lastname nil
    company 'Company'
    address1 '10 Lovely Street'
    address2 'Northwest'
    city 'Herndon'
    zipcode { FFaker::AddressUS.zip_code }
    phone '555-555-0199'
    alternative_phone '555-555-0199'

    state do |address|
      Spree::State.joins(:country).where('spree_countries.iso = (?)', country_iso_code).find_by(abbr: state_code) ||
        address.association(:state, country_iso: country_iso_code, state_code: state_code)
    end

    country do |address|
      if address.state
        address.state.country
      else
        address.association(:country, iso: country_iso_code)
      end
    end
  end

  factory :ship_address, parent: :address do
    address1 'A Different Road'
  end

  factory :bill_address, parent: :address do
    address1 'PO Box 1337'
  end
end

Use FFaker instead of Twitter CLDr in Address factory
Use FFaker instead of Twitter CLDr in Address factory

In the address factory, we were using Twitter CLDR for generating
sample zip codes. We can just as well use FFaker, which conveniently
comes with an address faking module for different countries.

Our default address is in the USA, so we can use the FFaker::AddressUS
module.
