spree_api 2.0.13 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -1
  3. data/app/controllers/spree/api/addresses_controller.rb +5 -2
  4. data/app/controllers/spree/api/base_controller.rb +14 -21
  5. data/app/controllers/spree/api/checkouts_controller.rb +30 -27
  6. data/app/controllers/spree/api/config_controller.rb +6 -0
  7. data/app/controllers/spree/api/countries_controller.rb +7 -7
  8. data/app/controllers/spree/api/images_controller.rb +10 -8
  9. data/app/controllers/spree/api/inventory_units_controller.rb +7 -4
  10. data/app/controllers/spree/api/line_items_controller.rb +14 -14
  11. data/app/controllers/spree/api/option_types_controller.rb +14 -11
  12. data/app/controllers/spree/api/option_values_controller.rb +13 -11
  13. data/app/controllers/spree/api/orders_controller.rb +56 -53
  14. data/app/controllers/spree/api/payments_controller.rb +25 -33
  15. data/app/controllers/spree/api/product_properties_controller.rb +20 -13
  16. data/app/controllers/spree/api/products_controller.rb +11 -58
  17. data/app/controllers/spree/api/properties_controller.rb +19 -16
  18. data/app/controllers/spree/api/return_authorizations_controller.rb +30 -25
  19. data/app/controllers/spree/api/shipments_controller.rb +24 -19
  20. data/app/controllers/spree/api/states_controller.rb +9 -7
  21. data/app/controllers/spree/api/stock_items_controller.rb +9 -11
  22. data/app/controllers/spree/api/stock_locations_controller.rb +9 -7
  23. data/app/controllers/spree/api/stock_movements_controller.rb +7 -5
  24. data/app/controllers/spree/api/taxonomies_controller.rb +14 -8
  25. data/app/controllers/spree/api/taxons_controller.rb +25 -20
  26. data/app/controllers/spree/api/users_controller.rb +7 -5
  27. data/app/controllers/spree/api/variants_controller.rb +35 -33
  28. data/app/controllers/spree/api/zones_controller.rb +18 -17
  29. data/app/helpers/spree/api/api_helpers.rb +7 -6
  30. data/app/models/spree/option_value_decorator.rb +0 -4
  31. data/app/models/spree/order_decorator.rb +33 -54
  32. data/app/views/spree/api/adjustments/show.v1.rabl +2 -1
  33. data/app/views/spree/api/config/money.v1.rabl +6 -0
  34. data/app/views/spree/api/config/show.v1.rabl +2 -0
  35. data/app/views/spree/api/images/show.v1.rabl +0 -1
  36. data/app/views/spree/api/line_items/show.v1.rabl +3 -0
  37. data/app/views/spree/api/orders/index.v1.rabl +1 -1
  38. data/app/views/spree/api/orders/order.v1.rabl +6 -0
  39. data/app/views/spree/api/orders/payment.v1.rabl +1 -1
  40. data/app/views/spree/api/orders/show.v1.rabl +1 -1
  41. data/app/views/spree/api/payments/credit_over_limit.v1.rabl +1 -1
  42. data/app/views/spree/api/payments/new.v1.rabl +1 -0
  43. data/app/views/spree/api/products/index.v1.rabl +2 -2
  44. data/app/views/spree/api/products/show.v1.rabl +1 -0
  45. data/app/views/spree/api/shipments/show.v1.rabl +22 -5
  46. data/app/views/spree/api/shipping_rates/show.v1.rabl +2 -0
  47. data/app/views/spree/api/taxons/index.v1.rabl +2 -4
  48. data/app/views/spree/api/variants/index.v1.rabl +1 -1
  49. data/config/locales/en.yml +1 -3
  50. data/config/routes.rb +4 -1
  51. data/lib/spree/api/responders/rabl_template.rb +1 -1
  52. data/lib/spree/api/testing_support/helpers.rb +5 -0
  53. data/spec/controllers/spree/api/addresses_controller_spec.rb +2 -2
  54. data/spec/controllers/spree/api/checkouts_controller_spec.rb +32 -22
  55. data/spec/controllers/spree/api/config_controller_spec.rb +27 -0
  56. data/spec/controllers/spree/api/images_controller_spec.rb +2 -2
  57. data/spec/controllers/spree/api/inventory_units_controller_spec.rb +28 -24
  58. data/spec/controllers/spree/api/line_items_controller_spec.rb +25 -27
  59. data/spec/controllers/spree/api/option_types_controller_spec.rb +2 -2
  60. data/spec/controllers/spree/api/option_values_controller_spec.rb +2 -2
  61. data/spec/controllers/spree/api/orders_controller_spec.rb +130 -119
  62. data/spec/controllers/spree/api/payments_controller_spec.rb +77 -118
  63. data/spec/controllers/spree/api/products_controller_spec.rb +13 -143
  64. data/spec/controllers/spree/api/return_authorizations_controller_spec.rb +4 -19
  65. data/spec/controllers/spree/api/shipments_controller_spec.rb +3 -3
  66. data/spec/controllers/spree/api/states_controller_spec.rb +1 -1
  67. data/spec/controllers/spree/api/stock_items_controller_spec.rb +26 -62
  68. data/spec/controllers/spree/api/stock_locations_controller_spec.rb +29 -56
  69. data/spec/controllers/spree/api/stock_movements_controller_spec.rb +27 -51
  70. data/spec/controllers/spree/api/taxons_controller_spec.rb +18 -48
  71. data/spec/controllers/spree/api/users_controller_spec.rb +4 -6
  72. data/spec/controllers/spree/api/variants_controller_spec.rb +21 -38
  73. data/spec/controllers/spree/api/zones_controller_spec.rb +2 -2
  74. data/spec/models/spree/order_spec.rb +19 -111
  75. data/spec/spec_helper.rb +2 -26
  76. data/spec/support/controller_hacks.rb +1 -1
  77. data/spree_api.gemspec +1 -1
  78. metadata +19 -15
  79. data/app/models/spree/line_item_decorator.rb +0 -3
  80. data/app/views/spree/api/payments/update_forbidden.v1.rabl +0 -2
  81. data/db/migrate/20131017162334_add_index_to_user_spree_api_key.rb +0 -7
