solidus_api 1.1.0.pre1 → 1.1.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_api might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f12beb38cf354e9a5e8be4a7a99d9af5b0350fb
4
- data.tar.gz: 3afecc41fd1020bf2c75e6b31c69feda1512d5e5
3
+ metadata.gz: 2fec876f748a73c00b4d7dbf63c2d3270a719ce7
4
+ data.tar.gz: b63a3f8f6ea3b237dd49057a787b9a2bd0e22afd
5
5
  SHA512:
6
- metadata.gz: ce431a0a22a1eb8500097691959273d005e1de0c478d9e30532ef9a40df9a8ea4ce54ac9612bdd4a49b711bb369153f8348d014775744438850c6bfe6459dd7a
7
- data.tar.gz: 132278ed5df8946142f6fd59715f6f508b8dacf5060775216abfd10aab59ff88090827d3ab629357b2e1c65f65ec6088f5444bb5cf90113c294476e42bb47980
6
+ metadata.gz: 2f89a236ed244de294c74ac119ce8ff13baf8f657e049d55ca8b32946ffb75b644b25ade0ae7a0e68f9d1233daa61e3e343788683d124af2212c74b6fbad8e84
7
+ data.tar.gz: d5637fc1f6611d61aeb4e517628da33db9b4335fe95e77e19738ff21cf4d5fe7387f16ccce6c6ecd56f6162f486e8bd293864ea8e7d749084f9425d479217b3a
@@ -2,32 +2,53 @@ module Spree
2
2
  module Api
3
3
  class AddressBooksController < Spree::Api::BaseController
4
4
  # Note: the AddressBook is the resource to think about here, not individual addresses
5
+ before_filter :load_user_addresses
5
6
 
6
7
  def show
7
- render_address_book
8
+ authorize! :show, address_book_user
9
+
10
+ render :show, status: :ok
8
11
  end
9
12
 
13
+ # Update a user's address book by adding an address to it or by updating
14
+ # the associated UserAddress (e.g. making it the default).
15
+ #
16
+ # @param user_id [String] the user id of the address book we're updating.
17
+ # @param address_book [Hash] any key-values permitted by
18
+ # permitted_address_book_attributes
19
+ # @return [Array] *All* of the user's addresses, since the resource here
20
+ # is the address book and since we may have mutated other UserAddresses
21
+ # (e.g. changed the 'default' flag). The user's default address will be
22
+ # flagged with default=true and the target address from this update will
23
+ # be flagged with update_target=true.
10
24
  def update
25
+ authorize! :save_in_address_book, address_book_user
26
+
11
27
  address_params = address_book_params
12
28
  default_flag = address_params.delete(:default)
13
- address = current_api_user.save_in_address_book(address_params, default_flag)
14
- if address.valid?
15
- render_address_book
29
+ @address = address_book_user.save_in_address_book(address_params, default_flag)
30
+ if @address.valid?
31
+ render :show, status: :ok
16
32
  else
17
- invalid_resource!(address)
33
+ invalid_resource!(@address)
18
34
  end
19
35
  end
20
36
 
21
37
  def destroy
22
- current_api_user.remove_from_address_book(params[:address_id])
23
- render_address_book
38
+ authorize! :remove_from_address_book, address_book_user
39
+
40
+ address_book_user.remove_from_address_book(params[:address_id])
41
+ render :show, status: :ok
24
42
  end
25
43
 
26
44
  private
27
45
 
28
- def render_address_book
29
- @user_addresses = current_api_user.user_addresses
30
- render :show, status: :ok
46
+ def address_book_user
47
+ @address_book_user ||= Spree.user_class.find(params[:user_id])
48
+ end
49
+
50
+ def load_user_addresses
51
+ @user_addresses ||= address_book_user.user_addresses
31
52
  end
32
53
 
33
54
  def address_book_params
@@ -37,8 +37,7 @@ module Spree
37
37
 
38
38
  def destroy
39
39
  @line_item = find_line_item
40
- variant = Spree::Variant.unscoped.find(@line_item.variant_id)
41
- @order.contents.remove(variant, @line_item.quantity)
40
+ @order.contents.remove_line_item(@line_item)
42
41
  respond_with(@line_item, status: 204)
43
42
  end
44
43
 
@@ -15,6 +15,10 @@ class Spree::Api::UsersController < Spree::Api::ResourceController
15
15
  end
16
16
 
17
17
  def permitted_resource_attributes
