solidus_api 1.1.0.pre1 → 1.1.0.pre2

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.

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