Class: Shopifydev::Test::OrderFixture

Inherits:
Object
  • Object
show all
Defined in:
lib/shopifydev/test/order_fixture.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(shop = nil) ⇒ OrderFixture

Create a test fixture given a shop object



9
10
11
12
13
14
# File 'lib/shopifydev/test/order_fixture.rb', line 9

def initialize(shop=nil)
  @shop = shop
  @shop ||= CurrentShop.new
  @address_defaults = {}
  @order_defaults = {}
end

Instance Attribute Details

#address_defaultsObject

Returns the value of attribute address_defaults.



6
7
8
# File 'lib/shopifydev/test/order_fixture.rb', line 6

def address_defaults
  @address_defaults
end

#order_defaultsObject

Returns the value of attribute order_defaults.



6
7
8
# File 'lib/shopifydev/test/order_fixture.rb', line 6

def order_defaults
  @order_defaults
end

#shopObject

Returns the value of attribute shop.



6
7
8
# File 'lib/shopifydev/test/order_fixture.rb', line 6

def shop
  @shop
end

Instance Method Details

#address_attrs(opts = nil) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/shopifydev/test/order_fixture.rb', line 115

def address_attrs(opts=nil)
  case opts
  when 'cad', 'CAD', 'ca', 'CA', :cad
    cad_address_opts(opts)
  when 'us', 'US', :us
    cad_address_opts(opts)
  when Hash
    country = opts[:country]
    case country.downcase
    when 'ca', 'cad', 'canada'
      cad_address_attrs(opts)
    when 'us', 'united states'
      us_address_attrs(opts)
    else
      [cad_address_attrs(opts), us_address_attrs(opts)].sample
    end
  else
    [cad_address_attrs, us_address_attrs].sample
  end
end

#cad_address_attrs(opts = {}) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/shopifydev/test/order_fixture.rb', line 96

def cad_address_attrs(opts={})
  require_relative 'valid_postal_code'
  place = ValidPostalCode.valid_place
  first_name = ::FFaker::Name.first_name
  last_name  = ::FFaker::Name.last_name
  attrs = {
    first_name:   first_name,
    last_name:    last_name,
    address1:     ::FFaker::AddressCA.street_address,
    phone:        ::FFaker::PhoneNumber.phone_number,
    city:         place[:city],
    province:     place[:province],
    country:      "CA",
    zip:          place[:postal_code]
  }.deep_merge(@address_defaults).deep_merge(opts)
  attrs[:name] = [attrs[:first_name], attrs[:last_name]].join(' ')
  attrs
end

#create_order!(opts = {}) ⇒ Object



186
187
188
189
190
191
192
193
194
# File 'lib/shopifydev/test/order_fixture.rb', line 186

def create_order!(opts={})
  order = new_order(opts)
  shop.with_shopify_session do
    # still have to be in a session even if not saving, because of utter lameness
    saved = order.save
    raise order.errors.full_messages.join("\n") unless saved
  end
  order
end

#create_orders!(opts = {}) ⇒ Object



196
197
198
199
200
201
202
203
204
205
# File 'lib/shopifydev/test/order_fixture.rb', line 196

def create_orders!(opts={})
  num = opts.delete(:num) || 1
  orders = []
  num.times do
    order = create_order!(opts)
    orders << order
    opts[:created_at] = Time.parse(order.created_at) + rand(60) + 10 if opts[:created_at].present?
  end
  orders
end

#fulfill(orders) ⇒ Object



207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/shopifydev/test/order_fixture.rb', line 207

def fulfill(orders)
  orders = [orders].flatten
  orders.each do |order|
    order_id = nil
    if order.is_a?(::ShopifyAPI::Order)
      next if order.fulfillment_status == "fulfilled"
      order_id = order.id
    else
      order_id = order.to_i
    end
    ::ShopifyAPI::Fulfillment.create({
      tracking_number: nil,
      order_id: order_id
    })
  end
end

#line_item_attrs(opts = {}) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/shopifydev/test/order_fixture.rb', line 37