@@ -12,7 +12,7 @@ module Spree
12
12
  end
13
13
 
14
14
  def product_attributes
15
- [:id, :name, :description, :price, :available_on, :permalink, :meta_description, :meta_keywords, :shipping_category_id, :taxon_ids]
15
+ [:id, :name, :description, :price, :display_price, :available_on, :permalink, :meta_description, :meta_keywords, :shipping_category_id, :taxon_ids]
16
16
  end
17
17
 
18
18
  def product_property_attributes
@@ -20,7 +20,7 @@ module Spree
20
20
  end
21
21
 
22
22
  def variant_attributes
23
- [:id, :name, :sku, :price, :weight, :height, :width, :depth, :is_master, :cost_price, :permalink]
23
+ [:id, :name, :sku, :price, :weight, :height, :width, :depth, :is_master, :cost_price, :permalink, :description]
24
24
  end
25
25
 
26
26
  def image_attributes
@@ -28,11 +28,11 @@ module Spree
28
28
  end
29
29
 
30
30
  def option_value_attributes
31
- [:id, :name, :presentation, :option_type_name, :option_type_id, :option_type_presentation]
31
+ [:id, :name, :presentation, :option_type_name, :option_type_id]
32
32
  end
33
33
 
34
34
  def order_attributes
35
- [:id, :number, :item_total, :total, :ship_total, :state, :adjustment_total, :user_id, :created_at, :updated_at, :completed_at, :payment_total, :shipment_state, :payment_state, :email, :special_instructions, :token, :channel, :currency]
35
+ [:id, :number, :item_total, :total, :state, :adjustment_total, :user_id, :created_at, :updated_at, :completed_at, :payment_total, :shipment_state, :payment_state, :email, :special_instructions]
36
36
  end
37
37
 
38
38
  def line_item_attributes
@@ -44,7 +44,7 @@ module Spree
44
44
  end
45
45
 
46
46
  def payment_attributes
47
- [:id, :source_type, :source_id, :amount, :display_amount, :payment_method_id, :response_code, :state, :avs_response, :created_at, :updated_at]
47
+ [:id, :source_type, :source_id, :amount, :payment_method_id, :response_code, :state, :avs_response, :created_at, :updated_at]
48
48
  end
