spree_api 2.1.12 → 2.2.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -1
  3. data/app/controllers/spree/api/addresses_controller.rb +25 -10
  4. data/app/controllers/spree/api/base_controller.rb +18 -29
  5. data/app/controllers/spree/api/checkouts_controller.rb +23 -29
  6. data/app/controllers/spree/api/classifications_controller.rb +18 -0
  7. data/app/controllers/spree/api/line_items_controller.rb +13 -1
  8. data/app/controllers/spree/api/option_types_controller.rb +2 -2
  9. data/app/controllers/spree/api/option_values_controller.rb +1 -1
  10. data/app/controllers/spree/api/orders_controller.rb +12 -34
  11. data/app/controllers/spree/api/products_controller.rb +22 -23
  12. data/app/controllers/spree/api/taxons_controller.rb +9 -0
  13. data/app/controllers/spree/api/variants_controller.rb +1 -1
  14. data/app/helpers/spree/api/api_helpers.rb +5 -3
  15. data/app/models/spree/order_decorator.rb +2 -11
  16. data/app/views/spree/api/line_items/show.v1.rabl +4 -0
  17. data/app/views/spree/api/orders/order.v1.rabl +0 -1
  18. data/app/views/spree/api/products/show.v1.rabl +7 -10
  19. data/app/views/spree/api/promotions/handler.v1.rabl +4 -0
  20. data/app/views/spree/api/variants/index.v1.rabl +1 -1
  21. data/app/views/spree/api/variants/show.v1.rabl +2 -3
  22. data/app/views/spree/api/variants/variant.v1.rabl +2 -0
  23. data/app/views/spree/api/variants/{big_variant.v1.rabl → variant_full.v1.rabl} +0 -0
  24. data/config/routes.rb +6 -4
  25. data/lib/spree/api/controller_setup.rb +0 -1
  26. data/lib/spree/api/testing_support/helpers.rb +1 -0
  27. data/spec/controllers/spree/api/addresses_controller_spec.rb +57 -31
  28. data/spec/controllers/spree/api/base_controller_spec.rb +0 -36
  29. data/spec/controllers/spree/api/checkouts_controller_spec.rb +8 -41
  30. data/spec/controllers/spree/api/classifications_controller_spec.rb +38 -0
  31. data/spec/controllers/spree/api/line_items_controller_spec.rb +10 -21
  32. data/spec/controllers/spree/api/option_values_controller_spec.rb +0 -7
  33. data/spec/controllers/spree/api/orders_controller_spec.rb +24 -121
  34. data/spec/controllers/spree/api/products_controller_spec.rb +26 -48
  35. data/spec/controllers/spree/api/promotion_application_spec.rb +48 -0
  36. data/spec/controllers/spree/api/shipments_controller_spec.rb +1 -22
  37. data/spec/controllers/spree/api/unauthenticated_products_controller_spec.rb +1 -1
  38. data/spec/controllers/spree/api/users_controller_spec.rb +3 -2
  39. data/spec/controllers/spree/api/variants_controller_spec.rb +13 -7
  40. data/spec/models/spree/order_spec.rb +3 -28
  41. metadata +12 -7
  42. data/app/views/spree/api/orders/apply_coupon_code.v1.rabl +0 -7
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'spree/promo/coupon_applicator'
3
2
 
4
3
  module Spree
5
4
  describe Api::CheckoutsController do
@@ -15,23 +14,13 @@ module Spree
15
14
  create(:stock_location)
16
15
 
17
16
  @shipping_method = create(:shipping_method, :zones => [country_zone])
18
- @payment_method = create(:bogus_payment_method)
17
+ @payment_method = create(:credit_card_payment_method)
19
18
  end
20
19
 
21
20
  after do
22
21
  Spree::Config[:track_inventory_levels] = true
23
22
  end
24
23
 
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
24
  context "POST 'create'" do
36
25
  it "creates a new order when no parameters are passed" do
37
26
  api_post :create
@@ -56,28 +45,12 @@ module Spree
56
45
  order
57
46
  end
58
47
 
48
+
59
49
  before(:each) do
60
50
  Order.any_instance.stub(:confirmation_required? => true)
61
51
  Order.any_instance.stub(:payment_required? => true)
62
52
  end
63
53
 
