diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 92432aae32..cacc26fc1c 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -339,7 +339,6 @@ Naming/VariableNumber:
- 'app/models/preference_sections/main_links_section.rb'
- 'lib/spree/core/controller_helpers/common.rb'
- 'spec/controllers/spree/admin/search_controller_spec.rb'
- - 'spec/factories/stock_location_factory.rb'
- 'spec/models/spree/stock_item_spec.rb'
- 'spec/models/spree/tax_rate_spec.rb'
- 'spec/requests/api/orders_spec.rb'
diff --git a/app/assets/javascripts/admin/spree/orders/variant_autocomplete.js.erb b/app/assets/javascripts/admin/spree/orders/variant_autocomplete.js.erb
index 001055417e..547a5a1b17 100644
--- a/app/assets/javascripts/admin/spree/orders/variant_autocomplete.js.erb
+++ b/app/assets/javascripts/admin/spree/orders/variant_autocomplete.js.erb
@@ -187,18 +187,17 @@ addVariantFromStockLocation = function() {
$('#stock_details').hide();
var variant_id = $('input.variant_autocomplete').val();
- var stock_location_id = $(this).data('stock-location-id');
- var quantity = $("input.quantity[data-stock-location-id='" + stock_location_id + "']").val();
+ var quantity = $("input.quantity").val();
var shipment = _.find(shipments, function(shipment){
- return shipment.stock_location_id == stock_location_id && (shipment.state == 'ready' || shipment.state == 'pending');
+ return shipment.state == 'ready' || shipment.state == 'pending';
});
if(shipment==undefined){
$.ajax({
type: "POST",
url: Spree.url(Spree.routes.orders_api + "/" + order_number + "/shipments.json"),
- data: { variant_id: variant_id, quantity: quantity, stock_location_id: stock_location_id }
+ data: { variant_id: variant_id, quantity: quantity }
}).done(function( msg ) {
window.location.reload();
}).error(function( msg ) {
diff --git a/app/controllers/api/v0/shipments_controller.rb b/app/controllers/api/v0/shipments_controller.rb
index b041eacd97..1580e1f89f 100644
--- a/app/controllers/api/v0/shipments_controller.rb
+++ b/app/controllers/api/v0/shipments_controller.rb
@@ -14,7 +14,7 @@ module Api
def create
variant = scoped_variant(params[:variant_id])
quantity = params[:quantity].to_i
- @shipment = get_or_create_shipment(params[:stock_location_id])
+ @shipment = @order.shipment || @order.shipments.create
@order.contents.add(variant, quantity, @shipment)
@@ -116,10 +116,6 @@ module Api
variant
end
- def get_or_create_shipment(stock_location_id)
- @order.shipment || @order.shipments.create(stock_location_id:)
- end
-
def shipment_params
return {} unless params.has_key? :shipment
diff --git a/app/models/concerns/variant_stock.rb b/app/models/concerns/variant_stock.rb
index 710095502f..7489aa5893 100644
--- a/app/models/concerns/variant_stock.rb
+++ b/app/models/concerns/variant_stock.rb
@@ -78,11 +78,6 @@ module VariantStock
on_demand || total_on_hand >= quantity
end
- # Moving Spree::StockLocation.fill_status to the variant enables us
- # to override this behaviour for variant overrides
- # We can have this responsibility here in the variant because there is
- # only one stock item per variant
- #
# Here we depend only on variant.total_on_hand and variant.on_demand.
# This way, variant_overrides only need to override variant.total_on_hand and variant.on_demand.
def fill_status(quantity)
@@ -107,13 +102,15 @@ module VariantStock
raise_error_if_no_stock_item_available
# Creates a stock movement: it updates stock_item.count_on_hand and fills backorders
- #
- # This is the original Spree::StockLocation#move,
- # except that we raise an error if the stock item is missing,
- # because, unlike Spree, we should always have exactly one stock item per variant.
stock_item.stock_movements.create!(quantity:, originator:)
end
+ # There shouldn't be any other stock items, because we should
+ # have only one stock location.
+ def stock_item
+ stock_items.first
+ end
+
private
# Persists the single stock item associated to this variant. As defined in
@@ -139,10 +136,4 @@ module VariantStock
def overwrite_stock_levels(new_level)
stock_item.adjust_count_on_hand(new_level.to_i - stock_item.count_on_hand)
end
-
- # There shouldn't be any other stock items, because we should
- # have only one stock location.
- def stock_item
- stock_items.first
- end
end
diff --git a/app/models/spree/inventory_unit.rb b/app/models/spree/inventory_unit.rb
index f5f0219919..6240883659 100644
--- a/app/models/spree/inventory_unit.rb
+++ b/app/models/spree/inventory_unit.rb
@@ -35,18 +35,6 @@ module Spree
end
end
- # This was refactored from a simpler query because the previous implementation
- # lead to issues once users tried to modify the objects returned. That's due
- # to ActiveRecord `joins(shipment: :stock_location)` only return readonly
- # objects
- #
- # Returns an array of backordered inventory units as per a given stock item
- def self.backordered_for_stock_item(stock_item)
- backordered_per_variant(stock_item).select do |unit|
- unit.shipment.stock_location == stock_item.stock_location
- end
- end
-
def self.finalize_units!(inventory_units)
inventory_units.map do |iu|
iu.update_columns(
@@ -57,8 +45,7 @@ module Spree
end
def find_stock_item
- Spree::StockItem.find_by(stock_location_id: shipment.stock_location_id,
- variant_id:)
+ Spree::StockItem.find_by(variant_id:)
end
private
diff --git a/app/models/spree/order_inventory.rb b/app/models/spree/order_inventory.rb
index e1e3e06182..fdf0d9ed9b 100644
--- a/app/models/spree/order_inventory.rb
+++ b/app/models/spree/order_inventory.rb
@@ -12,8 +12,8 @@ module Spree
# have inventory assigned via +order.create_proposed_shipment+) or when
# shipment is explicitly passed
#
- # In case shipment is passed the stock location should only unstock or
- # restock items if the order is completed. That is so because stock items
+ # In case shipment is passed stock should only be adjusted
+ # if the order is completed. That is so because stock items
# are always unstocked when the order is completed through +shipment.finalize+
def verify(line_item, shipment = nil)
if order.completed? || shipment.present?
@@ -60,27 +60,24 @@ module Spree
# Returns either one of the shipment:
#
# first unshipped that already includes this variant
- # first unshipped that's leaving from a stock_location that stocks this variant
def determine_target_shipment(variant)
target_shipment = order.shipments.detect do |shipment|
(shipment.ready? || shipment.pending?) && shipment.contains?(variant)
end
target_shipment || order.shipments.detect do |shipment|
- (shipment.ready? || shipment.pending?) &&
- variant.stock_location_ids.include?(shipment.stock_location_id)
+ shipment.ready? || shipment.pending?
end
end
def add_to_shipment(shipment, variant, quantity)
- on_hand, back_order = shipment.stock_location.fill_status(variant, quantity)
+ on_hand, back_order = variant.fill_status(quantity)
on_hand.times { shipment.set_up_inventory('on_hand', variant, order) }
back_order.times { shipment.set_up_inventory('backordered', variant, order) }
- # adding to this shipment, and removing from stock_location
if order.completed?
- shipment.stock_location.unstock(variant, quantity, shipment)
+ variant.move(-quantity, shipment)
end
quantity
@@ -103,9 +100,8 @@ module Spree
end
shipment.destroy if shipment.inventory_units.reload.count == 0
- # removing this from shipment, and adding to stock_location
if order.completed? && restock_item
- shipment.stock_location.restock variant, removed_quantity, shipment
+ variant.move(removed_quantity, shipment)
end
removed_quantity
diff --git a/app/models/spree/shipment.rb b/app/models/spree/shipment.rb
index 8e59029abc..5b9692912c 100644
--- a/app/models/spree/shipment.rb
+++ b/app/models/spree/shipment.rb
@@ -5,10 +5,10 @@ require 'ostruct'
module Spree
class Shipment < ApplicationRecord
self.belongs_to_required_by_default = false
+ self.ignored_columns += [:stock_location_id]
belongs_to :order, class_name: 'Spree::Order'
belongs_to :address, class_name: 'Spree::Address'
- belongs_to :stock_location, class_name: 'Spree::StockLocation'
has_many :shipping_rates, dependent: :delete_all
has_many :shipping_methods, through: :shipping_rates
@@ -257,7 +257,7 @@ module Spree
end
def to_package
- package = OrderManagement::Stock::Package.new(stock_location, order)
+ package = OrderManagement::Stock::Package.new(order)
grouped_inventory_units = inventory_units.includes(:variant).group_by do |iu|
[iu.variant, iu.state_name]
end
@@ -313,11 +313,11 @@ module Spree
end
def manifest_unstock(item)
- stock_location.unstock item.variant, item.quantity, self
+ item.variant.move(-1 * item.quantity, self)
end
def manifest_restock(item)
- stock_location.restock item.variant, item.quantity, self
+ item.variant.move(item.quantity, self)
end
def generate_shipment_number
diff --git a/app/models/spree/stock_item.rb b/app/models/spree/stock_item.rb
index a89a44975e..db236f7ecf 100644
--- a/app/models/spree/stock_item.rb
+++ b/app/models/spree/stock_item.rb
@@ -2,20 +2,21 @@
module Spree
class StockItem < ApplicationRecord
+ self.ignored_columns += [:stock_location_id]
+
acts_as_paranoid
- belongs_to :stock_location, class_name: 'Spree::StockLocation', inverse_of: :stock_items
belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant'
has_many :stock_movements, dependent: :destroy
- validates :variant_id, uniqueness: { scope: [:stock_location_id, :deleted_at] }
+ validates :variant_id, uniqueness: { scope: [:deleted_at] }
validates :count_on_hand, numericality: { greater_than_or_equal_to: 0, unless: :backorderable? }
delegate :weight, to: :variant
delegate :name, to: :variant, prefix: true
def backordered_inventory_units
- Spree::InventoryUnit.backordered_for_stock_item(self)
+ Spree::InventoryUnit.backordered_per_variant(self)
end
def adjust_count_on_hand(value)
diff --git a/app/models/spree/stock_location.rb b/app/models/spree/stock_location.rb
deleted file mode 100644
index 268e3b084c..0000000000
--- a/app/models/spree/stock_location.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-module Spree
- class StockLocation < ApplicationRecord
- self.belongs_to_required_by_default = false
- self.ignored_columns += [:backorderable_default, :active]
-
- has_many :stock_items, dependent: :delete_all, inverse_of: :stock_location
- has_many :stock_movements, through: :stock_items
-
- belongs_to :state, class_name: 'Spree::State'
- belongs_to :country, class_name: 'Spree::Country'
-
- validates :name, presence: true
-
- after_create :create_stock_items
-
- # Wrapper for creating a new stock item respecting the backorderable config
- def stock_item(variant)
- stock_items.where(variant_id: variant).order(:id).first
- end
-
- def stock_item_or_create(variant)
- stock_item(variant) || stock_items.create(variant:)
- end
-
- def count_on_hand(variant)
- stock_item(variant).try(:count_on_hand)
- end
-
- def backorderable?(variant)
- stock_item(variant).try(:backorderable?)
- end
-
- def restock(variant, quantity, originator = nil)
- move(variant, quantity, originator)
- end
-
- def unstock(variant, quantity, originator = nil)
- move(variant, -quantity, originator)
- end
-
- def move(variant, quantity, originator = nil)
- variant.move(quantity, originator)
- end
-
- def fill_status(variant, quantity)
- variant.fill_status(quantity)
- end
-
- private
-
- def create_stock_items
- Variant.find_each { |variant| stock_items.create!(variant:) }
- end
- end
-end
diff --git a/app/models/spree/variant.rb b/app/models/spree/variant.rb
index acb430ecb6..acf0e78408 100644
--- a/app/models/spree/variant.rb
+++ b/app/models/spree/variant.rb
@@ -39,7 +39,6 @@ module Spree
has_many :line_items, inverse_of: :variant, dependent: nil
has_many :stock_items, dependent: :destroy, inverse_of: :variant
- has_many :stock_locations, through: :stock_items
has_many :images, -> { order(:position) }, as: :viewable,
dependent: :destroy,
class_name: "Spree::Image"
@@ -268,9 +267,7 @@ module Spree
def create_stock_items
return unless stock_items.empty?
- StockLocation.find_each do |stock_location|
- stock_items.create!(stock_location:)
- end
+ stock_items.create!
end
def update_weight_from_unit_value
diff --git a/app/queries/product_scope_query.rb b/app/queries/product_scope_query.rb
index 678104695c..bdadbc3401 100644
--- a/app/queries/product_scope_query.rb
+++ b/app/queries/product_scope_query.rb
@@ -61,7 +61,7 @@ class ProductScopeQuery
def product_query_includes
[
image: { attachment_attachment: :blob },
- variants: [:default_price, :stock_locations, :stock_items, :variant_overrides]
+ variants: [:default_price, :stock_items, :variant_overrides]
]
end
diff --git a/app/serializers/api/admin/product_serializer.rb b/app/serializers/api/admin/product_serializer.rb
index 7056c5745c..991cb8e8b9 100644
--- a/app/serializers/api/admin/product_serializer.rb
+++ b/app/serializers/api/admin/product_serializer.rb
@@ -11,7 +11,6 @@ module Api
object.variants,
each_serializer: Api::Admin::VariantSerializer,
image: thumb_url,
- stock_location: Spree::StockLocation.first
)
end
diff --git a/app/serializers/api/admin/variant_serializer.rb b/app/serializers/api/admin/variant_serializer.rb
index 516351a3e4..7099207433 100644
--- a/app/serializers/api/admin/variant_serializer.rb
+++ b/app/serializers/api/admin/variant_serializer.rb
@@ -6,7 +6,7 @@ module Api
attributes :id, :name, :producer_name, :image, :sku, :import_date, :tax_category_id,
:options_text, :unit_value, :unit_description, :unit_to_display,
:display_as, :display_name, :name_to_display, :variant_overrides_count,
- :price, :on_demand, :on_hand, :in_stock, :stock_location_id, :stock_location_name,
+ :price, :on_demand, :on_hand, :in_stock,
:variant_unit, :variant_unit_scale, :variant_unit_name, :variant_unit_with_scale
has_one :primary_taxon, key: :category_id, embed: :id
@@ -44,18 +44,6 @@ module Api
object.in_stock?
end
- def stock_location_id
- return if object.stock_items.empty?
-
- options[:stock_location]&.id || object.stock_items.first.stock_location.id
- end
-
- def stock_location_name
- return if object.stock_items.empty?
-
- options[:stock_location]&.name || object.stock_items.first.stock_location.name
- end
-
def variant_overrides_count
object.variant_overrides.count
end
diff --git a/app/serializers/api/shipment_serializer.rb b/app/serializers/api/shipment_serializer.rb
index 1c03d9eb5e..278112bbf8 100644
--- a/app/serializers/api/shipment_serializer.rb
+++ b/app/serializers/api/shipment_serializer.rb
@@ -2,14 +2,10 @@
module Api
class ShipmentSerializer < ActiveModel::Serializer
- attributes :id, :tracking, :number, :order_id, :cost, :shipped_at, :stock_location_name, :state
+ attributes :id, :tracking, :number, :order_id, :cost, :shipped_at, :state
def order_id
object.order.number
end
-
- def stock_location_name
- object.stock_location.name
- end
end
end
diff --git a/app/services/default_stock_location.rb b/app/services/default_stock_location.rb
deleted file mode 100644
index fb58f537d1..0000000000
--- a/app/services/default_stock_location.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-# Encapsulates the concept of default stock location that OFN has, as explained
-# in https://github.com/openfoodfoundation/openfoodnetwork/wiki/Spree-Upgrade%3A-Stock-locations
-class DefaultStockLocation
- NAME = 'default'
-
- def self.find_or_create
- Spree::StockLocation.find_or_create_by(name: NAME)
- end
-end
diff --git a/app/services/products_renderer.rb b/app/services/products_renderer.rb
index 339d16c925..90b9e8e029 100644
--- a/app/services/products_renderer.rb
+++ b/app/services/products_renderer.rb
@@ -117,7 +117,7 @@ class ProductsRenderer
# rubocop:disable Rails/FindEach # .each returns an array, .find_each returns nil
distributed_products.variants_relation.
- includes(:default_price, :stock_locations, :product).
+ includes(:default_price, :product).
where(product_id: products).
each { |v| scoper.scope(v) } # Scope results with variant_overrides
# rubocop:enable Rails/FindEach
diff --git a/app/views/spree/admin/orders/_form.html.haml b/app/views/spree/admin/orders/_form.html.haml
index 4d43acf8dd..02b1acf841 100644
--- a/app/views/spree/admin/orders/_form.html.haml
+++ b/app/views/spree/admin/orders/_form.html.haml
@@ -30,5 +30,5 @@
var order_number = '#{@order.number}';
var shipments = [];
- @order.shipments.each do |shipment|
- shipments.push(#{shipment.to_json(:root => false, :include => [:inventory_units, :stock_location]).html_safe});
+ shipments.push(#{shipment.to_json(:root => false, :include => [:inventory_units]).html_safe});
= render :partial => 'spree/admin/shared/update_order_state', :handlers => [:erb], :formats => [:js]
diff --git a/app/views/spree/admin/variants/_autocomplete.js.erb b/app/views/spree/admin/variants/_autocomplete.js.erb
index c4f3bae954..b42de3f6b7 100644
--- a/app/views/spree/admin/variants/_autocomplete.js.erb
+++ b/app/views/spree/admin/variants/_autocomplete.js.erb
@@ -51,10 +51,10 @@
{{/if}}
-
+
|
-
+
|
{{else}}
<%= t('.out_of_stock') %> |
diff --git a/db/migrate/20190313142051_set_default_stock_location_on_shipments.rb b/db/migrate/20190313142051_set_default_stock_location_on_shipments.rb
index 66d5f6cbde..1724efea01 100644
--- a/db/migrate/20190313142051_set_default_stock_location_on_shipments.rb
+++ b/db/migrate/20190313142051_set_default_stock_location_on_shipments.rb
@@ -1,7 +1,10 @@
class SetDefaultStockLocationOnShipments < ActiveRecord::Migration[4.2]
+ class SpreeStockLocation < ActiveRecord::Base
+ end
+
def up
if Spree::Shipment.where('stock_location_id IS NULL').count > 0
- location = DefaultStockLocation.find_or_create
+ location = SpreeStockLocation.find_or_create_by(name: "default")
Spree::Shipment.where('stock_location_id IS NULL').update_all(stock_location_id: location.id)
end
end
diff --git a/db/migrate/20250108234658_allow_null_stock_location_id_on_spree_stock_items.rb b/db/migrate/20250108234658_allow_null_stock_location_id_on_spree_stock_items.rb
new file mode 100644
index 0000000000..34900af1ec
--- /dev/null
+++ b/db/migrate/20250108234658_allow_null_stock_location_id_on_spree_stock_items.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AllowNullStockLocationIdOnSpreeStockItems < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_stock_items, :stock_location_id, true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index ea7efe830f..d97d554f99 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -822,7 +822,7 @@ ActiveRecord::Schema[7.0].define(version: 2025_01_13_055412) do
end
create_table "spree_stock_items", id: :serial, force: :cascade do |t|
- t.integer "stock_location_id", null: false
+ t.integer "stock_location_id"
t.integer "variant_id", null: false
t.integer "count_on_hand", default: 0, null: false
t.datetime "created_at", precision: nil, null: false
diff --git a/db/seeds.rb b/db/seeds.rb
index 9192a35e61..70512b1463 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -30,5 +30,4 @@ require File.join(File.dirname(__FILE__), 'default', 'zones')
Rails.logger.info "[db:seed] Seeding Users"
require File.join(File.dirname(__FILE__), 'default', 'users')
-DefaultStockLocation.find_or_create
DefaultShippingCategory.find_or_create
diff --git a/engines/dfc_provider/app/services/catalog_item_builder.rb b/engines/dfc_provider/app/services/catalog_item_builder.rb
index 11aff59e40..3af8c0e4f4 100644
--- a/engines/dfc_provider/app/services/catalog_item_builder.rb
+++ b/engines/dfc_provider/app/services/catalog_item_builder.rb
@@ -8,7 +8,6 @@ class CatalogItemBuilder < DfcBuilder
if variant.stock_items.empty?
variant.stock_items << Spree::StockItem.new(
- stock_location: DefaultStockLocation.find_or_create,
variant:,
)
end
diff --git a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb
index 8c307fe5a5..bd222af048 100644
--- a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb
@@ -222,9 +222,6 @@ RSpec.describe SuppliedProductBuilder do
}
it "creates a new Spree::Product and variant" do
- # We need this to save stock:
- DefaultStockLocation.find_or_create
-
create(:taxon)
expect(imported_variant).to be_a(Spree::Variant)
diff --git a/engines/order_management/app/services/order_management/stock/coordinator.rb b/engines/order_management/app/services/order_management/stock/coordinator.rb
index 64bbbc8cbc..4434bbe13b 100644
--- a/engines/order_management/app/services/order_management/stock/coordinator.rb
+++ b/engines/order_management/app/services/order_management/stock/coordinator.rb
@@ -41,8 +41,7 @@ module OrderManagement
end
def build_packer(order)
- stock_location = DefaultStockLocation.find_or_create
- OrderManagement::Stock::Packer.new(stock_location, order)
+ OrderManagement::Stock::Packer.new(order)
end
end
end
diff --git a/engines/order_management/app/services/order_management/stock/package.rb b/engines/order_management/app/services/order_management/stock/package.rb
index 2a937fa0bb..6db9db186b 100644
--- a/engines/order_management/app/services/order_management/stock/package.rb
+++ b/engines/order_management/app/services/order_management/stock/package.rb
@@ -5,11 +5,10 @@ module OrderManagement
class Package
ContentItem = Struct.new(:variant, :quantity, :state)
- attr_reader :stock_location, :order, :contents
+ attr_reader :order, :contents
attr_accessor :shipping_rates
- def initialize(stock_location, order, contents = [])
- @stock_location = stock_location
+ def initialize(order, contents = [])
@order = order
@contents = contents
@shipping_rates = []
@@ -94,7 +93,6 @@ module OrderManagement
def to_shipment
shipment = Spree::Shipment.new
shipment.order = order
- shipment.stock_location = stock_location
shipment.shipping_rates = shipping_rates
contents.each do |item|
diff --git a/engines/order_management/app/services/order_management/stock/packer.rb b/engines/order_management/app/services/order_management/stock/packer.rb
index 87fe891c72..dc8c462783 100644
--- a/engines/order_management/app/services/order_management/stock/packer.rb
+++ b/engines/order_management/app/services/order_management/stock/packer.rb
@@ -3,22 +3,21 @@
module OrderManagement
module Stock
class Packer
- attr_reader :stock_location, :order
+ attr_reader :order
- def initialize(stock_location, order)
- @stock_location = stock_location
+ def initialize(order)
@order = order
end
def package
- package = OrderManagement::Stock::Package.new(stock_location, order)
+ package = OrderManagement::Stock::Package.new(order)
order.line_items.each do |line_item|
- next unless stock_location.stock_item(line_item.variant)
-
variant = line_item.variant
+ next unless variant.stock_item
+
OpenFoodNetwork::ScopeVariantToHub.new(order.distributor).scope(variant)
- on_hand, backordered = stock_location.fill_status(variant, line_item.quantity)
+ on_hand, backordered = variant.fill_status(line_item.quantity)
package.add variant, on_hand, :on_hand if on_hand.positive?
package.add variant, backordered, :backordered if backordered.positive?
end
diff --git a/engines/order_management/spec/services/order_management/stock/package_spec.rb b/engines/order_management/spec/services/order_management/stock/package_spec.rb
index 22b97eb1ff..0aea97d177 100644
--- a/engines/order_management/spec/services/order_management/stock/package_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/package_spec.rb
@@ -7,11 +7,10 @@ module OrderManagement
RSpec.describe Package do
context "base tests" do
let(:variant) { build(:variant, weight: 25.0) }
- let(:stock_location) { build(:stock_location) }
let(:distributor) { create(:enterprise) }
let(:order) { build(:order, distributor:) }
- subject { Package.new(stock_location, order) }
+ subject { Package.new(order) }
it 'calculates the weight of all the contents' do
subject.add variant, 4
@@ -80,7 +79,7 @@ module OrderManagement
Package::ContentItem.new(variant2, 1),
Package::ContentItem.new(variant3, 1)]
- package = Package.new(stock_location, order, contents)
+ package = Package.new(order, contents)
expect(package.shipping_methods.size).to eq 2
end
@@ -96,7 +95,6 @@ module OrderManagement
shipment = subject.to_shipment
expect(shipment.order).to eq subject.order
- expect(shipment.stock_location).to eq subject.stock_location
expect(shipment.inventory_units.size).to eq 3
first_unit = shipment.inventory_units.first
@@ -122,9 +120,7 @@ module OrderManagement
end
context "#shipping_methods and #shipping_categories" do
- let(:stock_location) { double(:stock_location) }
-
- subject(:package) { Package.new(stock_location, order, contents) }
+ subject(:package) { Package.new(order, contents) }
let(:enterprise) { create(:enterprise) }
let(:other_enterprise) { create(:enterprise) }
diff --git a/engines/order_management/spec/services/order_management/stock/packer_spec.rb b/engines/order_management/spec/services/order_management/stock/packer_spec.rb
index 1b0895bc28..a2669160af 100644
--- a/engines/order_management/spec/services/order_management/stock/packer_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/packer_spec.rb
@@ -7,9 +7,8 @@ module OrderManagement
RSpec.describe Packer do
let(:distributor) { create(:distributor_enterprise) }
let(:order) { create(:order_with_line_items, line_items_count: 5, distributor:) }
- let(:stock_location) { create(:stock_location) }
- subject { Packer.new(stock_location, order) }
+ subject { Packer.new(order) }
before { order.line_items.first.variant.update(unit_value: 100) }
@@ -21,7 +20,9 @@ module OrderManagement
end
it 'variants are added as backordered without enough on_hand' do
- expect(stock_location).to receive(:fill_status).exactly(5).times.and_return([2, 3])
+ order.line_items.each do |item|
+ expect(item.variant).to receive(:fill_status).and_return([2, 3])
+ end
package = subject.package
expect(package.on_hand.size).to eq 5
diff --git a/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb b/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb
index c521eaad84..85883e8be9 100644
--- a/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb
@@ -6,12 +6,11 @@ module OrderManagement
module Stock
RSpec.describe Prioritizer do
let(:order) { create(:order_with_line_items, line_items_count: 2) }
- let(:stock_location) { build(:stock_location) }
let(:variant1) { order.line_items[0].variant }
let(:variant2) { order.line_items[1].variant }
def pack
- package = Package.new(order, stock_location)
+ package = Package.new(order)
yield(package) if block_given?
package
end
diff --git a/spec/controllers/api/v0/products_controller_spec.rb b/spec/controllers/api/v0/products_controller_spec.rb
index 4c45845b8d..9e961e9ae0 100644
--- a/spec/controllers/api/v0/products_controller_spec.rb
+++ b/spec/controllers/api/v0/products_controller_spec.rb
@@ -42,10 +42,8 @@ RSpec.describe Api::V0::ProductsController, type: :controller do
api_get :show, id: product.to_param
- expect(all_attributes.all?{ |attr| json_response.keys.include? attr }).to eq(true)
- expect(variants_attributes.all?{ |attr|
- json_response['variants'].first.keys.include? attr
- } ).to eq(true)
+ expect(json_response.keys).to include(*all_attributes)
+ expect(json_response["variants"].first.keys).to include(*variants_attributes)
end
it "returns a 404 error when it cannot find a product" do
diff --git a/spec/controllers/api/v0/shipments_controller_spec.rb b/spec/controllers/api/v0/shipments_controller_spec.rb
index ad70950001..1c2196b36b 100644
--- a/spec/controllers/api/v0/shipments_controller_spec.rb
+++ b/spec/controllers/api/v0/shipments_controller_spec.rb
@@ -6,9 +6,7 @@ RSpec.describe Api::V0::ShipmentsController, type: :controller do
render_views
let!(:shipment) { create(:shipment) }
- let!(:attributes) do
- [:id, :tracking, :number, :cost, :shipped_at, :stock_location_name, :order_id]
- end
+ let(:attributes) { %w[id tracking number cost shipped_at order_id] }
let(:current_api_user) { build(:user) }
before do
@@ -31,13 +29,11 @@ RSpec.describe Api::V0::ShipmentsController, type: :controller do
let(:current_api_user) { build(:admin_user) }
let!(:order) { shipment.order }
let(:order_ship_address) { create(:address) }
- let!(:stock_location) { DefaultStockLocation.find_or_create }
let!(:variant) { create(:variant) }
let(:params) do
{ quantity: 2,
variant_id: variant.to_param,
order_id: order.number,
- stock_location_id: stock_location.to_param,
format: :json }
end
let(:error_message) { "broken shipments creation" }
@@ -109,7 +105,7 @@ RSpec.describe Api::V0::ShipmentsController, type: :controller do
allow_any_instance_of(Spree::Order).to receive_messages(paid?: true, complete?: true)
api_put :ready, order_id: shipment.order.to_param, id: shipment.to_param
- expect(attributes.all?{ |attr| json_response.key? attr.to_s }).to be_truthy
+ expect(json_response.keys).to include(*attributes)
expect(json_response["state"]).to eq("ready")
expect(shipment.reload.state).to eq("ready")
end
@@ -120,7 +116,7 @@ RSpec.describe Api::V0::ShipmentsController, type: :controller do
api_put :ready, order_id: shipment.order.to_param, id: shipment.to_param
- expect(attributes.all?{ |attr| json_response.key? attr.to_s }).to be_truthy
+ expect(json_response.keys).to include(*attributes)
expect(json_response["state"]).to eq("ready")
expect(shipment.reload.state).to eq("ready")
end
@@ -324,7 +320,7 @@ RSpec.describe Api::V0::ShipmentsController, type: :controller do
id: shipment.to_param,
shipment: { tracking: "123123" }
- expect(attributes.all?{ |attr| json_response.key? attr.to_s }).to be_truthy
+ expect(json_response.keys).to include(*attributes)
expect(json_response["state"]).to eq("shipped")
end
end
@@ -424,7 +420,7 @@ RSpec.describe Api::V0::ShipmentsController, type: :controller do
def expect_valid_response
expect(response.status).to eq 200
- attributes.all?{ |attr| json_response.key? attr.to_s }
+ expect(json_response.keys).to include(*attributes)
end
def make_order_contents_fail
diff --git a/spec/controllers/spree/admin/products_controller_spec.rb b/spec/controllers/spree/admin/products_controller_spec.rb
index deae56bd80..f6f14206ab 100644
--- a/spec/controllers/spree/admin/products_controller_spec.rb
+++ b/spec/controllers/spree/admin/products_controller_spec.rb
@@ -142,7 +142,6 @@ RSpec.describe Spree::Admin::ProductsController, type: :controller do
before do
controller_login_as_admin
- create(:stock_location)
end
it "redirects to products when the user hits 'create'" do
diff --git a/spec/factories/product_factory.rb b/spec/factories/product_factory.rb
index 453a442be4..3d3dafeb53 100644
--- a/spec/factories/product_factory.rb
+++ b/spec/factories/product_factory.rb
@@ -23,9 +23,6 @@ FactoryBot.define do
variant_unit { 'weight' }
variant_unit_scale { 1 }
- # ensure stock item will be created for this products master
- before(:create) { DefaultStockLocation.find_or_create }
-
factory :product do
transient do
on_hand { 5 }
diff --git a/spec/factories/shipment_factory.rb b/spec/factories/shipment_factory.rb
index f168880861..26a665dd9d 100644
--- a/spec/factories/shipment_factory.rb
+++ b/spec/factories/shipment_factory.rb
@@ -11,7 +11,6 @@ FactoryBot.define do
state { 'pending' }
order
address
- stock_location { DefaultStockLocation.find_or_create }
after(:create) do |shipment, _evalulator|
shipment.add_shipping_method(create(:shipping_method), true)
@@ -31,7 +30,6 @@ FactoryBot.define do
state { 'pending' }
order
address
- stock_location { DefaultStockLocation.find_or_create }
trait :shipping_method do
transient do
diff --git a/spec/factories/stock_factory.rb b/spec/factories/stock_factory.rb
index 8497ec02f4..84e9d35405 100644
--- a/spec/factories/stock_factory.rb
+++ b/spec/factories/stock_factory.rb
@@ -3,12 +3,11 @@
FactoryBot.define do
factory :stock_package, class: OrderManagement::Stock::Package do
transient do
- stock_location { build(:stock_location) }
order { create(:order_with_line_items, line_items_count: 2) }
contents { [] }
end
- initialize_with { new(stock_location, order, contents) }
+ initialize_with { new(order, contents) }
factory :stock_package_fulfilled do
after(:build) do |package, evaluator|
diff --git a/spec/factories/stock_location_factory.rb b/spec/factories/stock_location_factory.rb
deleted file mode 100644
index 466c4549a2..0000000000
--- a/spec/factories/stock_location_factory.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- factory :stock_location, class: Spree::StockLocation do
- # keeps the test stock_location unique
- initialize_with { Spree::StockLocation.first || DefaultStockLocation.find_or_create }
-
- address1 { '1600 Pennsylvania Ave NW' }
- city { 'Washington' }
- zipcode { '20500' }
- phone { '(202) 456-1111' }
-
- country { |stock_location| Spree::Country.first || stock_location.association(:country) }
- state do |stock_location|
- stock_location.country.states.first ||
- stock_location.association(:state, country: stock_location.country)
- end
-
- factory :stock_location_with_items do
- after(:create) do |stock_location, _evaluator|
- # variant will add itself to all stock_locations in an after_create
- # creating a product will automatically create a master variant
- product_1 = create(:product)
- product_2 = create(:product)
-
- stock_location.stock_items.where(variant_id: product_1.variants.first.id)
- .first.adjust_count_on_hand(10)
- stock_location.stock_items.where(variant_id: product_2.variants.first.id)
- .first.adjust_count_on_hand(20)
- end
- end
- end
-end
diff --git a/spec/factories/variant_factory.rb b/spec/factories/variant_factory.rb
index 1aed03f183..38560acd81 100644
--- a/spec/factories/variant_factory.rb
+++ b/spec/factories/variant_factory.rb
@@ -28,9 +28,6 @@ FactoryBot.define do
# create a "standard variant"
product { association :base_product }
- # ensure stock item will be created for this variant
- before(:create) { DefaultStockLocation.find_or_create }
-
factory :variant do
transient do
on_demand { false }
diff --git a/spec/lib/tasks/sample_data_rake_spec.rb b/spec/lib/tasks/sample_data_rake_spec.rb
index 4fa798e53a..f16a1e3be0 100644
--- a/spec/lib/tasks/sample_data_rake_spec.rb
+++ b/spec/lib/tasks/sample_data_rake_spec.rb
@@ -12,7 +12,6 @@ RSpec.describe 'sample_data.rake' do
before do
# Create seed data required by the sample data.
create(:user)
- DefaultStockLocation.find_or_create
DefaultShippingCategory.find_or_create
end
diff --git a/spec/models/concerns/variant_stock_spec.rb b/spec/models/concerns/variant_stock_spec.rb
index eeae48fcab..26f650d86c 100644
--- a/spec/models/concerns/variant_stock_spec.rb
+++ b/spec/models/concerns/variant_stock_spec.rb
@@ -83,7 +83,6 @@ RSpec.describe VariantStock do
it 'returns false' do
variant = build_stubbed(
:variant,
- stock_locations: [build_stubbed(:stock_location)]
)
expect(variant.on_demand).to be_falsy
end
@@ -94,9 +93,6 @@ RSpec.describe VariantStock do
let(:variant) do
build_stubbed(
:variant,
- stock_locations: [
- build_stubbed(:stock_location)
- ]
)
end
@@ -148,7 +144,6 @@ RSpec.describe VariantStock do
build_stubbed(
:variant,
on_demand: true,
- stock_locations: [build_stubbed(:stock_location)]
)
end
let(:stock_item) { Spree::StockItem.new(backorderable: true) }
@@ -172,7 +167,6 @@ RSpec.describe VariantStock do
build_stubbed(
:variant,
on_demand: false,
- stock_locations: [build_stubbed(:stock_location)]
)
end
diff --git a/spec/models/spree/inventory_unit_spec.rb b/spec/models/spree/inventory_unit_spec.rb
index e4743b652e..8a755fa6d6 100644
--- a/spec/models/spree/inventory_unit_spec.rb
+++ b/spec/models/spree/inventory_unit_spec.rb
@@ -3,50 +3,8 @@
require 'spec_helper'
RSpec.describe Spree::InventoryUnit do
- let(:stock_location) { create(:stock_location_with_items) }
- let(:stock_item) { stock_location.stock_items.order(:id).first }
-
- context "#backordered_for_stock_item" do
- let(:order) { create(:order) }
-
- let(:shipment) do
- shipment = Spree::Shipment.new
- shipment.stock_location = stock_location
- shipment.shipping_methods << create(:shipping_method)
- shipment.order = order
- # We don't care about this in this test
- allow(shipment).to receive(:ensure_correct_adjustment)
- shipment.tap(&:save!)
- end
-
- let!(:unit) do
- unit = shipment.inventory_units.build
- unit.state = 'backordered'
- unit.variant_id = stock_item.variant.id
- unit.tap(&:save!)
- end
-
- # Regression for Spree #3066
- it "returns modifiable objects" do
- units = Spree::InventoryUnit.backordered_for_stock_item(stock_item)
- expect { units.first.save! }.not_to raise_error
- end
-
- it "finds inventory units from its stock location " \
- "when the unit's variant matches the stock item's variant" do
- expect(Spree::InventoryUnit.backordered_for_stock_item(stock_item)).to eq [unit]
- end
-
- it "does not find inventory units that don't match the stock item's variant" do
- other_variant_unit = shipment.inventory_units.build
- other_variant_unit.state = 'backordered'
- other_variant_unit.variant = create(:variant)
- other_variant_unit.save!
-
- expect(Spree::InventoryUnit.backordered_for_stock_item(stock_item))
- .not_to include(other_variant_unit)
- end
- end
+ let(:variant) { create(:variant) }
+ let(:stock_item) { variant.stock_item }
context "variants deleted" do
let!(:unit) do
@@ -60,8 +18,6 @@ RSpec.describe Spree::InventoryUnit do
end
context "#finalize_units!" do
- let!(:stock_location) { create(:stock_location) }
- let(:variant) { create(:variant) }
let(:inventory_units) {
[
create(:inventory_unit, variant:),
diff --git a/spec/models/spree/order_inventory_spec.rb b/spec/models/spree/order_inventory_spec.rb
index 814cca78d6..cc7d520bca 100644
--- a/spec/models/spree/order_inventory_spec.rb
+++ b/spec/models/spree/order_inventory_spec.rb
@@ -36,13 +36,13 @@ RSpec.describe Spree::OrderInventory do
before { allow(order).to receive_messages completed?: false }
it "doesn't unstock items" do
- expect(shipment.stock_location).not_to receive(:unstock)
+ expect(line_item.variant).not_to receive(:move)
expect(subject.__send__(:add_to_shipment, shipment, variant, 5)).to eq 5
end
end
it 'should create inventory_units in the necessary states' do
- expect(shipment.stock_location).to receive(:fill_status).with(variant, 5).and_return([3, 2])
+ expect(variant).to receive(:fill_status).with(5).and_return([3, 2])
expect(subject.__send__(:add_to_shipment, shipment, variant, 5)).to eq 5
@@ -55,8 +55,7 @@ RSpec.describe Spree::OrderInventory do
it 'should create stock_movement' do
expect(subject.__send__(:add_to_shipment, shipment, variant, 5)).to eq 5
- stock_item = shipment.stock_location.stock_item(variant)
- movement = stock_item.stock_movements.last
+ movement = variant.stock_item.stock_movements.last
expect(movement.quantity).to eq(-5)
end
end
@@ -88,7 +87,7 @@ RSpec.describe Spree::OrderInventory do
before { allow(order).to receive_messages completed?: false }
it "doesn't restock items" do
- expect(shipment.stock_location).not_to receive(:restock)
+ expect(variant).not_to receive(:move)
expect(subject.__send__(:remove_from_shipment, shipment, variant, 1, true)).to eq 1
end
end
@@ -97,7 +96,7 @@ RSpec.describe Spree::OrderInventory do
before { allow(order).to receive_messages completed?: true }
it "doesn't restock items" do
- expect(shipment.stock_location).not_to receive(:restock)
+ expect(variant).not_to receive(:move)
expect(subject.__send__(:remove_from_shipment, shipment, variant, 1, false)).to eq 1
end
end
@@ -105,8 +104,7 @@ RSpec.describe Spree::OrderInventory do
it 'should create stock_movement' do
expect(subject.__send__(:remove_from_shipment, shipment, variant, 1, true)).to eq 1
- stock_item = shipment.stock_location.stock_item(variant)
- movement = stock_item.stock_movements.last
+ movement = variant.stock_item.stock_movements.last
expect(movement.quantity).to eq 1
end
diff --git a/spec/models/spree/product_spec.rb b/spec/models/spree/product_spec.rb
index 26fef88569..9f9937f897 100644
--- a/spec/models/spree/product_spec.rb
+++ b/spec/models/spree/product_spec.rb
@@ -130,10 +130,6 @@ module Spree
let!(:taxon){ create(:taxon) }
let(:supplier){ create(:enterprise) }
- before do
- create(:stock_location)
- end
-
it "copies properties to the first standard variant" do
product.primary_taxon_id = taxon.id
product.name = "Product1"
diff --git a/spec/models/spree/shipment_spec.rb b/spec/models/spree/shipment_spec.rb
index ecaba70205..6f420aabff 100644
--- a/spec/models/spree/shipment_spec.rb
+++ b/spec/models/spree/shipment_spec.rb
@@ -324,8 +324,7 @@ RSpec.describe Spree::Shipment do
allow(shipment).to receive_message_chain(:inventory_units,
:group_by,
map: [unit])
- shipment.stock_location = build(:stock_location)
- expect(shipment.stock_location).to receive(:restock).with(variant, 1, shipment)
+ expect(variant).to receive(:move).with(1, shipment)
shipment.after_cancel
end
end
@@ -348,8 +347,7 @@ RSpec.describe Spree::Shipment do
allow(shipment).to receive_message_chain(:inventory_units,
:group_by,
map: [unit])
- shipment.stock_location = create(:stock_location)
- expect(shipment.stock_location).to receive(:unstock).with(variant, 1, shipment)
+ expect(variant).to receive(:move).with(-1, shipment)
shipment.after_resume
end
diff --git a/spec/models/spree/stock_item_spec.rb b/spec/models/spree/stock_item_spec.rb
index c3f94ef71a..9268c04b18 100644
--- a/spec/models/spree/stock_item_spec.rb
+++ b/spec/models/spree/stock_item_spec.rb
@@ -3,13 +3,9 @@
require 'spec_helper'
RSpec.describe Spree::StockItem do
- let(:stock_location) { create(:stock_location_with_items) }
-
- subject { stock_location.stock_items.order(:id).first }
+ subject(:stock_item) { create(:variant, on_hand: 15).stock_item }
describe "validation" do
- let(:stock_item) { stock_location.stock_items.first }
-
it "requires count_on_hand to be positive if not backorderable" do
stock_item.backorderable = false
diff --git a/spec/models/spree/stock_location_spec.rb b/spec/models/spree/stock_location_spec.rb
deleted file mode 100644
index fd01212caa..0000000000
--- a/spec/models/spree/stock_location_spec.rb
+++ /dev/null
@@ -1,104 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-module Spree
- RSpec.describe StockLocation do
- subject { create(:stock_location_with_items) }
- let(:stock_item) { subject.stock_items.order(:id).first }
- let(:variant) { stock_item.variant }
-
- it 'creates stock_items for all variants' do
- expect(subject.stock_items.count).to eq Variant.count
- end
-
- context "handling stock items" do
- let!(:variant) { create(:variant) }
-
- context "given a variant" do
- context "propagate all variants" do
- subject { StockLocation.new(name: "testing") }
-
- specify do
- expect(subject.stock_items).to receive(:create!).at_least(:once)
- subject.save!
- end
- end
- end
- end
-
- it 'finds a stock_item for a variant' do
- stock_item = subject.stock_item(variant)
- expect(stock_item.count_on_hand).to eq 15
- end
-
- it 'finds a stock_item for a variant by id' do
- stock_item = subject.stock_item(variant.id)
- expect(stock_item.variant).to eq variant
- end
-
- it 'returns nil when stock_item is not found for variant' do
- stock_item = subject.stock_item(100)
- expect(stock_item).to be_nil
- end
-
- it 'finds a count_on_hand for a variant' do
- expect(subject.count_on_hand(variant)).to eq 15
- end
-
- it 'finds determines if you a variant is backorderable' do
- expect(subject.backorderable?(variant)).to eq false
- end
-
- it 'restocks a variant with a positive stock movement' do
- originator = double
- expect(subject).to receive(:move).with(variant, 5, originator)
- subject.restock(variant, 5, originator)
- end
-
- it 'unstocks a variant with a negative stock movement' do
- originator = double
- expect(subject).to receive(:move).with(variant, -5, originator)
- subject.unstock(variant, 5, originator)
- end
-
- it 'it creates a stock_movement' do
- variant.on_demand = false
- expect {
- subject.move variant, 5
- }.to change { subject.stock_movements.where(stock_item_id: stock_item).count }.by(1)
- end
-
- context 'fill_status' do
- before { variant.on_demand = false }
-
- it 'is all on_hand if variant is on_demand' do
- variant.on_demand = true
-
- on_hand, backordered = subject.fill_status(variant, 25)
- expect(on_hand).to eq 25
- expect(backordered).to eq 0
- end
-
- it 'is all on_hand if on_hand is enough' do
- on_hand, backordered = subject.fill_status(variant, 5)
- expect(on_hand).to eq 5
- expect(backordered).to eq 0
- end
-
- it 'is some on_hand if not all available' do
- on_hand, backordered = subject.fill_status(variant, 20)
- expect(on_hand).to eq 15
- expect(backordered).to eq 0
- end
-
- it 'is zero on_hand if none available' do
- variant.on_hand = 0
-
- on_hand, backordered = subject.fill_status(variant, 20)
- expect(on_hand).to eq 0
- expect(backordered).to eq 0
- end
- end
- end
-end
diff --git a/spec/models/spree/stock_movement_spec.rb b/spec/models/spree/stock_movement_spec.rb
index 19ff09341c..02f4f4c543 100644
--- a/spec/models/spree/stock_movement_spec.rb
+++ b/spec/models/spree/stock_movement_spec.rb
@@ -3,8 +3,7 @@
require 'spec_helper'
RSpec.describe Spree::StockMovement do
- let(:stock_location) { create(:stock_location_with_items) }
- let(:stock_item) { stock_location.stock_items.order(:id).first }
+ let(:stock_item) { create(:variant, on_hand: 15).stock_item }
subject { build(:stock_movement, stock_item:) }
it 'should belong to a stock item' do
diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb
index 73754aaa72..aac0ae441c 100644
--- a/spec/models/spree/variant_spec.rb
+++ b/spec/models/spree/variant_spec.rb
@@ -12,7 +12,6 @@ RSpec.describe Spree::Variant do
it { is_expected.to have_many(:inventory_units) }
it { is_expected.to have_many(:line_items) }
it { is_expected.to have_many(:stock_items) }
- it { is_expected.to have_many(:stock_locations).through(:stock_items) }
it { is_expected.to have_many(:images) }
it { is_expected.to have_one(:default_price) }
it { is_expected.to have_many(:prices) }
diff --git a/spec/models/spree/variant_stock_spec.rb b/spec/models/spree/variant_stock_spec.rb
index 224fa3e855..4597fd1114 100644
--- a/spec/models/spree/variant_stock_spec.rb
+++ b/spec/models/spree/variant_stock_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Spree::Variant do
- # This method is defined in app/models/concerns/variant_stock.rb.
+ # These methods are defined in app/models/concerns/variant_stock.rb.
# There is a separate spec for that concern but here I want to test
# the interplay of Spree::Variant and VariantOverride.
#
@@ -11,6 +11,38 @@ RSpec.describe Spree::Variant do
# like this one get overridden. Future calls to `variant.move` are then
# handled by the ScopeVariantToHub module which may call the
# VariantOverride.
+ describe "#fill_status" do
+ subject(:variant) { create(:variant, on_hand: 15) }
+
+ it 'is all on_hand if variant is on_demand' do
+ variant.on_demand = true
+
+ on_hand, backordered = subject.fill_status(25)
+ expect(on_hand).to eq 25
+ expect(backordered).to eq 0
+ end
+
+ it 'is all on_hand if on_hand is enough' do
+ on_hand, backordered = subject.fill_status(5)
+ expect(on_hand).to eq 5
+ expect(backordered).to eq 0
+ end
+
+ it 'is some on_hand if not all available' do
+ on_hand, backordered = subject.fill_status(20)
+ expect(on_hand).to eq 15
+ expect(backordered).to eq 0
+ end
+
+ it 'is zero on_hand if none available' do
+ variant.on_hand = 0
+
+ on_hand, backordered = subject.fill_status(20)
+ expect(on_hand).to eq 0
+ expect(backordered).to eq 0
+ end
+ end
+
describe "#move" do
subject(:variant) { create(:variant, on_hand: 5) }
diff --git a/spec/serializers/api/admin/variant_serializer_spec.rb b/spec/serializers/api/admin/variant_serializer_spec.rb
index 7c496d721d..60f8ad45d4 100644
--- a/spec/serializers/api/admin/variant_serializer_spec.rb
+++ b/spec/serializers/api/admin/variant_serializer_spec.rb
@@ -22,10 +22,4 @@ RSpec.describe Api::Admin::VariantSerializer do
expect(serializer.to_json).to match variant.full_name
end
-
- it "serializes the variant stock location id" do
- serializer = Api::Admin::VariantSerializer.new variant
-
- expect(serializer.to_json).to match variant.stock_items.first.stock_location.id.to_s
- end
end
diff --git a/spec/services/default_stock_location_spec.rb b/spec/services/default_stock_location_spec.rb
deleted file mode 100644
index 93b0a053f7..0000000000
--- a/spec/services/default_stock_location_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe DefaultStockLocation do
- describe '.find_or_create' do
- context 'when a location named default already exists' do
- let!(:location) do
- country = create(:country)
- state = Spree::State.create(name: 'Alabama', country:)
- Spree::StockLocation.create!(
- name: 'default',
- country_id: country.id,
- state_id: state.id
- )
- end
-
- it 'returns the location' do
- expect(described_class.find_or_create).to eq(location)
- end
-
- it 'does not create any other location' do
- expect { described_class.find_or_create }.not_to change { Spree::StockLocation.count }
- end
- end
-
- context 'when a location named default does not exist' do
- it 'returns the location' do
- location = described_class.find_or_create
- expect(location.name).to eq('default')
- end
-
- it 'does not create any other location' do
- expect { described_class.find_or_create }
- .to change { Spree::StockLocation.count }.from(0).to(1)
- end
- end
- end
-end
diff --git a/spec/services/sets/product_set_spec.rb b/spec/services/sets/product_set_spec.rb
index d415f7096d..f6b28a5fc1 100644
--- a/spec/services/sets/product_set_spec.rb
+++ b/spec/services/sets/product_set_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe Sets::ProductSet do
subject{ product_set.save }
context 'when the product does not exist yet' do
- let!(:stock_location) { create(:stock_location) }
let(:collection_hash) do
{
0 => {
diff --git a/spec/system/admin/bulk_order_management_spec.rb b/spec/system/admin/bulk_order_management_spec.rb
index e8af8337c9..95af4bac5b 100644
--- a/spec/system/admin/bulk_order_management_spec.rb
+++ b/spec/system/admin/bulk_order_management_spec.rb
@@ -1100,7 +1100,7 @@ RSpec.describe '
end
it "the user can confirm : line item is then deleted and order is canceled" do
- expect_any_instance_of(Spree::StockLocation).to receive(:restock).at_least(1).times
+ expect_any_instance_of(Spree::Variant).to receive(:move).at_least(1).times
expect do
within(".modal") do
uncheck("send_cancellation_email")
@@ -1113,7 +1113,7 @@ RSpec.describe '
it "the user can confirm + wants to send email confirmation : line item is " \
"then deleted, order is canceled and email is sent" do
- expect_any_instance_of(Spree::StockLocation).to receive(:restock).at_least(1).times
+ expect_any_instance_of(Spree::Variant).to receive(:move).at_least(1).times
expect do
within(".modal") do
check("send_cancellation_email")
@@ -1126,7 +1126,7 @@ RSpec.describe '
it "the user can confirm + uncheck the restock option: line item is then deleted and " \
"order is canceled without retocking" do
- expect_any_instance_of(Spree::StockLocation).not_to receive(:restock)
+ expect_any_instance_of(Spree::Variant).not_to receive(:move)
expect do
within(".modal") do
uncheck("Restock Items: return all items to stock")
diff --git a/spec/system/admin/order_spec.rb b/spec/system/admin/order_spec.rb
index 0ab9cbf13c..d5240f17b1 100644
--- a/spec/system/admin/order_spec.rb
+++ b/spec/system/admin/order_spec.rb
@@ -218,7 +218,6 @@ RSpec.describe '
let(:shipment) { order.shipments.first }
it "and by default an Email is sent and the items are restocked" do
- expect_any_instance_of(Spree::StockLocation).to receive(:restock).at_least(1).times
expect do
within(".modal") do
click_on("OK")
@@ -226,10 +225,10 @@ RSpec.describe '
expect(page).to have_content "Cannot add item to canceled order"
expect(order.reload.state).to eq("canceled")
end.to have_enqueued_mail(Spree::OrderMailer, :cancel_email)
+ .and change { Spree::StockItem.pluck(:count_on_hand) }
end
it "and then the order is cancelled and email is not sent when unchecked" do
- expect_any_instance_of(Spree::StockLocation).to receive(:restock).at_least(1).times
expect do
within(".modal") do
uncheck("send_cancellation_email")
@@ -237,11 +236,12 @@ RSpec.describe '
end
expect(page).to have_content "Cannot add item to canceled order"
expect(order.reload.state).to eq("canceled")
- end.not_to have_enqueued_mail(Spree::OrderMailer, :cancel_email)
+ end.to have_enqueued_mail(Spree::OrderMailer, :cancel_email).at_most(0).times
+ .and change { Spree::StockItem.pluck(:count_on_hand) }
end
it "and the items are not restocked when the user uncheck the checkbox to restock items" do
- expect_any_instance_of(Spree::StockLocation).not_to receive(:restock)
+ expect_any_instance_of(Spree::Variant).not_to receive(:move)
expect do
within(".modal") do
uncheck("restock_items")
@@ -250,6 +250,8 @@ RSpec.describe '
expect(page).to have_content "Cannot add item to canceled order"
expect(order.reload.state).to eq("canceled")
end.to have_enqueued_mail(Spree::OrderMailer, :cancel_email)
+ # Not change stock. Rspec can't combine `to` and `not_to` though.
+ .and change { Spree::StockItem.pluck(:count_on_hand) }.by([])
end
end
end
diff --git a/spec/system/admin/products_spec.rb b/spec/system/admin/products_spec.rb
index f2a1c322f3..8f10416261 100644
--- a/spec/system/admin/products_spec.rb
+++ b/spec/system/admin/products_spec.rb
@@ -11,7 +11,6 @@ RSpec.describe '
include FileHelper
let!(:taxon) { create(:taxon) }
- let!(:stock_location) { create(:stock_location) }
let!(:shipping_category) { DefaultShippingCategory.find_or_create }
let!(:supplier) { create(:supplier_enterprise, name: 'New supplier') }
diff --git a/spec/system/admin/products_v3/create_spec.rb b/spec/system/admin/products_v3/create_spec.rb
index e767ab3891..d2af1c8899 100644
--- a/spec/system/admin/products_v3/create_spec.rb
+++ b/spec/system/admin/products_v3/create_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe 'As an enterprise user, I can manage my products' do
let!(:taxon) { create(:taxon) }
describe "creating a new product" do
- let!(:stock_location) { create(:stock_location) }
let!(:distributor) { create(:distributor_enterprise) }
let!(:shipping_category) { create(:shipping_category) }
diff --git a/spec/system/admin/unit_price_spec.rb b/spec/system/admin/unit_price_spec.rb
index eb64b11172..5ad5b4fc7c 100644
--- a/spec/system/admin/unit_price_spec.rb
+++ b/spec/system/admin/unit_price_spec.rb
@@ -9,8 +9,6 @@ RSpec.describe '
include AuthenticationHelper
include WebHelper
- let!(:stock_location) { create(:stock_location) }
-
describe "product" do
it "creating a new product" do
login_as_admin