solidus_api 2.9.6 → 2.11.0

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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -2
  3. data/app/controllers/spree/api/addresses_controller.rb +2 -2
  4. data/app/controllers/spree/api/base_controller.rb +21 -13
  5. data/app/controllers/spree/api/checkouts_controller.rb +1 -11
  6. data/app/controllers/spree/api/countries_controller.rb +2 -2
  7. data/app/controllers/spree/api/credit_cards_controller.rb +3 -3
  8. data/app/controllers/spree/api/customer_returns_controller.rb +67 -0
  9. data/app/controllers/spree/api/images_controller.rb +5 -5
  10. data/app/controllers/spree/api/inventory_units_controller.rb +2 -2
  11. data/app/controllers/spree/api/option_types_controller.rb +4 -4
  12. data/app/controllers/spree/api/option_values_controller.rb +3 -3
  13. data/app/controllers/spree/api/orders_controller.rb +11 -6
  14. data/app/controllers/spree/api/payments_controller.rb +2 -2
  15. data/app/controllers/spree/api/product_properties_controller.rb +9 -14
  16. data/app/controllers/spree/api/promotions_controller.rb +3 -12
  17. data/app/controllers/spree/api/properties_controller.rb +4 -4
  18. data/app/controllers/spree/api/resource_controller.rb +3 -3
  19. data/app/controllers/spree/api/return_authorizations_controller.rb +4 -4
  20. data/app/controllers/spree/api/shipments_controller.rb +2 -2
  21. data/app/controllers/spree/api/states_controller.rb +3 -3
  22. data/app/controllers/spree/api/stock_items_controller.rb +3 -3
  23. data/app/controllers/spree/api/stock_locations_controller.rb +4 -4
  24. data/app/controllers/spree/api/stock_movements_controller.rb +3 -3
  25. data/app/controllers/spree/api/stores_controller.rb +4 -4
  26. data/app/controllers/spree/api/taxonomies_controller.rb +5 -3
  27. data/app/controllers/spree/api/taxons_controller.rb +5 -5
  28. data/app/controllers/spree/api/users_controller.rb +13 -0
  29. data/app/controllers/spree/api/variants_controller.rb +4 -4
  30. data/app/controllers/spree/api/zones_controller.rb +3 -3
  31. data/app/helpers/spree/api/api_helpers.rb +20 -7
  32. data/app/views/spree/api/customer_returns/index.json.jbuilder +6 -0
  33. data/app/views/spree/api/customer_returns/new.json.jbuilder +4 -0
  34. data/app/views/spree/api/customer_returns/show.json.jbuilder +3 -0
  35. data/app/views/spree/api/errors/could_not_transition.json.jbuilder +4 -0
  36. data/app/views/spree/api/images/_image.json.jbuilder +2 -2
  37. data/app/views/spree/api/orders/_order.json.jbuilder +1 -1
  38. data/app/views/spree/api/orders/could_not_transition.json.jbuilder +5 -0
  39. data/app/views/spree/api/shared/_pagination.json.jbuilder +1 -1
  40. data/config/locales/en.yml +2 -0
  41. data/config/routes.rb +6 -3
  42. data/lib/spree/api.rb +0 -7
  43. data/lib/spree/api/config.rb +9 -0
  44. data/lib/spree/api/engine.rb +4 -4
  45. data/lib/spree/api/responders.rb +3 -2
  46. data/lib/spree/api/responders/{rabl_template.rb → jbuilder_template.rb} +3 -1
  47. data/lib/spree/api/testing_support/helpers.rb +1 -1
  48. data/{app/models → lib}/spree/api_configuration.rb +0 -0
  49. data/openapi/.stoplight.yml +7 -0
  50. data/openapi/authentication.md +33 -0
  51. data/openapi/checkout-flow.md +63 -0
  52. data/openapi/errors.md +3 -0
  53. data/openapi/lint.yml +1 -0
  54. data/openapi/main.hub.yml +65 -0
  55. data/openapi/pagination.md +7 -0
  56. data/openapi/solidus-api.oas.yml +6753 -0
  57. data/openapi/theme.css +0 -0
  58. data/solidus_api.gemspec +19 -19
  59. metadata +27 -115
  60. data/script/rails +0 -10
  61. data/spec/controllers/spree/api/base_controller_spec.rb +0 -118
  62. data/spec/controllers/spree/api/resource_controller_spec.rb +0 -190
  63. data/spec/features/checkout_spec.rb +0 -192
  64. data/spec/fixtures/thinking-cat.jpg +0 -0
  65. data/spec/models/spree/legacy_user_spec.rb +0 -103
  66. data/spec/requests/api/address_books_spec.rb +0 -240
  67. data/spec/requests/rabl_cache_spec.rb +0 -34
  68. data/spec/requests/ransackable_attributes_spec.rb +0 -79
  69. data/spec/requests/spree/api/addresses_controller_spec.rb +0 -57
  70. data/spec/requests/spree/api/checkouts_controller_spec.rb +0 -484
  71. data/spec/requests/spree/api/classifications_controller_spec.rb +0 -50
  72. data/spec/requests/spree/api/config_controller_spec.rb +0 -26
  73. data/spec/requests/spree/api/countries_controller_spec.rb +0 -48
  74. data/spec/requests/spree/api/coupon_codes_controller_spec.rb +0 -105
  75. data/spec/requests/spree/api/credit_cards_controller_spec.rb +0 -105
  76. data/spec/requests/spree/api/images_controller_spec.rb +0 -99
  77. data/spec/requests/spree/api/inventory_units_controller_spec.rb +0 -55
  78. data/spec/requests/spree/api/line_items_controller_spec.rb +0 -213
  79. data/spec/requests/spree/api/option_types_controller_spec.rb +0 -116
  80. data/spec/requests/spree/api/option_values_controller_spec.rb +0 -138
  81. data/spec/requests/spree/api/orders_controller_spec.rb +0 -954
  82. data/spec/requests/spree/api/payments_controller_spec.rb +0 -259
  83. data/spec/requests/spree/api/product_properties_controller_spec.rb +0 -114
  84. data/spec/requests/spree/api/products_controller_spec.rb +0 -422
  85. data/spec/requests/spree/api/promotion_application_spec.rb +0 -50
  86. data/spec/requests/spree/api/promotions_controller_spec.rb +0 -67
  87. data/spec/requests/spree/api/properties_controller_spec.rb +0 -102
  88. data/spec/requests/spree/api/return_authorizations_controller_spec.rb +0 -180
  89. data/spec/requests/spree/api/shipments_controller_spec.rb +0 -532
  90. data/spec/requests/spree/api/states_controller_spec.rb +0 -69
  91. data/spec/requests/spree/api/stock_items_controller_spec.rb +0 -311
  92. data/spec/requests/spree/api/stock_locations_controller_spec.rb +0 -170
  93. data/spec/requests/spree/api/stock_movements_controller_spec.rb +0 -81
  94. data/spec/requests/spree/api/store_credit_events_controller_spec.rb +0 -59
  95. data/spec/requests/spree/api/stores_controller_spec.rb +0 -134
  96. data/spec/requests/spree/api/taxonomies_controller_spec.rb +0 -114
  97. data/spec/requests/spree/api/taxons_controller_spec.rb +0 -217
  98. data/spec/requests/spree/api/unauthenticated_products_controller_spec.rb +0 -27
  99. data/spec/requests/spree/api/users_controller_spec.rb +0 -151
  100. data/spec/requests/spree/api/variants_controller_spec.rb +0 -340
  101. data/spec/requests/spree/api/zones_controller_spec.rb +0 -89
  102. data/spec/shared_examples/protect_product_actions.rb +0 -18
  103. data/spec/spec_helper.rb +0 -73
  104. data/spec/support/be_paginated_matcher.rb +0 -9
  105. data/spec/support/controller_hacks.rb +0 -43
  106. data/spec/support/database_cleaner.rb +0 -16
  107. data/spec/support/have_attributes_matcher.rb +0 -11
  108. data/spec/test_views/spree/api/widgets/_widget.json.jbuilder +0 -3
  109. data/spec/test_views/spree/api/widgets/index.json.jbuilder +0 -9
  110. data/spec/test_views/spree/api/widgets/new.json.jbuilder +0 -3
  111. data/spec/test_views/spree/api/widgets/show.json.jbuilder +0 -3
