spree_api 1.3.5 → 2.0.0.rc1
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.
- checksums.yaml +14 -6
- data/Rakefile +1 -1
- data/app/controllers/spree/api/addresses_controller.rb +0 -1
- data/app/controllers/spree/api/base_controller.rb +21 -9
- data/app/controllers/spree/api/checkouts_controller.rb +40 -20
- data/app/controllers/spree/api/countries_controller.rb +0 -1
- data/app/controllers/spree/api/inventory_units_controller.rb +1 -1
- data/app/controllers/spree/api/option_types_controller.rb +46 -0
- data/app/controllers/spree/api/option_values_controller.rb +56 -0
- data/app/controllers/spree/api/orders_controller.rb +1 -21
- data/app/controllers/spree/api/product_properties_controller.rb +0 -1
- data/app/controllers/spree/api/products_controller.rb +12 -27
- data/app/controllers/spree/api/properties_controller.rb +61 -0
- data/app/controllers/spree/api/shipments_controller.rb +51 -1
- data/app/controllers/spree/api/states_controller.rb +32 -0
- data/app/controllers/spree/api/stock_items_controller.rb +70 -0
- data/app/controllers/spree/api/stock_locations_controller.rb +45 -0
- data/app/controllers/spree/api/stock_movements_controller.rb +55 -0
- data/app/controllers/spree/api/taxonomies_controller.rb +5 -0
- data/app/controllers/spree/api/taxons_controller.rb +16 -2
- data/app/controllers/spree/api/variants_controller.rb +1 -1
- data/app/controllers/spree/api/zones_controller.rb +0 -1
- data/app/helpers/spree/api/api_helpers.rb +34 -7
- data/app/models/spree/api_configuration.rb +1 -2
- data/app/models/spree/line_item_decorator.rb +1 -1
- data/app/models/spree/order_decorator.rb +6 -169
- data/app/overrides/api_admin_user_edit_form.rb +7 -6
- data/app/views/spree/admin/users/_api_fields.html.erb +7 -8
- data/app/views/spree/api/addresses/show.v1.rabl +2 -2
- data/app/views/spree/api/adjustments/show.v1.rabl +2 -0
- data/app/views/spree/api/credit_cards/show.v1.rabl +2 -0
- data/app/views/spree/api/option_types/index.v1.rabl +3 -0
- data/app/views/spree/api/option_types/show.v1.rabl +5 -0
- data/app/views/spree/api/option_values/index.v1.rabl +3 -0
- data/app/views/spree/api/option_values/show.v1.rabl +2 -0
- data/app/views/spree/api/orders/could_not_apply_coupon.v1.rabl +2 -0
- data/app/views/spree/api/orders/delivery.v1.rabl +2 -2
- data/app/views/spree/api/orders/payment.v1.rabl +3 -0
- data/app/views/spree/api/orders/show.v1.rabl +8 -0
- data/app/views/spree/api/properties/index.v1.rabl +7 -0
- data/app/views/spree/api/properties/new.v1.rabl +2 -0
- data/app/views/spree/api/properties/show.v1.rabl +2 -0
- data/app/views/spree/api/shared/stock_location_required.v1.rabl +2 -0
- data/app/views/spree/api/shipments/show.v1.rabl +7 -0
- data/app/views/spree/api/states/index.v1.rabl +14 -0
- data/app/views/spree/api/states/show.v1.rabl +2 -0
- data/app/views/spree/api/stock_items/index.v1.rabl +7 -0
- data/app/views/spree/api/stock_items/show.v1.rabl +5 -0
- data/app/views/spree/api/stock_locations/index.v1.rabl +7 -0
- data/app/views/spree/api/stock_locations/show.v1.rabl +8 -0
- data/app/views/spree/api/stock_movements/index.v1.rabl +7 -0
- data/app/views/spree/api/stock_movements/show.v1.rabl +5 -0
- data/app/views/spree/api/taxonomies/jstree.rabl +8 -0
- data/app/views/spree/api/taxons/jstree.rabl +8 -0
- data/app/views/spree/api/variants/index.v1.rabl +14 -1
- data/app/views/spree/api/variants/variant.v1.rabl +0 -4
- data/config/locales/en.yml +1 -0
- data/config/routes.rb +29 -3
- data/lib/spree/api.rb +0 -2
- data/lib/spree/api/controller_setup.rb +6 -1
- data/lib/spree/api/testing_support/helpers.rb +1 -1
- data/lib/spree/api/testing_support/setup.rb +13 -0
- data/spec/controllers/spree/api/base_controller_spec.rb +14 -1
- data/spec/controllers/spree/api/checkouts_controller_spec.rb +59 -28
- data/spec/controllers/spree/api/line_items_controller_spec.rb +1 -5
- data/spec/controllers/spree/api/option_types_controller_spec.rb +116 -0
- data/spec/controllers/spree/api/option_values_controller_spec.rb +128 -0
- data/spec/controllers/spree/api/orders_controller_spec.rb +11 -93
- data/spec/controllers/spree/api/product_properties_controller_spec.rb +2 -2
- data/spec/controllers/spree/api/products_controller_spec.rb +18 -76
- data/spec/controllers/spree/api/properties_controller_spec.rb +89 -0
- data/spec/controllers/spree/api/return_authorizations_controller_spec.rb +1 -9
- data/spec/controllers/spree/api/shipments_controller_spec.rb +80 -5
- data/spec/controllers/spree/api/states_controller_spec.rb +76 -0
- data/spec/controllers/spree/api/stock_items_controller_spec.rb +88 -0
- data/spec/controllers/spree/api/stock_locations_controller_spec.rb +86 -0
- data/spec/controllers/spree/api/stock_movements_controller_spec.rb +72 -0
- data/spec/controllers/spree/api/taxonomies_controller_spec.rb +7 -0
- data/spec/controllers/spree/api/taxons_controller_spec.rb +29 -2
- data/spec/controllers/spree/api/unauthenticated_products_controller_spec.rb +1 -1
- data/spec/controllers/spree/api/variants_controller_spec.rb +5 -16
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/models/spree/order_spec.rb +7 -328
- data/spec/spec_helper.rb +18 -2
- data/spree_api.gemspec +2 -1
- metadata +67 -16
- data/.rspec +0 -1
- data/app/controllers/spree/base_controller_decorator.rb +0 -15
- data/app/overrides/api_key_spree_layout.rb +0 -7
- data/app/views/spree/api/_key.html.erb +0 -4
- data/db/migrate/20131017162334_add_index_to_user_spree_api_key.rb +0 -7
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'spree/promo/coupon_applicator'
|
2
3
|
|
3
4
|
module Spree
|
4
5
|
describe Api::CheckoutsController do
|
@@ -11,8 +12,9 @@ module Spree
|
|
11
12
|
@state = create(:state)
|
12
13
|
@country = @state.country
|
13
14
|
country_zone.members.create(:zoneable => @country)
|
15
|
+
create(:stock_location)
|
14
16
|
|
15
|
-
@shipping_method = create(:shipping_method, :
|
17
|
+
@shipping_method = create(:shipping_method, :zones => [country_zone])
|
16
18
|
@payment_method = create(:payment_method)
|
17
19
|
end
|
18
20
|
|
@@ -44,7 +46,7 @@ module Spree
|
|
44
46
|
end
|
45
47
|
|
46
48
|
context "PUT 'update'" do
|
47
|
-
let(:order) { create(:
|
49
|
+
let(:order) { create(:order_with_line_items) }
|
48
50
|
|
49
51
|
before(:each) do
|
50
52
|
Order.any_instance.stub(:confirmation_required? => true)
|
@@ -53,26 +55,24 @@ module Spree
|
|
53
55
|
|
54
56
|
it "will return an error if the recently created order cannot transition from cart to address" do
|
55
57
|
order.state.should eq "cart"
|
56
|
-
order.email
|
57
|
-
order.save!
|
58
|
+
order.update_column(:email, nil) # email is necessary to transition from cart to address
|
58
59
|
|
59
|
-
api_put :update, :id => order.to_param
|
60
|
+
api_put :update, :id => order.to_param
|
60
61
|
|
61
|
-
|
62
|
-
|
62
|
+
# Order has not transitioned
|
63
|
+
json_response['state'].should == 'cart'
|
63
64
|
end
|
64
65
|
|
65
66
|
it "should transition a recently created order from cart do address" do
|
66
67
|
order.state.should eq "cart"
|
67
68
|
order.email.should_not be_nil
|
68
|
-
api_put :update, :id => order.to_param
|
69
|
+
api_put :update, :id => order.to_param
|
69
70
|
order.reload.state.should eq "address"
|
70
71
|
end
|
71
72
|
|
72
73
|
it "will return an error if the order cannot transition" do
|
73
74
|
order.update_column(:state, "address")
|
74
|
-
api_put :update, :id => order.to_param
|
75
|
-
json_response['error'].should =~ /could not be transitioned/
|
75
|
+
api_put :update, :id => order.to_param
|
76
76
|
response.status.should == 422
|
77
77
|
end
|
78
78
|
|
@@ -89,9 +89,8 @@ module Spree
|
|
89
89
|
:country_id => @country.id
|
90
90
|
}
|
91
91
|
api_put :update,
|
92
|
-
:id => order.to_param,
|
92
|
+
:id => order.to_param,
|
93
93
|
:order => { :bill_address_attributes => billing_address, :ship_address_attributes => shipping_address }
|
94
|
-
|
95
94
|
json_response['state'].should == 'delivery'
|
96
95
|
json_response['bill_address']['firstname'].should == 'John'
|
97
96
|
json_response['ship_address']['firstname'].should == 'John'
|
@@ -100,9 +99,9 @@ module Spree
|
|
100
99
|
|
101
100
|
it "can update shipping method and transition from delivery to payment" do
|
102
101
|
order.update_column(:state, "delivery")
|
103
|
-
|
104
|
-
|
105
|
-
|
102
|
+
shipment = create(:shipment, :order => order)
|
103
|
+
shipping_rate = shipment.shipping_rates.first
|
104
|
+
api_put :update, :id => order.to_param, :order => { :shipments_attributes => { "0" => { :selected_shipping_rate_id => shipping_rate.id, :id => shipment.id } } }
|
106
105
|
json_response['shipments'][0]['shipping_method']['name'].should == @shipping_method.name
|
107
106
|
json_response['state'].should == 'payment'
|
108
107
|
response.status.should == 200
|
@@ -110,8 +109,7 @@ module Spree
|
|
110
109
|
|
111
110
|
it "can update payment method and transition from payment to confirm" do
|
112
111
|
order.update_column(:state, "payment")
|
113
|
-
api_put :update, :id => order.to_param, :
|
114
|
-
:order => { :payments_attributes => [{ :payment_method_id => @payment_method.id }] }
|
112
|
+
api_put :update, :id => order.to_param, :order => { :payments_attributes => [{ :payment_method_id => @payment_method.id }] }
|
115
113
|
json_response['state'].should == 'confirm'
|
116
114
|
json_response['payments'][0]['payment_method']['name'].should == @payment_method.name
|
117
115
|
response.status.should == 200
|
@@ -120,34 +118,67 @@ module Spree
|
|
120
118
|
it "can transition from confirm to complete" do
|
121
119
|
order.update_column(:state, "confirm")
|
122
120
|
Spree::Order.any_instance.stub(:payment_required? => false)
|
123
|
-
api_put :update, :id => order.to_param
|
121
|
+
api_put :update, :id => order.to_param
|
124
122
|
json_response['state'].should == 'complete'
|
125
123
|
response.status.should == 200
|
126
124
|
end
|
127
125
|
|
128
126
|
it "returns the order if the order is already complete" do
|
129
127
|
order.update_column(:state, "complete")
|
130
|
-
api_put :update, :id => order.to_param
|
128
|
+
api_put :update, :id => order.to_param
|
131
129
|
json_response['number'].should == order.number
|
132
130
|
response.status.should == 200
|
133
131
|
end
|
134
132
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
133
|
+
context "as an admin" do
|
134
|
+
sign_in_as_admin!
|
135
|
+
it "can assign a user to the order" do
|
136
|
+
user = create(:user)
|
137
|
+
# Need to pass email as well so that validations succeed
|
138
|
+
api_put :update, :id => order.to_param, :order => { :user_id => user.id, :email => "guest@spreecommerce.com" }
|
139
|
+
response.status.should == 200
|
140
|
+
json_response['user_id'].should == user.id
|
141
|
+
end
|
140
142
|
end
|
141
143
|
|
142
144
|
it "can assign an email to the order" do
|
143
|
-
api_put :update, :id => order.to_param, :
|
145
|
+
api_put :update, :id => order.to_param, :order => { :email => "guest@spreecommerce.com" }
|
144
146
|
json_response['email'].should == "guest@spreecommerce.com"
|
145
147
|
response.status.should == 200
|
146
148
|
end
|
147
149
|
|
148
|
-
it "
|
149
|
-
|
150
|
-
|
150
|
+
it "can apply a coupon code to an order" do
|
151
|
+
order.update_column(:state, "payment")
|
152
|
+
Spree::Promo::CouponApplicator.should_receive(:new).with(order).and_call_original
|
153
|
+
Spree::Promo::CouponApplicator.any_instance.should_receive(:apply).and_return({:coupon_applied? => true})
|
154
|
+
api_put :update, :id => order.to_param, :order => { :coupon_code => "foobar" }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "PUT 'next'" do
|
159
|
+
let!(:order) { create(:order) }
|
160
|
+
it "can transition an order to the next state" do
|
161
|
+
order.update_column(:email, "spree@example.com")
|
162
|
+
|
163
|
+
api_put :next, :id => order.to_param
|
164
|
+
response.status.should == 200
|
165
|
+
json_response['state'].should == 'address'
|
166
|
+
end
|
167
|
+
|
168
|
+
it "cannot transition if order email is blank" do
|
169
|
+
order.update_column(:email, nil)
|
170
|
+
|
171
|
+
api_put :next, :id => order.to_param
|
172
|
+
response.status.should == 422
|
173
|
+
json_response['error'].should =~ /could not be transitioned/
|
174
|
+
end
|
175
|
+
|
176
|
+
it "can apply a coupon code to an order" do
|
177
|
+
order.update_column(:state, "payment")
|
178
|
+
Spree::Promo::CouponApplicator.should_receive(:new).with(order).and_call_original
|
179
|
+
coupon_result = { :coupon_applied? => true }
|
180
|
+
Spree::Promo::CouponApplicator.any_instance.should_receive(:apply).and_return(coupon_result)
|
181
|
+
api_put :update, :id => order.to_param, :order => { :coupon_code => "foobar" }
|
151
182
|
end
|
152
183
|
end
|
153
184
|
end
|
@@ -4,11 +4,7 @@ module Spree
|
|
4
4
|
describe Api::LineItemsController do
|
5
5
|
render_views
|
6
6
|
|
7
|
-
let!(:order)
|
8
|
-
order = create(:order)
|
9
|
-
order.line_items << create(:line_item)
|
10
|
-
order
|
11
|
-
end
|
7
|
+
let!(:order) { create(:order_with_line_items) }
|
12
8
|
|
13
9
|
let(:product) { create(:product) }
|
14
10
|
let(:attributes) { [:id, :quantity, :price, :variant] }
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::OptionTypesController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let(:attributes) { [:id, :name, :position, :presentation] }
|
8
|
+
let!(:option_value) { create(:option_value) }
|
9
|
+
let!(:option_type) { option_value.option_type }
|
10
|
+
|
11
|
+
before do
|
12
|
+
stub_authentication!
|
13
|
+
end
|
14
|
+
|
15
|
+
def check_option_values(option_values)
|
16
|
+
option_values.count.should == 1
|
17
|
+
option_values.first.should have_attributes([:id, :name, :presentation,
|
18
|
+
:option_type_name, :option_type_id])
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can list all option types" do
|
22
|
+
api_get :index
|
23
|
+
json_response.count.should == 1
|
24
|
+
json_response.first.should have_attributes(attributes)
|
25
|
+
|
26
|
+
check_option_values(json_response.first["option_values"])
|
27
|
+
end
|
28
|
+
|
29
|
+
it "can search for an option type" do
|
30
|
+
create(:option_type, :name => "buzz")
|
31
|
+
api_get :index, :q => { :name_cont => option_type.name }
|
32
|
+
json_response.count.should == 1
|
33
|
+
json_response.first.should have_attributes(attributes)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "can retreive a list of specific option types" do
|
37
|
+
option_type_1 = create(:option_type)
|
38
|
+
option_type_2 = create(:option_type)
|
39
|
+
api_get :index, :ids => "#{option_type.id},#{option_type_1.id}"
|
40
|
+
json_response.count.should == 2
|
41
|
+
|
42
|
+
check_option_values(json_response.first["option_values"])
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can list a single option type" do
|
46
|
+
api_get :show, :id => option_type.id
|
47
|
+
json_response.should have_attributes(attributes)
|
48
|
+
check_option_values(json_response["option_values"])
|
49
|
+
end
|
50
|
+
|
51
|
+
it "cannot create a new option type" do
|
52
|
+
api_post :create, :option_type => {
|
53
|
+
:name => "Option Type",
|
54
|
+
:presentation => "Option Type"
|
55
|
+
}
|
56
|
+
assert_unauthorized!
|
57
|
+
end
|
58
|
+
|
59
|
+
it "cannot alter an option type" do
|
60
|
+
original_name = option_type.name
|
61
|
+
api_put :update, :id => option_type.id,
|
62
|
+
:option_type => {
|
63
|
+
:name => "Option Type"
|
64
|
+
}
|
65
|
+
assert_unauthorized!
|
66
|
+
option_type.reload.name.should == original_name
|
67
|
+
end
|
68
|
+
|
69
|
+
it "cannot delete an option type" do
|
70
|
+
api_delete :destroy, :id => option_type.id
|
71
|
+
assert_unauthorized!
|
72
|
+
lambda { option_type.reload }.should_not raise_error(ActiveRecord::RecordNotFound)
|
73
|
+
end
|
74
|
+
|
75
|
+
context "as an admin" do
|
76
|
+
sign_in_as_admin!
|
77
|
+
|
78
|
+
it "can create an option type" do
|
79
|
+
api_post :create, :option_type => {
|
80
|
+
:name => "Option Type",
|
81
|
+
:presentation => "Option Type"
|
82
|
+
}
|
83
|
+
json_response.should have_attributes(attributes)
|
84
|
+
response.status.should == 201
|
85
|
+
end
|
86
|
+
|
87
|
+
it "cannot create an option type with invalid attributes" do
|
88
|
+
api_post :create, :option_type => {}
|
89
|
+
response.status.should == 422
|
90
|
+
end
|
91
|
+
|
92
|
+
it "can update an option type" do
|
93
|
+
original_name = option_type.name
|
94
|
+
api_put :update, :id => option_type.id, :option_type => {
|
95
|
+
:name => "Option Type",
|
96
|
+
}
|
97
|
+
response.status.should == 200
|
98
|
+
|
99
|
+
option_type.reload
|
100
|
+
option_type.name.should == "Option Type"
|
101
|
+
end
|
102
|
+
|
103
|
+
it "cannot update an option type with invalid attributes" do
|
104
|
+
api_put :update, :id => option_type.id, :option_type => {
|
105
|
+
:name => ""
|
106
|
+
}
|
107
|
+
response.status.should == 422
|
108
|
+
end
|
109
|
+
|
110
|
+
it "can delete an option type" do
|
111
|
+
api_delete :destroy, :id => option_type.id
|
112
|
+
response.status.should == 204
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::OptionValuesController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let(:attributes) { [:id, :name, :presentation, :option_type_name, :option_type_name] }
|
8
|
+
let!(:option_value) { create(:option_value) }
|
9
|
+
let!(:option_type) { option_value.option_type }
|
10
|
+
|
11
|
+
before do
|
12
|
+
stub_authentication!
|
13
|
+
end
|
14
|
+
|
15
|
+
def check_option_values(option_values)
|
16
|
+
option_values.count.should == 1
|
17
|
+
option_values.first.should have_attributes([:id, :name, :presentation,
|
18
|
+
:option_type_name, :option_type_id])
|
19
|
+
end
|
20
|
+
|
21
|
+
context "without any option type scoping" do
|
22
|
+
before do
|
23
|
+
# Create another option value with a brand new option type
|
24
|
+
create(:option_value, :option_type => create(:option_type))
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can retreive a list of all option values" do
|
28
|
+
api_get :index
|
29
|
+
json_response.count.should == 2
|
30
|
+
json_response.first.should have_attributes(attributes)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "for a particular option type" do
|
35
|
+
let(:resource_scoping) { { :option_type_id => option_type.id } }
|
36
|
+
|
37
|
+
it "can list all option values" do
|
38
|
+
api_get :index
|
39
|
+
json_response.count.should == 1
|
40
|
+
json_response.first.should have_attributes(attributes)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "can search for an option type" do
|
44
|
+
create(:option_value, :name => "buzz")
|
45
|
+
api_get :index, :q => { :name_cont => option_value.name }
|
46
|
+
json_response.count.should == 1
|
47
|
+
json_response.first.should have_attributes(attributes)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "can retreive a list of option types" do
|
51
|
+
option_value_1 = create(:option_value, :option_type => option_type)
|
52
|
+
option_value_2 = create(:option_value, :option_type => option_type)
|
53
|
+
api_get :index, :ids => [option_value.id, option_value_1.id]
|
54
|
+
json_response.count.should == 2
|
55
|
+
end
|
56
|
+
|
57
|
+
it "can list a single option value" do
|
58
|
+
api_get :show, :id => option_value.id
|
59
|
+
json_response.should have_attributes(attributes)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "cannot create a new option value" do
|
63
|
+
api_post :create, :option_value => {
|
64
|
+
:name => "Option Value",
|
65
|
+
:presentation => "Option Value"
|
66
|
+
}
|
67
|
+
assert_unauthorized!
|
68
|
+
end
|
69
|
+
|
70
|
+
it "cannot alter an option value" do
|
71
|
+
original_name = option_type.name
|
72
|
+
api_put :update, :id => option_type.id,
|
73
|
+
:option_value => {
|
74
|
+
:name => "Option Value"
|
75
|
+
}
|
76
|
+
assert_unauthorized!
|
77
|
+
option_type.reload.name.should == original_name
|
78
|
+
end
|
79
|
+
|
80
|
+
it "cannot delete an option value" do
|
81
|
+
api_delete :destroy, :id => option_type.id
|
82
|
+
assert_unauthorized!
|
83
|
+
lambda { option_type.reload }.should_not raise_error(ActiveRecord::RecordNotFound)
|
84
|
+
end
|
85
|
+
|
86
|
+
context "as an admin" do
|
87
|
+
sign_in_as_admin!
|
88
|
+
|
89
|
+
it "can create an option value" do
|
90
|
+
api_post :create, :option_value => {
|
91
|
+
:name => "Option Value",
|
92
|
+
:presentation => "Option Value"
|
93
|
+
}
|
94
|
+
json_response.should have_attributes(attributes)
|
95
|
+
response.status.should == 201
|
96
|
+
end
|
97
|
+
|
98
|
+
it "cannot create an option type with invalid attributes" do
|
99
|
+
api_post :create, :option_value => {}
|
100
|
+
response.status.should == 422
|
101
|
+
end
|
102
|
+
|
103
|
+
it "can update an option value" do
|
104
|
+
original_name = option_value.name
|
105
|
+
api_put :update, :id => option_value.id, :option_value => {
|
106
|
+
:name => "Option Value",
|
107
|
+
}
|
108
|
+
response.status.should == 200
|
109
|
+
|
110
|
+
option_value.reload
|
111
|
+
option_value.name.should == "Option Value"
|
112
|
+
end
|
113
|
+
|
114
|
+
it "cannot update an option value with invalid attributes" do
|
115
|
+
api_put :update, :id => option_value.id, :option_value => {
|
116
|
+
:name => ""
|
117
|
+
}
|
118
|
+
response.status.should == 422
|
119
|
+
end
|
120
|
+
|
121
|
+
it "can delete an option value" do
|
122
|
+
api_delete :destroy, :id => option_value.id
|
123
|
+
response.status.should == 204
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -11,9 +11,10 @@ module Spree
|
|
11
11
|
:completed_at, :payment_total, :shipment_state,
|
12
12
|
:payment_state, :email, :special_instructions] }
|
13
13
|
|
14
|
-
let(:variant) { create(:variant) }
|
15
14
|
|
16
|
-
before
|
15
|
+
before do
|
16
|
+
stub_authentication!
|
17
|
+
end
|
17
18
|
|
18
19
|
it "cannot view all orders" do
|
19
20
|
api_get :index
|
@@ -25,6 +26,8 @@ module Spree
|
|
25
26
|
api_get :show, :id => order.to_param
|
26
27
|
response.status.should == 200
|
27
28
|
json_response.should have_attributes(attributes)
|
29
|
+
json_response["adjustments"].should be_empty
|
30
|
+
json_response["credit_cards"].should be_empty
|
28
31
|
end
|
29
32
|
|
30
33
|
# Regression test for #1992
|
@@ -63,50 +66,6 @@ module Spree
|
|
63
66
|
json_response["state"].should == "cart"
|
64
67
|
end
|
65
68
|
|
66
|
-
context "import" do
|
67
|
-
let(:tax_rate) { create(:tax_rate, amount: 0.05, calculator: Calculator::DefaultTax.create) }
|
68
|
-
let(:other_variant) { create(:variant) }
|
69
|
-
|
70
|
-
# line items come in as an array when importing orders or when
|
71
|
-
# creating both an order an a line item at once
|
72
|
-
let(:order_params) do
|
73
|
-
{
|
74
|
-
:line_items => [
|
75
|
-
{ :variant_id => variant.to_param, :quantity => 5 },
|
76
|
-
{ :variant_id => other_variant.to_param, :quantity => 5 }
|
77
|
-
]
|
78
|
-
}
|
79
|
-
end
|
80
|
-
|
81
|
-
before do
|
82
|
-
Zone.stub default_tax: tax_rate.zone
|
83
|
-
current_api_user.stub has_spree_role?: true
|
84
|
-
end
|
85
|
-
|
86
|
-
it "sets channel" do
|
87
|
-
api_post :create, :order => { channel: "amazon" }
|
88
|
-
expect(json_response['channel']).to eq "amazon"
|
89
|
-
end
|
90
|
-
|
91
|
-
it "doesnt persist any automatic tax adjustment" do
|
92
|
-
expect {
|
93
|
-
api_post :create, :order => order_params.merge(:import => true)
|
94
|
-
}.not_to change { Adjustment.count }
|
95
|
-
expect(response.status).to eq 201
|
96
|
-
end
|
97
|
-
|
98
|
-
context "provides sku rather than variant id" do
|
99
|
-
let(:order_params) do
|
100
|
-
{ :line_items => [{ :sku => variant.sku, :quantity => 1 }] }
|
101
|
-
end
|
102
|
-
|
103
|
-
it "still finds the variant by sku and persist order" do
|
104
|
-
api_post :create, :order => order_params
|
105
|
-
expect(json_response['line_items'].count).to eq 1
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
69
|
it "can create an order without any parameters" do
|
111
70
|
lambda { api_post :create }.should_not raise_error(NoMethodError)
|
112
71
|
response.status.should == 201
|
@@ -114,25 +73,6 @@ module Spree
|
|
114
73
|
json_response["state"].should == "cart"
|
115
74
|
end
|
116
75
|
|
117
|
-
it "cannot create an order with an abitrary price for the line item" do
|
118
|
-
variant = create(:variant)
|
119
|
-
api_post :create, :order => {
|
120
|
-
:line_items => {
|
121
|
-
"0" => {
|
122
|
-
:variant_id => variant.to_param,
|
123
|
-
:quantity => 5,
|
124
|
-
:price => 0.44
|
125
|
-
}
|
126
|
-
}
|
127
|
-
}
|
128
|
-
response.status.should == 201
|
129
|
-
order = Order.last
|
130
|
-
order.line_items.count.should == 1
|
131
|
-
order.line_items.first.variant.should == variant
|
132
|
-
order.line_items.first.quantity.should == 5
|
133
|
-
order.line_items.first.price.should == order.line_items.first.variant.price
|
134
|
-
end
|
135
|
-
|
136
76
|
context "working with an order" do
|
137
77
|
before do
|
138
78
|
Order.any_instance.stub :user => current_api_user
|
@@ -155,23 +95,10 @@ module Spree
|
|
155
95
|
let(:shipping_address) { { :firstname => "Tiago", :lastname => "Motta", :address1 => "Av Paulista",
|
156
96
|
:city => "Sao Paulo", :zipcode => "1234567", :phone => "12345678",
|
157
97
|
:country_id => Country.first.id, :state_id => State.first.id} }
|
158
|
-
let!(:shipping_method) { create(:shipping_method) }
|
159
98
|
let!(:payment_method) { create(:payment_method) }
|
160
99
|
|
161
|
-
it "can
|
162
|
-
order.line_items
|
163
|
-
api_put :update,
|
164
|
-
:id => order.to_param,
|
165
|
-
:order => {
|
166
|
-
:line_items => {
|
167
|
-
order.line_items.first.id =>
|
168
|
-
{
|
169
|
-
:variant_id => create(:variant).id,
|
170
|
-
:quantity => 2,
|
171
|
-
:price => 0.44
|
172
|
-
}
|
173
|
-
}
|
174
|
-
}
|
100
|
+
it "can add line items" do
|
101
|
+
api_put :update, :id => order.to_param, :order => { :line_items => [{:variant_id => create(:variant).id, :quantity => 2}] }
|
175
102
|
|
176
103
|
response.status.should == 200
|
177
104
|
json_response['item_total'].to_f.should_not == order.item_total.to_f
|
@@ -197,6 +124,7 @@ module Spree
|
|
197
124
|
end
|
198
125
|
|
199
126
|
it "can add shipping address" do
|
127
|
+
pending "need to figure out how to get shipping methods for an order"
|
200
128
|
order.ship_address.should be_nil
|
201
129
|
|
202
130
|
api_put :update, :id => order.to_param, :order => { :ship_address_attributes => shipping_address }
|
@@ -217,7 +145,8 @@ module Spree
|
|
217
145
|
|
218
146
|
context "with a line item" do
|
219
147
|
before do
|
220
|
-
|
148
|
+
create(:line_item, :order => order)
|
149
|
+
order.reload
|
221
150
|
end
|
222
151
|
|
223
152
|
it "can empty an order" do
|
@@ -253,14 +182,6 @@ module Spree
|
|
253
182
|
end
|
254
183
|
end
|
255
184
|
|
256
|
-
it "responds with orders updated_at with miliseconds precision" do
|
257
|
-
api_get :index
|
258
|
-
milisecond = order.updated_at.strftime("%L")
|
259
|
-
updated_at = json_response["orders"].first["updated_at"]
|
260
|
-
|
261
|
-
expect(updated_at.split("T").last).to have_content(milisecond)
|
262
|
-
end
|
263
|
-
|
264
185
|
context "with two orders" do
|
265
186
|
before { create(:order) }
|
266
187
|
|
@@ -304,10 +225,7 @@ module Spree
|
|
304
225
|
|
305
226
|
context "can cancel an order" do
|
306
227
|
before do
|
307
|
-
Spree::
|
308
|
-
:environment => Rails.env,
|
309
|
-
:preferred_mails_from => "spree@example.com"
|
310
|
-
)
|
228
|
+
Spree::Config[:mails_from] = "spree@example.com"
|
311
229
|
|
312
230
|
order.completed_at = Time.now
|
313
231
|
order.state = 'complete'
|