18
- super | [bill_address_attributes: permitted_address_attributes, ship_address_attributes: permitted_address_attributes]
18
+ if action_name == "create" || can?(:update_email, user)
19
+ super | [:email]
20
+ else
21
+ super
22
+ end
19
23
  end
20
24
  end
@@ -1,4 +1,7 @@
1
1
  collection @user_addresses
2
2
  node do |user_address|
3
- partial("spree/api/addresses/show", object: user_address.address).merge(default: user_address.default)
3
+ partial("spree/api/addresses/show", object: user_address.address).merge(
4
+ default: user_address.default,
5
+ update_target: @address == user_address.address,
6
+ )
4
7
  end
@@ -41,6 +41,13 @@ child order: :order do
41
41
 
42
42
  child payments: :payments do
43
43
  attributes :id, :amount, :display_amount, :state
44
+ child source: :source do |s|
45
+ attrs = [:id]
46
+ if s.respond_to?(:cc_type)
47
+ attrs << :cc_type
48
+ end
49
+ attributes *attrs
50
+ end
44
51
  child payment_method: :payment_method do
45
52
  attributes :id, :name
46
53
  end
@@ -1,7 +1,7 @@
1
1
  object @variant
2
2
  attributes *variant_attributes
3
3
 
4
- cache [I18n.locale, @current_user_roles.include?('admin'), 'big_variant', root_object]
4
+ cache [I18n.locale, Spree::StockLocation.accessible_by(current_ability).pluck(:id).sort.join(":"), 'big_variant', root_object]
5
5
 
6
6
  extends "spree/api/variants/small"
7
7
 
@@ -1,4 +1,4 @@
1
- cache [I18n.locale, @current_user_roles.include?('admin'), 'small_variant', root_object]
1
+ cache [I18n.locale, 'small_variant', root_object]
2
2
 
3
3
  attributes *variant_attributes
4
4
 
data/config/routes.rb CHANGED
@@ -107,6 +107,7 @@ Spree::Core::Engine.add_routes do
107
107
 
108
108
  resources :users do
109
109
  resources :credit_cards, only: [:index]
110
+ resource :address_book, only: [:show, :update, :destroy]
110
111
  end
111
112
 
112
113
  resources :credit_cards, only: [:update]
@@ -134,8 +135,6 @@ Spree::Core::Engine.add_routes do
134
135
  end
135
136
  end
136
137
 
137
- resource :address_book, only: [:show, :update, :destroy]
138
-
139
138
  get '/config/money', to: 'config#money'
140
139
  get '/config', to: 'config#show'
141
140
  put '/classifications', to: 'classifications#update', as: :classifications
@@ -226,7 +226,7 @@ module Spree
226
226
 
227
227
  describe 'GET #show' do
228
228
  let(:order) { create :order_with_line_items }
229
- let(:adjustment) { FactoryGirl.create(:adjustment, order: order) }
229
+ let(:adjustment) { FactoryGirl.create(:adjustment, adjustable: order, order: order) }
230
230
 
231
231
  subject { api_get :show, id: order.to_param }
232
232
 
@@ -162,6 +162,25 @@ describe Spree::Api::ShipmentsController, :type => :controller do
162
162
  subject
163
163
  expect(rendered_shipment_ids).to match_array current_api_user.orders.flat_map(&:shipments).map(&:id)
164
164
  end
165
+
166
+ context "credit card payment" do
167
+ before { subject }
168
+
169
+ it 'contains the id and cc_type of the credit card' do
170
+ expect(json_response['shipments'][0]['order']['payments'][0]['source'].keys).to match_array ["id", "cc_type"]
171
+ end
172
+ end
173
+
174
+ context "store credit payment" do
175
+ let(:current_api_user) { shipped_order.user }
176
+ let(:shipped_order) { create(:shipped_order, payment_type: :store_credit_payment) }
177
+
178
+ before { subject }
179
+
180
+ it 'only contains the id of the payment source' do
181
+ expect(json_response['shipments'][0]['order']['payments'][0]['source'].keys).to match_array ["id"]
182
+ end
183
+ end
165
184
  end
166
185
 
167
186
  context 'with filtering' do
@@ -46,6 +46,21 @@ module Spree
46
46
  end
47
47
  end
48
48
 
49
+ context "transfer item does not have stock in source location after ship" do
50
+ let(:variant_id) { transfer_item.variant.to_param }
51
+ let(:user) { create :user }
52
+
53
+ before do
54
+ stock_transfer.finalize(user)
55
+ stock_transfer.ship(shipped_at: Time.now)
56
+ stock_transfer.source_location.stock_item(transfer_item.variant_id).set_count_on_hand(0)
57
+ end
58
+
59
+ it "can still receive item" do
60
+ expect { subject }.to change { transfer_item.reload.received_quantity }.by(1)
61
+ end
62
+ end
63
+
49
64
  context "transfer item has been fully received" do
