spree_api 3.2.9 → 3.3.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/spree/api/base_controller.rb +11 -12
- data/app/controllers/spree/api/v1/checkouts_controller.rb +5 -8
- data/app/controllers/spree/api/v1/customer_returns_controller.rb +24 -0
- data/app/controllers/spree/api/v1/orders_controller.rb +13 -24
- data/app/controllers/spree/api/v1/payments_controller.rb +2 -3
- data/app/controllers/spree/api/v1/reimbursements_controller.rb +24 -0
- data/app/controllers/spree/api/v1/shipments_controller.rb +4 -4
- data/app/controllers/spree/api/v1/zones_controller.rb +8 -3
- data/app/helpers/spree/api/api_helpers.rb +13 -1
- data/app/models/concerns/spree/user_api_authentication.rb +19 -0
- data/app/models/concerns/spree/user_api_methods.rb +7 -0
- data/app/views/spree/api/v1/customer_returns/index.v1.rabl +7 -0
- data/app/views/spree/api/v1/line_items/show.v1.rabl +0 -1
- data/app/views/spree/api/v1/reimbursements/index.v1.rabl +7 -0
- data/config/initializers/user_class_extensions.rb +7 -0
- data/config/routes.rb +3 -0
- data/spec/controllers/spree/api/base_controller_spec.rb +84 -0
- data/spec/controllers/spree/api/v1/addresses_controller_spec.rb +56 -0
- data/spec/controllers/spree/api/v1/checkouts_controller_spec.rb +361 -0
- data/spec/controllers/spree/api/v1/classifications_controller_spec.rb +48 -0
- data/spec/controllers/spree/api/v1/countries_controller_spec.rb +48 -0
- data/spec/controllers/spree/api/v1/credit_cards_controller_spec.rb +80 -0
- data/spec/controllers/spree/api/v1/customer_returns_controller_spec.rb +27 -0
- data/spec/controllers/spree/api/v1/images_controller_spec.rb +114 -0
- data/spec/controllers/spree/api/v1/inventory_units_controller_spec.rb +48 -0
- data/spec/controllers/spree/api/v1/line_items_controller_spec.rb +210 -0
- data/spec/controllers/spree/api/v1/option_types_controller_spec.rb +122 -0
- data/spec/controllers/spree/api/v1/option_values_controller_spec.rb +141 -0
- data/spec/controllers/spree/api/v1/orders_controller_spec.rb +735 -0
- data/spec/controllers/spree/api/v1/payments_controller_spec.rb +234 -0
- data/spec/controllers/spree/api/v1/product_properties_controller_spec.rb +156 -0
- data/spec/controllers/spree/api/v1/products_controller_spec.rb +409 -0
- data/spec/controllers/spree/api/v1/promotion_application_spec.rb +50 -0
- data/spec/controllers/spree/api/v1/promotions_controller_spec.rb +64 -0
- data/spec/controllers/spree/api/v1/properties_controller_spec.rb +102 -0
- data/spec/controllers/spree/api/v1/reimbursements_controller_spec.rb +24 -0
- data/spec/controllers/spree/api/v1/return_authorizations_controller_spec.rb +161 -0
- data/spec/controllers/spree/api/v1/shipments_controller_spec.rb +187 -0
- data/spec/controllers/spree/api/v1/states_controller_spec.rb +86 -0
- data/spec/controllers/spree/api/v1/stock_items_controller_spec.rb +151 -0
- data/spec/controllers/spree/api/v1/stock_locations_controller_spec.rb +113 -0
- data/spec/controllers/spree/api/v1/stock_movements_controller_spec.rb +84 -0
- data/spec/controllers/spree/api/v1/stores_controller_spec.rb +133 -0
- data/spec/controllers/spree/api/v1/tags_controller_spec.rb +102 -0
- data/spec/controllers/spree/api/v1/taxonomies_controller_spec.rb +114 -0
- data/spec/controllers/spree/api/v1/taxons_controller_spec.rb +177 -0
- data/spec/controllers/spree/api/v1/unauthenticated_products_controller_spec.rb +26 -0
- data/spec/controllers/spree/api/v1/users_controller_spec.rb +153 -0
- data/spec/controllers/spree/api/v1/variants_controller_spec.rb +205 -0
- data/spec/controllers/spree/api/v1/zones_controller_spec.rb +91 -0
- data/spec/models/spree/legacy_user_spec.rb +19 -0
- data/spec/requests/rabl_cache_spec.rb +32 -0
- data/spec/requests/ransackable_attributes_spec.rb +79 -0
- data/spec/requests/version_spec.rb +19 -0
- data/spec/shared_examples/protect_product_actions.rb +17 -0
- data/spec/spec_helper.rb +63 -0
- data/spec/support/controller_hacks.rb +40 -0
- data/spec/support/database_cleaner.rb +14 -0
- data/spec/support/have_attributes_matcher.rb +13 -0
- data/spree_api.gemspec +4 -3
- metadata +105 -13
- data/app/views/spree/api/v1/config/money.v1.rabl +0 -2
- data/app/views/spree/api/v1/config/show.v1.rabl +0 -2
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::StockMovementsController, type: :controller 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
|
+
context 'as a user' do
|
17
|
+
it 'cannot see a list of stock movements' do
|
18
|
+
api_get :index, stock_location_id: stock_location.to_param
|
19
|
+
expect(response.status).to eq(404)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'cannot see a stock movement' do
|
23
|
+
api_get :show, stock_location_id: stock_location.to_param, id: stock_movement.id
|
24
|
+
expect(response.status).to eq(404)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'cannot create a stock movement' do
|
28
|
+
params = {
|
29
|
+
stock_location_id: stock_location.to_param,
|
30
|
+
stock_movement: {
|
31
|
+
stock_item_id: stock_item.to_param
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
api_post :create, params
|
36
|
+
expect(response.status).to eq(404)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'as an admin' do
|
41
|
+
sign_in_as_admin!
|
42
|
+
|
43
|
+
it 'gets list of stock movements' do
|
44
|
+
api_get :index, stock_location_id: stock_location.to_param
|
45
|
+
expect(json_response['stock_movements'].first).to have_attributes(attributes)
|
46
|
+
expect(json_response['stock_movements'].first['stock_item']['count_on_hand']).to eq 11
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'can control the page size through a parameter' do
|
50
|
+
create(:stock_movement, stock_item: stock_item)
|
51
|
+
api_get :index, stock_location_id: stock_location.to_param, per_page: 1
|
52
|
+
expect(json_response['count']).to eq(1)
|
53
|
+
expect(json_response['current_page']).to eq(1)
|
54
|
+
expect(json_response['pages']).to eq(2)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'can query the results through a paramter' do
|
58
|
+
expected_result = create(:stock_movement, :received, quantity: 10, stock_item: stock_item)
|
59
|
+
api_get :index, stock_location_id: stock_location.to_param, q: { quantity_eq: '10' }
|
60
|
+
expect(json_response['count']).to eq(1)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'gets a stock movement' do
|
64
|
+
api_get :show, stock_location_id: stock_location.to_param, id: stock_movement.to_param
|
65
|
+
expect(json_response).to have_attributes(attributes)
|
66
|
+
expect(json_response['stock_item_id']).to eq stock_movement.stock_item_id
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'can create a new stock movement' do
|
70
|
+
params = {
|
71
|
+
stock_location_id: stock_location.to_param,
|
72
|
+
stock_movement: {
|
73
|
+
stock_item_id: stock_item.to_param
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
api_post :create, params
|
78
|
+
expect(response.status).to eq(201)
|
79
|
+
expect(json_response).to have_attributes(attributes)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::StoresController, type: :controller do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let!(:store) do
|
8
|
+
create(:store, name: "My Spree Store", url: "spreestore.example.com")
|
9
|
+
end
|
10
|
+
|
11
|
+
before do
|
12
|
+
stub_authentication!
|
13
|
+
end
|
14
|
+
|
15
|
+
context "as an admin" do
|
16
|
+
sign_in_as_admin!
|
17
|
+
|
18
|
+
let!(:non_default_store) do
|
19
|
+
create(:store,
|
20
|
+
name: "Extra Store",
|
21
|
+
url: "spreestore-5.example.com",
|
22
|
+
default: false
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "I can list the available stores" do
|
27
|
+
api_get :index
|
28
|
+
expect(json_response["stores"]).to eq([
|
29
|
+
{
|
30
|
+
"id" => store.id,
|
31
|
+
"name" => "My Spree Store",
|
32
|
+
"url" => "spreestore.example.com",
|
33
|
+
"meta_description" => nil,
|
34
|
+
"meta_keywords" => nil,
|
35
|
+
"seo_title" => nil,
|
36
|
+
"mail_from_address" => "spree@example.org",
|
37
|
+
"default_currency" => nil,
|
38
|
+
"code" => store.code,
|
39
|
+
"default" => true
|
40
|
+
},
|
41
|
+
{
|
42
|
+
"id" => non_default_store.id,
|
43
|
+
"name" => "Extra Store",
|
44
|
+
"url" => "spreestore-5.example.com",
|
45
|
+
"meta_description" => nil,
|
46
|
+
"meta_keywords" => nil,
|
47
|
+
"seo_title" => nil,
|
48
|
+
"mail_from_address" => "spree@example.org",
|
49
|
+
"default_currency" => nil,
|
50
|
+
"code" => non_default_store.code,
|
51
|
+
"default" => false
|
52
|
+
}
|
53
|
+
])
|
54
|
+
end
|
55
|
+
|
56
|
+
it "I can get the store details" do
|
57
|
+
api_get :show, id: store.id
|
58
|
+
expect(json_response).to eq(
|
59
|
+
"id" => store.id,
|
60
|
+
"name" => "My Spree Store",
|
61
|
+
"url" => "spreestore.example.com",
|
62
|
+
"meta_description" => nil,
|
63
|
+
"meta_keywords" => nil,
|
64
|
+
"seo_title" => nil,
|
65
|
+
"mail_from_address" => "spree@example.org",
|
66
|
+
"default_currency" => nil,
|
67
|
+
"code" => store.code,
|
68
|
+
"default" => true
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "I can create a new store" do
|
73
|
+
store_hash = {
|
74
|
+
code: "spree123",
|
75
|
+
name: "Hack0rz",
|
76
|
+
url: "spree123.example.com",
|
77
|
+
mail_from_address: "me@example.com"
|
78
|
+
}
|
79
|
+
api_post :create, store: store_hash
|
80
|
+
expect(response.status).to eq(201)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "I can update an existing store" do
|
84
|
+
store_hash = {
|
85
|
+
url: "spree123.example.com",
|
86
|
+
mail_from_address: "me@example.com"
|
87
|
+
}
|
88
|
+
api_put :update, id: store.id, store: store_hash
|
89
|
+
expect(response.status).to eq(200)
|
90
|
+
expect(store.reload.url).to eql "spree123.example.com"
|
91
|
+
expect(store.reload.mail_from_address).to eql "me@example.com"
|
92
|
+
end
|
93
|
+
|
94
|
+
context "deleting a store" do
|
95
|
+
it "will fail if it's the default Store" do
|
96
|
+
api_delete :destroy, id: store.id
|
97
|
+
expect(response.status).to eq(422)
|
98
|
+
expect(json_response["errors"]["base"]).to eql(
|
99
|
+
["Cannot destroy the default Store."]
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "will destroy the store" do
|
104
|
+
api_delete :destroy, id: non_default_store.id
|
105
|
+
expect(response.status).to eq(204)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "as an user" do
|
111
|
+
|
112
|
+
it "I cannot list all the stores" do
|
113
|
+
api_get :index
|
114
|
+
expect(response.status).to eq(401)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "I cannot get the store details" do
|
118
|
+
api_get :show, id: store.id
|
119
|
+
expect(response.status).to eq(401)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "I cannot create a new store" do
|
123
|
+
api_post :create, store: {}
|
124
|
+
expect(response.status).to eq(401)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "I cannot update an existing store" do
|
128
|
+
api_put :update, id: store.id, store: {}
|
129
|
+
expect(response.status).to eq(401)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::TagsController, type: :controller do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let!(:tag) { create(:tag) }
|
8
|
+
let(:base_attributes) { Api::ApiHelpers.tag_attributes }
|
9
|
+
|
10
|
+
before do
|
11
|
+
stub_authentication!
|
12
|
+
end
|
13
|
+
|
14
|
+
context "as a normal user" do
|
15
|
+
context "with caching enabled" do
|
16
|
+
let!(:tag_2) { create(:tag) }
|
17
|
+
|
18
|
+
before do
|
19
|
+
ActionController::Base.perform_caching = true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns unique tags" do
|
23
|
+
api_get :index
|
24
|
+
tag_ids = json_response["tags"].map { |p| p["id"] }
|
25
|
+
expect(tag_ids.uniq.count).to eq(tag_ids.count)
|
26
|
+
end
|
27
|
+
|
28
|
+
after do
|
29
|
+
ActionController::Base.perform_caching = false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "retrieves a list of tags" do
|
34
|
+
api_get :index
|
35
|
+
expect(json_response["tags"].first).to have_attributes(base_attributes)
|
36
|
+
expect(json_response["total_count"]).to eq(1)
|
37
|
+
expect(json_response["current_page"]).to eq(1)
|
38
|
+
expect(json_response["pages"]).to eq(1)
|
39
|
+
expect(json_response["per_page"]).to eq(Kaminari.config.default_per_page)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "retrieves a list of tags by id" do
|
43
|
+
api_get :index, ids: [tag.id]
|
44
|
+
expect(json_response["tags"].first).to have_attributes(base_attributes)
|
45
|
+
expect(json_response["total_count"]).to eq(1)
|
46
|
+
expect(json_response["current_page"]).to eq(1)
|
47
|
+
expect(json_response["pages"]).to eq(1)
|
48
|
+
expect(json_response["per_page"]).to eq(Kaminari.config.default_per_page)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "retrieves a list of tags by ids string" do
|
52
|
+
second_tag = create(:tag)
|
53
|
+
api_get :index, ids: [tag.id, second_tag.id].join(",")
|
54
|
+
expect(json_response["tags"].first).to have_attributes(base_attributes)
|
55
|
+
expect(json_response["tags"][1]).to have_attributes(base_attributes)
|
56
|
+
expect(json_response["total_count"]).to eq(2)
|
57
|
+
expect(json_response["current_page"]).to eq(1)
|
58
|
+
expect(json_response["pages"]).to eq(1)
|
59
|
+
expect(json_response["per_page"]).to eq(Kaminari.config.default_per_page)
|
60
|
+
end
|
61
|
+
|
62
|
+
context "pagination" do
|
63
|
+
let!(:second_tag) { create(:tag) }
|
64
|
+
|
65
|
+
it "can select the next page of tags" do
|
66
|
+
api_get :index, page: 2, per_page: 1
|
67
|
+
expect(json_response["tags"].first).to have_attributes(base_attributes)
|
68
|
+
expect(json_response["total_count"]).to eq(2)
|
69
|
+
expect(json_response["current_page"]).to eq(2)
|
70
|
+
expect(json_response["pages"]).to eq(2)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'can control the page size through a parameter' do
|
74
|
+
api_get :index, per_page: 1
|
75
|
+
expect(json_response['count']).to eq(1)
|
76
|
+
expect(json_response['total_count']).to eq(2)
|
77
|
+
expect(json_response['current_page']).to eq(1)
|
78
|
+
expect(json_response['pages']).to eq(2)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it "can search for tags" do
|
83
|
+
create(:tag, name: "The best tag in the world")
|
84
|
+
api_get :index, q: { name_cont: "best" }
|
85
|
+
expect(json_response["tags"].first).to have_attributes(base_attributes)
|
86
|
+
expect(json_response["count"]).to eq(1)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "as an admin" do
|
91
|
+
sign_in_as_admin!
|
92
|
+
|
93
|
+
it "can see all tags" do
|
94
|
+
api_get :index
|
95
|
+
expect(json_response["tags"].count).to eq(1)
|
96
|
+
expect(json_response["count"]).to eq(1)
|
97
|
+
expect(json_response["current_page"]).to eq(1)
|
98
|
+
expect(json_response["pages"]).to eq(1)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::TaxonomiesController, type: :controller do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let(:taxonomy) { create(:taxonomy) }
|
8
|
+
let(:taxon) { create(:taxon, name: "Ruby", taxonomy: taxonomy) }
|
9
|
+
let(:taxon2) { create(:taxon, name: "Rails", taxonomy: taxonomy) }
|
10
|
+
let(:attributes) { [:id, :name] }
|
11
|
+
|
12
|
+
before do
|
13
|
+
stub_authentication!
|
14
|
+
taxon2.children << create(:taxon, name: "3.2.2", taxonomy: taxonomy)
|
15
|
+
taxon.children << taxon2
|
16
|
+
taxonomy.root.children << taxon
|
17
|
+
end
|
18
|
+
|
19
|
+
context "as a normal user" do
|
20
|
+
it "gets all taxonomies" do
|
21
|
+
api_get :index
|
22
|
+
|
23
|
+
expect(json_response["taxonomies"].first['name']).to eq taxonomy.name
|
24
|
+
expect(json_response["taxonomies"].first['root']['taxons'].count).to eq 1
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'can control the page size through a parameter' do
|
28
|
+
create(:taxonomy)
|
29
|
+
api_get :index, per_page: 1
|
30
|
+
expect(json_response['count']).to eq(1)
|
31
|
+
expect(json_response['current_page']).to eq(1)
|
32
|
+
expect(json_response['pages']).to eq(2)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'can query the results through a paramter' do
|
36
|
+
expected_result = create(:taxonomy, name: 'Style')
|
37
|
+
api_get :index, q: { name_cont: 'style' }
|
38
|
+
expect(json_response['count']).to eq(1)
|
39
|
+
expect(json_response['taxonomies'].first['name']).to eq expected_result.name
|
40
|
+
end
|
41
|
+
|
42
|
+
it "gets a single taxonomy" do
|
43
|
+
api_get :show, id: taxonomy.id
|
44
|
+
|
45
|
+
expect(json_response['name']).to eq taxonomy.name
|
46
|
+
|
47
|
+
children = json_response['root']['taxons']
|
48
|
+
expect(children.count).to eq 1
|
49
|
+
expect(children.first['name']).to eq taxon.name
|
50
|
+
expect(children.first.key?('taxons')).to be false
|
51
|
+
end
|
52
|
+
|
53
|
+
it "gets a single taxonomy with set=nested" do
|
54
|
+
api_get :show, id: taxonomy.id, set: 'nested'
|
55
|
+
|
56
|
+
expect(json_response['name']).to eq taxonomy.name
|
57
|
+
|
58
|
+
children = json_response['root']['taxons']
|
59
|
+
expect(children.first.key?('taxons')).to be true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "gets the jstree-friendly version of a taxonomy" do
|
63
|
+
api_get :jstree, id: taxonomy.id
|
64
|
+
expect(json_response["data"]).to eq(taxonomy.root.name)
|
65
|
+
expect(json_response["attr"]).to eq({ "id" => taxonomy.root.id, "name" => taxonomy.root.name})
|
66
|
+
expect(json_response["state"]).to eq("closed")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "can learn how to create a new taxonomy" do
|
70
|
+
api_get :new
|
71
|
+
expect(json_response["attributes"]).to eq(attributes.map(&:to_s))
|
72
|
+
required_attributes = json_response["required_attributes"]
|
73
|
+
expect(required_attributes).to include("name")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "cannot create a new taxonomy if not an admin" do
|
77
|
+
api_post :create, taxonomy: { name: "Location" }
|
78
|
+
assert_unauthorized!
|
79
|
+
end
|
80
|
+
|
81
|
+
it "cannot update a taxonomy" do
|
82
|
+
api_put :update, id: taxonomy.id, taxonomy: { name: "I hacked your store!" }
|
83
|
+
assert_unauthorized!
|
84
|
+
end
|
85
|
+
|
86
|
+
it "cannot delete a taxonomy" do
|
87
|
+
api_delete :destroy, id: taxonomy.id
|
88
|
+
assert_unauthorized!
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "as an admin" do
|
93
|
+
sign_in_as_admin!
|
94
|
+
|
95
|
+
it "can create" do
|
96
|
+
api_post :create, taxonomy: { name: "Colors"}
|
97
|
+
expect(json_response).to have_attributes(attributes)
|
98
|
+
expect(response.status).to eq(201)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "cannot create a new taxonomy with invalid attributes" do
|
102
|
+
api_post :create, taxonomy: {}
|
103
|
+
expect(response.status).to eq(422)
|
104
|
+
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
|
105
|
+
errors = json_response["errors"]
|
106
|
+
end
|
107
|
+
|
108
|
+
it "can destroy" do
|
109
|
+
api_delete :destroy, id: taxonomy.id
|
110
|
+
expect(response.status).to eq(204)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::TaxonsController, type: :controller do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let(:taxonomy) { create(:taxonomy) }
|
8
|
+
let(:taxon) { create(:taxon, name: "Ruby", taxonomy: taxonomy) }
|
9
|
+
let(:taxon2) { create(:taxon, name: "Rails", taxonomy: taxonomy) }
|
10
|
+
let(:attributes) { ["id", "name", "pretty_name", "permalink", "parent_id", "taxonomy_id", "meta_title", "meta_description"] }
|
11
|
+
|
12
|
+
before do
|
13
|
+
stub_authentication!
|
14
|
+
taxon2.children << create(:taxon, name: "3.2.2", taxonomy: taxonomy)
|
15
|
+
taxon.children << taxon2
|
16
|
+
taxonomy.root.children << taxon
|
17
|
+
end
|
18
|
+
|
19
|
+
context "as a normal user" do
|
20
|
+
it "gets all taxons for a taxonomy" do
|
21
|
+
api_get :index, taxonomy_id: taxonomy.id
|
22
|
+
|
23
|
+
expect(json_response['taxons'].first['name']).to eq taxon.name
|
24
|
+
children = json_response['taxons'].first['taxons']
|
25
|
+
expect(children.count).to eq 1
|
26
|
+
expect(children.first['name']).to eq taxon2.name
|
27
|
+
expect(children.first['taxons'].count).to eq 1
|
28
|
+
end
|
29
|
+
|
30
|
+
# Regression test for #4112
|
31
|
+
it "does not include children when asked not to" do
|
32
|
+
api_get :index, taxonomy_id: taxonomy.id, without_children: 1
|
33
|
+
|
34
|
+
expect(json_response['taxons'].first['name']).to eq(taxon.name)
|
35
|
+
expect(json_response['taxons'].first['taxons']).to be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "paginates through taxons" do
|
39
|
+
new_taxon = create(:taxon, name: "Go", taxonomy: taxonomy)
|
40
|
+
taxonomy.root.children << new_taxon
|
41
|
+
expect(taxonomy.root.children.count).to eql(2)
|
42
|
+
api_get :index, taxonomy_id: taxonomy.id, page: 1, per_page: 1
|
43
|
+
expect(json_response["count"]).to eql(1)
|
44
|
+
expect(json_response["total_count"]).to eql(2)
|
45
|
+
expect(json_response["current_page"]).to eql(1)
|
46
|
+
expect(json_response["per_page"]).to eql(1)
|
47
|
+
expect(json_response["pages"]).to eql(2)
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'searching' do
|
51
|
+
context 'with a name' do
|
52
|
+
before do
|
53
|
+
api_get :index, q: { name_cont: name }
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'with one result' do
|
57
|
+
let(:name) { "Ruby" }
|
58
|
+
|
59
|
+
it "returns an array including the matching taxon" do
|
60
|
+
expect(json_response['taxons'].count).to eq(1)
|
61
|
+
expect(json_response['taxons'].first['name']).to eq "Ruby"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with no results' do
|
66
|
+
let(:name) { "Imaginary" }
|
67
|
+
|
68
|
+
it 'returns an empty array of taxons' do
|
69
|
+
expect(json_response.keys).to include('taxons')
|
70
|
+
expect(json_response['taxons'].count).to eq(0)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'with no filters' do
|
76
|
+
it "gets all taxons" do
|
77
|
+
api_get :index
|
78
|
+
|
79
|
+
expect(json_response['taxons'].first['name']).to eq taxonomy.root.name
|
80
|
+
children = json_response['taxons'].first['taxons']
|
81
|
+
expect(children.count).to eq 1
|
82
|
+
expect(children.first['name']).to eq taxon.name
|
83
|
+
expect(children.first['taxons'].count).to eq 1
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
it "gets a single taxon" do
|
89
|
+
api_get :show, id: taxon.id, taxonomy_id: taxonomy.id
|
90
|
+
|
91
|
+
expect(json_response['name']).to eq taxon.name
|
92
|
+
expect(json_response['taxons'].count).to eq 1
|
93
|
+
end
|
94
|
+
|
95
|
+
it "gets all taxons in JSTree form" do
|
96
|
+
api_get :jstree, taxonomy_id: taxonomy.id, id: taxon.id
|
97
|
+
response = json_response.first
|
98
|
+
expect(response["data"]).to eq(taxon2.name)
|
99
|
+
expect(response["attr"]).to eq({ "name" => taxon2.name, "id" => taxon2.id})
|
100
|
+
expect(response["state"]).to eq("closed")
|
101
|
+
end
|
102
|
+
|
103
|
+
it "can learn how to create a new taxon" do
|
104
|
+
api_get :new, taxonomy_id: taxonomy.id
|
105
|
+
expect(json_response["attributes"]).to eq(attributes.map(&:to_s))
|
106
|
+
required_attributes = json_response["required_attributes"]
|
107
|
+
expect(required_attributes).to include("name")
|
108
|
+
end
|
109
|
+
|
110
|
+
it "cannot create a new taxon if not an admin" do
|
111
|
+
api_post :create, taxonomy_id: taxonomy.id, taxon: { name: "Location" }
|
112
|
+
assert_unauthorized!
|
113
|
+
end
|
114
|
+
|
115
|
+
it "cannot update a taxon" do
|
116
|
+
api_put :update, taxonomy_id: taxonomy.id, id: taxon.id, taxon: { name: "I hacked your store!" }
|
117
|
+
assert_unauthorized!
|
118
|
+
end
|
119
|
+
|
120
|
+
it "cannot delete a taxon" do
|
121
|
+
api_delete :destroy, taxonomy_id: taxonomy.id, id: taxon.id
|
122
|
+
assert_unauthorized!
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "as an admin" do
|
127
|
+
sign_in_as_admin!
|
128
|
+
|
129
|
+
it "can create" do
|
130
|
+
api_post :create, taxonomy_id: taxonomy.id, taxon: { name: "Colors" }
|
131
|
+
expect(json_response).to have_attributes(attributes)
|
132
|
+
expect(response.status).to eq(201)
|
133
|
+
|
134
|
+
expect(taxonomy.reload.root.children.count).to eq 2
|
135
|
+
taxon = Spree::Taxon.where(name: 'Colors').first
|
136
|
+
|
137
|
+
expect(taxon.parent_id).to eq taxonomy.root.id
|
138
|
+
expect(taxon.taxonomy_id).to eq taxonomy.id
|
139
|
+
end
|
140
|
+
|
141
|
+
it "can update the position in the list" do
|
142
|
+
taxonomy.root.children << taxon2
|
143
|
+
api_put :update, taxonomy_id: taxonomy.id, id: taxon.id, taxon: {parent_id: taxon.parent_id, child_index: 2 }
|
144
|
+
expect(response.status).to eq(200)
|
145
|
+
expect(taxonomy.reload.root.children[0]).to eql taxon2
|
146
|
+
expect(taxonomy.reload.root.children[1]).to eql taxon
|
147
|
+
end
|
148
|
+
|
149
|
+
it "cannot create a new taxon with invalid attributes" do
|
150
|
+
api_post :create, taxonomy_id: taxonomy.id, taxon: { foo: :bar }
|
151
|
+
expect(response.status).to eq(422)
|
152
|
+
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
|
153
|
+
errors = json_response["errors"]
|
154
|
+
|
155
|
+
expect(taxonomy.reload.root.children.count).to eq 1
|
156
|
+
end
|
157
|
+
|
158
|
+
it "cannot create a new taxon with invalid taxonomy_id" do
|
159
|
+
api_post :create, taxonomy_id: 1000, taxon: { name: "Colors" }
|
160
|
+
expect(response.status).to eq(422)
|
161
|
+
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
|
162
|
+
|
163
|
+
errors = json_response["errors"]
|
164
|
+
expect(errors["taxonomy_id"]).not_to be_nil
|
165
|
+
expect(errors["taxonomy_id"].first).to eq "Invalid taxonomy id."
|
166
|
+
|
167
|
+
expect(taxonomy.reload.root.children.count).to eq 1
|
168
|
+
end
|
169
|
+
|
170
|
+
it "can destroy" do
|
171
|
+
api_delete :destroy, taxonomy_id: taxonomy.id, id: taxon.id
|
172
|
+
expect(response.status).to eq(204)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'shared_examples/protect_product_actions'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Spree
|
5
|
+
describe Api::V1::ProductsController, type: :controller do
|
6
|
+
render_views
|
7
|
+
|
8
|
+
let!(:product) { create(:product) }
|
9
|
+
let(:attributes) { [:id, :name, :description, :price, :available_on, :slug, :meta_description, :meta_keywords, :taxon_ids] }
|
10
|
+
|
11
|
+
context "without authentication" do
|
12
|
+
before { Spree::Api::Config[:requires_authentication] = false }
|
13
|
+
|
14
|
+
it "retrieves a list of products" do
|
15
|
+
api_get :index
|
16
|
+
expect(json_response["products"].first).to have_attributes(attributes)
|
17
|
+
expect(json_response["count"]).to eq(1)
|
18
|
+
expect(json_response["current_page"]).to eq(1)
|
19
|
+
expect(json_response["pages"]).to eq(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
it_behaves_like "modifying product actions are restricted"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|