spree_api 2.0.13 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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