49
49
 
50
50
  def payment_method_attributes
@@ -60,7 +60,7 @@ module Spree
60
60
  end
61
61
 
62
62
  def taxon_attributes
63
- [:id, :name, :pretty_name, :permalink, :parent_id, :taxonomy_id]
63
+ [:id, :name, :pretty_name, :permalink, :position, :parent_id, :taxonomy_id]
64
64
  end
65
65
 
66
66
  def inventory_unit_attributes
@@ -113,3 +113,4 @@ module Spree
113
113
  end
114
114
  end
115
115
  end
116
+
@@ -2,8 +2,4 @@ Spree::OptionValue.class_eval do
2
2
  def option_type_name
3
3
  option_type.name
4
4
  end
5
-
6
- def option_type_presentation
7
- option_type.presentation
8
- end
9
5
  end
@@ -1,41 +1,28 @@
1
1
  Spree::Order.class_eval do
2
- attr_accessible :channel, :as => :api_admin
3
-
4
2
  def self.build_from_api(user, params)
5
- begin
6
- ensure_country_id_from_api params[:ship_address_attributes]
7
- ensure_state_id_from_api params[:ship_address_attributes]
8
- ensure_country_id_from_api params[:bill_address_attributes]
9
- ensure_state_id_from_api params[:bill_address_attributes]
10
-
11
- order = create!
12
- order.associate_user!(user)
13
-
14
- order.create_shipments_from_api params.delete(:shipments_attributes) || []
15
- order.create_line_items_from_api params.delete(:line_items_attributes) || {}
16
- order.create_adjustments_from_api params.delete(:adjustments_attributes) || []
17
- order.create_payments_from_api params.delete(:payments_attributes) || []
18
- order.complete_from_api params.delete(:completed_at)
19
-
20
- destroy_automatic_taxes_on_import(order, params)
21
-
22
- if user.has_spree_role? "admin"
23
- order.update_attributes!(params, as: :api_admin)
24
- else
25
- order.update_attributes!(params)
26
- end
3
+ completed_at = params.delete(:completed_at)
4
+ line_items = params.delete(:line_items_attributes) || {}
5
+ shipments = params.delete(:shipments_attributes) || []
6
+ payments = params.delete(:payments_attributes) || []
7
+ adjustments = params.delete(:adjustments_attributes) || []
27
8
 
28
- order.reload
29
- rescue Exception => e
30
- order.destroy if order && order.persisted?
31
- raise e.message
32
- end
33
- end
9
+ ensure_country_id_from_api params[:ship_address_attributes]
10
+ ensure_state_id_from_api params[:ship_address_attributes]
34
11
 
35
- def self.destroy_automatic_taxes_on_import(order, params)
36
- if params.delete :import
37
- order.adjustments.tax.destroy_all
38
- end
12
+ ensure_country_id_from_api params[:bill_address_attributes]
13
+ ensure_state_id_from_api params[:bill_address_attributes]
14
+
15
+ order = create!(params)
16
+ order.associate_user!(user)
17
+
18
+ order.create_shipments_from_api(shipments)
19
+ order.create_line_items_from_api(line_items)
20
+ order.create_adjustments_from_api(adjustments)
21
+ order.create_payments_from_api(payments)
22
+ order.complete_from_api(completed_at)
23
+
24
+ order.save!
25
+ order.reload
39
26
  end
40
27
 
41
28
  def complete_from_api(completed_at)
@@ -50,7 +37,6 @@ Spree::Order.class_eval do
50
37
  begin
51
38
  shipment = shipments.build
52
39
  shipment.tracking = s[:tracking]
53
- shipment.stock_location = Spree::StockLocation.find_by_name!(s[:stock_location])
54
40
 
55
41
  inventory_units = s[:inventory_units] || []
56
42
  inventory_units.each do |iu|
@@ -64,11 +50,10 @@ Spree::Order.class_eval do
64
50
  shipment.save!
65
51
 
66
52
  shipping_method = Spree::ShippingMethod.find_by_name!(s[:shipping_method])
67
- rate = shipment.shipping_rates.create!(:shipping_method => shipping_method,
68
- :cost => s[:cost])
69
- shipment.selected_shipping_rate_id = rate.id
53
+ shipment.shipping_rates.create!(:shipping_method => shipping_method,
54
+ :cost => s[:cost])
70
55
  rescue Exception => e