64
- it 'should not allow users to change the price of line items' do
65
- line_item = order.line_items.first
66
- price_was = line_item.price
67
- api_put(
68
- :update,
69
- id: order.to_param,
70
- order_token: order.token,
71
- order: {
72
- line_items: {0 => {id: line_item.id, price: '0.1', quantity: '3'}}
73
- }
74
- )
75
- response.status.should == 200
76
- line_item.reload
77
- expect(line_item.price).to eq price_was
78
- expect(line_item.price).to_not eq 0.1
79
- end
80
-
81
54
  it "should transition a recently created order from cart to address" do
82
55
  order.state.should eq "cart"
83
56
  order.email.should_not be_nil
@@ -174,7 +147,8 @@ module Spree
174
147
  "number" => "4111111111111111",
175
148
  "month" => 1.month.from_now.month,
176
149
  "year" => 1.month.from_now.year,
177
- "verification_value" => "123"
150
+ "verification_value" => "123",
151
+ "name" => "Spree Commerce"
178
152
  }
179
153
 
180
154
  api_put :update, :id => order.to_param, :order_token => order.token,
@@ -189,8 +163,7 @@ module Spree
189
163
  order.update_column(:state, "payment")
190
164
  api_put :update, :id => order.to_param, :order_token => order.token,
191
165
  :order => { :payments_attributes => [{ :payment_method_id => @payment_method.id.to_s }],
192
- :payment_source => { @payment_method.id.to_s => { first_name: "Spree" } } }
193
-
166
+ :payment_source => { @payment_method.id.to_s => { } } }
194
167
  response.status.should == 422
195
168
  cc_errors = json_response['errors']['payments.Credit Card']
196
169
  cc_errors.should include("Number can't be blank")
@@ -242,17 +215,11 @@ module Spree
242
215
  end
243
216
 
244
217
  it "can apply a coupon code to an order" do
245
- order.update_column(:state, "payment")
246
- Spree::Promo::CouponApplicator.should_receive(:new).with(order).and_call_original
247
- Spree::Promo::CouponApplicator.any_instance.should_receive(:apply).and_return({:coupon_applied? => true})
248
- api_put :update, :id => order.to_param, :order_token => order.token, :order => { :coupon_code => "foobar" }
249
- end
218
+ pending "ensure that the order totals are properly updated, see frontend orders_controller or checkout_controller as example"
250
219
 
251
- it "can apply a coupon code to an order" do
252
220
  order.update_column(:state, "payment")
253
- Spree::Promo::CouponApplicator.should_receive(:new).with(order).and_call_original
254
- coupon_result = { :coupon_applied? => true }
255
- Spree::Promo::CouponApplicator.any_instance.should_receive(:apply).and_return(coupon_result)
221
+ PromotionHandler::Coupon.should_receive(:new).with(order).and_call_original
222
+ PromotionHandler::Coupon.any_instance.should_receive(:apply).and_return({:coupon_applied? => true})
256
223
  api_put :update, :id => order.to_param, :order_token => order.token, :order => { :coupon_code => "foobar" }
257
224
  end
258
225
  end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Api::ClassificationsController do
5
+ let(:taxon) do
6
+ taxon = create(:taxon)
7
+ 3.times do
8
+ product = create(:product)
9
+ product.taxons << taxon
10
+ end
11
+ taxon
12
+ end
13
+
14
+ before do
15
+ stub_authentication!
16
+ end
17
+
18
+ context "as a user" do
19
+ it "cannot change the order of a product" do
20
+ api_put :update, :taxon_id => taxon, :product_id => taxon.products.first, :position => 1
21
+ response.status.should == 401
22
+ end
23
+ end
24
+
25
+ context "as an admin" do
26
+ sign_in_as_admin!
27
+
28
+ it "can change the order a product" do
29
+ last_product = taxon.products.last
30
+ classification = taxon.classifications.find_by(:product_id => last_product.id)
31
+ classification.position.should == 3
32
+ api_put :update, :taxon_id => taxon, :product_id => last_product, :position => 0
33
+ response.status.should == 200
34
+ classification.reload.position.should == 1
35
+ end
36
+ end
37
+ end
38
+ end
@@ -10,8 +10,11 @@ module Spree
10
10
  let(:attributes) { [:id, :quantity, :price, :variant, :total, :display_amount, :single_display_amount] }
