spree_api 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/spree/admin/users_controller_decorator.rb +17 -0
- data/app/controllers/spree/api/v1/addresses_controller.rb +17 -0
- data/app/controllers/spree/api/v1/images_controller.rb +9 -26
- data/app/controllers/spree/api/v1/orders_controller.rb +5 -0
- data/app/controllers/spree/api/v1/taxonomies_controller.rb +47 -0
- data/app/controllers/spree/api/v1/taxons_controller.rb +51 -0
- data/app/helpers/spree/api/api_helpers.rb +10 -2
- data/app/overrides/api_admin_user_edit_form.rb +6 -0
- data/app/views/spree/admin/users/_api_fields.html.erb +20 -0
- data/app/views/spree/api/v1/addresses/show.rabl +11 -0
- data/app/views/spree/api/v1/images/show.rabl +1 -0
- data/app/views/spree/api/v1/orders/address.rabl +0 -3
- data/app/views/spree/api/v1/orders/show.rabl +3 -3
- data/app/views/spree/api/v1/products/show.rabl +1 -1
- data/app/views/spree/api/v1/taxonomies/index.rabl +2 -0
- data/app/views/spree/api/v1/taxonomies/nested.rabl +11 -0
- data/app/views/spree/api/v1/taxonomies/new.rabl +3 -0
- data/app/views/spree/api/v1/taxonomies/show.rabl +15 -0
- data/app/views/spree/api/v1/taxons/index.rabl +4 -0
- data/app/views/spree/api/v1/taxons/new.rabl +3 -0
- data/app/views/spree/api/v1/taxons/show.rabl +8 -0
- data/app/views/spree/api/v1/taxons/taxons.rabl +7 -0
- data/config/initializers/metal_load_paths.rb +1 -0
- data/config/locales/en.yml +8 -1
- data/config/routes.rb +18 -2
- data/lib/spree/api/controller_setup.rb +0 -1
- data/spec/controllers/spree/api/v1/addresses_controller_spec.rb +23 -0
- data/spec/controllers/spree/api/v1/countries_controller_spec.rb +1 -1
- data/spec/controllers/spree/api/v1/images_controller_spec.rb +21 -15
- data/spec/controllers/spree/api/v1/line_items_controller_spec.rb +3 -3
- data/spec/controllers/spree/api/v1/orders_controller_spec.rb +8 -8
- data/spec/controllers/spree/api/v1/payments_controller_spec.rb +2 -2
- data/spec/controllers/spree/api/v1/products_controller_spec.rb +6 -6
- data/spec/controllers/spree/api/v1/shipments_controller_spec.rb +1 -1
- data/spec/controllers/spree/api/v1/taxonomies_controller_spec.rb +88 -0
- data/spec/controllers/spree/api/v1/taxons_controller_spec.rb +82 -0
- data/spec/controllers/spree/api/v1/variants_controller_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -0
- metadata +38 -17
- data/README.md +0 -29
@@ -0,0 +1,17 @@
|
|
1
|
+
Spree::Admin::UsersController.class_eval do
|
2
|
+
before_filter :load_roles, :only => [:edit, :new, :update, :create, :generate_api_key, :clear_api_key]
|
3
|
+
|
4
|
+
def generate_api_key
|
5
|
+
if @user.generate_api_key!
|
6
|
+
flash.notice = t('key_generated', :scope => 'spree.api')
|
7
|
+
end
|
8
|
+
redirect_to edit_admin_user_path(@user)
|
9
|
+
end
|
10
|
+
|
11
|
+
def clear_api_key
|
12
|
+
if @user.clear_api_key!
|
13
|
+
flash.notice = t('key_cleared', :scope => 'spree.api')
|
14
|
+
end
|
15
|
+
redirect_to edit_admin_user_path(@user)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V1
|
4
|
+
class AddressesController < Spree::Api::V1::BaseController
|
5
|
+
def show
|
6
|
+
@address = Address.find(params[:id])
|
7
|
+
end
|
8
|
+
|
9
|
+
def update
|
10
|
+
@address = Address.find(params[:id])
|
11
|
+
@address.update_attributes(params[:address])
|
12
|
+
render :show, :status => 200
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -2,44 +2,27 @@ module Spree
|
|
2
2
|
module Api
|
3
3
|
module V1
|
4
4
|
class ImagesController < Spree::Api::V1::BaseController
|
5
|
+
def show
|
6
|
+
@image = Image.find(params[:id])
|
7
|
+
end
|
8
|
+
|
5
9
|
def create
|
6
|
-
@image =
|
10
|
+
@image = Image.create(params[:image])
|
7
11
|
render :show, :status => 201
|
8
12
|
end
|
9
13
|
|
10
14
|
def update
|
11
|
-
image.
|
15
|
+
@image = Image.find(params[:id])
|
16
|
+
@image.update_attributes(params[:image])
|
12
17
|
render :show, :status => 200
|
13
18
|
end
|
14
19
|
|
15
20
|
def destroy
|
16
|
-
image.
|
21
|
+
@image = Image.find(params[:id])
|
22
|
+
@image.destroy
|
17
23
|
render :text => nil
|
18
24
|
end
|
19
25
|
|
20
|
-
private
|
21
|
-
|
22
|
-
def image
|
23
|
-
@image = product_or_variant.images.find(params[:id])
|
24
|
-
end
|
25
|
-
|
26
|
-
def product_or_variant
|
27
|
-
return @product_or_variant if @product_or_variant
|
28
|
-
if params[:product_id]
|
29
|
-
@product_or_variant = product
|
30
|
-
else
|
31
|
-
@product_or_variant = variant
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def variant
|
36
|
-
Variant.find(params[:variant_id])
|
37
|
-
end
|
38
|
-
|
39
|
-
def product
|
40
|
-
find_product(params[:product_id]).master
|
41
|
-
end
|
42
|
-
|
43
26
|
end
|
44
27
|
end
|
45
28
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V1
|
4
|
+
class TaxonomiesController < Spree::Api::V1::BaseController
|
5
|
+
def index
|
6
|
+
@taxonomies = Taxonomy.order('name').includes(:root => :children)
|
7
|
+
end
|
8
|
+
|
9
|
+
def show
|
10
|
+
@taxonomy = Taxonomy.find(params[:id])
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
authorize! :create, Taxonomy
|
15
|
+
@taxonomy = Taxonomy.new(params[:taxonomy])
|
16
|
+
if @taxonomy.save
|
17
|
+
render :show, :status => 201
|
18
|
+
else
|
19
|
+
invalid_resource!(@taxonomy)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
authorize! :update, Taxonomy
|
25
|
+
if taxonomy.update_attributes(params[:taxonomy])
|
26
|
+
render :show, :status => 200
|
27
|
+
else
|
28
|
+
invalid_resource!(taxonomy)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
authorize! :delete, Taxonomy
|
34
|
+
taxonomy.destroy
|
35
|
+
render :text => nil, :status => 200
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def taxonomy
|
41
|
+
@taxonomy ||= Taxonomy.find(params[:id])
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V1
|
4
|
+
class TaxonsController < Spree::Api::V1::BaseController
|
5
|
+
def index
|
6
|
+
@taxons = taxonomy.root.children
|
7
|
+
end
|
8
|
+
|
9
|
+
def show
|
10
|
+
@taxon = taxon
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
authorize! :create, Taxon
|
15
|
+
@taxon = Taxon.new(params[:taxon])
|
16
|
+
if @taxon.save
|
17
|
+
render :show, :status => 201
|
18
|
+
else
|
19
|
+
invalid_resource!(@taxon)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
authorize! :update, Taxon
|
25
|
+
if taxon.update_attributes(params[:taxon])
|
26
|
+
render :show, :status => 200
|
27
|
+
else
|
28
|
+
invalid_resource!(taxon)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
authorize! :delete, Taxon
|
34
|
+
taxon.destroy
|
35
|
+
render :text => nil, :status => 200
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def taxonomy
|
41
|
+
@taxonomy ||= Taxonomy.find(params[:taxonomy_id])
|
42
|
+
end
|
43
|
+
|
44
|
+
def taxon
|
45
|
+
@taxon ||= taxonomy.taxons.find(params[:id])
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -12,8 +12,8 @@ module Spree
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def product_attributes
|
15
|
-
[:id, :name, :description, :price,
|
16
|
-
|
15
|
+
[:id, :name, :description, :price, :available_on, :permalink,
|
16
|
+
:count_on_hand, :meta_description, :meta_keywords, :taxon_ids]
|
17
17
|
end
|
18
18
|
|
19
19
|
def variant_attributes
|
@@ -51,6 +51,14 @@ module Spree
|
|
51
51
|
def shipment_attributes
|
52
52
|
[:id, :tracking, :number, :cost, :shipped_at, :state]
|
53
53
|
end
|
54
|
+
|
55
|
+
def taxonomy_attributes
|
56
|
+
[:id, :name]
|
57
|
+
end
|
58
|
+
|
59
|
+
def taxon_attributes
|
60
|
+
[:id, :name, :permalink, :position, :parent_id, :taxonomy_id]
|
61
|
+
end
|
54
62
|
end
|
55
63
|
end
|
56
64
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<h2><%= t('access', :scope => 'spree.api') %></h2>
|
2
|
+
|
3
|
+
<% if @user.api_key.present? %>
|
4
|
+
<p><strong><%= t('key', :scope => 'spree.api') %></strong> <%= @user.api_key %></p>
|
5
|
+
|
6
|
+
<%= form_tag spree.clear_api_key_admin_user_path(@user), :method => :put do %>
|
7
|
+
<%= button t('clear_key', :scope => 'spree.api') %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<%= form_tag spree.generate_api_key_admin_user_path(@user), :method => :put do %>
|
11
|
+
<%= button t('regenerate_key', :scope => 'spree.api') %>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<% else %>
|
15
|
+
|
16
|
+
<p><%= t('no_key', :scope => 'spree.api') %></p>
|
17
|
+
<%= form_tag spree.generate_api_key_admin_user_path(@user), :method => :put do %>
|
18
|
+
<%= button t('generate_key', :scope => 'spree.api') %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
object @address
|
2
|
+
attributes :id, :firstname, :lastname, :address1, :address2,
|
3
|
+
:city, :zipcode, :phone,
|
4
|
+
:company, :alternative_phone, :country_id, :state_id,
|
5
|
+
:state_name
|
6
|
+
child(:country) do |address|
|
7
|
+
attributes :id, :iso_name, :iso, :iso3, :name, :numcode
|
8
|
+
end
|
9
|
+
child(:state) do |address|
|
10
|
+
attributes :abbr, :country_id, :id, :name
|
11
|
+
end
|
@@ -3,11 +3,11 @@ attributes *order_attributes
|
|
3
3
|
extends "spree/api/v1/orders/#{@order.state}"
|
4
4
|
|
5
5
|
child :billing_address => :bill_address do
|
6
|
-
extends "spree/api/v1/
|
6
|
+
extends "spree/api/v1/addresses/show"
|
7
7
|
end
|
8
8
|
|
9
9
|
child :shipping_address => :ship_address do
|
10
|
-
extends "spree/api/v1/
|
10
|
+
extends "spree/api/v1/addresses/show"
|
11
11
|
end
|
12
12
|
|
13
13
|
child :line_items => :line_items do
|
@@ -23,4 +23,4 @@ end
|
|
23
23
|
|
24
24
|
child :shipments => :shipments do
|
25
25
|
extends "spree/api/v1/shipments/show"
|
26
|
-
end
|
26
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
object @taxonomy
|
2
|
+
|
3
|
+
if set = params[:set]
|
4
|
+
extends "spree/api/v1/taxonomies/#{set}"
|
5
|
+
else
|
6
|
+
attributes *taxonomy_attributes
|
7
|
+
|
8
|
+
child :root => :root do
|
9
|
+
attributes *taxon_attributes
|
10
|
+
|
11
|
+
child :children => :taxons do
|
12
|
+
attributes *taxon_attributes
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Spree::Api::V1::BaseController.append_view_path(ApplicationController.view_paths)
|
data/config/locales/en.yml
CHANGED
@@ -8,7 +8,14 @@ en:
|
|
8
8
|
resource_not_found: "The resource you were looking for could not be found."
|
9
9
|
gateway_error: "There was a problem with the payment gateway: %{text}"
|
10
10
|
credit_over_limit: "This payment can only be credited up to %{limit}. Please specify an amount less than or equal to this number."
|
11
|
-
|
11
|
+
access: "API Access"
|
12
|
+
key: "Key"
|
13
|
+
clear_key: "Clear key"
|
14
|
+
regenerate_key: "Regenerate Key"
|
15
|
+
no_key: "No key"
|
16
|
+
generate_key: "Generate API key"
|
17
|
+
key_generated: "Key generated"
|
18
|
+
key_cleared: "Key cleared"
|
12
19
|
order:
|
13
20
|
could_not_transition: "The order could not be transitioned. Please fix the errors and try again."
|
14
21
|
invalid_shipping_method: "Invalid shipping method specified."
|
data/config/routes.rb
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
Spree::Core::Engine.routes.prepend do
|
2
|
+
namespace :admin do
|
3
|
+
resources :users do
|
4
|
+
member do
|
5
|
+
put :generate_api_key
|
6
|
+
put :clear_api_key
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
2
11
|
namespace :api do
|
3
12
|
scope :module => :v1 do
|
4
13
|
resources :products do
|
@@ -7,14 +16,17 @@ Spree::Core::Engine.routes.prepend do
|
|
7
16
|
end
|
8
17
|
|
9
18
|
resources :variants
|
10
|
-
resources :images
|
11
19
|
end
|
12
20
|
|
21
|
+
resources :images
|
22
|
+
|
13
23
|
resources :variants, :only => [:index] do
|
14
|
-
resources :images
|
15
24
|
end
|
16
25
|
|
17
26
|
resources :orders do
|
27
|
+
collection do
|
28
|
+
get :search
|
29
|
+
end
|
18
30
|
member do
|
19
31
|
put :address
|
20
32
|
put :delivery
|
@@ -40,6 +52,10 @@ Spree::Core::Engine.routes.prepend do
|
|
40
52
|
end
|
41
53
|
|
42
54
|
resources :countries, :only => [:index, :show]
|
55
|
+
resources :addresses, :only => [:show, :update]
|
56
|
+
resources :taxonomies do
|
57
|
+
resources :taxons
|
58
|
+
end
|
43
59
|
end
|
44
60
|
end
|
45
61
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::AddressesController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
before do
|
8
|
+
stub_authentication!
|
9
|
+
@address = create(:address)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "gets an address" do
|
13
|
+
api_get :show, :id => @address.id
|
14
|
+
json_response['address']['address1'].should eq @address.address1
|
15
|
+
end
|
16
|
+
|
17
|
+
it "updates an address" do
|
18
|
+
api_put :update, :id => @address.id,
|
19
|
+
:address => { :address1 => "123 Test Lane" }
|
20
|
+
json_response['address']['address1'].should eq '123 Test Lane'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -4,9 +4,9 @@ module Spree
|
|
4
4
|
describe Spree::Api::V1::ImagesController do
|
5
5
|
render_views
|
6
6
|
|
7
|
-
let!(:product) {
|
8
|
-
let!(:attributes) { [:id, :position, :attachment_content_type,
|
9
|
-
:attachment_file_name, :type, :attachment_updated_at, :attachment_width,
|
7
|
+
let!(:product) { create(:product) }
|
8
|
+
let!(:attributes) { [:id, :position, :attachment_content_type,
|
9
|
+
:attachment_file_name, :type, :attachment_updated_at, :attachment_width,
|
10
10
|
:attachment_height, :alt] }
|
11
11
|
|
12
12
|
before do
|
@@ -14,19 +14,25 @@ module Spree
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "can upload a new image for a product" do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
lambda do
|
18
|
+
api_post :create,
|
19
|
+
:image => { :attachment => upload_image("thinking-cat.jpg"),
|
20
|
+
:viewable_type => 'Spree::Product',
|
21
|
+
:viewable_id => product.id }
|
22
|
+
response.status.should == 201
|
23
|
+
json_response.should have_attributes(attributes)
|
24
|
+
end.should change(Image, :count).by(1)
|
22
25
|
end
|
23
26
|
|
24
27
|
it "can upload a new image for a variant" do
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
lambda do
|
29
|
+
api_post :create,
|
30
|
+
:image => { :attachment => upload_image("thinking-cat.jpg"),
|
31
|
+
:viewable_type => 'Spree::Variant',
|
32
|
+
:viewable_id => product.master.to_param }
|
33
|
+
response.status.should == 201
|
34
|
+
json_response.should have_attributes(attributes)
|
35
|
+
end.should change(Image, :count).by(1)
|
30
36
|
end
|
31
37
|
|
32
38
|
context "working with an existing image" do
|
@@ -34,14 +40,14 @@ module Spree
|
|
34
40
|
|
35
41
|
it "can update image data" do
|
36
42
|
product_image.position.should == 1
|
37
|
-
api_post :update, :
|
43
|
+
api_post :update, :image => { :position => 2 }, :id => product_image.id
|
38
44
|
response.status.should == 200
|
39
45
|
json_response.should have_attributes(attributes)
|
40
46
|
product_image.reload.position.should == 2
|
41
47
|
end
|
42
48
|
|
43
49
|
it "can delete an image" do
|
44
|
-
api_delete :destroy, :
|
50
|
+
api_delete :destroy, :id => product_image.id
|
45
51
|
response.status.should == 200
|
46
52
|
lambda { product_image.reload }.should raise_error(ActiveRecord::RecordNotFound)
|
47
53
|
end
|
@@ -5,12 +5,12 @@ module Spree
|
|
5
5
|
render_views
|
6
6
|
|
7
7
|
let!(:order) do
|
8
|
-
order =
|
9
|
-
order.line_items <<
|
8
|
+
order = create(:order)
|
9
|
+
order.line_items << create(:line_item)
|
10
10
|
order
|
11
11
|
end
|
12
12
|
|
13
|
-
let(:product) {
|
13
|
+
let(:product) { create(:product) }
|
14
14
|
let(:attributes) { [:id, :quantity, :price, :variant] }
|
15
15
|
let(:resource_scoping) { { :order_id => order.to_param } }
|
16
16
|
|
@@ -4,7 +4,7 @@ module Spree
|
|
4
4
|
describe Api::V1::OrdersController do
|
5
5
|
render_views
|
6
6
|
|
7
|
-
let!(:order) {
|
7
|
+
let!(:order) { create(:order) }
|
8
8
|
let(:attributes) { [:number, :item_total, :total,
|
9
9
|
:state, :adjustment_total, :credit_total,
|
10
10
|
:user_id, :created_at, :updated_at,
|
@@ -35,7 +35,7 @@ module Spree
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "can create an order" do
|
38
|
-
variant =
|
38
|
+
variant = create(:variant)
|
39
39
|
api_post :create, :order => { :line_items => [{ :variant_id => variant.to_param, :quantity => 5 }] }
|
40
40
|
response.status.should == 200
|
41
41
|
order = Order.last
|
@@ -47,7 +47,7 @@ module Spree
|
|
47
47
|
|
48
48
|
context "working with an order" do
|
49
49
|
before do
|
50
|
-
|
50
|
+
create(:payment_method)
|
51
51
|
order.next # Switch from cart to address
|
52
52
|
order.ship_address.should be_nil
|
53
53
|
order.state.should == "address"
|
@@ -60,10 +60,10 @@ module Spree
|
|
60
60
|
end
|
61
61
|
|
62
62
|
let(:address_params) { { :country_id => Country.first.id, :state_id => State.first.id } }
|
63
|
-
let(:shipping_address) { clean_address(
|
64
|
-
let(:billing_address) { clean_address(
|
65
|
-
let!(:shipping_method) {
|
66
|
-
let!(:payment_method) {
|
63
|
+
let(:shipping_address) { clean_address(attributes_for(:address).merge!(address_params)) }
|
64
|
+
let(:billing_address) { clean_address(attributes_for(:address).merge!(address_params)) }
|
65
|
+
let!(:shipping_method) { create(:shipping_method) }
|
66
|
+
let!(:payment_method) { create(:payment_method) }
|
67
67
|
|
68
68
|
it "can add address information to an order" do
|
69
69
|
api_put :address, :id => order.to_param, :shipping_address => shipping_address, :billing_address => billing_address
|
@@ -104,7 +104,7 @@ module Spree
|
|
104
104
|
|
105
105
|
context "with a line item" do
|
106
106
|
before do
|
107
|
-
order.line_items <<
|
107
|
+
order.line_items << create(:line_item)
|
108
108
|
end
|
109
109
|
|
110
110
|
context "for delivery" do
|
@@ -2,8 +2,8 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
describe Spree::Api::V1::PaymentsController do
|
5
|
-
let!(:order) {
|
6
|
-
let!(:payment) {
|
5
|
+
let!(:order) { create(:order) }
|
6
|
+
let!(:payment) { create(:payment, :order => order) }
|
7
7
|
let!(:attributes) { [:id, :source_type, :source_id, :amount,
|
8
8
|
:payment_method_id, :response_code, :state, :avs_response,
|
9
9
|
:created_at, :updated_at] }
|
@@ -4,9 +4,9 @@ module Spree
|
|
4
4
|
describe Spree::Api::V1::ProductsController do
|
5
5
|
render_views
|
6
6
|
|
7
|
-
let!(:product) {
|
8
|
-
let!(:inactive_product) {
|
9
|
-
let(:attributes) { [:id, :name, :description, :price, :available_on, :permalink, :count_on_hand, :meta_description, :meta_keywords] }
|
7
|
+
let!(:product) { create(:product) }
|
8
|
+
let!(:inactive_product) { create(:product, :available_on => Time.now.tomorrow, :name => "inactive") }
|
9
|
+
let(:attributes) { [:id, :name, :description, :price, :available_on, :permalink, :count_on_hand, :meta_description, :meta_keywords, :taxon_ids] }
|
10
10
|
|
11
11
|
before do
|
12
12
|
stub_authentication!
|
@@ -30,7 +30,7 @@ module Spree
|
|
30
30
|
default_per_page(1)
|
31
31
|
|
32
32
|
it "can select the next page of products" do
|
33
|
-
second_product =
|
33
|
+
second_product = create(:product)
|
34
34
|
api_get :index, :page => 2
|
35
35
|
json_response["products"].first.should have_attributes(attributes)
|
36
36
|
json_response["count"].should == 2
|
@@ -40,7 +40,7 @@ module Spree
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "can search for products" do
|
43
|
-
|
43
|
+
create(:product, :name => "The best product in the world")
|
44
44
|
api_get :search, :q => { :name_cont => "best" }
|
45
45
|
json_response["products"].first.should have_attributes(attributes)
|
46
46
|
json_response["count"].should == 1
|
@@ -64,7 +64,7 @@ module Spree
|
|
64
64
|
|
65
65
|
|
66
66
|
context "finds a product by permalink first then by id" do
|
67
|
-
let!(:other_product) {
|
67
|
+
let!(:other_product) { create(:product, :permalink => "these-are-not-the-droids-you-are-looking-for") }
|
68
68
|
|
69
69
|
before do
|
70
70
|
product.update_attribute(:permalink, "#{other_product.id}-and-1-ways")
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::TaxonomiesController 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
|
+
json_response.first['taxonomy']['name'].should eq taxonomy.name
|
24
|
+
json_response.first['taxonomy']['root']['taxons'].count.should eq 1
|
25
|
+
end
|
26
|
+
|
27
|
+
it "gets a single taxonomy" do
|
28
|
+
api_get :show, :id => taxonomy.id
|
29
|
+
|
30
|
+
json_response['taxonomy']['name'].should eq taxonomy.name
|
31
|
+
|
32
|
+
children = json_response['taxonomy']['root']['taxons']
|
33
|
+
children.count.should eq 1
|
34
|
+
children.first['taxon']['name'].should eq taxon.name
|
35
|
+
children.first['taxon'].key?('taxons').should be_false
|
36
|
+
end
|
37
|
+
|
38
|
+
it "gets a single taxonomy with set=nested" do
|
39
|
+
api_get :show, :id => taxonomy.id, :set => 'nested'
|
40
|
+
|
41
|
+
json_response['taxonomy']['name'].should eq taxonomy.name
|
42
|
+
|
43
|
+
children = json_response['taxonomy']['root']['taxons']
|
44
|
+
children.first['taxon'].key?('taxons').should be_true
|
45
|
+
end
|
46
|
+
|
47
|
+
it "can learn how to create a new taxonomy" do
|
48
|
+
api_get :new
|
49
|
+
json_response["attributes"].should == attributes.map(&:to_s)
|
50
|
+
required_attributes = json_response["required_attributes"]
|
51
|
+
required_attributes.should include("name")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "cannot create a new taxonomy if not an admin" do
|
55
|
+
api_post :create, :taxonomy => { :name => "Location" }
|
56
|
+
assert_unauthorized!
|
57
|
+
end
|
58
|
+
|
59
|
+
it "cannot update a taxonomy" do
|
60
|
+
api_put :update, :id => taxonomy.id, :taxonomy => { :name => "I hacked your store!" }
|
61
|
+
assert_unauthorized!
|
62
|
+
end
|
63
|
+
|
64
|
+
it "cannot delete a taxonomy" do
|
65
|
+
api_delete :destroy, :id => taxonomy.id
|
66
|
+
assert_unauthorized!
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "as an admin" do
|
71
|
+
sign_in_as_admin!
|
72
|
+
|
73
|
+
it "can create" do
|
74
|
+
api_post :create, :taxonomy => { :name => "Colors"}
|
75
|
+
json_response.should have_attributes(attributes)
|
76
|
+
response.status.should == 201
|
77
|
+
end
|
78
|
+
|
79
|
+
it "cannot create a new taxonomy with invalid attributes" do
|
80
|
+
api_post :create, :taxonomy => {}
|
81
|
+
response.status.should == 422
|
82
|
+
json_response["error"].should == "Invalid resource. Please fix errors and try again."
|
83
|
+
errors = json_response["errors"]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::TaxonsController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let(:taxonomy) { Factory(:taxonomy) }
|
8
|
+
let(:taxon) { Factory(:taxon, :name => "Ruby", :taxonomy => taxonomy) }
|
9
|
+
let(:taxon2) { Factory(:taxon, :name => "Rails", :taxonomy => taxonomy) }
|
10
|
+
let(:attributes) { ["id", "name", "permalink", "position", "parent_id", "taxonomy_id"] }
|
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" do
|
21
|
+
api_get :index, :taxonomy_id => taxonomy.id
|
22
|
+
|
23
|
+
json_response.first['taxon']['name'].should eq taxon.name
|
24
|
+
children = json_response.first['taxon']['taxons']
|
25
|
+
children.count.should eq 1
|
26
|
+
children.first['taxon']['name'].should eq taxon2.name
|
27
|
+
children.first['taxon']['taxons'].count.should eq 1
|
28
|
+
end
|
29
|
+
|
30
|
+
it "gets a single taxon" do
|
31
|
+
api_get :show, :id => taxon.id, :taxonomy_id => taxonomy.id
|
32
|
+
|
33
|
+
json_response['taxon']['name'].should eq taxon.name
|
34
|
+
json_response['taxon']['taxons'].count.should eq 1
|
35
|
+
end
|
36
|
+
|
37
|
+
it "can learn how to create a new taxon" do
|
38
|
+
api_get :new, :taxonomy_id => taxonomy.id
|
39
|
+
json_response["attributes"].should == attributes.map(&:to_s)
|
40
|
+
required_attributes = json_response["required_attributes"]
|
41
|
+
required_attributes.should include("name")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "cannot create a new taxon if not an admin" do
|
45
|
+
api_post :create, :taxonomy_id => taxonomy.id, :taxon => { :name => "Location" }
|
46
|
+
assert_unauthorized!
|
47
|
+
end
|
48
|
+
|
49
|
+
it "cannot update a taxon" do
|
50
|
+
api_put :update, :taxonomy_id => taxonomy.id, :id => taxon.id, :taxon => { :name => "I hacked your store!" }
|
51
|
+
assert_unauthorized!
|
52
|
+
end
|
53
|
+
|
54
|
+
it "cannot delete a taxon" do
|
55
|
+
api_delete :destroy, :taxonomy_id => taxonomy.id, :id => taxon.id
|
56
|
+
assert_unauthorized!
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "as an admin" do
|
61
|
+
sign_in_as_admin!
|
62
|
+
|
63
|
+
it "can create" do
|
64
|
+
api_post :create, :taxonomy_id => taxonomy.id, :taxon => { :name => "Colors", :parent_id => taxon.id}
|
65
|
+
json_response.should have_attributes(attributes)
|
66
|
+
response.status.should == 201
|
67
|
+
|
68
|
+
taxon.reload.children.count.should eq 2
|
69
|
+
end
|
70
|
+
|
71
|
+
it "cannot create a new taxon with invalid attributes" do
|
72
|
+
api_post :create, :taxonomy_id => taxonomy.id, :taxon => {}
|
73
|
+
response.status.should == 422
|
74
|
+
json_response["error"].should == "Invalid resource. Please fix errors and try again."
|
75
|
+
errors = json_response["errors"]
|
76
|
+
|
77
|
+
taxon.reload.children.count.should eq 1
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -5,10 +5,10 @@ module Spree
|
|
5
5
|
render_views
|
6
6
|
|
7
7
|
|
8
|
-
let!(:product) {
|
8
|
+
let!(:product) { create(:product) }
|
9
9
|
let!(:variant) do
|
10
10
|
variant = product.master
|
11
|
-
variant.option_values <<
|
11
|
+
variant.option_values << create(:option_value)
|
12
12
|
variant
|
13
13
|
end
|
14
14
|
let!(:attributes) { [:id, :name, :count_on_hand,
|
data/spec/spec_helper.rb
CHANGED
@@ -16,6 +16,7 @@ require 'spree/api/testing_support/setup'
|
|
16
16
|
RSpec.configure do |config|
|
17
17
|
config.backtrace_clean_patterns = [/gems\/activesupport/, /gems\/actionpack/, /gems\/rspec/]
|
18
18
|
|
19
|
+
config.include FactoryGirl::Syntax::Methods
|
19
20
|
config.include Spree::Api::TestingSupport::Helpers, :type => :controller
|
20
21
|
config.extend Spree::Api::TestingSupport::Setup, :type => :controller
|
21
22
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,33 +9,33 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-05-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: spree_core
|
16
|
-
requirement: &
|
16
|
+
requirement: &70243020240540 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - =
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.1.
|
21
|
+
version: 1.1.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70243020240540
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: spree_auth
|
27
|
-
requirement: &
|
27
|
+
requirement: &70243020240060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - =
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.1.
|
32
|
+
version: 1.1.1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70243020240060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rabl
|
38
|
-
requirement: &
|
38
|
+
requirement: &70243020239600 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - =
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.6.5
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70243020239600
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec-rails
|
49
|
-
requirement: &
|
49
|
+
requirement: &70243020238960 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - =
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.9.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70243020238960
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: database_cleaner
|
60
|
-
requirement: &
|
60
|
+
requirement: &70243020238580 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70243020238580
|
69
69
|
description: Spree's API
|
70
70
|
email:
|
71
71
|
- ryan@spreecommerce.com
|
@@ -76,8 +76,9 @@ files:
|
|
76
76
|
- .gitignore
|
77
77
|
- Gemfile
|
78
78
|
- LICENSE
|
79
|
-
- README.md
|
80
79
|
- Rakefile
|
80
|
+
- app/controllers/spree/admin/users_controller_decorator.rb
|
81
|
+
- app/controllers/spree/api/v1/addresses_controller.rb
|
81
82
|
- app/controllers/spree/api/v1/base_controller.rb
|
82
83
|
- app/controllers/spree/api/v1/countries_controller.rb
|
83
84
|
- app/controllers/spree/api/v1/images_controller.rb
|
@@ -86,6 +87,8 @@ files:
|
|
86
87
|
- app/controllers/spree/api/v1/payments_controller.rb
|
87
88
|
- app/controllers/spree/api/v1/products_controller.rb
|
88
89
|
- app/controllers/spree/api/v1/shipments_controller.rb
|
90
|
+
- app/controllers/spree/api/v1/taxonomies_controller.rb
|
91
|
+
- app/controllers/spree/api/v1/taxons_controller.rb
|
89
92
|
- app/controllers/spree/api/v1/variants_controller.rb
|
90
93
|
- app/helpers/spree/api/api_helpers.rb
|
91
94
|
- app/models/spree/line_item_decorator.rb
|
@@ -93,6 +96,9 @@ files:
|
|
93
96
|
- app/models/spree/order_decorator.rb
|
94
97
|
- app/models/spree/payment_decorator.rb
|
95
98
|
- app/models/spree/user_decorator.rb
|
99
|
+
- app/overrides/api_admin_user_edit_form.rb
|
100
|
+
- app/views/spree/admin/users/_api_fields.html.erb
|
101
|
+
- app/views/spree/api/v1/addresses/show.rabl
|
96
102
|
- app/views/spree/api/v1/countries/index.rabl
|
97
103
|
- app/views/spree/api/v1/countries/show.rabl
|
98
104
|
- app/views/spree/api/v1/errors/gateway_error.rabl
|
@@ -123,10 +129,19 @@ files:
|
|
123
129
|
- app/views/spree/api/v1/products/product.rabl
|
124
130
|
- app/views/spree/api/v1/products/show.rabl
|
125
131
|
- app/views/spree/api/v1/shipments/show.rabl
|
132
|
+
- app/views/spree/api/v1/taxonomies/index.rabl
|
133
|
+
- app/views/spree/api/v1/taxonomies/nested.rabl
|
134
|
+
- app/views/spree/api/v1/taxonomies/new.rabl
|
135
|
+
- app/views/spree/api/v1/taxonomies/show.rabl
|
136
|
+
- app/views/spree/api/v1/taxons/index.rabl
|
137
|
+
- app/views/spree/api/v1/taxons/new.rabl
|
138
|
+
- app/views/spree/api/v1/taxons/show.rabl
|
139
|
+
- app/views/spree/api/v1/taxons/taxons.rabl
|
126
140
|
- app/views/spree/api/v1/variants/index.rabl
|
127
141
|
- app/views/spree/api/v1/variants/new.rabl
|
128
142
|
- app/views/spree/api/v1/variants/show.rabl
|
129
143
|
- app/views/spree/api/v1/variants/variant.rabl
|
144
|
+
- config/initializers/metal_load_paths.rb
|
130
145
|
- config/locales/en.yml
|
131
146
|
- config/routes.rb
|
132
147
|
- db/migrate/20100107141738_add_api_key_to_spree_users.rb
|
@@ -139,6 +154,7 @@ files:
|
|
139
154
|
- lib/spree/api/version.rb
|
140
155
|
- lib/spree_api.rb
|
141
156
|
- script/rails
|
157
|
+
- spec/controllers/spree/api/v1/addresses_controller_spec.rb
|
142
158
|
- spec/controllers/spree/api/v1/base_controller_spec.rb
|
143
159
|
- spec/controllers/spree/api/v1/countries_controller_spec.rb
|
144
160
|
- spec/controllers/spree/api/v1/images_controller_spec.rb
|
@@ -147,6 +163,8 @@ files:
|
|
147
163
|
- spec/controllers/spree/api/v1/payments_controller_spec.rb
|
148
164
|
- spec/controllers/spree/api/v1/products_controller_spec.rb
|
149
165
|
- spec/controllers/spree/api/v1/shipments_controller_spec.rb
|
166
|
+
- spec/controllers/spree/api/v1/taxonomies_controller_spec.rb
|
167
|
+
- spec/controllers/spree/api/v1/taxons_controller_spec.rb
|
150
168
|
- spec/controllers/spree/api/v1/variants_controller_spec.rb
|
151
169
|
- spec/fixtures/thinking-cat.jpg
|
152
170
|
- spec/models/spree/order_spec.rb
|
@@ -170,7 +188,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
188
|
version: '0'
|
171
189
|
segments:
|
172
190
|
- 0
|
173
|
-
hash:
|
191
|
+
hash: -3593481641416743509
|
174
192
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
193
|
none: false
|
176
194
|
requirements:
|
@@ -179,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
197
|
version: '0'
|
180
198
|
segments:
|
181
199
|
- 0
|
182
|
-
hash:
|
200
|
+
hash: -3593481641416743509
|
183
201
|
requirements: []
|
184
202
|
rubyforge_project:
|
185
203
|
rubygems_version: 1.8.10
|
@@ -187,6 +205,7 @@ signing_key:
|
|
187
205
|
specification_version: 3
|
188
206
|
summary: Spree's API
|
189
207
|
test_files:
|
208
|
+
- spec/controllers/spree/api/v1/addresses_controller_spec.rb
|
190
209
|
- spec/controllers/spree/api/v1/base_controller_spec.rb
|
191
210
|
- spec/controllers/spree/api/v1/countries_controller_spec.rb
|
192
211
|
- spec/controllers/spree/api/v1/images_controller_spec.rb
|
@@ -195,6 +214,8 @@ test_files:
|
|
195
214
|
- spec/controllers/spree/api/v1/payments_controller_spec.rb
|
196
215
|
- spec/controllers/spree/api/v1/products_controller_spec.rb
|
197
216
|
- spec/controllers/spree/api/v1/shipments_controller_spec.rb
|
217
|
+
- spec/controllers/spree/api/v1/taxonomies_controller_spec.rb
|
218
|
+
- spec/controllers/spree/api/v1/taxons_controller_spec.rb
|
198
219
|
- spec/controllers/spree/api/v1/variants_controller_spec.rb
|
199
220
|
- spec/fixtures/thinking-cat.jpg
|
200
221
|
- spec/models/spree/order_spec.rb
|
data/README.md
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# Api
|
2
|
-
|
3
|
-
TODO: Write a gem description
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
Add this line to your application's Gemfile:
|
8
|
-
|
9
|
-
gem 'api'
|
10
|
-
|
11
|
-
And then execute:
|
12
|
-
|
13
|
-
$ bundle
|
14
|
-
|
15
|
-
Or install it yourself as:
|
16
|
-
|
17
|
-
$ gem install api
|
18
|
-
|
19
|
-
## Usage
|
20
|
-
|
21
|
-
TODO: Write usage instructions here
|
22
|
-
|
23
|
-
## Contributing
|
24
|
-
|
25
|
-
1. Fork it
|
26
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
-
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|