71
- raise "Order import shipments: #{e.message} #{s}"
56
+ raise "#{e.message} #{s}"
72
57
  end
73
58
  end
74
59
  end
@@ -82,7 +67,7 @@ Spree::Order.class_eval do
82
67
  payment.payment_method = Spree::PaymentMethod.find_by_name!(p[:payment_method])
83
68
  payment.save!
84
69
  rescue Exception => e
85
- raise "Order import payments: #{e.message} #{p}"
70
+ raise "#{e.message} #{p}"
86
71
  end
87
72
  end
88
73
  end
@@ -95,9 +80,9 @@ Spree::Order.class_eval do
95
80
 
96
81
  extra_params = line_item.except(:variant_id, :quantity)
97
82
  line_item = self.contents.add(Spree::Variant.find(line_item[:variant_id]), line_item[:quantity])
98
- line_item.update_attributes(extra_params, as: :api) unless extra_params.empty?
83
+ line_item.update_attributes(extra_params) unless extra_params.empty?
99
84
  rescue Exception => e
100
- raise "Order import line items: #{e.message} #{line_item}"
85
+ raise "#{e.message} #{line_item}"
101
86
  end
102
87
  end
103
88
  end
@@ -110,7 +95,7 @@ Spree::Order.class_eval do
110
95
  adjustment.save!
111
96
  adjustment.finalize!
112
97
  rescue Exception => e
113
- raise "Order import adjustments: #{e.message} #{a}"
98
+ raise "#{e.message} #{a}"
114
99
  end
115
100
  end
116
101
  end
@@ -122,7 +107,7 @@ Spree::Order.class_eval do
122
107
  hash.delete(:sku)
123
108
  end
124
109
  rescue Exception => e
125
- raise "Ensure order import variant: #{e.message} #{hash}"
110
+ raise "#{e.message} #{hash}"
126
111
  end
127
112
  end
128
113
 
@@ -145,7 +130,7 @@ Spree::Order.class_eval do
145
130
  address[:country_id] = Spree::Country.where(search).first!.id
146
131
 
147
132
  rescue Exception => e
148
- raise "Ensure order import address country: #{e.message} #{search}"
133
+ raise "#{e.message} #{search}"
149
134
  end
150
135
  end
151
136
 
@@ -161,22 +146,16 @@ Spree::Order.class_eval do
161
146
  end
162
147
 
163
148
  address.delete(:state)
164
- search[:country_id] = address[:country_id]
165
-
166
- if state = Spree::State.where(search).first
167
- address[:state_id] = state.id
168
- else
169
- address[:state_name] = search[:name] || search[:abbr]
170
- end
149
+ address[:state_id] = Spree::State.where(search).first!.id
171
150
  rescue Exception => e
172
- raise "Ensure order import address state: #{e.message} #{search}"
151
+ raise "#{e.message} #{search}"
173
152
  end
174
153
  end
175
154
 
176
155
  def update_line_items(line_item_params)
177
156
  return if line_item_params.blank?
178
157
  line_item_params.each do |id, attributes|
179
- self.line_items.find(id).update_attributes!(attributes, :as => :api)
158
+ self.line_items.find(id).update_attributes!(attributes)
180
159
  end
181
160
  self.ensure_updated_shipments
182
161
  end
@@ -1,2 +1,3 @@
1
1
  object @adjustment
2
- attributes *adjustment_attributes
2
+ attributes *adjustment_attributes
3
+ node(:display_amount) { |a| a.display_amount.to_s }
@@ -0,0 +1,6 @@
1
+ object false
2
+ node(:symbol) { ::Money.new(1, Spree::Config[:currency]).symbol }
3
+ node(:symbol_position) { Spree::Config[:currency_symbol_position] }
4
+ node(:no_cents) { Spree::Config[:hide_cents] }
5
+ node(:decimal_mark) { Spree::Config[:currency_decimal_mark] }
6
+ node(:thousands_separator) { Spree::Config[:currency_thousands_separator] }
@@ -0,0 +1,2 @@
1
+ object false
2
+ node(:default_country_id) { Spree::Config[:default_country_id] }
@@ -1,7 +1,6 @@
1
1
  object @image