50
65
  let(:variant_id) { transfer_item.variant.to_param }
51
66
 
@@ -0,0 +1,222 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Api::AddressBooksController, :type => :request do
5
+ let!(:state) { create(:state) }
6
+ let!(:harry_address_attributes) do
7
+ {
8
+ 'firstname' => 'Harry',
9
+ 'lastname' => 'Potter',
10
+ 'address1' => '4 Privet Drive',
11
+ 'address2' => 'cupboard under the stairs',
12
+ 'city' => 'Surrey',
13
+ 'zipcode' => '10010',
14
+ 'phone' => '555-5555',
15
+ 'state_id' => state.id,
16
+ 'country_id' => state.country.id
17
+ }
18
+ end
19
+
20
+ let!(:ron_address_attributes) do
21
+ {
22
+ 'firstname' => 'Ron',
23
+ 'lastname' => 'Weasly',
24
+ 'address1' => 'Ottery St. Catchpole',
25
+ 'address2' => '4th floor',
26
+ 'city' => 'Devon, West Country',
27
+ 'zipcode' => '10010',
28
+ 'phone' => '555-5555',
29
+ 'state_id' => state.id,
30
+ 'country_id' => state.country.id
31
+ }
32
+ end
33
+
34
+ context 'as address book owner' do
35
+ context 'with ability' do
36
+ it 'returns my address book' do
37
+ user = create(:user, spree_api_key: 'galleon')
38
+ user.save_in_address_book(harry_address_attributes, true)
39
+ user.save_in_address_book(ron_address_attributes, false)
40
+
41
+ get "/api/users/#{user.id}/address_book", nil, { 'X-SPREE-TOKEN' => 'galleon'}
42
+
43
+ json_response = JSON.parse(response.body)
44
+ expect(response.status).to eq(200)
45
+ expect(json_response.length).to eq(2)
46
+ expect(json_response).to include(
47
+ hash_including(harry_address_attributes.merge!('default' => true)),
48
+ hash_including(ron_address_attributes.merge!('default' => false)),
49
+ )
50
+ end
51
+
52
+ it 'updates my address book' do
53
+ user = create(:user, spree_api_key: 'galleon')
54
+ address = user.save_in_address_book(harry_address_attributes, true)
55
+ harry_address_attributes['firstname'] = 'Ron'
56
+
57
+ expect {
58
+ put "/api/users/#{user.id}/address_book", { address_book: harry_address_attributes.merge('id' => address.id) }, { 'X-SPREE-TOKEN' => 'galleon' }
59
+ }.to change { UserAddress.count }.from(1).to(2)
60
+
61
+ expect(response.status).to eq(200)
62
+ expect(JSON.parse(response.body).first).to include(harry_address_attributes)
63
+ end
64
+
65
+ context 'when creating an address' do
66
+ it 'marks the update_target' do
67
+ user = create(:user, spree_api_key: 'galleon')
68
+
69
+ expect {
70
+ put "/api/users/#{user.id}/address_book", { address_book: harry_address_attributes }, { 'X-SPREE-TOKEN' => 'galleon' }
71
+ }.to change { UserAddress.count }.by(1)
72
+
73
+ user_address = UserAddress.last
74
+
75
+ expect(response.status).to eq(200)
76
+ update_target_ids = JSON.parse(response.body).select { |a| a['update_target'] }.map { |a| a['id'] }
77
+ expect(update_target_ids).to eq([user_address.address_id])
78
+ end
79
+ end
80
+
81
+ context 'when updating an address' do
82
+ it 'marks the update_target' do
83
+ user = create(:user, spree_api_key: 'galleon')
84
+ address = user.save_in_address_book(harry_address_attributes, true)
85
+
86
+ expect {
87
+ put "/api/users/#{user.id}/address_book", { address_book: harry_address_attributes }, { 'X-SPREE-TOKEN' => 'galleon' }
88
+ }.to_not change { UserAddress.count }
89
+
90
+ expect(response.status).to eq(200)
91
+ update_target_ids = JSON.parse(response.body).select { |a| a['update_target'] }.map { |a| a['id'] }
92
+ expect(update_target_ids).to eq([address.id])
93
+ end
94
+ end
95
+
96
+ it 'archives my address' do
97
+ address = create(:address)
98
+ user = create(:user, spree_api_key: 'galleon')
99
+ user.save_in_address_book(address.attributes, false)
100
+
101
+ expect {
102
+ delete "/api/users/#{user.id}/address_book", { address_id: address.id }, { 'X-SPREE-TOKEN' => 'galleon'}
103
+ }.to change { user.reload.user_addresses.count }.from(1).to(0)
104
+
105
+ expect(response.status).to eq(200)
106
+ end
107
+ end
108
+ end
109
+
110
+ context 'on behalf of address book owner' do
111
+ context 'with ability' do
112
+ before do
113
+ Spree::RoleConfiguration.configure do |config|
114
+ config.assign_permissions 'Prefect', [Spree::PermissionSets::UserManagement]
115
+ end
116
+ create(:user, spree_api_key: 'galleon', spree_roles: [build(:role, name: 'Prefect')])
117
+ end
118
+
119
+ it "returns another user's address book" do
120
+ other_user = create(:user)
121
+ other_user.save_in_address_book(harry_address_attributes, true)
122
+ other_user.save_in_address_book(ron_address_attributes, false)
123
+
124
+ get "/api/users/#{other_user.id}/address_book", nil, { 'X-SPREE-TOKEN' => 'galleon'}
125
+
126
+ json_response = JSON.parse(response.body)
127
+ expect(response.status).to eq(200)
128
+ expect(json_response.length).to eq(2)
129
+ expect(json_response).to include(
130
+ hash_including(harry_address_attributes.merge!('default' => true)),
131
+ hash_including(ron_address_attributes.merge!('default' => false)),
132
+ )
133
+ end
134
+
135
+ it "updates another user's address" do
136
+ other_user = create(:user)
137
+ address = other_user.save_in_address_book(harry_address_attributes, true)
138
+ updated_harry_address = harry_address_attributes.merge('firstname' => 'Ron')
139
+
140
+ expect {
141
+ put "/api/users/#{other_user.id}/address_book", { address_book: updated_harry_address.merge('id' => address.id) }, { 'X-SPREE-TOKEN' => 'galleon' }
142
+ }.to change { UserAddress.count }.from(1).to(2)
143
+
144
+ expect(response.status).to eq(200)
145
+ expect(JSON.parse(response.body).first).to include(updated_harry_address)
146
+ end
147
+
148
+ it "archives another user's address" do
149
+ address = create(:address)
150
+ other_user = create(:user)
151
+ other_user.save_in_address_book(address.attributes, false)
152
+
153
+ expect {
154
+ delete "/api/users/#{other_user.id}/address_book", { address_id: address.id }, { 'X-SPREE-TOKEN' => 'galleon'}
155
+ }.to change { other_user.reload.user_addresses.count }.from(1).to(0)
156
+
157
+ expect(response.status).to eq(200)
158
+ end
159
+ end
160
+
161
+ context 'without ability' do
162
+ it 'does not return another user address book' do
163
+ create(:user, spree_api_key: 'galleon')
164
+ other_user = create(:user)
165
+ other_user.save_in_address_book(harry_address_attributes, true)
166
+
167
+ get "/api/users/#{other_user.id}/address_book", nil, { 'X-SPREE-TOKEN' => 'galleon'}
168
+
169
+ expect(response.status).to eq(401)
170
+ end
171
+
172
+ it 'does not update another user address' do
173
+ address = create(:address)
174
+ other_user = create(:user)
175
+ other_user_address = other_user.save_in_address_book(address.attributes, true)
176
+ create(:user, spree_api_key: 'galleon')
177
+
178
+ expect {
179
+ put "/api/users/#{other_user.id}/address_book", { address_book: other_user_address.attributes.merge('address1' => 'Hogwarts') }, { 'X-SPREE-TOKEN' => 'galleon' }
180
+ }.not_to change { UserAddress.count }
181
+
182
+ expect(response.status).to eq(401)
183
+ end
184
+
185
+ it 'does not archive another user address' do
186
+ address = create(:address)
187
+ other_user = create(:user)
188
+ other_user.save_in_address_book(address.attributes, true)
189
+ create(:user, spree_api_key: 'galleon')
190
+
191
+ expect {
192
+ delete "/api/users/#{other_user.id}/address_book", { address_id: address.id }, { 'X-SPREE-TOKEN' => 'galleon' }
193
+ }.not_to change { other_user.user_addresses.count }
194
+
195
+ expect(response.status).to eq(401)
196
+ end
197
+ end
198
+ end
199
+
200
+
201
+ context 'unauthenticated' do
202
+ before do
203
+ @user = create(:user)
204
+ end
205
+
206
+ it 'GET returns a 401' do
207
+ get "/api/users/#{@user.id}/address_book"
208
+ expect(response.status).to eq(401)
209
+ end
210
+
211
+ it 'UPDATE returns a 401' do
212
+ put "/api/users/#{@user.id}/address_book"
213
+ expect(response.status).to eq(401)
214
+ end
215
+
216
+ it 'DELETE returns a 401' do
217
+ delete "/api/users/#{@user.id}/address_book"
218
+ expect(response.status).to eq(401)
219
+ end
220
+ end
221
+ end
222
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.pre1
4
+ version: 1.1.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Solidus Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-30 00:00:00.000000000 Z
11
+ date: 2015-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: solidus_core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.0.pre1
19
+ version: 1.1.0.pre2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.0.pre1
26
+ version: 1.1.0.pre2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rabl
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -215,7 +215,6 @@ files:
215
215
  - lib/spree_api.rb
