mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
263 lines
9.0 KiB
Ruby
263 lines
9.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Spree::Address do
|
|
describe "clone" do
|
|
it "creates a copy of the address with the exception of the id, " \
|
|
"updated_at and created_at attributes" do
|
|
state = build_stubbed(:state)
|
|
original = build_stubbed(:address,
|
|
address1: 'address1',
|
|
address2: 'address2',
|
|
alternative_phone: 'alternative_phone',
|
|
city: 'city',
|
|
country: state.country,
|
|
firstname: 'firstname',
|
|
lastname: 'lastname',
|
|
company: 'unused',
|
|
phone: 'phone',
|
|
state_id: state.id,
|
|
state_name: state.name,
|
|
zipcode: 'zip_code')
|
|
|
|
cloned = original.clone
|
|
|
|
expect(cloned.address1).to eq original.address1
|
|
expect(cloned.address2).to eq original.address2
|
|
expect(cloned.alternative_phone).to eq original.alternative_phone
|
|
expect(cloned.city).to eq original.city
|
|
expect(cloned.country_id).to eq original.country_id
|
|
expect(cloned.firstname).to eq original.firstname
|
|
expect(cloned.lastname).to eq original.lastname
|
|
expect(cloned.company).to eq original.company
|
|
expect(cloned.phone).to eq original.phone
|
|
expect(cloned.state_id).to eq original.state_id
|
|
expect(cloned.state_name).to eq original.state_name
|
|
expect(cloned.zipcode).to eq original.zipcode
|
|
|
|
expect(cloned.id).not_to eq original.id
|
|
expect(cloned.created_at).not_to eq original.created_at
|
|
expect(cloned.updated_at).not_to eq original.updated_at
|
|
end
|
|
end
|
|
|
|
context "aliased attributes" do
|
|
let(:address) { Spree::Address.new }
|
|
|
|
it "first_name" do
|
|
address.firstname = "Ryan"
|
|
expect(address.first_name).to eq "Ryan"
|
|
end
|
|
|
|
it "last_name" do
|
|
address.lastname = "Bigg"
|
|
expect(address.last_name).to eq "Bigg"
|
|
end
|
|
end
|
|
|
|
context "validation" do
|
|
before do
|
|
configure_spree_preferences do |config|
|
|
config.address_requires_state = true
|
|
end
|
|
end
|
|
|
|
let(:state) { build_stubbed(:state, name: 'maryland', abbr: 'md') }
|
|
let(:country) { state.country }
|
|
let(:address) { build_stubbed(:address, country:, state:) }
|
|
|
|
before do
|
|
country.states_required = true
|
|
end
|
|
|
|
it "errors when state_name is nil" do
|
|
address.state_name = nil
|
|
address.state = nil
|
|
expect(address).not_to be_valid
|
|
end
|
|
|
|
it "full state name is in state_name and country does contain that state" do
|
|
allow(country).to receive_message_chain(:states, :find_all_by_name_or_abbr) do
|
|
[build_stubbed(:state, name: 'alabama', abbr: 'al')]
|
|
end
|
|
|
|
address.state_name = 'alabama'
|
|
expect(address).to be_valid
|
|
expect(address.state.name).to eq 'alabama'
|
|
expect(address.state_name).to eq 'alabama'
|
|
end
|
|
|
|
it "state abbr is in state_name and country does contain that state" do
|
|
allow(country).to receive_message_chain(:states, :find_all_by_name_or_abbr) { [state] }
|
|
address.state_name = state.abbr
|
|
expect(address).to be_valid
|
|
expect(address.state.abbr).to eq state.abbr
|
|
expect(address.state_name).to eq state.name
|
|
end
|
|
|
|
it "both state and state_name are entered and country does contain the state" do
|
|
allow(country).to receive_message_chain(:states, :find_all_by_name_or_abbr) { [state] }
|
|
address.state = state
|
|
address.state_name = 'maryland'
|
|
expect(address).to be_valid
|
|
expect(address.state_name).to eq 'maryland'
|
|
end
|
|
|
|
it "address_requires_state preference is false" do
|
|
Spree::Config.set address_requires_state: false
|
|
address.state = nil
|
|
address.state_name = nil
|
|
expect(address).to be_valid
|
|
end
|
|
|
|
it "requires phone" do
|
|
address.phone = ""
|
|
address.valid?
|
|
expect(address.errors[:phone].first).to eq "can't be blank"
|
|
end
|
|
|
|
it "requires zipcode" do
|
|
address.zipcode = ""
|
|
address.valid?
|
|
expect(address.errors[:zipcode].first).to eq "can't be blank"
|
|
end
|
|
|
|
context "zipcode not required" do
|
|
before { allow(address).to receive(:require_zipcode?) { false } }
|
|
|
|
it "shows no errors when phone is blank" do
|
|
address.zipcode = ""
|
|
address.valid?
|
|
expect(address.errors[:zipcode]).to be_empty
|
|
end
|
|
end
|
|
end
|
|
|
|
context "associations" do
|
|
it "destroys shipments upon destroy" do
|
|
address = create(:address)
|
|
create(:shipment, address:)
|
|
|
|
expect {
|
|
address.destroy
|
|
}.to raise_error(ActiveRecord::DeleteRestrictionError)
|
|
end
|
|
end
|
|
|
|
context ".default" do
|
|
it "sets up a new record the default country" do
|
|
expect(Spree::Address.default.country).to eq DefaultCountry.country
|
|
end
|
|
|
|
# Regression test for #1142
|
|
|
|
context "The default country code is set to an invalid value" do
|
|
before do
|
|
allow(ENV).to receive(:[]).and_call_original
|
|
allow(ENV).to receive(:[]).with("DEFAULT_COUNTRY_CODE").and_return("notacountry")
|
|
end
|
|
|
|
it "uses the first available country" do
|
|
expect(Spree::Address.default.country).to eq Spree::Country.first
|
|
end
|
|
end
|
|
end
|
|
|
|
context '#full_name' do
|
|
context 'both first and last names are present' do
|
|
let(:address) { build(:address, firstname: 'Michael', lastname: 'Jackson') }
|
|
specify { expect(address.full_name).to eq 'Michael Jackson' }
|
|
end
|
|
|
|
context 'first name is blank' do
|
|
let(:address) { build(:address, firstname: nil, lastname: 'Jackson') }
|
|
specify { expect(address.full_name).to eq 'Jackson' }
|
|
end
|
|
|
|
context 'last name is blank' do
|
|
let(:address) { build(:address, firstname: 'Michael', lastname: nil) }
|
|
specify { expect(address.full_name).to eq 'Michael' }
|
|
end
|
|
|
|
context 'both first and last names are blank' do
|
|
let(:address) { build(:address, firstname: nil, lastname: nil) }
|
|
specify { expect(address.full_name).to eq '' }
|
|
end
|
|
end
|
|
|
|
context '#state_text' do
|
|
context 'both name and abbr is present' do
|
|
let(:state) { build(:state, name: 'virginia', abbr: 'va') }
|
|
let(:address) { build(:address, state:) }
|
|
specify { expect(address.state_text).to eq 'va' }
|
|
end
|
|
|
|
context 'only name is present' do
|
|
let(:state) { build(:state, name: 'virginia', abbr: nil) }
|
|
let(:address) { build(:address, state:) }
|
|
specify { expect(address.state_text).to eq 'virginia' }
|
|
end
|
|
end
|
|
|
|
describe "ransacker :full_name" do
|
|
it "searches for records with matching full names" do
|
|
address1 = create(:address, firstname: 'John', lastname: 'Doe')
|
|
address2 = create(:address, firstname: 'Jane', lastname: 'Smith')
|
|
|
|
result1 = described_class.ransack(full_name_cont: 'John Doe').result
|
|
expect(result1).to include(address1)
|
|
expect(result1).not_to include(address2)
|
|
|
|
result2 = described_class.ransack(full_name_cont: 'Jane Smith').result
|
|
expect(result2).to include(address2)
|
|
expect(result2).not_to include(address1)
|
|
end
|
|
end
|
|
|
|
describe "ransacker :full_name_with_comma" do
|
|
it "searches for records with matching full names with comma" do
|
|
address1 = create(:address, firstname: 'John', lastname: 'Doe')
|
|
address2 = create(:address, firstname: 'Jane', lastname: 'Smith')
|
|
|
|
result1 = described_class.ransack(full_name_with_comma_cont: 'John, Doe').result
|
|
expect(result1).to include(address1)
|
|
expect(result1).not_to include(address2)
|
|
|
|
result2 = described_class.ransack(full_name_with_comma_cont: 'Jane, Smith').result
|
|
expect(result2).to include(address2)
|
|
expect(result2).not_to include(address1)
|
|
end
|
|
end
|
|
|
|
describe "ransacker :full_name_reversed" do
|
|
it "searches for records with matching reversed full names" do
|
|
address1 = create(:address, firstname: 'John', lastname: 'Doe')
|
|
address2 = create(:address, firstname: 'Jane', lastname: 'Smith')
|
|
|
|
result1 = described_class.ransack(full_name_reversed_cont: 'Doe John').result
|
|
expect(result1).to include(address1)
|
|
expect(result1).not_to include(address2)
|
|
|
|
result2 = described_class.ransack(full_name_reversed_cont: 'Smith Jane').result
|
|
expect(result2).to include(address2)
|
|
expect(result2).not_to include(address1)
|
|
end
|
|
end
|
|
|
|
describe "ransacker :full_name_with_comma_reversed" do
|
|
it "searches for records with matching reversed full names" do
|
|
address1 = create(:address, firstname: 'John', lastname: 'Doe')
|
|
address2 = create(:address, firstname: 'Jane', lastname: 'Smith')
|
|
|
|
result1 = described_class.ransack(full_name_with_comma_reversed_cont: 'Doe, John').result
|
|
expect(result1).to include(address1)
|
|
expect(result1).not_to include(address2)
|
|
|
|
result2 = described_class.ransack(full_name_with_comma_reversed_cont: 'Smith, Jane').result
|
|
expect(result2).to include(address2)
|
|
expect(result2).not_to include(address1)
|
|
end
|
|
end
|
|
end
|