2
2
  attributes *image_attributes
3
3
  attributes :viewable_type, :viewable_id
4
- node(:attachment_url) { |i| i.attachment.to_s }
5
4
  Spree::Image.attachment_definitions[:attachment][:styles].each do |k,v|
6
5
  node("#{k}_url") { |i| i.attachment.url(k) }
7
6
  end
@@ -1,5 +1,8 @@
1
1
  object @line_item
2
2
  attributes *line_item_attributes
3
+ node(:single_display_amount) { |li| li.single_display_amount.to_s }
4
+ node(:display_amount) { |li| li.display_amount.to_s }
5
+ node(:total) { |li| li.total }
3
6
  child :variant do
4
7
  extends "spree/api/variants/variant"
5
8
  attributes :product_id
@@ -1,6 +1,6 @@
1
1
  object false
2
2
  child(@orders => :orders) do
3
- attributes *order_attributes
3
+ extends "spree/api/orders/order"
4
4
  end
5
5
  node(:count) { @orders.count }
6
6
  node(:current_page) { params[:page] || 1 }
@@ -0,0 +1,6 @@
1
+ attributes *order_attributes
2
+ node(:display_item_total) { |o| o.display_item_total.to_s }
3
+ node(:total_quantity) { |o| o.line_items.sum(:quantity) }
4
+ node(:display_total) { |o| o.display_total.to_s }
5
+ node(:token) { |o| o.token }
6
+ node(:checkout_steps) { |o| o.checkout_steps }
@@ -1,3 +1,3 @@
1
1
  child :available_payment_methods => :payment_methods do
2
- attributes :id, :name, :environment
2
+ attributes :id, :name, :environment, :method_type
3
3
  end
@@ -1,5 +1,5 @@
1
1
  object @order
2
- attributes *order_attributes
2
+ extends "spree/api/orders/order"
3
3
 
4
4
  if lookup_context.find_all("spree/api/orders/#{@order.state}").present?
5
5
  extends "spree/api/orders/#{@order.state}"
@@ -1,2 +1,2 @@
1
1
  object false
2
- node(:error) { I18n.t(:credit_over_limit, :limit => @payment.credit_allowed, :scope => 'spree.api.payment') }
2
+ node(:error) { I18n.t(:credit_over_limit, :limit => @payment.credit_allowed, :scope => 'spree.api') }
@@ -3,3 +3,4 @@ node(:attributes) { [*payment_attributes] }
3
3
  child @payment_methods => :payment_methods do
4
4
  attributes *payment_method_attributes
5
5
  end
6
+
@@ -2,8 +2,8 @@ object false
2
2
  node(:count) { @products.count }
3
3
  node(:total_count) { @products.total_count }
4
4
  node(:current_page) { params[:page] ? params[:page].to_i : 1 }
5
- node(:pages) { @products.num_pages }
6
5
  node(:per_page) { params[:per_page] || Kaminari.config.default_per_page }
7
- child(@products => :products) do
6
+ node(:pages) { @products.num_pages }
7
+ child(@products) do
8
8
  extends "spree/api/products/show"
9
9
  end
@@ -1,5 +1,6 @@
1
1
  object @product
2
2
  attributes *product_attributes
3
+ node(:display_price) { |p| p.display_price.to_s }
3
4
  child :variants_including_master => :variants do
4
5
  attributes *variant_attributes
5
6
 
@@ -2,13 +2,30 @@ object @shipment
2
2
  attributes *shipment_attributes
3
3
  node(:order_id) { |shipment| shipment.order.number }
4
4
  node(:stock_location_name) { |shipment| shipment.stock_location.name }
5
+
5
6
  child :shipping_rates => :shipping_rates do
6
- attributes :id, :cost, :selected, :shipment_id, :shipping_method_id
7
+ extends "spree/api/shipping_rates/show"
8
+ end
9
+
10
+ child :selected_shipping_rate => :selected_shipping_rate do
11
+ extends "spree/api/shipping_rates/show"
7
12
  end
8
- child :shipping_method => :shipping_method do
9
- attributes :name, :zone_id, :shipping_category_id
13
+
14
+ child :shipping_methods => :shipping_methods do
15
+ attributes :id, :name
16
+ child :zones => :zones do
17
+ attributes :id, :name, :description
18
+ end
19
+
20
+ child :shipping_categories => :shipping_categories do
21
+ attributes :id, :name
22
+ end
10
23
  end
