core/lib/spree/testing_support/factories/order_factory.rb
FactoryBot.define do
factory :order, class: Spree::Order do
user
bill_address
completed_at { nil }
email { user&.email }
currency { 'USD' }
transient do
line_items_price { BigDecimal(10) }
attach_to_default_store { true }
end
before(:create) do |order|
unless order.store.present?
default_store = Spree::Store.default.persisted? ? Spree::Store.default : nil
store = default_store || create(:store)
order.store = store
end
end
factory :order_with_totals do
after(:create) do |order, evaluator|
create(:line_item, order: order, price: evaluator.line_items_price)
order.line_items.reload # to ensure order.line_items is accessible after
end
end
factory :order_with_line_item_quantity do
transient do
line_items_quantity { 1 }
end
after(:create) do |order, evaluator|
create(:line_item, order: order, price: evaluator.line_items_price, quantity: evaluator.line_items_quantity)
order.line_items.reload # to ensure order.line_items is accessible after
end
end
factory :order_with_line_items do
bill_address
ship_address
transient do
line_items_count { 1 }
without_line_items { false }
shipment_cost { 100 }
shipping_method_filter { Spree::ShippingMethod::DISPLAY_ON_FRONT_END }
end
after(:create) do |order, evaluator|
unless evaluator.without_line_items
create_list(:line_item, evaluator.line_items_count, order: order, price: evaluator.line_items_price)
order.line_items.reload
end
stock_location = order.line_items&.first&.variant&.stock_items&.first&.stock_location || create(:stock_location)
create(:shipment, order: order, cost: evaluator.shipment_cost, stock_location: stock_location)
order.shipments.reload
order.update_with_updater!
end
factory :completed_order_with_totals do
state { 'complete' }
after(:create) do |order, evaluator|
order.refresh_shipment_rates(evaluator.shipping_method_filter)
order.update_column(:completed_at, Time.current)
end
factory :completed_order_with_pending_payment do
after(:create) do |order|
create(:payment, amount: order.total, order: order)
end
end
factory :completed_order_with_store_credit_payment do
after(:create) do |order|
store_credit = create(:store_credit, amount: order.total, store: order.store, user: order.user)
payment_method = create(:store_credit_payment_method, stores: [order.store])
create(:store_credit_payment, amount: order.total, order: order, source: store_credit, payment_method: payment_method)
end
end
factory :order_ready_to_ship do
payment_state { 'paid' }
shipment_state { 'ready' }
after(:create) do |order|
create(:payment, amount: order.total, order: order, state: 'completed')
order.shipments.each do |shipment|
shipment.inventory_units.update_all state: 'on_hand'
shipment.update_column('state', 'ready')
end
order.reload
end
factory :shipped_order do
after(:create) do |order|
order.shipments.each do |shipment|
shipment.inventory_units.update_all state: 'shipped'
shipment.update_column('state', 'shipped')
end
order.update_column('shipment_state', 'shipped')
order.reload
end
end
end
end
end
end
end