spree_api 1.3.5 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::StockItemsController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let!(:stock_location) { create(:stock_location_with_items) }
|
8
|
+
let!(:stock_item) { stock_location.stock_items.order(:id).first }
|
9
|
+
let!(:attributes) { [:id, :count_on_hand, :backorderable,
|
10
|
+
:stock_location_id, :variant_id] }
|
11
|
+
|
12
|
+
before do
|
13
|
+
stub_authentication!
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'gets list of stock items' do
|
17
|
+
api_get :index, stock_location_id: stock_location.to_param
|
18
|
+
json_response['stock_items'].first.should have_attributes(attributes)
|
19
|
+
json_response['stock_items'].first['variant']['sku'].should eq 'ABC'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'requires a stock_location_id to be passed as a parameter' do
|
23
|
+
api_get :index
|
24
|
+
json_response['error'].should =~ /stock_location_id parameter must be provided/
|
25
|
+
response.status.should == 422
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'can control the page size through a parameter' do
|
29
|
+
api_get :index, stock_location_id: stock_location.to_param, per_page: 1
|
30
|
+
json_response['count'].should == 1
|
31
|
+
json_response['current_page'].should == 1
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'can query the results through a paramter' do
|
35
|
+
stock_item.update_column(:count_on_hand, 30)
|
36
|
+
api_get :index, stock_location_id: stock_location.to_param, q: { count_on_hand_eq: '30' }
|
37
|
+
json_response['count'].should == 1
|
38
|
+
json_response['stock_items'].first['count_on_hand'].should eq 30
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'gets a stock item' do
|
42
|
+
api_get :show, stock_location_id: stock_location.to_param, id: stock_item.to_param
|
43
|
+
json_response.should have_attributes(attributes)
|
44
|
+
json_response['count_on_hand'].should eq stock_item.count_on_hand
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'as an admin' do
|
48
|
+
sign_in_as_admin!
|
49
|
+
|
50
|
+
it 'can create a new stock item' do
|
51
|
+
variant = create(:variant)
|
52
|
+
variant.stock_items.delete_all
|
53
|
+
params = {
|
54
|
+
stock_location_id: stock_location.to_param,
|
55
|
+
stock_item: {
|
56
|
+
variant_id: variant.id,
|
57
|
+
count_on_hand: '20'
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
api_post :create, params
|
62
|
+
response.status.should == 201
|
63
|
+
json_response.should have_attributes(attributes)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'can update a stock item to add new inventory' do
|
67
|
+
stock_item.count_on_hand.should == 10
|
68
|
+
params = {
|
69
|
+
id: stock_item.to_param,
|
70
|
+
stock_item: {
|
71
|
+
count_on_hand: 40,
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
api_put :update, params
|
76
|
+
response.status.should == 200
|
77
|
+
json_response['count_on_hand'].should eq 50
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'can delete a stock item' do
|
81
|
+
api_delete :destroy, id: stock_item.to_param
|
82
|
+
response.status.should == 204
|
83
|
+
lambda { stock_item.reload }.should raise_error(ActiveRecord::RecordNotFound)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::StockLocationsController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let!(:stock_location) { create(:stock_location) }
|
8
|
+
let!(:attributes) { [:id, :name, :address1, :address2, :city, :state_id, :state_name, :country_id, :zipcode, :phone, :active] }
|
9
|
+
|
10
|
+
before do
|
11
|
+
stub_authentication!
|
12
|
+
end
|
13
|
+
|
14
|
+
it "gets list of stock locations" do
|
15
|
+
api_get :index
|
16
|
+
json_response['stock_locations'].first.should have_attributes(attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "includes the country" do
|
20
|
+
api_get :index
|
21
|
+
json_response['stock_locations'].first['country'].should_not be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it "includes the state" do
|
25
|
+
api_get :index
|
26
|
+
json_response['stock_locations'].first['state'].should_not be_nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'can control the page size through a parameter' do
|
30
|
+
create(:stock_location)
|
31
|
+
api_get :index, per_page: 1
|
32
|
+
json_response['count'].should == 1
|
33
|
+
json_response['current_page'].should == 1
|
34
|
+
json_response['pages'].should == 2
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'can query the results through a paramter' do
|
38
|
+
expected_result = create(:stock_location, name: 'South America')
|
39
|
+
api_get :index, q: { name_cont: 'south' }
|
40
|
+
json_response['count'].should == 1
|
41
|
+
json_response['stock_locations'].first['name'].should eq expected_result.name
|
42
|
+
end
|
43
|
+
|
44
|
+
it "gets a stock location" do
|
45
|
+
api_get :show, id: stock_location.to_param
|
46
|
+
json_response.should have_attributes(attributes)
|
47
|
+
json_response['name'].should eq stock_location.name
|
48
|
+
end
|
49
|
+
|
50
|
+
context "as an admin" do
|
51
|
+
sign_in_as_admin!
|
52
|
+
|
53
|
+
it "can create a new stock location" do
|
54
|
+
params = {
|
55
|
+
stock_location: {
|
56
|
+
name: "North Pole",
|
57
|
+
active: true
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
api_post :create, params
|
62
|
+
response.status.should == 201
|
63
|
+
json_response.should have_attributes(attributes)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "can update a stock location" do
|
67
|
+
params = {
|
68
|
+
id: stock_location.to_param,
|
69
|
+
stock_location: {
|
70
|
+
name: "South Pole"
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
api_put :update, params
|
75
|
+
response.status.should == 200
|
76
|
+
json_response['name'].should eq 'South Pole'
|
77
|
+
end
|
78
|
+
|
79
|
+
it "can delete a stock location" do
|
80
|
+
api_delete :destroy, id: stock_location.to_param
|
81
|
+
response.status.should == 204
|
82
|
+
lambda { stock_location.reload }.should raise_error(ActiveRecord::RecordNotFound)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::StockMovementsController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let!(:stock_location) { create(:stock_location_with_items) }
|
8
|
+
let!(:stock_item) { stock_location.stock_items.order(:id).first }
|
9
|
+
let!(:stock_movement) { create(:stock_movement, stock_item: stock_item) }
|
10
|
+
let!(:attributes) { [:id, :quantity, :stock_item_id] }
|
11
|
+
|
12
|
+
before do
|
13
|
+
stub_authentication!
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'gets list of stock movements' do
|
17
|
+
api_get :index, stock_location_id: stock_location.to_param
|
18
|
+
json_response['stock_movements'].first.should have_attributes(attributes)
|
19
|
+
json_response['stock_movements'].first['stock_item']['count_on_hand'].should eq 11
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'requires a stock_location_id to be passed as a parameter' do
|
23
|
+
api_get :index
|
24
|
+
json_response['error'].should =~ /stock_location_id parameter must be provided/
|
25
|
+
response.status.should == 422
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'can control the page size through a parameter' do
|
29
|
+
create(:stock_movement, stock_item: stock_item)
|
30
|
+
api_get :index, stock_location_id: stock_location.to_param, per_page: 1
|
31
|
+
json_response['count'].should == 1
|
32
|
+
json_response['current_page'].should == 1
|
33
|
+
json_response['pages'].should == 2
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'can query the results through a paramter' do
|
37
|
+
expected_result = create(:stock_movement, :received, quantity: 10, stock_item: stock_item)
|
38
|
+
api_get :index, stock_location_id: stock_location.to_param, q: { quantity_eq: '10' }
|
39
|
+
json_response['count'].should == 1
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'gets a stock movement' do
|
43
|
+
api_get :show, stock_location_id: stock_location.to_param, id: stock_movement.to_param
|
44
|
+
json_response.should have_attributes(attributes)
|
45
|
+
json_response['stock_item_id'].should eq stock_movement.stock_item_id
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'as an admin' do
|
49
|
+
sign_in_as_admin!
|
50
|
+
|
51
|
+
it 'can create a new stock movement' do
|
52
|
+
params = {
|
53
|
+
stock_location_id: stock_location.to_param,
|
54
|
+
stock_movement: {
|
55
|
+
stock_item_id: stock_item.to_param
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
api_post :create, params
|
60
|
+
response.status.should == 201
|
61
|
+
json_response.should have_attributes(attributes)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'can delete a stock movement' do
|
65
|
+
api_delete :destroy, id: stock_movement.to_param
|
66
|
+
response.status.should == 204
|
67
|
+
lambda { stock_movement.reload }.should raise_error(ActiveRecord::RecordNotFound)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -59,6 +59,13 @@ module Spree
|
|
59
59
|
children.first.key?('taxons').should be_true
|
60
60
|
end
|
61
61
|
|
62
|
+
it "gets the jstree-friendly version of a taxonomy" do
|
63
|
+
api_get :jstree, :id => taxonomy.id
|
64
|
+
json_response["data"].should eq(taxonomy.root.name)
|
65
|
+
json_response["attr"].should eq({ "id" => taxonomy.root.id, "name" => taxonomy.root.name})
|
66
|
+
json_response["state"].should eq("closed")
|
67
|
+
end
|
68
|
+
|
62
69
|
it "can learn how to create a new taxonomy" do
|
63
70
|
api_get :new
|
64
71
|
json_response["attributes"].should == attributes.map(&:to_s)
|
@@ -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", "permalink", "position", "parent_id", "taxonomy_id"] }
|
10
|
+
let(:attributes) { ["id", "name", "pretty_name", "permalink", "position", "parent_id", "taxonomy_id"] }
|
11
11
|
|
12
12
|
before do
|
13
13
|
stub_authentication!
|
@@ -17,7 +17,7 @@ module Spree
|
|
17
17
|
end
|
18
18
|
|
19
19
|
context "as a normal user" do
|
20
|
-
it "gets all taxons" do
|
20
|
+
it "gets all taxons for a taxonomy" do
|
21
21
|
api_get :index, :taxonomy_id => taxonomy.id
|
22
22
|
|
23
23
|
json_response.first['name'].should eq taxon.name
|
@@ -27,6 +27,23 @@ module Spree
|
|
27
27
|
children.first['taxons'].count.should eq 1
|
28
28
|
end
|
29
29
|
|
30
|
+
it "gets all taxons" do
|
31
|
+
api_get :index
|
32
|
+
|
33
|
+
json_response.first['name'].should eq taxonomy.root.name
|
34
|
+
children = json_response.first['taxons']
|
35
|
+
children.count.should eq 1
|
36
|
+
children.first['name'].should eq taxon.name
|
37
|
+
children.first['taxons'].count.should eq 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it "can search for a single taxon" do
|
41
|
+
api_get :index, :q => { :name_cont => "Ruby" }
|
42
|
+
|
43
|
+
json_response.count.should == 1
|
44
|
+
json_response.first['name'].should eq "Ruby"
|
45
|
+
end
|
46
|
+
|
30
47
|
it "gets a single taxon" do
|
31
48
|
api_get :show, :id => taxon.id, :taxonomy_id => taxonomy.id
|
32
49
|
|
@@ -34,6 +51,16 @@ module Spree
|
|
34
51
|
json_response['taxons'].count.should eq 1
|
35
52
|
end
|
36
53
|
|
54
|
+
it "gets all taxons in JSTree form" do
|
55
|
+
api_get :jstree, :taxonomy_id => taxonomy.id, :id => taxon.id
|
56
|
+
response = json_response.first
|
57
|
+
response["data"].should eq(taxon2.name)
|
58
|
+
response["attr"].should eq({ "name" => taxon2.name, "id" => taxon2.id})
|
59
|
+
response["state"].should eq("closed")
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
|
37
64
|
it "can learn how to create a new taxon" do
|
38
65
|
api_get :new, :taxonomy_id => taxonomy.id
|
39
66
|
json_response["attributes"].should == attributes.map(&:to_s)
|
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
render_views
|
7
7
|
|
8
8
|
let!(:product) { create(:product) }
|
9
|
-
let(:attributes) { [:id, :name, :description, :price, :available_on, :permalink, :
|
9
|
+
let(:attributes) { [:id, :name, :description, :price, :available_on, :permalink, :meta_description, :meta_keywords, :taxon_ids] }
|
10
10
|
|
11
11
|
context "without authentication" do
|
12
12
|
before { Spree::Api::Config[:requires_authentication] = false }
|
@@ -11,10 +11,9 @@ module Spree
|
|
11
11
|
variant.option_values << create(:option_value)
|
12
12
|
variant
|
13
13
|
end
|
14
|
-
let!(:attributes) { [:id, :name, :
|
15
|
-
:sku, :price, :weight, :height,
|
14
|
+
let!(:attributes) { [:id, :name, :sku, :price, :weight, :height,
|
16
15
|
:width, :depth, :is_master, :cost_price,
|
17
|
-
:permalink
|
16
|
+
:permalink] }
|
18
17
|
|
19
18
|
before do
|
20
19
|
stub_authentication!
|
@@ -78,9 +77,11 @@ module Spree
|
|
78
77
|
end
|
79
78
|
|
80
79
|
context "pagination" do
|
80
|
+
default_per_page(1)
|
81
|
+
|
81
82
|
it "can select the next page of variants" do
|
82
83
|
second_variant = create(:variant)
|
83
|
-
api_get :index, :page => 2
|
84
|
+
api_get :index, :page => 2
|
84
85
|
json_response["variants"].first.should have_attributes(attributes)
|
85
86
|
json_response["total_count"].should == 3
|
86
87
|
json_response["current_page"].should == 2
|
@@ -168,18 +169,6 @@ module Spree
|
|
168
169
|
response.status.should == 204
|
169
170
|
lambda { variant.reload }.should raise_error(ActiveRecord::RecordNotFound)
|
170
171
|
end
|
171
|
-
|
172
|
-
context "without product" do
|
173
|
-
sign_in_as_admin!
|
174
|
-
let(:resource_scoping) { { :product_id => variant.product.to_param } }
|
175
|
-
|
176
|
-
it "will not raise an ActiveRecord::ReadOnlyRecord exception" do
|
177
|
-
api_put :update, :id => variant.to_param, :variant => { :sku => "12345", :on_hand => 5 }
|
178
|
-
response.status.should_not eql 422
|
179
|
-
json_response["exception"].should_not eql "ActiveRecord::ReadOnlyRecord"
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
172
|
end
|
184
173
|
|
185
174
|
|
Binary file
|
@@ -2,338 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
describe Order do
|
5
|
-
let
|
6
|
-
let
|
7
|
-
let(:user) { create(:user) }
|
8
|
-
let(:product) { Spree::Product.create!(:name => 'Test', :sku => 'TEST-1', :price => 33.22) }
|
9
|
-
let(:sku) { product.master.sku }
|
10
|
-
let(:variant) { product.master }
|
11
|
-
let(:variant_id) { product.master.id }
|
12
|
-
let(:line_items) {{ "0" => { :variant_id => variant.id, :quantity => 5 }}}
|
13
|
-
let(:shipping_method) { create(:shipping_method) }
|
14
|
-
let(:payment_method) { create(:payment_method) }
|
15
|
-
let(:ship_address) {{
|
16
|
-
:address1 => '123 Testable Way',
|
17
|
-
:firstname => 'Fox',
|
18
|
-
:lastname => 'Mulder',
|
19
|
-
:city => 'Washington',
|
20
|
-
:country_id => country.id,
|
21
|
-
:state_id => state.id,
|
22
|
-
:zipcode => '666',
|
23
|
-
:phone => '666-666-6666'
|
24
|
-
}}
|
5
|
+
let(:user) { stub_model(LegacyUser) }
|
6
|
+
let(:product) { create :product }
|
25
7
|
|
26
|
-
it 'can
|
27
|
-
|
28
|
-
order = Order.build_from_api(user,
|
29
|
-
order.number.should eq '123-456-789'
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'optionally add completed at' do
|
33
|
-
params = {:email => 'test@test.com',
|
34
|
-
:completed_at => Time.now,
|
35
|
-
:line_items_attributes => line_items }
|
36
|
-
|
37
|
-
order = Order.build_from_api(user, params)
|
38
|
-
order.should be_completed
|
39
|
-
order.state.should eq 'complete'
|
40
|
-
end
|
41
|
-
|
42
|
-
it "assigns order[email] over user email to order" do
|
43
|
-
params = { email: 'wooowww@test.com' }
|
44
|
-
order = Order.build_from_api(user, params)
|
45
|
-
expect(order.email).to eq params[:email]
|
46
|
-
end
|
47
|
-
|
48
|
-
context "build order with line items" do
|
49
|
-
let(:attributes) do
|
50
|
-
{ :variant_id => variant.id, :quantity => 5, :price => 33.77 }
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'can build an order from API with just line items' do
|
54
|
-
params = { :line_items_attributes => { "0" => attributes } }
|
55
|
-
Order.should_receive(:ensure_variant_id_from_api)
|
56
|
-
order = Order.build_from_api(user, params)
|
57
|
-
|
58
|
-
order.user.should == nil
|
59
|
-
line_item = order.line_items.first
|
60
|
-
|
61
|
-
expect(line_item.quantity).to eq attributes[:quantity]
|
62
|
-
expect(line_item.variant_id).to eq attributes[:variant_id]
|
63
|
-
expect(line_item.price).to eq attributes[:price]
|
64
|
-
end
|
65
|
-
|
66
|
-
it "ensures quantity values are converted to integer" do
|
67
|
-
params = {
|
68
|
-
:line_items_attributes => {
|
69
|
-
"0" => { :variant_id => variant.id, :quantity => "5" },
|
70
|
-
"1" => { :variant_id => variant.id, :quantity => "5" }
|
71
|
-
}
|
72
|
-
}
|
73
|
-
|
74
|
-
order = Order.build_from_api(user, params)
|
75
|
-
expect(order.line_items.first.quantity).to eq 10
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'uses line item price if present' do
|
80
|
-
line_items['0'][:price] = 12.00
|
81
|
-
params = { :line_items_attributes => line_items }
|
82
|
-
|
83
|
-
order = Order.build_from_api(user, params)
|
8
|
+
it 'can build an order from API parameters' do
|
9
|
+
variant_id = product.master.id
|
10
|
+
order = Order.build_from_api(user, { :line_items_attributes => { "0" => { :variant_id => variant_id, :quantity => 5 }}})
|
84
11
|
|
12
|
+
order.user.should == nil
|
85
13
|
line_item = order.line_items.first
|
86
|
-
line_item.price.to_f.should == 12.00
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'handles line_item building exceptions' do
|
90
|
-
line_items['0'][:variant_id] = 'XXX'
|
91
|
-
params = { :line_items_attributes => line_items }
|
92
|
-
|
93
|
-
expect {
|
94
|
-
order = Order.build_from_api(user, params)
|
95
|
-
}.to raise_error /XXX/
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'can build an order from API with variant sku' do
|
99
|
-
params = { :line_items_attributes => {
|
100
|
-
"0" => { :sku => sku, :quantity => 5 } }}
|
101
|
-
|
102
|
-
order = Order.build_from_api(user, params)
|
103
|
-
|
104
|
-
line_item = order.line_items.first
|
105
|
-
line_item.variant_id.should == variant_id
|
106
14
|
line_item.quantity.should == 5
|
107
|
-
|
108
|
-
|
109
|
-
it 'handles exceptions when sku is not found' do
|
110
|
-
params = { :line_items_attributes => {
|
111
|
-
"0" => { :sku => 'XXX', :quantity => 5 } }}
|
112
|
-
expect {
|
113
|
-
order = Order.build_from_api(user, params)
|
114
|
-
}.to raise_error /XXX/
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'can build an order from API shipping address' do
|
118
|
-
params = { :ship_address_attributes => ship_address,
|
119
|
-
:line_items_attributes => line_items }
|
120
|
-
|
121
|
-
order = Order.build_from_api(user, params)
|
122
|
-
order.ship_address.address1.should eq '123 Testable Way'
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'can build an order from API with country attributes' do
|
126
|
-
ship_address.delete(:country_id)
|
127
|
-
ship_address[:country] = { 'iso' => 'US' }
|
128
|
-
params = { :ship_address_attributes => ship_address,
|
129
|
-
:line_items_attributes => line_items }
|
130
|
-
|
131
|
-
order = Order.build_from_api(user, params)
|
132
|
-
order.ship_address.country.iso.should eq 'US'
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'handles country lookup exceptions' do
|
136
|
-
ship_address.delete(:country_id)
|
137
|
-
ship_address[:country] = { 'iso' => 'XXX' }
|
138
|
-
params = { :ship_address_attributes => ship_address,
|
139
|
-
:line_items_attributes => line_items }
|
140
|
-
|
141
|
-
expect {
|
142
|
-
order = Order.build_from_api(user, params)
|
143
|
-
}.to raise_error /XXX/
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'can build an order from API with state attributes' do
|
147
|
-
ship_address.delete(:state_id)
|
148
|
-
ship_address[:state] = { 'name' => state.name }
|
149
|
-
params = { :ship_address_attributes => ship_address,
|
150
|
-
:line_items_attributes => line_items }
|
151
|
-
|
152
|
-
order = Order.build_from_api(user, params)
|
153
|
-
order.ship_address.state.name.should eq 'Alabama'
|
154
|
-
end
|
155
|
-
|
156
|
-
context "state passed is not associated with country" do
|
157
|
-
let(:params) do
|
158
|
-
params = { :ship_address_attributes => ship_address,
|
159
|
-
:line_items_attributes => line_items }
|
160
|
-
end
|
161
|
-
|
162
|
-
let(:other_state) { create(:state, name: "Uhuhuh", country: create(:country)) }
|
163
|
-
|
164
|
-
before do
|
165
|
-
country.states.destroy_all
|
166
|
-
|
167
|
-
ship_address.delete(:state_id)
|
168
|
-
ship_address[:state] = { 'name' => other_state.name }
|
169
|
-
end
|
170
|
-
|
171
|
-
it 'sets states name instead of state id' do
|
172
|
-
order = Order.build_from_api(user, params)
|
173
|
-
expect(order.ship_address.state_name).to eq other_state.name
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
it 'sets state name if state record not found' do
|
178
|
-
country.states.destroy_all
|
179
|
-
|
180
|
-
ship_address.delete(:state_id)
|
181
|
-
ship_address[:state] = { 'name' => 'XXX' }
|
182
|
-
params = { :ship_address_attributes => ship_address,
|
183
|
-
:line_items_attributes => line_items }
|
184
|
-
|
185
|
-
order = Order.build_from_api(user, params)
|
186
|
-
expect(order.ship_address.state_name).to eq 'XXX'
|
187
|
-
end
|
188
|
-
|
189
|
-
context 'variant not deleted' do
|
190
|
-
it 'ensures variant id from api' do
|
191
|
-
hash = { sku: variant.sku }
|
192
|
-
Order.ensure_variant_id_from_api(hash)
|
193
|
-
expect(hash[:variant_id]).to eq variant.id
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
context 'variant was deleted' do
|
198
|
-
it 'raise error as variant shouldnt be found' do
|
199
|
-
variant.product.delete
|
200
|
-
hash = { sku: variant.sku }
|
201
|
-
expect {
|
202
|
-
Order.ensure_variant_id_from_api(hash)
|
203
|
-
}.to raise_error
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
it 'ensures_country_id for country fields' do
|
208
|
-
[:name, :iso, :iso_name, :iso3].each do |field|
|
209
|
-
address = { :country => { field => country.send(field) }}
|
210
|
-
Order.ensure_country_id_from_api(address)
|
211
|
-
address[:country_id].should eq country.id
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
it "raises with proper message when cant find country" do
|
216
|
-
address = { :country => { "name" => "NoNoCountry" } }
|
217
|
-
expect {
|
218
|
-
Order.ensure_country_id_from_api(address)
|
219
|
-
}.to raise_error /NoNoCountry/
|
220
|
-
end
|
221
|
-
|
222
|
-
it 'ensures_state_id for state fields' do
|
223
|
-
[:name, :abbr].each do |field|
|
224
|
-
address = { country_id: country.id, :state => { field => state.send(field) }}
|
225
|
-
Order.ensure_state_id_from_api(address)
|
226
|
-
address[:state_id].should eq state.id
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
context "shippments" do
|
231
|
-
let(:params) do
|
232
|
-
{ :shipments_attributes => [
|
233
|
-
{ :tracking => '123456789',
|
234
|
-
:cost => '4.99',
|
235
|
-
:shipping_method => shipping_method.name,
|
236
|
-
:inventory_units => [{ :sku => sku }]
|
237
|
-
}
|
238
|
-
] }
|
239
|
-
end
|
240
|
-
|
241
|
-
it 'ensures variant exists and is not deleted' do
|
242
|
-
Order.should_receive(:ensure_variant_id_from_api)
|
243
|
-
order = Order.build_from_api(user, params)
|
244
|
-
end
|
245
|
-
|
246
|
-
it 'builds them properly' do
|
247
|
-
order = Order.build_from_api(user, params)
|
248
|
-
|
249
|
-
shipment = order.shipments.first
|
250
|
-
shipment.inventory_units.first.variant_id.should eq product.master.id
|
251
|
-
shipment.tracking.should eq '123456789'
|
252
|
-
shipment.adjustment.amount.should eq 4.99
|
253
|
-
shipment.adjustment.should be_locked
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
it 'handles shipment building exceptions' do
|
258
|
-
params = { :shipments_attributes => [{ :tracking => '123456789',
|
259
|
-
:cost => '4.99',
|
260
|
-
:shipping_method => 'XXX',
|
261
|
-
:inventory_units => [{ :sku => sku }]
|
262
|
-
}] }
|
263
|
-
expect {
|
264
|
-
order = Order.build_from_api(user, params)
|
265
|
-
}.to raise_error /XXX/
|
266
|
-
end
|
267
|
-
|
268
|
-
it 'adds adjustments' do
|
269
|
-
params = { :adjustments_attributes => [
|
270
|
-
{ "label" => "Shipping Discount", "amount" => "-4.99" },
|
271
|
-
{ "label" => "Promotion Discount", "amount" => "-3.00" }] }
|
272
|
-
|
273
|
-
order = Order.build_from_api(user, params)
|
274
|
-
order.adjustments.all?(&:locked).should be_true
|
275
|
-
order.adjustments.first.label.should eq 'Shipping Discount'
|
276
|
-
order.adjustments.first.amount.should eq -4.99
|
277
|
-
end
|
278
|
-
|
279
|
-
it 'handles adjustment building exceptions' do
|
280
|
-
params = { :adjustments_attributes => [
|
281
|
-
{ "amount" => "XXX" },
|
282
|
-
{ "label" => "Promotion Discount", "amount" => "-3.00" }] }
|
283
|
-
|
284
|
-
expect {
|
285
|
-
order = Order.build_from_api(user, params)
|
286
|
-
}.to raise_error /XXX/
|
287
|
-
end
|
288
|
-
|
289
|
-
it 'builds a payment' do
|
290
|
-
params = { :payments_attributes => [{ :amount => '4.99',
|
291
|
-
:payment_method => payment_method.name }] }
|
292
|
-
order = Order.build_from_api(user, params)
|
293
|
-
order.payments.first.amount.should eq 4.99
|
294
|
-
end
|
295
|
-
|
296
|
-
it 'handles payment building exceptions' do
|
297
|
-
params = { :payments_attributes => [{ :amount => '4.99',
|
298
|
-
:payment_method => 'XXX' }] }
|
299
|
-
expect {
|
300
|
-
order = Order.build_from_api(user, params)
|
301
|
-
}.to raise_error /XXX/
|
302
|
-
end
|
303
|
-
|
304
|
-
context "raises error" do
|
305
|
-
it "clears out order from db" do
|
306
|
-
params = { :payments_attributes => [{ payment_method: "XXX" }] }
|
307
|
-
count = Order.count
|
308
|
-
|
309
|
-
expect { order = Order.build_from_api(user, params) }.to raise_error
|
310
|
-
expect(Order.count).to eq count
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
context "import param and tax adjustments" do
|
315
|
-
let!(:tax_rate) { create(:tax_rate, amount: 0.05, calculator: Calculator::DefaultTax.create) }
|
316
|
-
let(:other_variant) { create(:variant) }
|
317
|
-
|
318
|
-
let(:line_item_attributes) do
|
319
|
-
line_items.merge({ "1" => { :variant_id => other_variant.id, :quantity => 5 }})
|
320
|
-
end
|
321
|
-
|
322
|
-
before { Zone.stub default_tax: tax_rate.zone }
|
323
|
-
|
324
|
-
it "doesnt create any tax ajustments when importing order" do
|
325
|
-
params = { import: true, line_items_attributes: line_item_attributes }
|
326
|
-
expect {
|
327
|
-
Order.build_from_api(user, params)
|
328
|
-
}.not_to change { Adjustment.count }
|
329
|
-
end
|
330
|
-
|
331
|
-
it "does create tax adjustments if not importing order" do
|
332
|
-
params = { import: false, line_items_attributes: line_item_attributes }
|
333
|
-
expect {
|
334
|
-
Order.build_from_api(user, params)
|
335
|
-
}.to change { Adjustment.count }
|
336
|
-
end
|
15
|
+
line_item.variant_id.should == variant_id
|
337
16
|
end
|
338
17
|
end
|
339
18
|
end
|