def line_item_attrs(opts={})
  product = nil
  variant = nil
  if opts[:product_id]
    product = products.find{|prod| prod.id.to_s == opts[:product_id].to_s}
    raise "don't know about a product with id #{opts[:product_id]}" if product.nil?
  end

  if opts[:variant_id]
    variant = variants.find{|v| v.id.to_s == opts[:variant_id].to_s}
    variant ||= product.variants.sample if product
    raise "don't know about a variant with id #{opts[:variant_id]}" if variant.nil?
  end
  variant ||= products.sample.variants.sample

  q = opts[:quantity]
  q ||= (rand() > 0.3) ? 1 : (rand(3) + 1)
  {
    price: variant.price,
    quantity: q,
    variant_id: variant.id
  }
end

#line_items_attrs(opts = {}) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/shopifydev/test/order_fixture.rb', line 61

def line_items_attrs(opts={})
  num = opts.delete(:num_line_items)
  if line_item_opts = opts.delete(:line_items)
    num = line_item_opts.length
  end

  num ||= (rand() > 0.4) ? 1 : (rand(2) + 2)
  line_item_opts ||= []
  while line_item_opts.length < num
    line_item_opts << {}
  end
  out = []
  num.times { |i| out << line_item_attrs(line_item_opts[i]) }
  out
end

#new_order(opts = {}) ⇒ Object



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/shopifydev/test/order_fixture.rb', line 165

def new_order(opts={})
  period = opts.delete(:in_period)
  case period
  when Range
    opts[:created_at] = period.first + rand(period.last - period.first)
  when Hash
    opts[:created_at] = period[:created_at_min]
    opts[:created_at] += rand(period[:created_at_max] - period[:created_at_min]) if period[:created_at_max].present?
  when Time, Date
    opts[:created_at] = period
  end
  opts[:fulfillment_status] = "fulfilled" if opts.delete(:fulfilled)
  opts = order_attrs(opts)
  order = nil
  shop.with_shopify_session do
    # still have to be in a session even if not saving, because of utter lameness
    order = ::ShopifyAPI::Order.new(opts)
  end
  order
end

#order_attrs(opts = {}) ⇒ Object



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/shopifydev/test/order_fixture.rb', line 136

def order_attrs(opts={})
  address = opts.delete(:address)
  address = address_attrs(address) if address
  billing_address = opts.delete(:billing_address)
  billing_address = address_attrs(billing_address) if billing_address
  billing_address ||= address
  billing_address ||= address_attrs
  
  shipping_address = opts.delete(:shipping_address)
  shipping_address = address_attrs(shipping_address) if shipping_address
  shipping_address ||= address
  shipping_address ||= address_attrs

  opts.delete(:address)
  {
    line_items: line_items_attrs(opts),
    billing_address: billing_address,
    shipping_address: shipping_address,
    financial_status: 'paid',
    email: ::FFaker::Internet.email
  }.deep_merge(@order_defaults).deep_merge(opts)
end

#ordersObject



159
160
161
162
163
# File 'lib/shopifydev/test/order_fixture.rb', line 159

def orders
  @orders ||= shop.with_shopify_session do
    ::ShopifyAPI::Order.find(:all, params: {limit: false})
  end
end

#productsObject



27
28
29
30
31
# File 'lib/shopifydev/test/order_fixture.rb', line 27

def products
  @products ||= shop.with_shopify_session do
    ::ShopifyAPI::Product.find(:all, params: {limit: false})
  end
end

#set_test_defaults!Object



17
18
19
20
21
22
23
24
25
# File 'lib/shopifydev/test/order_fixture.rb', line 17

def set_test_defaults!
  @address_defaults = {
    first_name: "Webify",
    last_name: "Test"
  }
  @order_defaults = {
    email: "[email protected]"
  }
end

#us_address_attrs(opts = {}) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/shopifydev/test/order_fixture.rb', line 77

def us_address_attrs(opts={})
  require_relative 'valid_zip'
  place = ValidZip.valid_place
  first_name = ::FFaker::Name.first_name
  last_name  = ::FFaker::Name.last_name
  attrs = {
    first_name:   first_name,
    last_name:    last_name,
    address1:     ::FFaker::AddressUS.street_address,
    phone:        ::FFaker::PhoneNumber.phone_number,
    city:         place[:city],
    province:     place[:state],
    country:      "US",
    zip:          place[:zip]
  }.deep_merge(@address_defaults).deep_merge(opts)
  attrs[:name] = [attrs[:first_name], attrs[:last_name]].join(' ')
  attrs
end

#variantsObject



33
34
35
# File 'lib/shopifydev/test/order_fixture.rb', line 33

def variants
  @variants ||= products.map(&:variants).flatten
end