@@ -1,192 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe 'Api Feature Specs', type: :request do
7
- before do
8
- stub_spree_preferences(Spree::Api::Config, requires_authentication: false)
9
- end
10
- let!(:promotion) { FactoryBot.create(:promotion, :with_order_adjustment, code: 'foo', weighted_order_adjustment_amount: 10) }
11
- let(:promotion_code) { promotion.codes.first }
12
- let!(:store) { FactoryBot.create(:store) }
13
- let(:bill_address) { FactoryBot.create(:address) }
14
- let(:ship_address) { FactoryBot.create(:address) }
15
- let(:variant_1) { FactoryBot.create(:variant, price: 100.00) }
16
- let(:variant_2) { FactoryBot.create(:variant, price: 200.00) }
17
- let(:payment_method) { FactoryBot.create(:check_payment_method) }
18
- let!(:shipping_method) do
19
- FactoryBot.create(:shipping_method).tap do |shipping_method|
20
- shipping_method.zones.first.zone_members.create!(zoneable: ship_address.country)
21
- shipping_method.calculator.set_preference(:amount, 10.0)
22
- end
23
- end
24
-
25
- def parsed
26
- JSON.parse(response.body)
27
- end
28
-
29
- def login
30
- expect {
31
- post '/api/users', params: {
32
- user: {
33
- email: "featurecheckoutuser@example.com",
34
- password: "featurecheckoutuser"
35
- }
36
- }
37
- }.to change { Spree.user_class.count }.by 1
38
- expect(response).to have_http_status(:created)
39
- @user = Spree.user_class.find(parsed['id'])
40
-
41
- # copied from api testing helpers support since we can't really sign in
42
- allow(Spree::LegacyUser).to receive(:find_by).with(hash_including(:spree_api_key)) { @user }
43
- end
44
-
45
- def create_order(order_params: {})
46
- expect { post '/api/orders', params: order_params }.to change { Order.count }.by 1
47
- expect(response).to have_http_status(:created)
48
- @order = Order.find(parsed['id'])
49
- expect(@order.email).to eq "featurecheckoutuser@example.com"
50
- end
51
-
52
- def update_order(order_params: {})
53
- put "/api/orders/#{@order.number}", params: order_params
54
- expect(response).to have_http_status(:ok)
55
- end
56
-
57
- def create_line_item(variant, quantity = 1)
58
- expect {
59
- post "/api/orders/#{@order.number}/line_items",
60
- params: { line_item: { variant_id: variant.id, quantity: quantity } }
61
- }.to change { @order.line_items.count }.by 1
62
- expect(response).to have_http_status(:created)
63
- end
64
-
65
- def add_promotion(_promotion)
66
- expect {
67
- post "/api/orders/#{@order.number}/coupon_codes",
68
- params: { coupon_code: promotion_code.value }
69
- }.to change { @order.promotions.count }.by 1
70
- expect(response).to have_http_status(:ok)
71
- end
72
-
73
- def add_address(address, billing: true)
74
- address_type = billing ? :bill_address : :ship_address
75
- # It seems we are missing an order-scoped address api endpoint since we need
76
- # to use update here.
77
- expect {
78
- update_order(order_params: { order: { address_type => address.attributes.except('id') } })
79
- }.to change { @order.reload.public_send(address_type) }.to address
80
- end
81
-
82
- def add_payment
83
- expect {
84
- post "/api/orders/#{@order.number}/payments",
85
- params: { payment: { payment_method_id: payment_method.id } }
86
- }.to change { @order.reload.payments.count }.by 1
87
- expect(response).to have_http_status(:created)
88
- expect(@order.payments.last.payment_method).to eq payment_method
89
- end
90
-
91
- def advance
92
- put "/api/checkouts/#{@order.number}/advance"
93
- expect(response).to have_http_status(:ok)
94
- end
95
-
96
- def complete
97
- put "/api/checkouts/#{@order.number}/complete"
98
- expect(response).to have_http_status(:ok)
99
- end
100
-
101
- def assert_order_expectations
102
- @order.reload
103
- expect(@order.state).to eq 'complete'
104
- expect(@order.completed_at).to be_a ActiveSupport::TimeWithZone
105
- expect(@order.item_total).to eq 600.00
106
- expect(@order.total).to eq 600.00
107
- expect(@order.adjustment_total).to eq(-10.00)
108
- expect(@order.shipment_total).to eq 10.00
109
- expect(@order.user).to eq @user
110
- expect(@order.bill_address).to eq bill_address
111
- expect(@order.ship_address).to eq ship_address
112
- expect(@order.payments.length).to eq 1
113
- expect(@order.line_items.any? { |li| li.variant == variant_1 && li.quantity == 2 }).to eq true
114
- expect(@order.line_items.any? { |li| li.variant == variant_2 && li.quantity == 2 }).to eq true
115
- expect(@order.promotions).to eq [promotion]
116
- end
117
-
118
- it "is able to checkout with individualized requests" do
119
- login
120
- create_order
121
-
122
- create_line_item(variant_1, 2)
123
- add_promotion(promotion)
124
- create_line_item(variant_2, 2)
125
-
126
- add_address(bill_address)
127
- add_address(ship_address, billing: false)
128
-
129
- add_payment
130
-
131
- advance
132
- complete
133
-
134
- assert_order_expectations
135
- end
136
-
137
- it "is able to checkout with the create request" do
138
- login
139
-
140
- create_order(order_params: {
141
- order: {
142
- bill_address: bill_address.as_json.except('id'),
143
- ship_address: ship_address.as_json.except('id'),
144
- line_items: {
145
- 0 => { variant_id: variant_1.id, quantity: 2 },
146
- 1 => { variant_id: variant_2.id, quantity: 2 }
147
- },
148
- # Would like to do this, but it puts the payment in a complete state,
149
- # which the order does not like when transitioning from confirm to complete
150
- # since it looks to process pending payments.
151
- # payments: [ { payment_method: payment_method.name, state: "pending" } ],
152
- }
153
- })
154
-
155
- add_promotion(promotion)
156
- add_payment
157
-
158
- advance
159
- complete
160
-
161
- assert_order_expectations
162
- end
163
-
164
- it "is able to checkout with the update request" do
165
- login
166
-
167
- create_order
168
- update_order(order_params: {
169
- order: {
170
- bill_address: bill_address.as_json.except('id'),
171
- ship_address: ship_address.as_json.except('id'),
172
- line_items: {
173
- 0 => { variant_id: variant_1.id, quantity: 2 },
174
- 1 => { variant_id: variant_2.id, quantity: 2 }
175
- },
176
- # Would like to do this, but it puts the payment in a complete state,
177
- # which the order does not like when transitioning from confirm to complete
178
- # since it looks to process pending payments.
179
- # payments: [ { payment_method: payment_method.name, state: "pending" } ],
180
- }
181
- })
182
-
183
- add_promotion(promotion)
184
- add_payment
185
-
186
- advance
187
- complete
188
-
189
- assert_order_expectations
190
- end
191
- end
192
- end
@@ -1,103 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe LegacyUser, type: :model do
7
- let(:user) { LegacyUser.new }
8
-
9
- it "can generate an API key" do
10
- expect(user).to receive(:save!)
11
- expect { user.generate_spree_api_key! }.to change(user, :spree_api_key).to be_present
12
- end
13
-
14
- it "can generate an API key without persisting" do
15
- expect(user).not_to receive(:save!)
16
- expect { user.generate_spree_api_key }.to change(user, :spree_api_key).to be_present
17
- end
18
-
19
- it "can clear an API key" do
20
- user.spree_api_key = 'abc123'
21
- expect(user).to receive(:save!)
22
- expect { user.clear_spree_api_key! }.to change(user, :spree_api_key).to be_blank
23
- end
24
-
25
- it "can clear an api key without persisting" do
26
- user.spree_api_key = 'abc123'
27
- expect(user).not_to receive(:save!)
28
- expect { user.clear_spree_api_key }.to change(user, :spree_api_key).to be_blank
29
- end
30
-
31
- context "auto-api-key grant" do
32
- context "after role user create" do
33
- let(:user) { create(:user) }
34
- before { expect(user.spree_roles).to be_blank }
35
- subject { user.spree_roles << role }
36
-
37
- context "roles_for_auto_api_key default" do
38
- let(:role) { create(:role, name: "admin") }
39
-
40
- context "the user has no api key" do
41
- before { user.clear_spree_api_key! }
42
- it { expect { subject }.to change { user.reload.spree_api_key }.from(nil) }
43
- end
44
-
45
- context "the user already has an api key" do
46
- before { user.generate_spree_api_key! }
47
- it { expect { subject }.not_to change { user.reload.spree_api_key } }
48
- end
49
- end
50
-
51
- context "roles_for_auto_api_key is defined" do
52
- let(:role) { create(:role, name: 'hobbit') }
53
- let(:undesired_role) { create(:role, name: "foo") }
54
-
55
- before {
56
- user.clear_spree_api_key!
57
- stub_spree_preferences(roles_for_auto_api_key: ['hobbit'])
58
- }
59
-
60
- it { expect { subject }.to change { user.reload.spree_api_key }.from(nil) }
61
- it { expect { user.spree_roles << undesired_role }.not_to change { user.reload.spree_api_key } }
62
- end
63
-
64
- context "for all roles" do
65
- let(:role) { create(:role, name: 'hobbit') }
66
- let(:other_role) { create(:role, name: 'wizard') }
67
- let(:other_user) { create(:user) }
68
-
69
- before {
70
- user.clear_spree_api_key!
71
- other_user.clear_spree_api_key!
72
- stub_spree_preferences(generate_api_key_for_all_roles: true)
73
- }
74
-
75
- it { expect { subject }.to change { user.reload.spree_api_key }.from(nil) }
76
- it { expect { other_user.spree_roles << other_role }.to change { other_user.reload.spree_api_key }.from(nil) }
77
- end
78
- end
79
-
80
- context "after user create" do
81
- let(:user) { LegacyUser.new }
82
-
83
- context "generate_api_key_for_all_roles" do
84
- it "does not grant api key default" do
85
- expect(user.spree_api_key).to eq(nil)
86
-
87
- user.save!
88
- expect(user.spree_api_key).to eq(nil)
89
- end
90
-
91
- it "grants an api key on create when set to true" do
92
- stub_spree_preferences(generate_api_key_for_all_roles: true)
93
-
94
- expect(user.spree_api_key).to eq(nil)
95
-
96
- user.save!
97
- expect(user.spree_api_key).not_to eq(nil)
98
- end
99
- end
100
- end
101
- end
102
- end
103
- end
@@ -1,240 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::AddressBooksController, type: :request do
7
- let!(:state) { create(:state) }
8
- let!(:harry_address_attributes) do
9
- {
10
- 'firstname' => 'Harry',
11
- 'lastname' => 'Potter',
12
- 'address1' => '4 Privet Drive',
13
- 'address2' => 'cupboard under the stairs',
14
- 'city' => 'Surrey',
15
- 'zipcode' => '10010',
16
- 'phone' => '555-5555',
17
- 'state_id' => state.id,
18
- 'country_id' => state.country.id
19
- }
20
- end
21
-
22
- let!(:ron_address_attributes) do
23
- {
24
- 'firstname' => 'Ron',
25
- 'lastname' => 'Weasly',
26
- 'address1' => 'Ottery St. Catchpole',
27
- 'address2' => '4th floor',
28
- 'city' => 'Devon, West Country',
29
- 'zipcode' => '10010',
30
- 'phone' => '555-5555',
31
- 'state_id' => state.id,
32
- 'country_id' => state.country.id
33
- }
34
- end
35
-
36
- context 'as address book owner' do
37
- context 'with ability' do
38
- it 'returns my address book' do
39
- user = create(:user, spree_api_key: 'galleon')
40
- user.save_in_address_book(harry_address_attributes, true)
41
- user.save_in_address_book(ron_address_attributes, false)
42
-
43
- get "/api/users/#{user.id}/address_book",
44
- headers: { Authorization: 'Bearer galleon' }
45
-
46
- json_response = JSON.parse(response.body)
47
- expect(response.status).to eq(200)
48
- expect(json_response.length).to eq(2)
49
- expect(json_response).to include(
50
- hash_including(harry_address_attributes.merge!('default' => true)),
51
- hash_including(ron_address_attributes.merge!('default' => false))
52
- )
53
- end
54
-
55
- it 'updates my address book' do
56
- user = create(:user, spree_api_key: 'galleon')
57
- address = user.save_in_address_book(harry_address_attributes, true)
58
- harry_address_attributes['firstname'] = 'Ron'
59
-
60
- expect {
61
- put "/api/users/#{user.id}/address_book",
62
- params: { address_book: harry_address_attributes.merge('id' => address.id) },
63
- headers: { Authorization: 'Bearer galleon' }
64
- }.to change { UserAddress.count }.from(1).to(2)
65
-
66
- expect(response.status).to eq(200)
67
- expect(JSON.parse(response.body).first).to include(harry_address_attributes)
68
- end
69
-
70
- context 'when creating an address' do
71
- it 'marks the update_target' do
72
- user = create(:user, spree_api_key: 'galleon')
73
-
74
- expect {
75
- put "/api/users/#{user.id}/address_book",
76
- params: { address_book: harry_address_attributes },
77
- headers: { Authorization: 'Bearer galleon' }
78
- }.to change { UserAddress.count }.by(1)
79
-
80
- user_address = UserAddress.last
81
-
82
- expect(response.status).to eq(200)
83
- update_target_ids = JSON.parse(response.body).select { |a| a['update_target'] }.map { |a| a['id'] }
84
- expect(update_target_ids).to eq([user_address.address_id])
85
- end
86
- end
87
-
88
- context 'when updating an address' do
89
- it 'marks the update_target' do
90
- user = create(:user, spree_api_key: 'galleon')
91
- address = user.save_in_address_book(harry_address_attributes, true)
92
-
93
- expect {
94
- put "/api/users/#{user.id}/address_book",
95
- params: { address_book: harry_address_attributes },
96
- headers: { Authorization: 'Bearer galleon' }
97
- }.to_not change { UserAddress.count }
98
-
99
- expect(response.status).to eq(200)
100
- update_target_ids = JSON.parse(response.body).select { |a| a['update_target'] }.map { |a| a['id'] }
101
- expect(update_target_ids).to eq([address.id])
102
- end
103
- end
104
-
105
- it 'archives my address' do
106
- address = create(:address)
107
- user = create(:user, spree_api_key: 'galleon')
108
- user.save_in_address_book(address.attributes, false)
109
-
110
- expect {
111
- delete "/api/users/#{user.id}/address_book",
112
- params: { address_id: address.id },
113
- headers: { Authorization: 'Bearer galleon' }
114
- }.to change { user.reload.user_addresses.count }.from(1).to(0)
115
-
116
- expect(response.status).to eq(200)
117
- end
118
- end
119
- end
120
-
121
- context 'on behalf of address book owner' do
122
- context 'with ability' do
123
- before do
124
- Spree::Config.roles.assign_permissions 'Prefect', [Spree::PermissionSets::UserManagement]
125
- create(:user, spree_api_key: 'galleon', spree_roles: [build(:role, name: 'Prefect')])
126
- end
127
-
128
- it "returns another user's address book" do
129
- other_user = create(:user)
130
- other_user.save_in_address_book(harry_address_attributes, true)
131
- other_user.save_in_address_book(ron_address_attributes, false)
132
-
133
- get "/api/users/#{other_user.id}/address_book",
134
- headers: { Authorization: 'Bearer galleon' }
135
-
136
- json_response = JSON.parse(response.body)
137
- expect(response.status).to eq(200)
138
- expect(json_response.length).to eq(2)
139
- expect(json_response).to include(
140
- hash_including(harry_address_attributes.merge!('default' => true)),
141
- hash_including(ron_address_attributes.merge!('default' => false))
142
- )
143
- end
144
-
145
- it "updates another user's address" do
146
- other_user = create(:user)
147
- address = other_user.save_in_address_book(harry_address_attributes, true)
148
- updated_harry_address = harry_address_attributes.merge('firstname' => 'Ron')
149
-
150
- expect {
151
- put "/api/users/#{other_user.id}/address_book",
152
- params: { address_book: updated_harry_address.merge('id' => address.id) },
153
- headers: { Authorization: 'Bearer galleon' }
154
- }.to change { UserAddress.count }.from(1).to(2)
155
-
156
- expect(response.status).to eq(200)
157
- expect(JSON.parse(response.body).first).to include(updated_harry_address)
158
- end
159
-
160
- it "archives another user's address" do
161
- address = create(:address)
162
- other_user = create(:user)
163
- other_user.save_in_address_book(address.attributes, false)
164
-
165
- expect {
166
- delete "/api/users/#{other_user.id}/address_book",
167
- params: { address_id: address.id },
168
- headers: { Authorization: 'Bearer galleon' }
169
- }.to change { other_user.reload.user_addresses.count }.from(1).to(0)
170
-
171
- expect(response.status).to eq(200)
172
- end
173
- end
174
-
175
- context 'without ability' do
176
- it 'does not return another user address book' do
177
- create(:user, spree_api_key: 'galleon')
178
- other_user = create(:user)
179
- other_user.save_in_address_book(harry_address_attributes, true)
180
-
181
- get "/api/users/#{other_user.id}/address_book",
182
- headers: { Authorization: 'Bearer galleon' }
183
-
184
- expect(response.status).to eq(401)
185
- end
186
-
187
- it 'does not update another user address' do
188
- address = create(:address)
189
- other_user = create(:user)
190
- other_user_address = other_user.save_in_address_book(address.attributes, true)
191
- create(:user, spree_api_key: 'galleon')
192
-
193
- expect {
194
- put "/api/users/#{other_user.id}/address_book",
195
- params: { address_book: other_user_address.attributes.merge('address1' => 'Hogwarts') },
196
- headers: { Authorization: 'Bearer galleon' }
197
- }.not_to change { UserAddress.count }
198
-
199
- expect(response.status).to eq(401)
200
- end
201
-
202
- it 'does not archive another user address' do
203
- address = create(:address)
204
- other_user = create(:user)
205
- other_user.save_in_address_book(address.attributes, true)
206
- create(:user, spree_api_key: 'galleon')
207
-
208
- expect {
209
- delete "/api/users/#{other_user.id}/address_book",
210
- params: { address_id: address.id },
211
- headers: { Authorization: 'Bearer galleon' }
212
- }.not_to change { other_user.user_addresses.count }
213
-
214
- expect(response.status).to eq(401)
215
- end
216
- end
217
- end
218
-
219
- context 'unauthenticated' do
220
- before do
221
- @user = create(:user)
222
- end
223
-
224
- it 'GET returns a 401' do
225
- get "/api/users/#{@user.id}/address_book"
226
- expect(response.status).to eq(401)
227
- end
228
-
229
- it 'UPDATE returns a 401' do
230
- put "/api/users/#{@user.id}/address_book"
231
- expect(response.status).to eq(401)
232
- end
233
-
234
- it 'DELETE returns a 401' do
235
- delete "/api/users/#{@user.id}/address_book"
236
- expect(response.status).to eq(401)
237
- end
238
- end
239
- end
240
- end