11
24
 
12
- child :inventory_units => :inventory_units do
13
- attribute *inventory_unit_attributes
25
+ child :manifest => :manifest do
26
+ child :variant => :variant do
27
+ extends "spree/api/variants/show"
28
+ end
29
+ node(:quantity) { |m| m.quantity }
30
+ node(:states) { |m| m.states }
14
31
  end
@@ -0,0 +1,2 @@
1
+ attributes :id, :name, :cost, :selected, :shipping_method_id
2
+ node(:display_cost) { |sr| sr.display_cost.to_s }
@@ -4,9 +4,7 @@ node(:total_count) { @taxons.total_count }
4
4
  node(:current_page) { params[:page] ? params[:page].to_i : 1 }
5
5
  node(:per_page) { params[:per_page] || Kaminari.config.default_per_page }
6
6
  node(:pages) { @taxons.num_pages }
7
- child @taxons => :taxons do
7
+ child(@taxons) do
8
8
  attributes *taxon_attributes
9
- unless params[:without_children]
10
- extends "spree/api/taxons/taxons"
11
- end
9
+ extends "spree/api/taxons/taxons"
12
10
  end
@@ -14,7 +14,7 @@ child(@variants => :variants) do
14
14
  end
15
15
  end
16
16
 
17
- child(:stock_items => :stock_items) do
17
+ child(:stock_items) do
18
18
  attributes :id, :count_on_hand, :stock_location_id, :backorderable
19
19
  attribute :available? => :available
20
20
 
@@ -7,6 +7,7 @@ en:
7
7
  invalid_resource: "Invalid resource. Please fix errors and try again."
8
8
  resource_not_found: "The resource you were looking for could not be found."
9
9
  gateway_error: "There was a problem with the payment gateway: %{text}"
10
+ credit_over_limit: "This payment can only be credited up to %{limit}. Please specify an amount less than or equal to this number."
10
11
  access: "API Access"
11
12
  key: "Key"
12
13
  clear_key: "Clear key"
@@ -18,9 +19,6 @@ en:
18
19
  order:
19
20
  could_not_transition: "The order could not be transitioned. Please fix the errors and try again."
20
21
  invalid_shipping_method: "Invalid shipping method specified."
21
- payment:
22
- credit_over_limit: "This payment can only be credited up to %{limit}. Please specify an amount less than or equal to this number."
23
- update_forbidden: "This payment cannot be updated because it is %{state}."
24
22
  shipment:
25
23
  cannot_ready: "Cannot ready shipment."
26
24
  stock_location_required: "A stock_location_id parameter must be provided in order to retrieve stock movements."
data/config/routes.rb CHANGED
@@ -22,7 +22,7 @@ Spree::Core::Engine.routes.draw do
22
22
  end
23
23
  end
24
24
 
25
- resources :variants, :only => [:index, :show]
25
+ resources :variants, :only => [:index]
26
26
 
27
27
  resources :option_types do
28
28
  resources :option_values
@@ -86,5 +86,8 @@ Spree::Core::Engine.routes.draw do
86
86
  resources :stock_movements
87
87
  resources :stock_items
88
88
  end
89
+
90
+ get '/config/money', :to => 'config#money'
91
+ get '/config', :to => 'config#show'
89
92
  end
90
93
  end
@@ -14,7 +14,7 @@ module Spree
14
14
  end
15
15
 
16
16
  def template
17
- request.headers['X-Spree-Template'] || controller.params[:template] || options[:default_template]
17
+ request.headers.env['X-Spree-Template'] || controller.params[:template] || options[:default_template]
18
18
  end
19
19
  end
20
20
  end
@@ -6,6 +6,11 @@ module Spree
6
6
  JSON.parse(response.body)
7
7
  end
8
8
 
9
+ def assert_not_found!
10
+ json_response.should == { "error" => "The resource you were looking for could not be found." }
11
+ response.status.should == 404
12
+ end
13
+
9
14
  def assert_unauthorized!
10
15
  json_response.should == { "error" => "You are not authorized to perform that action." }