11
11
  let(:resource_scoping) { { :order_id => order.to_param } }
12
12
 
13
+ before do
14
+ stub_authentication!
15
+ end
16
+
13
17
  it "can learn how to create a new line item" do
14
- controller.stub :try_spree_current_user => current_api_user
15
18
  api_get :new
16
19
  json_response["attributes"].should == ["quantity", "price", "variant_id"]
17
20
  required_attributes = json_response["required_attributes"]
@@ -37,7 +40,6 @@ module Spree
37
40
 
38
41
  context "as the order owner" do
39
42
  before do
40
- controller.stub :try_spree_current_user => current_api_user
41
43
  Order.any_instance.stub :user => current_api_user
42
44
  end
43
45
 
@@ -60,15 +62,20 @@ module Spree
60
62
 
61
63
  it "can update a line item on the order" do
62
64
  line_item = order.line_items.first
63
- api_put :update, :id => line_item.id, :line_item => { :quantity => 1000 }
65
+ api_put :update, :id => line_item.id, :line_item => { :quantity => 101 }
64
66
  response.status.should == 200
67
+ order.reload
68
+ order.total.should == 1050 # 50 original due to factory, + 1000 in this test
65
69
  json_response.should have_attributes(attributes)
70
+ json_response["quantity"].should == 101
66
71
  end
67
72
 
68
73
  it "can delete a line item on the order" do
69
74
  line_item = order.line_items.first
70
75
  api_delete :destroy, :id => line_item.id
71
76
  response.status.should == 204
77
+ order.reload
78
+ order.line_items.count.should == 4 # 5 original due to factory, - 1 in this test
72
79
  lambda { line_item.reload }.should raise_error(ActiveRecord::RecordNotFound)
73
80
  end
74
81
 
@@ -95,28 +102,10 @@ module Spree
95
102
  api_delete :destroy, :id => line_item.id
96
103
  expect(order.reload.shipments).to be_empty
97
104
  end
98
-
99
- context "order is completed" do
100
- before do
101
- order.stub completed?: true
102
- Order.stub find_by!: order
103
- end
104
-
105
- it "doesn't destroy shipments or restart checkout flow" do
106
- expect(order.reload.shipments).not_to be_empty
107
- api_post :create, :line_item => { :variant_id => product.master.to_param, :quantity => 1 }
108
- expect(order.reload.shipments).not_to be_empty
109
- end
110
- end
111
105
  end
112
106
  end
113
107
 
114
108
  context "as just another user" do
115
- before do
116
- user = create(:user)
117
- controller.stub :try_spree_current_user => user
118
- end
119
-
120
109
  it "cannot add a new line item to the order" do
121
110
  api_post :create, :line_item => { :variant_id => product.master.to_param, :quantity => 1 }
122
111
  assert_unauthorized!
@@ -111,13 +111,6 @@ module Spree
111
111
  option_value.name.should == "Option Value"
112
112
  end
113
113
 
114
- it "permits the correct attributes" do
115
- controller.should_receive(:permitted_option_value_attributes)
116
- api_put :update, :id => option_value.id, :option_value => {
117
- :name => ""
118
- }
119
- end
120
-
121
114
  it "cannot update an option value with invalid attributes" do
122
115
  api_put :update, :id => option_value.id, :option_value => {
123
116
  :name => ""
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'spree/testing_support/bar_ability'
3
2
 
4
3
  module Spree
5
4
  describe Api::OrdersController do
@@ -14,7 +13,7 @@ module Spree
14
13
  :user_id, :created_at, :updated_at,
15
14
  :completed_at, :payment_total, :shipment_state,
16
15
  :payment_state, :email, :special_instructions,
17
- :total_quantity, :display_item_total, :currency] }
16
+ :total_quantity, :display_item_total] }
18
17
 
19
18
  let(:address_params) { { :country_id => Country.first.id, :state_id => State.first.id } }
20
19
 
@@ -26,7 +25,7 @@ module Spree
26
25
  :city => "Sao Paulo", :zipcode => "1234567", :phone => "12345678",
27
26
  :country_id => Country.first.id, :state_id => State.first.id} }
28
27
 
29
- let!(:payment_method) { create(:payment_method) }
28
+ let!(:payment_method) { create(:check_payment_method) }
30
29
 
31
30
  let(:current_api_user) do
