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
@@ -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
|