Skip to content

Commit 907bf8a

Browse files
authored
Merge pull request #6305 from mamhoff/country-dependent
Country and state: Restrict deletion if addresses present
2 parents da70045 + 737f092 commit 907bf8a

19 files changed

Lines changed: 434 additions & 307 deletions

File tree

.rubocop_todo.yml

Lines changed: 250 additions & 251 deletions
Large diffs are not rendered by default.

admin/spec/features/zones_spec.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,20 @@
44

55
describe "Zones", :js, type: :feature do
66
before { sign_in create(:admin_user, email: 'admin@example.com') }
7+
let(:canada) { create(:country, iso: "CA") }
8+
let(:france) { create(:country, iso: "FR") }
9+
let(:usa) { create(:country) }
710

811
let(:states) do
912
[
10-
create(:state, name: "Alberta", country: create(:country, iso: "CA")),
11-
create(:state, name: "Manitoba", country: create(:country, iso: "CA"))
13+
create(:state, name: "Alberta", country: canada),
14+
create(:state, name: "Manitoba", country: canada)
1215
]
1316
end
1417

1518
it "lists zones and allows deleting them" do
16-
create(:zone, name: "Europe")
17-
create(:zone, name: "North America")
19+
create(:zone, name: "Europe", countries: [france])
20+
create(:zone, name: "North America", countries: [usa, canada])
1821

1922
visit "/admin/zones"
2023
expect(page).to have_content("Europe")

admin/spec/requests/solidus_admin/zones_spec.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
RSpec.describe "SolidusAdmin::ZonesController", type: :request do
77
include_examples "CRUD resource requests", "zone" do
8-
let(:countries) { create_list(:country, 2) }
8+
let(:usa) { create(:country) }
9+
let(:canada) { create(:country, iso: "CA") }
10+
let(:countries) { [usa, canada] }
911
let(:resource_class) { Spree::Zone }
1012
let(:valid_attributes) { { name: "Zone with countries", country_ids: countries.map(&:id) } }
1113
let(:invalid_attributes) { { name: "" } }
@@ -15,16 +17,21 @@
1517
end
1618

1719
it "updates zone members" do
18-
zone = create(:zone, :with_country)
20+
brazil = create(:country, iso: "BR")
21+
zone = create(:zone, countries: [brazil])
1922
expect { patch solidus_admin.zone_path(zone), params: { zone: valid_attributes } }.to change(Spree::ZoneMember, :count).by(1)
2023
end
2124
end
2225

2326
context "N+1" do
24-
before do
25-
create_list(:zone, 2, :with_country)
26-
create_list(:zone, 2, :with_state)
27-
end
27+
let(:usa) { create(:country) }
28+
let(:canada) { create(:country, iso: "CA") }
29+
let(:new_york) { create(:state, state_code: "NY", country: usa) }
30+
let(:north_carolina) { create(:state, state_code: "NC", country: usa) }
31+
let!(:usa_zone) { create(:zone, countries: [usa]) }
32+
let!(:canada_zone) { create(:zone, countries: [canada]) }
33+
let!(:new_york_zone) { create(:zone, states: [new_york]) }
34+
let!(:north_carolina_zone) { create(:zone, states: [north_carolina]) }
2835

2936
let(:expected_count) do
3037
[

api/spec/requests/spree/api/countries_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module Spree::Api
1616
end
1717

1818
context "with two countries" do
19-
before { @zambia = create(:country, name: "Zambia") }
19+
before { @zambia = create(:country, iso: "ZA", name: "Zambia") }
2020

2121
it "can view all countries" do
2222
get spree.api_countries_path

api/spec/requests/spree/api/states_spec.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
module Spree::Api
66
describe 'States', type: :request do
7-
let!(:state) { create(:state, name: "Victoria") }
7+
let(:australia) { create(:country, iso: "AU") }
8+
let!(:state) { create(:state, country: australia, name: "Victoria") }
89
let(:attributes) { [:id, :name, :abbr, :country_id] }
910

1011
before do
@@ -37,7 +38,7 @@ module Spree::Api
3738
end
3839

3940
context "with two states" do
40-
before { create(:state, name: "New South Wales") }
41+
before { create(:state, country: australia, name: "New South Wales") }
4142

4243
it "gets all states for a country" do
4344
country = create(:country, states_required: true)

backend/spec/features/admin/orders/customer_details_spec.rb

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -147,20 +147,6 @@
147147
end
148148
end
149149

150-
context "country associated was removed" do
151-
let(:brazil) { create(:country, iso: "BR", name: "Brazil") }
152-
153-
before do
154-
order.bill_address.country.destroy
155-
stub_spree_preferences(default_country_iso: brazil.iso)
156-
end
157-
158-
it "sets default country when displaying form" do
159-
click_link "Customer"
160-
expect(page).to have_field("order_bill_address_attributes_country_id", with: brazil.id, visible: false)
161-
end
162-
end
163-
164150
# Regression test for https://github.com/spree/spree/issues/942
165151
context "errors when no shipping methods are available" do
166152
before do

core/app/models/spree/address.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ class Address < Spree::Base
1111
mattr_accessor :state_validator_class
1212
self.state_validator_class = Spree::Address::StateValidator
1313

14-
belongs_to :country, class_name: "Spree::Country", optional: true
14+
belongs_to :country, class_name: "Spree::Country"
1515
belongs_to :state, class_name: "Spree::State", optional: true
1616

17-
validates :address1, :city, :country_id, :name, presence: true
17+
validates :address1, :city, :name, presence: true
1818
validates :zipcode, presence: true, if: :require_zipcode?
1919
validates :phone, presence: true, if: :require_phone?
2020

core/app/models/spree/country.rb

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,22 @@
22

33
module Spree
44
class Country < Spree::Base
5-
has_many :states, -> { order(:name) }, dependent: :destroy
6-
has_many :addresses, dependent: :nullify
7-
has_many :prices, class_name: "Spree::Price", foreign_key: "country_iso", primary_key: "iso"
8-
9-
validates :name, :iso_name, presence: true
5+
has_many :states,
6+
-> { order(:name) },
7+
dependent: :destroy,
8+
inverse_of: :country
9+
has_many :addresses,
10+
dependent: :restrict_with_error,
11+
inverse_of: :country
12+
has_many :prices,
13+
class_name: "Spree::Price",
14+
foreign_key: "country_iso",
15+
primary_key: "iso",
16+
dependent: :restrict_with_error,
17+
inverse_of: :country
18+
19+
validates :name, :iso_name, :iso, presence: true
20+
validates :iso, uniqueness: true
1021

1122
self.allowed_ransackable_attributes = %w[name]
1223

core/app/models/spree/state.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
module Spree
44
class State < Spree::Base
5-
belongs_to :country, class_name: 'Spree::Country', optional: true
6-
has_many :addresses, dependent: :nullify
5+
belongs_to :country, class_name: 'Spree::Country'
6+
has_many :addresses, dependent: :nullify, inverse_of: :state
77

8-
validates :country, :name, presence: true
8+
validates :name, presence: true
99

1010
scope :with_name_or_abbr, ->(name_or_abbr) do
1111
where(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# frozen_string_literal: true
2+
3+
class ChangeCountriesIsoToUnique < ActiveRecord::Migration[7.0]
4+
def change
5+
remove_index :spree_countries, :iso
6+
7+
add_index :spree_countries, :iso, unique: true
8+
end
9+
end

0 commit comments

Comments
 (0)