spree_api 2.0.6 → 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -42
- data/app/controllers/spree/api/line_items_controller.rb +2 -0
- data/app/controllers/spree/api/orders_controller.rb +2 -0
- data/app/controllers/spree/api/products_controller.rb +1 -1
- data/app/helpers/spree/api/api_helpers.rb +2 -2
- data/app/models/spree/line_item_decorator.rb +1 -1
- data/app/models/spree/order_decorator.rb +15 -2
- data/app/views/spree/api/products/index.v1.rabl +1 -0
- data/db/migrate/20131017162334_add_index_to_user_spree_api_key.rb +7 -0
- data/spec/controllers/spree/api/line_items_controller_spec.rb +19 -1
- data/spec/controllers/spree/api/orders_controller_spec.rb +54 -5
- data/spec/controllers/spree/api/products_controller_spec.rb +11 -0
- data/spec/controllers/spree/api/taxons_controller_spec.rb +4 -3
- data/spec/models/spree/order_spec.rb +24 -13
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31009b464b6105afeae033af555ebf099230ff51
|
4
|
+
data.tar.gz: 9a6294c2ddcfa6044efede92b4821544acfbf82e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8bccb730f13c6867b1e46a175b52edfb128445f0c81aaa25580eb4d08781d0b63102cd179854d22c5017dc8ef4536a3f869aac7614e5048ff801d2688e759a8
|
7
|
+
data.tar.gz: 9b2e19265e60d63e04a3ff1380955cebd8c751eed12ce4ab4e34afafa62de307b17e8de50eb3c34942afd4321bad45f4eb78666974c8d7bd6bea0d87c527c5d0
|
data/CHANGELOG.md
CHANGED
@@ -1,49 +1,17 @@
|
|
1
|
-
## Spree 2.0.
|
1
|
+
## Spree 2.0.7 (unreleased) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
*For all commits, please see [the GitHub compare view](https://github.com/spree/spree/compare/v2.0.6...v2.0.7).*
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
## Spree 2.0.x ##
|
5
|
+
* Admin users can set the order channel when importing orders. By sing the
|
6
|
+
channel attribute on Order model
|
8
7
|
|
9
|
-
|
8
|
+
Washington Luiz
|
10
9
|
|
11
|
-
|
10
|
+
* Added missing per_page node to products/index
|
12
11
|
|
13
|
-
|
12
|
+
Ryan Bigg
|
14
13
|
|
15
|
-
|
14
|
+
* `ship_total` is now returned on order results.
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
* Ryan Bigg*
|
20
|
-
|
21
|
-
* Checkouts API now correctly processes incoming payment data during the payment step.
|
22
|
-
|
23
|
-
*Ryan Bigg*
|
24
|
-
|
25
|
-
* Fix issue where `set_current_order` before filter would be called when CheckoutsController actions were run, causing the order object to be deleted. #3306
|
26
|
-
|
27
|
-
*Ryan Bigg*
|
28
|
-
|
29
|
-
* An order can no longer transition past the "cart" state without first having a line item. #3312
|
30
|
-
|
31
|
-
*Ryan Bigg*
|
32
|
-
|
33
|
-
* Attributes other than "quantity" and "variant_id" will be added to a line item when creating along with an order. #3404
|
34
|
-
|
35
|
-
*Alex Marles & Ryan Bigg*
|
36
|
-
|
37
|
-
* Taxon attributes from `/api/taxons` are now returned within `taxons` subkey. Before:
|
38
|
-
|
39
|
-
```json
|
40
|
-
[{ name: 'Ruby' ... }]
|
41
|
-
```
|
42
|
-
|
43
|
-
Now:
|
44
|
-
|
45
|
-
```json
|
46
|
-
{ taxons: [{ name: 'Ruby' }]}
|
47
|
-
```
|
48
|
-
|
49
|
-
* Ryan Bigg
|
16
|
+
Washington Luiz
|
17
|
+
|
@@ -7,6 +7,7 @@ module Spree
|
|
7
7
|
authorize! :read, order
|
8
8
|
@line_item = order.line_items.build(params[:line_item], :as => :api)
|
9
9
|
if @line_item.save
|
10
|
+
@order.ensure_updated_shipments
|
10
11
|
respond_with(@line_item, :status => 201, :default_template => :show)
|
11
12
|
else
|
12
13
|
invalid_resource!(@line_item)
|
@@ -17,6 +18,7 @@ module Spree
|
|
17
18
|
authorize! :read, order
|
18
19
|
@line_item = order.line_items.find(params[:id])
|
19
20
|
if @line_item.update_attributes(params[:line_item], :as => :api)
|
21
|
+
@order.ensure_updated_shipments
|
20
22
|
respond_with(@line_item, :default_template => :show)
|
21
23
|
else
|
22
24
|
invalid_resource!(@line_item)
|
@@ -58,6 +58,8 @@ module Spree
|
|
58
58
|
def sanitize_line_items(line_item_attributes)
|
59
59
|
return {} if line_item_attributes.blank?
|
60
60
|
line_item_attributes = line_item_attributes.map do |id, attributes|
|
61
|
+
attributes ||= id
|
62
|
+
|
61
63
|
# Faux Strong-Parameters code to strip price if user isn't an admin
|
62
64
|
if current_api_user.has_spree_role?("admin")
|
63
65
|
[id, attributes.slice(*Spree::LineItem.attr_accessible[:api])]
|
@@ -32,7 +32,7 @@ module Spree
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def order_attributes
|
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, :token]
|
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]
|
36
36
|
end
|
37
37
|
|
38
38
|
def line_item_attributes
|
@@ -60,7 +60,7 @@ module Spree
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def taxon_attributes
|
63
|
-
[:id, :name, :pretty_name, :permalink, :
|
63
|
+
[:id, :name, :pretty_name, :permalink, :parent_id, :taxonomy_id]
|
64
64
|
end
|
65
65
|
|
66
66
|
def inventory_unit_attributes
|
@@ -1,4 +1,6 @@
|
|
1
1
|
Spree::Order.class_eval do
|
2
|
+
attr_accessible :channel, :as => :api_admin
|
3
|
+
|
2
4
|
def self.build_from_api(user, params)
|
3
5
|
begin
|
4
6
|
ensure_country_id_from_api params[:ship_address_attributes]
|
@@ -16,7 +18,12 @@ Spree::Order.class_eval do
|
|
16
18
|
order.complete_from_api params.delete(:completed_at)
|
17
19
|
|
18
20
|
destroy_automatic_taxes_on_import(order, params)
|
19
|
-
|
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
|
20
27
|
|
21
28
|
order.reload
|
22
29
|
rescue Exception => e
|
@@ -153,7 +160,13 @@ Spree::Order.class_eval do
|
|
153
160
|
end
|
154
161
|
|
155
162
|
address.delete(:state)
|
156
|
-
|
163
|
+
search[:country_id] = address[:country_id]
|
164
|
+
|
165
|
+
if state = Spree::State.where(search).first
|
166
|
+
address[:state_id] = state.id
|
167
|
+
else
|
168
|
+
address[:state_name] = search[:name] || search[:abbr]
|
169
|
+
end
|
157
170
|
rescue Exception => e
|
158
171
|
raise "#{e.message} #{search}"
|
159
172
|
end
|
@@ -3,6 +3,7 @@ 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
5
|
node(:pages) { @products.num_pages }
|
6
|
+
node(:per_page) { params[:per_page] || Kaminari.config.default_per_page }
|
6
7
|
child(@products) do
|
7
8
|
extends "spree/api/products/show"
|
8
9
|
end
|
@@ -46,6 +46,25 @@ module Spree
|
|
46
46
|
response.status.should == 204
|
47
47
|
lambda { line_item.reload }.should raise_error(ActiveRecord::RecordNotFound)
|
48
48
|
end
|
49
|
+
|
50
|
+
context "order contents changed after shipments were created" do
|
51
|
+
let!(:order) { Order.create }
|
52
|
+
let!(:line_item) { order.contents.add(product.master) }
|
53
|
+
|
54
|
+
before { order.create_proposed_shipments }
|
55
|
+
|
56
|
+
it "clear out shipments on create" do
|
57
|
+
expect(order.reload.shipments).not_to be_empty
|
58
|
+
api_post :create, :line_item => { :variant_id => product.master.to_param, :quantity => 1 }
|
59
|
+
expect(order.reload.shipments).to be_empty
|
60
|
+
end
|
61
|
+
|
62
|
+
it "clear out shipments on update" do
|
63
|
+
expect(order.reload.shipments).not_to be_empty
|
64
|
+
api_put :update, :id => line_item.id, :line_item => { :quantity => 1000 }
|
65
|
+
expect(order.reload.shipments).to be_empty
|
66
|
+
end
|
67
|
+
end
|
49
68
|
end
|
50
69
|
|
51
70
|
context "as just another user" do
|
@@ -68,6 +87,5 @@ module Spree
|
|
68
87
|
lambda { line_item.reload }.should_not raise_error
|
69
88
|
end
|
70
89
|
end
|
71
|
-
|
72
90
|
end
|
73
91
|
end
|
@@ -11,10 +11,9 @@ module Spree
|
|
11
11
|
:completed_at, :payment_total, :shipment_state,
|
12
12
|
:payment_state, :email, :special_instructions, :token] }
|
13
13
|
|
14
|
+
let(:variant) { create(:variant) }
|
14
15
|
|
15
|
-
before
|
16
|
-
stub_authentication!
|
17
|
-
end
|
16
|
+
before { stub_authentication! }
|
18
17
|
|
19
18
|
it "cannot view all orders" do
|
20
19
|
api_get :index
|
@@ -76,6 +75,50 @@ module Spree
|
|
76
75
|
json_response["user_id"].should == current_api_user.id
|
77
76
|
end
|
78
77
|
|
78
|
+
context "import" do
|
79
|
+
let(:tax_rate) { create(:tax_rate, amount: 0.05, calculator: Calculator::DefaultTax.create) }
|
80
|
+
let(:other_variant) { create(:variant) }
|
81
|
+
|
82
|
+
# line items come in as an array when importing orders or when
|
83
|
+
# creating both an order an a line item at once
|
84
|
+
let(:order_params) do
|
85
|
+
{
|
86
|
+
:line_items => [
|
87
|
+
{ :variant_id => variant.to_param, :quantity => 5 },
|
88
|
+
{ :variant_id => other_variant.to_param, :quantity => 5 }
|
89
|
+
]
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
before do
|
94
|
+
Zone.stub default_tax: tax_rate.zone
|
95
|
+
current_api_user.stub has_spree_role?: true
|
96
|
+
end
|
97
|
+
|
98
|
+
it "sets channel" do
|
99
|
+
api_post :create, :order => { channel: "amazon" }
|
100
|
+
expect(json_response['channel']).to eq "amazon"
|
101
|
+
end
|
102
|
+
|
103
|
+
it "doesnt persist any automatic tax adjustment" do
|
104
|
+
expect {
|
105
|
+
api_post :create, :order => order_params.merge(:import => true)
|
106
|
+
}.not_to change { Adjustment.count }
|
107
|
+
expect(response.status).to eq 201
|
108
|
+
end
|
109
|
+
|
110
|
+
context "provides sku rather than variant id" do
|
111
|
+
let(:order_params) do
|
112
|
+
{ :line_items => [{ :sku => variant.sku, :quantity => 1 }] }
|
113
|
+
end
|
114
|
+
|
115
|
+
it "still finds the variant by sku and persist order" do
|
116
|
+
api_post :create, :order => order_params
|
117
|
+
expect(json_response['line_items'].count).to eq 1
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
79
122
|
it "cannot create an order with an abitrary price for the line item" do
|
80
123
|
variant = create(:variant)
|
81
124
|
api_post :create, :order => {
|
@@ -104,8 +147,6 @@ module Spree
|
|
104
147
|
end
|
105
148
|
|
106
149
|
context "working with an order" do
|
107
|
-
|
108
|
-
let(:variant) { create(:variant) }
|
109
150
|
let!(:line_item) { order.contents.add(variant, 1) }
|
110
151
|
let!(:payment_method) { create(:payment_method) }
|
111
152
|
|
@@ -254,6 +295,14 @@ module Spree
|
|
254
295
|
end
|
255
296
|
end
|
256
297
|
|
298
|
+
it "responds with orders updated_at with miliseconds precision" do
|
299
|
+
api_get :index
|
300
|
+
milisecond = order.updated_at.strftime("%L")
|
301
|
+
updated_at = json_response["orders"].first["updated_at"]
|
302
|
+
|
303
|
+
expect(updated_at.split("T").last).to have_content(milisecond)
|
304
|
+
end
|
305
|
+
|
257
306
|
context "with two orders" do
|
258
307
|
before { create(:order) }
|
259
308
|
|
@@ -30,6 +30,17 @@ module Spree
|
|
30
30
|
json_response["pages"].should == 1
|
31
31
|
end
|
32
32
|
|
33
|
+
it "retrieves a list of products by ids string" do
|
34
|
+
second_product = create(:product)
|
35
|
+
api_get :index, :ids => [product.id, second_product.id].join(",")
|
36
|
+
json_response["products"].first.should have_attributes(attributes)
|
37
|
+
json_response["products"][1].should have_attributes(attributes)
|
38
|
+
json_response["total_count"].should == 2
|
39
|
+
json_response["current_page"].should == 1
|
40
|
+
json_response["pages"].should == 1
|
41
|
+
json_response["per_page"].should == Kaminari.config.default_per_page
|
42
|
+
end
|
43
|
+
|
33
44
|
it "does not return inactive products when queried by ids" do
|
34
45
|
api_get :index, :ids => [inactive_product.id]
|
35
46
|
json_response["count"].should == 0
|
@@ -7,7 +7,7 @@ module Spree
|
|
7
7
|
let(:taxonomy) { create(:taxonomy) }
|
8
8
|
let(:taxon) { create(:taxon, :name => "Ruby", :taxonomy => taxonomy) }
|
9
9
|
let(:taxon2) { create(:taxon, :name => "Rails", :taxonomy => taxonomy) }
|
10
|
-
let(:attributes) { ["id", "name", "pretty_name", "permalink", "
|
10
|
+
let(:attributes) { ["id", "name", "pretty_name", "permalink", "parent_id", "taxonomy_id"] }
|
11
11
|
|
12
12
|
before do
|
13
13
|
stub_authentication!
|
@@ -105,9 +105,10 @@ module Spree
|
|
105
105
|
response.status.should == 201
|
106
106
|
|
107
107
|
taxonomy.reload.root.children.count.should eq 2
|
108
|
+
taxon = Spree::Taxon.where(:name => 'Colors').first
|
108
109
|
|
109
|
-
|
110
|
-
|
110
|
+
taxon.parent_id.should eq taxonomy.root.id
|
111
|
+
taxon.taxonomy_id.should eq taxonomy.id
|
111
112
|
end
|
112
113
|
|
113
114
|
it "cannot create a new taxon with invalid attributes" do
|
@@ -130,7 +130,7 @@ module Spree
|
|
130
130
|
|
131
131
|
it 'can build an order from API with state attributes' do
|
132
132
|
ship_address.delete(:state_id)
|
133
|
-
ship_address[:state] = { 'name' =>
|
133
|
+
ship_address[:state] = { 'name' => state.name }
|
134
134
|
params = { :ship_address_attributes => ship_address,
|
135
135
|
:line_items_attributes => line_items }
|
136
136
|
|
@@ -138,15 +138,33 @@ module Spree
|
|
138
138
|
order.ship_address.state.name.should eq 'Alabama'
|
139
139
|
end
|
140
140
|
|
141
|
-
|
141
|
+
context "state passed is not associated with country" do
|
142
|
+
let(:params) do
|
143
|
+
params = { :ship_address_attributes => ship_address,
|
144
|
+
:line_items_attributes => line_items }
|
145
|
+
end
|
146
|
+
|
147
|
+
let(:other_state) { create(:state, name: "Uhuhuh", country: create(:country)) }
|
148
|
+
|
149
|
+
before do
|
150
|
+
ship_address.delete(:state_id)
|
151
|
+
ship_address[:state] = { 'name' => other_state.name }
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'sets states name instead of state id' do
|
155
|
+
order = Order.build_from_api(user, params)
|
156
|
+
expect(order.ship_address.state_name).to eq other_state.name
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'sets state name if state record not found' do
|
142
161
|
ship_address.delete(:state_id)
|
143
162
|
ship_address[:state] = { 'name' => 'XXX' }
|
144
163
|
params = { :ship_address_attributes => ship_address,
|
145
164
|
:line_items_attributes => line_items }
|
146
165
|
|
147
|
-
|
148
|
-
|
149
|
-
}.to raise_error /XXX/
|
166
|
+
order = Order.build_from_api(user, params)
|
167
|
+
expect(order.ship_address.state_name).to eq 'XXX'
|
150
168
|
end
|
151
169
|
|
152
170
|
context 'variant not deleted' do
|
@@ -184,19 +202,12 @@ module Spree
|
|
184
202
|
|
185
203
|
it 'ensures_state_id for state fields' do
|
186
204
|
[:name, :abbr].each do |field|
|
187
|
-
address = { :state => { field => state.send(field) }}
|
205
|
+
address = { country_id: country.id, :state => { field => state.send(field) }}
|
188
206
|
Order.ensure_state_id_from_api(address)
|
189
207
|
address[:state_id].should eq state.id
|
190
208
|
end
|
191
209
|
end
|
192
210
|
|
193
|
-
it "raises with proper message when cant find state" do
|
194
|
-
address = { :state => { "name" => "NoNoState" } }
|
195
|
-
expect {
|
196
|
-
Order.ensure_state_id_from_api(address)
|
197
|
-
}.to raise_error /NoNoState/
|
198
|
-
end
|
199
|
-
|
200
211
|
context "shippments" do
|
201
212
|
let(:params) do
|
202
213
|
{ :shipments_attributes => [
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Bigg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.
|
19
|
+
version: 2.0.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0.
|
26
|
+
version: 2.0.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rabl
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -181,6 +181,7 @@ files:
|
|
181
181
|
- db/migrate/20100107141738_add_api_key_to_spree_users.rb
|
182
182
|
- db/migrate/20120411123334_resize_api_key_field.rb
|
183
183
|
- db/migrate/20120530054546_rename_api_key_to_spree_api_key.rb
|
184
|
+
- db/migrate/20131017162334_add_index_to_user_spree_api_key.rb
|
184
185
|
- lib/spree/api.rb
|
185
186
|
- lib/spree/api/controller_setup.rb
|
186
187
|
- lib/spree/api/engine.rb
|