11
16
  response.status.should == 401
@@ -25,11 +25,11 @@ module Spree
25
25
  :address => { :address1 => "123 Test Lane" }
26
26
  json_response['address1'].should eq '123 Test Lane'
27
27
  end
28
-
28
+
29
29
  it "receives the errors object if address is invalid" do
30
30
  api_put :update, :id => @address.id, :order_id => @order.number,
31
31
  :address => { :address1 => "" }
32
-
32
+
33
33
  json_response['error'].should_not be_nil
34
34
  json_response['errors'].should_not be_nil
35
35
  json_response['errors']['address1'].first.should eq "can't be blank"
@@ -22,16 +22,6 @@ module Spree
22
22
  Spree::Config[:track_inventory_levels] = true
23
23
  end
24
24
 
25
- context "GET 'show'" do
26
- let(:order) { create(:order) }
27
-
28
- it "redirects to Orders#show" do
29
- api_get :show, :id => order.number
30
- response.status.should == 301
31
- response.should redirect_to("/api/orders/#{order.number}")
32
- end
33
- end
34
-
35
25
  context "POST 'create'" do
36
26
  it "creates a new order when no parameters are passed" do
37
27
  api_post :create
@@ -49,9 +39,14 @@ module Spree
49
39
  Order.any_instance.stub(:payment_required? => true)
50
40
  end
51
41
 
52
- it "cannot update without a token" do
53
- api_put :update, :id => order.to_param
54
- assert_unauthorized!
42
+ it "will return an error if the recently created order cannot transition from cart to address" do
43
+ order.state.should eq "cart"
44
+ order.update_column(:email, nil) # email is necessary to transition from cart to address
45
+
46
+ api_put :update, :id => order.to_param, :order_token => order.token
47
+
48
+ # Order has not transitioned
49
+ json_response['state'].should == 'cart'
55
50
  end
56
51
 
57
52
  it "should transition a recently created order from cart to address" do
@@ -66,6 +61,7 @@ module Spree
66
61
  api_put :update, :id => order.to_param, :order_token => order.token,
67
62
  :order => { :line_items_attributes => { line_item.id => { :quantity => 1 } } }
68
63
  response.status.should == 200
64
+ order.reload.state.should eq "address"
69
65
  end
70
66
 
71
67
  it "can take line_items as a parameter" do
@@ -73,13 +69,16 @@ module Spree
73
69
  api_put :update, :id => order.to_param, :order_token => order.token,
74
70
  :order => { :line_items => { line_item.id => { :quantity => 1 } } }
75
71
  response.status.should == 200
72
+ order.reload.state.should eq "address"
76
73
  end
77
74
 
78
75
  it "will return an error if the order cannot transition" do
76
+ pending "not sure if this test is valid"
79
77
  order.bill_address = nil
80
78
  order.save
81
79
  order.update_column(:state, "address")
82
80
  api_put :update, :id => order.to_param, :order_token => order.token
81
+ # Order has not transitioned
83
82
  response.status.should == 422
84
83
  end
85
84
 
@@ -107,18 +106,28 @@ module Spree
107
106
  it "can update shipping method and transition from delivery to payment" do
108
107
  order.update_column(:state, "delivery")
109
108
  shipment = create(:shipment, :order => order)
110
- shipping_rate = shipment.shipping_rates.first
111
- api_put :update, :id => order.to_param, :order_token => order.token, :order => { :shipments_attributes => { "0" => { :selected_shipping_rate_id => shipping_rate.id, :id => shipment.id } } }
112
- json_response['shipments'][0]['shipping_method']['name'].should == @shipping_method.name
113
- json_response['state'].should == 'payment'
109
+ shipment.refresh_rates
110
+ shipping_rate = shipment.shipping_rates.where(:selected => false).first
111
+ api_put :update, :id => order.to_param, :order_token => order.token,
112
+ :order => { :shipments_attributes => { "0" => { :selected_shipping_rate_id => shipping_rate.id, :id => shipment.id } } }
114
113
  response.status.should == 200