32
31
  user = Spree.user_class.new(:email => "spree@example.com")
@@ -117,20 +116,6 @@ module Spree
117
116
  response.status.should == 200
118
117
  end
119
118
 
120
- context "with BarAbility registered" do
121
- before { Spree::Ability.register_ability(::BarAbility) }
122
- after { Spree::Ability.remove_ability(::BarAbility) }
123
-
124
- it "can view an order" do
125
- user = mock_model(Spree::LegacyUser)
126
- user.stub(:has_spree_role?).with('bar').and_return(true)
127
- user.stub(:has_spree_role?).with('admin').and_return(false)
128
- controller.stub try_spree_current_user: user
129
- api_get :show, :id => order.to_param
130
- response.status.should == 200
131
- end
132
- end
133
-
134
119
  it "cannot cancel an order that doesn't belong to them" do
135
120
  order.update_attribute(:completed_at, Time.now)
136
121
  order.update_attribute(:shipment_state, "ready")
@@ -188,45 +173,13 @@ module Spree
188
173
  expect(Order.last.line_items.first.price.to_f).to eq(variant.price)
189
174
  end
190
175
 
191
- context "import" do
192
- let(:tax_rate) { create(:tax_rate, amount: 0.05, calculator: Calculator::DefaultTax.create) }
193
- let(:other_variant) { create(:variant) }
194
-
195
- let(:order_params) do
196
- {
197
- :line_items => {
198
- "0" => { :variant_id => variant.to_param, :quantity => 5 },
199
- "1" => { :variant_id => other_variant.to_param, :quantity => 5 }
200
- }
201
- }
202
- end
203
-
204
- before do
205
- Zone.stub default_tax: tax_rate.zone
206
- current_api_user.stub has_spree_role?: true
207
- end
176
+ context "admin user imports order" do
177
+ before { current_api_user.stub has_spree_role?: true }
208
178
 
209
179
  it "sets channel" do
210
180
  api_post :create, :order => { channel: "amazon" }
211
181
  expect(json_response['channel']).to eq "amazon"
212
182
  end
213
-
214
- it "doesnt persist any automatic tax adjustment" do
215
- expect {
216
- api_post :create, :order => order_params.merge(:import => true)
217
- }.not_to change { Adjustment.count }
218
-
219
- expect(response.status).to eq 201
220
- end
221
-
222
- it "doesnt blow up when passing a sku into line items hash" do
223
- order_params[:line_items]["0"][:sku] = variant.sku
224
- order_params[:line_items]["0"][:variant_id] = nil
225
- order_params[:line_items]["1"][:sku] = other_variant.sku
226
-
227
- api_post :create, :order => order_params
228
- expect(response.status).to eq 201
229
- end
230
183
  end
231
184
 
232
185
  # Regression test for #3404
@@ -255,7 +208,7 @@ module Spree
255
208
 
256
209
  let(:variant) { create(:variant) }
257
210
  let!(:line_item) { order.contents.add(variant, 1) }
258
- let!(:payment_method) { create(:payment_method) }
211
+ let!(:payment_method) { create(:check_payment_method) }
259
212
 
260
213
  let(:address_params) { { :country_id => Country.first.id, :state_id => State.first.id } }