216
216
  - script/rails
217
217
  - solidus_api.gemspec
218
- - spec/controllers/spree/api/address_books_controller_spec.rb
219
218
  - spec/controllers/spree/api/addresses_controller_spec.rb
220
219
  - spec/controllers/spree/api/base_controller_spec.rb
221
220
  - spec/controllers/spree/api/checkouts_controller_spec.rb
@@ -255,6 +254,7 @@ files:
255
254
  - spec/features/checkout_spec.rb
256
255
  - spec/fixtures/thinking-cat.jpg
257
256
  - spec/models/spree/legacy_user_spec.rb
257
+ - spec/requests/api/address_books_spec.rb
258
258
  - spec/requests/rabl_cache_spec.rb
259
259
  - spec/requests/ransackable_attributes_spec.rb
260
260
  - spec/shared_examples/protect_product_actions.rb
@@ -289,7 +289,6 @@ signing_key:
289
289
  specification_version: 4
290
290
  summary: REST API for the Solidus e-commerce framework.
291
291
  test_files:
292
- - spec/controllers/spree/api/address_books_controller_spec.rb
293
292
  - spec/controllers/spree/api/addresses_controller_spec.rb
294
293
  - spec/controllers/spree/api/base_controller_spec.rb
295
294
  - spec/controllers/spree/api/checkouts_controller_spec.rb