114
+ # Find the correct shipment...
115
+ json_shipment = json_response['shipments'].detect { |s| s["id"] == shipment.id }
116
+ # Find the correct shipping rate for that shipment...
117
+ json_shipping_rate = json_shipment['shipping_rates'].detect { |sr| sr["id"] == shipping_rate.id }
118
+ # ... And finally ensure that it's selected
119
+ json_shipping_rate['selected'].should be_true
120
+ # Order should automatically transfer to payment because all criteria are met
121
+ json_response['state'].should == 'payment'
115
122
  end
116
123
 
117
124
  it "can update payment method and transition from payment to confirm" do
118
125
  order.update_column(:state, "payment")
119
- api_put :update, :id => order.to_param, :order_token => order.token, :order => { :payments_attributes => [{ :payment_method_id => @payment_method.id }] }
126
+ api_put :update, :id => order.to_param, :order_token => order.token,
127
+ :order => { :payments_attributes => [{ :payment_method_id => @payment_method.id }] }
120
128
  json_response['state'].should == 'confirm'
121
129
  json_response['payments'][0]['payment_method']['name'].should == @payment_method.name
130
+ json_response['payments'][0]['amount'].should == order.total.to_s
122
131
  response.status.should == 200
123
132
  end
124
133
 
@@ -172,14 +181,16 @@ module Spree
172
181
  it "can assign a user to the order" do
173
182
  user = create(:user)
174
183
  # Need to pass email as well so that validations succeed
175
- api_put :update, :id => order.to_param, :order => { :user_id => user.id, :email => "guest@spreecommerce.com" }
184
+ api_put :update, :id => order.to_param, :order_token => order.token,
185
+ :order => { :user_id => user.id, :email => "guest@spreecommerce.com" }
176
186
  response.status.should == 200
177
187
  json_response['user_id'].should == user.id
178
188
  end
179
189
  end
180
190
 
181
191
  it "can assign an email to the order" do
182
- api_put :update, :id => order.to_param, :order => { :email => "guest@spreecommerce.com" }, :order_token => order.token
192
+ api_put :update, :id => order.to_param, :order_token => order.token,
193
+ :order => { :email => "guest@spreecommerce.com" }
183
194
  json_response['email'].should == "guest@spreecommerce.com"
184
195
  response.status.should == 200
185
196
  end
@@ -188,7 +199,7 @@ module Spree
188
199
  order.update_column(:state, "payment")
189
200
  Spree::Promo::CouponApplicator.should_receive(:new).with(order).and_call_original
190
201
  Spree::Promo::CouponApplicator.any_instance.should_receive(:apply).and_return({:coupon_applied? => true})
191
- api_put :update, :id => order.to_param, :order => { :coupon_code => "foobar" }, :order_token => order.token
202
+ api_put :update, :id => order.to_param, :order_token => order.token, :order => { :coupon_code => "foobar" }
192
203
  end
193
204
 
194
205
  it "can apply a coupon code to an order" do
@@ -220,7 +231,6 @@ module Spree
220
231
 
221
232
  it "cannot transition if order email is blank" do
222
233
  order.update_column(:email, nil)
223
- order.update_column(:state, 'address')
224
234
 
225
235
  api_put :next, :id => order.to_param, :order_token => order.token
226
236
  response.status.should == 422
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Api::ConfigController do
5
+ render_views
6
+
7
+ before do
8
+ stub_authentication!
9
+ end
10
+
11
+ it "returns Spree::Money settings" do
12
+ api_get :money
13
+ response.should be_success
14
+ json_response["symbol"].should == "$"
15
+ json_response["symbol_position"].should == "before"
16
+ json_response["no_cents"].should == false
17
+ json_response["decimal_mark"].should == "."
18
+ json_response["thousands_separator"].should == ","
19
+ end
20
+
21
+ it "returns some configuration settings" do
22
+ api_get :show
23
+ response.should be_success
24
+ json_response["default_country_id"].should == Spree::Config[:default_country_id]
25
+ end
26
+ end
27
+ end
@@ -54,12 +54,12 @@ module Spree
54
54
 
55
55
  it "cannot update an image" do
56
56
  api_put :update, :id => 1
57
- assert_unauthorized!
57
+ assert_not_found!
58
58
  end
59
59
 
60
60
  it "cannot delete an image" do
61
61
  api_delete :destroy, :id => 1
62
- assert_unauthorized!
62
+ assert_not_found!
63
63
  end
64
64
  end
65
65
  end