core/lib/spree/testing_support/factories/order_factory.rb

Summary

Maintainability
A
20 mins
Test Coverage
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