261
214
  let(:billing_address) { { :firstname => "Tiago", :lastname => "Motta", :address1 => "Av Paulista",
@@ -413,8 +366,23 @@ module Spree
413
366
  it "includes the tax_total in the response" do
414
367
  api_get :show, :id => order.to_param
415
368
 
416
- json_response['tax_total'].should == '0.0'
417
- json_response['display_tax_total'].should == '$0.00'
369
+ json_response['included_tax_total'].should == '0.0'
370
+ json_response['additional_tax_total'].should == '0.0'
371
+ json_response['display_included_tax_total'].should == '$0.00'
372
+ json_response['display_additional_tax_total'].should == '$0.00'
373
+ end
374
+
375
+ it "lists line item adjustments" do
376
+ adjustment = create(:adjustment,
377
+ :label => "10% off!",
378
+ :order => order,
379
+ :adjustable => order.line_items.first)
380
+ adjustment.update_column(:amount, 5)
381
+ api_get :show, :id => order.to_param
382
+
383
+ adjustment = json_response['line_items'].first['adjustments'].first
384
+ adjustment['label'].should == "10% off!"
385
+ adjustment['amount'].should == "5.0"
418
386
  end
419
387
 
420
388
  context "when in delivery" do
@@ -434,8 +402,8 @@ module Spree
434
402
  it "includes the ship_total in the response" do
435
403
  api_get :show, :id => order.to_param
436
404
 
437
- json_response['ship_total'].should == '10.0'
438
- json_response['display_ship_total'].should == '$10.00'
405
+ json_response['ship_total'].should == '0.0'
406
+ json_response['display_ship_total'].should == '$0.00'
439
407
  end
440
408
 
441
409
  it "returns available shipments for an order" do
@@ -564,71 +532,6 @@ module Spree
564
532
  end
565
533
  end
566
534
  end
567
-
568
- describe 'apply_promo_code' do
569
- # Borrowed from:
570
- # https://github.com/spree/spree/blob/master/api/spec/controllers/spree/api/promotion_application_spec.rb
571
-
572
- let(:order) do
573
- order = create(
574
- :order_with_line_items,
575
- state: 'payment',
576
- user: current_api_user,
577
- line_items_count: 1
578
- )
579
- end
580
-
581
- subject do
582
- api_put :apply_coupon_code, id: order.to_param, coupon_code: coupon_code, :order_token => order.token
583
- end
584
-
585
- context 'when valid promo code' do
586
- let(:coupon_code) { 'some_code' }
587
-
588
- # Create a promotion for testing.
589
- # https://github.com/spree/spree/blob/2-1-stable/core/spec/lib/spree/promo/coupon_applicator_spec.rb
590
- before(:each) do
591
- flat_percent_calc = Spree::Calculator::FlatPercentItemTotal.create(:preferred_flat_percent => "10")
592
- promo = Spree::Promotion.create(:name => "Discount", :event_name => "spree.checkout.coupon_code_added", :code => coupon_code, :usage_limit => "10", :starts_at => DateTime.yesterday, :expires_at => DateTime.tomorrow)
593
- promo_rule = Spree::Promotion::Rules::ItemTotal.create(:preferred_operator => "gt", :preferred_amount => "1")
594
- promo_rule.update_attribute(:activator_id, promo.id)
595
- promo_action = Spree::Promotion::Actions::CreateAdjustment.create(:calculator_type => "Spree::Calculator::FlatPercentItemTotal")
596
- promo_action.update_attribute(:activator_id, promo.id)
597
- flat_percent_calc.update_attribute(:calculable_id, promo.id)
598
- Spree::Order.any_instance.stub(:payment_required? => false)
599
- Spree::Adjustment.any_instance.stub(:eligible => true)
600
- end
601
-
602
- it 'should should be_ok' do
603
- subject
604
- response.should be_ok
605
- end
606
-
607
- it 'should have success JSON' do
608
- subject
609
- result = JSON.parse(response.body)
610
- result['successful'].should be_true
611
- result['success'].should == "The coupon code was successfully applied to your order."
612
- result['error'].should be_nil
613
- end
614
- end
615
-
616
- context 'when invalid promo code' do
617
- let(:coupon_code) { 'xxxxx' }
618
- it 'should should be_ok ' do
619
- subject
620
- response.code.to_i.should == 422
621
- end
622
-
623
- it 'should have error JSON' do
624
- subject
625
- result = JSON.parse(response.body)
626
- result['successful'].should be_false
627
- result['error'].should == "The coupon code you entered doesn't exist. Please try again."
628
- result['success'].should be_nil
629
- end
630
- end
631
- end
632
535
  end
633
536
  end
634
537
 
@@ -7,7 +7,10 @@ module Spree
7
7
 
8
8
  let!(:product) { create(:product) }
9
9
  let!(:inactive_product) { create(:product, :available_on => Time.now.tomorrow, :name => "inactive") }
10
- let(:attributes) { [:id, :name, :description, :price, :display_price, :available_on, :permalink, :meta_description, :meta_keywords, :shipping_category_id, :taxon_ids] }
10
+ let(:base_attributes) { [:id, :name, :description, :price, :display_price, :available_on, :slug, :meta_description, :meta_keywords, :shipping_category_id, :taxon_ids] }
11
+ let(:show_attributes) { base_attributes.dup.push(:has_variants) }
12
+ let(:new_attributes) { base_attributes }
13
+
11
14
  let(:product_data) do
12
15
  { name: "The Other Product",
13
16
  price: 19.99,
@@ -28,27 +31,9 @@ module Spree
28
31
  end
29
32
 
30
33
  context "as a normal user" do
31
- context "with caching enabled" do
32
- let!(:product_2) { create(:product) }
33
-
34
- before do
35
- ActionController::Base.perform_caching = true
36
- end
37
-
38
- it "returns unique products" do
39
- api_get :index
40
- product_ids = json_response["products"].map { |p| p["id"] }
41
- expect(product_ids.uniq.count).to eq(product_ids.count)
42
- end
43
-
44
- after do
45
- ActionController::Base.perform_caching = false
46
- end
47
- end
48
-
49
34
  it "retrieves a list of products" do
50
35
  api_get :index
51
- json_response["products"].first.should have_attributes(attributes)
36
+ json_response["products"].first.should have_attributes(show_attributes)
52
37
  json_response["total_count"].should == 1
53
38
  json_response["current_page"].should == 1
54
39
  json_response["pages"].should == 1
@@ -57,7 +42,7 @@ module Spree
57
42
 
58
43
  it "retrieves a list of products by id" do
59
44
  api_get :index, :ids => [product.id]
60
- json_response["products"].first.should have_attributes(attributes)
45
+ json_response["products"].first.should have_attributes(show_attributes)
61
46
  json_response["total_count"].should == 1
62
47
  json_response["current_page"].should == 1
63
48
  json_response["pages"].should == 1
@@ -76,8 +61,8 @@ module Spree
76
61
  it "retrieves a list of products by ids string" do
77
62
  second_product = create(:product)
78
63
  api_get :index, :ids => [product.id, second_product.id].join(",")
79
- json_response["products"].first.should have_attributes(attributes)
80
- json_response["products"][1].should have_attributes(attributes)
64
+ json_response["products"].first.should have_attributes(show_attributes)
65
+ json_response["products"][1].should have_attributes(show_attributes)
81
66
  json_response["total_count"].should == 2
82
67
  json_response["current_page"].should == 1
83
68
  json_response["pages"].should == 1
@@ -98,7 +83,7 @@ module Spree
98
83
  it "can select the next page of products" do
99
84
  second_product = create(:product)
100
85
  api_get :index, :page => 2, :per_page => 1
101
- json_response["products"].first.should have_attributes(attributes)
86
+ json_response["products"].first.should have_attributes(show_attributes)
102
87
  json_response["total_count"].should == 2
103
88
  json_response["current_page"].should == 2
104
89
  json_response["pages"].should == 2
@@ -132,7 +117,7 @@ module Spree
132
117
  it "can search for products" do
133
118
  create(:product, :name => "The best product in the world")
134
119
  api_get :index, :q => { :name_cont => "best" }
135
- json_response["products"].first.should have_attributes(attributes)
120
+ json_response["products"].first.should have_attributes(show_attributes)
136
121
  json_response["count"].should == 1
137
122
  end
138
123
 
@@ -142,11 +127,12 @@ module Spree
142
127
  product.variants.first.images.create!(:attachment => image("thinking-cat.jpg"))
143
128
  product.set_property("spree", "rocks")
144
129
  api_get :show, :id => product.to_param
145
- json_response.should have_attributes(attributes)
130
+ json_response.should have_attributes(show_attributes)
146
131
  json_response['variants'].first.should have_attributes([:name,
147
132
  :is_master,
148
133
  :price,
149
- :images])
134
+ :images,
135
+ :in_stock])
150
136
 
151
137
  json_response['variants'].first['images'].first.should have_attributes([:attachment_file_name,
152
138
  :attachment_width,
@@ -163,20 +149,20 @@ module Spree
163
149
  end
164
150
 
165
151
 
166
- context "finds a product by permalink first then by id" do
167
- let!(:other_product) { create(:product, :permalink => "these-are-not-the-droids-you-are-looking-for") }
152
+ context "finds a product by slug first then by id" do
153
+ let!(:other_product) { create(:product, :slug => "these-are-not-the-droids-you-are-looking-for") }
168
154
 
169
155
  before do
170
- product.update_attribute(:permalink, "#{other_product.id}-and-1-ways")
156
+ product.update_column(:slug, "#{other_product.id}-and-1-ways")
171
157
  end
172
158
 
173
159
  specify do
174
160
  api_get :show, :id => product.to_param
175
- json_response["permalink"].should =~ /and-1-ways/
161
+ json_response["slug"].should =~ /and-1-ways/
176
162
  product.destroy
177
163
 
178
164
  api_get :show, :id => other_product.id
179
- json_response["permalink"].should =~ /droids/
165
+ json_response["slug"].should =~ /droids/
180
166
  end
181
167
  end
182
168
 
@@ -192,7 +178,7 @@ module Spree
192
178
 
193
179
  it "can learn how to create a new product" do
194
180
  api_get :new
195
- json_response["attributes"].should == attributes.map(&:to_s)
181
+ json_response["attributes"].should == new_attributes.map(&:to_s)
196
182
  required_attributes = json_response["required_attributes"]
197
183
  required_attributes.should include("name")
198
184
  required_attributes.should include("price")
@@ -238,7 +224,7 @@ module Spree
238
224
  api_post :create, :product => { :name => "The Other Product",
239
225
  :price => 19.99,
240
226
  :shipping_category_id => create(:shipping_category).id }
241
- json_response.should have_attributes(attributes)
227
+ json_response.should have_attributes(base_attributes)
242
228
  response.status.should == 201
243
229
  end
244
230
 
@@ -249,9 +235,9 @@ module Spree
249
235
 
250
236
  api_post :create, :product => product_data
251
237
  expect(response.status).to eq 201
252
- expect(json_response['variants'].count).to eq(3) # 1 master + 2 variants
253
238
 
254
- variants = json_response['variants'].select { |v| !v['is_master'] }
239
+ variants = json_response['variants']
240
+ expect(variants.count).to eq(2)
255
241
  expect(variants.last['option_values'][0]['name']).to eq('small')
256
242
  expect(variants.last['option_values'][0]['option_type_name']).to eq('size')
257
243
 
@@ -281,14 +267,6 @@ module Spree
281
267
  expect(json_response['option_types'].count).to eq(2)
282
268
  end
283
269
 
284
- it "can create a new product" do
285
- api_post :create, :product => { :name => "The Other Product",
286
- :price => 19.99,
287
- :shipping_category_id => create(:shipping_category).id }
288
- json_response.should have_attributes(attributes)
289
- response.status.should == 201
290
- end
291
-
292
270
  it "creates with shipping categories" do
293
271
  hash = { :name => "The Other Product",
294
272
  :price => 19.99,
@@ -326,7 +304,7 @@ module Spree
326
304
 
327
305
  it "can still create a product" do
328
306
  api_post :create, :product => product_data, :token => "fake"
329
- json_response.should have_attributes(attributes)
307
+ json_response.should have_attributes(show_attributes)
330
308
  response.status.should == 201
331
309
  end
332
310
  end
@@ -336,7 +314,7 @@ module Spree
336
314
  response.status.should == 422
337
315
  json_response["error"].should == "Invalid resource. Please fix errors and try again."
338
316
  errors = json_response["errors"]
339
- errors.delete("permalink") # Don't care about this one.
317
+ errors.delete("slug") # Don't care about this one.
340
318
  errors.keys.should =~ ["name", "price", "shipping_category_id"]
341
319
  end
342
320
  end
@@ -355,7 +333,7 @@ module Spree
355
333
  it "can create new variants on a product" do
356
334
  api_put :update, :id => product.to_param, :product => { :variants => [attributes_for_variant, attributes_for_variant] }
357
335
  expect(response.status).to eq 200
358
- expect(json_response['variants'].count).to eq(3) # 1 master + 2 variants
336
+ expect(json_response['variants'].count).to eq(2) # 2 variants
359
337
 
360
338
  variants = json_response['variants'].select { |v| !v['is_master'] }
361
339
  expect(variants.last['option_values'][0]['name']).to eq('small')
@@ -380,7 +358,7 @@ module Spree
380
358
  ]
381
359
  }
382
360
 
383
- expect(json_response['variants'].count).to eq(2) # 1 master + 1 variants
361
+ expect(json_response['variants'].count).to eq(1)
384
362
  variants = json_response['variants'].select { |v| !v['is_master'] }
385
363
  expect(variants.last['option_values'][0]['name']).to eq('large')
386
364
  expect(variants.last['sku']).to eq('456')