@@ -329,6 +328,7 @@ test_files:
329
328
  - spec/features/checkout_spec.rb
330
329
  - spec/fixtures/thinking-cat.jpg
331
330
  - spec/models/spree/legacy_user_spec.rb
331
+ - spec/requests/api/address_books_spec.rb
332
332
  - spec/requests/rabl_cache_spec.rb
333
333
  - spec/requests/ransackable_attributes_spec.rb
334
334
  - spec/shared_examples/protect_product_actions.rb
@@ -1,60 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Spree
4
- describe Api::AddressBooksController, :type => :controller do
5
- render_views
6
-
7
- context "unauthorized user" do
8
- it "get 401 on /show" do
9
- api_get :show
10
- expect(response.status).to eq 401
11
- end
12
-
13
- it "get 401 on /update" do
14
- api_put :update
15
- expect(response.status).to eq 401
16
- end
17
-
18
- it "get 401 on /destroy" do
19
- api_delete :destroy, address_id: 1
20
- expect(response.status).to eq 401
21
- end
22
- end
23
-
24
- context "authorized user with addresses" do
25
- let(:address1) { create(:address) }
26
- let(:address2) { create(:address, firstname: "Different") }
27
-
28
- before do
29
- stub_authentication!
30
- current_api_user.save_in_address_book(address1.attributes, true)
31
- current_api_user.save_in_address_book(address2.attributes, false)
32
- end
33
-
34
- it "gets their address book" do
35
- api_get :show
36
- expect(json_response.length).to eq 2
37
- end
38
-
39
- it "the first one is default" do
40
- api_get :show
41
- first, second = *json_response
42
- expect(first["default"]).to be true
43
- expect(second["default"]).to be false
44
- end
45
-
46
- it "can remove an address" do
47
- api_delete :destroy, address_id: address1.id
48
- expect(json_response.length).to eq 1
49
- end
50
-
51
- it "can update an address" do
52
- updated_params = address2.attributes
53
- updated_params[:firstname] = "Johnny"
54
- updated_params[:default] = true
55
- api_put :update, address_book: updated_params
56
- expect(json_response.first["firstname"]).to eq "Johnny"
57
- end
58
- end
59
- end
60
- end