solidus_backend 1.1.0 → 1.1.1

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -0
  3. data/Rakefile +15 -0
  4. data/script/rails +9 -0
  5. data/solidus_backend.gemspec +30 -0
  6. data/spec/controllers/spree/admin/base_controller_spec.rb +24 -0
  7. data/spec/controllers/spree/admin/cancellations_controller_spec.rb +77 -0
  8. data/spec/controllers/spree/admin/customer_returns_controller_spec.rb +234 -0
  9. data/spec/controllers/spree/admin/general_settings_controller_spec.rb +41 -0
  10. data/spec/controllers/spree/admin/missing_products_controller_spec.rb +18 -0
  11. data/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb +80 -0
  12. data/spec/controllers/spree/admin/orders_controller_spec.rb +460 -0
  13. data/spec/controllers/spree/admin/payment_methods_controller_spec.rb +49 -0
  14. data/spec/controllers/spree/admin/payments_controller_spec.rb +175 -0
  15. data/spec/controllers/spree/admin/product_properties_controller_spec.rb +69 -0
  16. data/spec/controllers/spree/admin/products_controller_spec.rb +162 -0
  17. data/spec/controllers/spree/admin/promotion_actions_controller_spec.rb +21 -0
  18. data/spec/controllers/spree/admin/promotion_codes_controller_spec.rb +18 -0
  19. data/spec/controllers/spree/admin/promotion_rules_controller_spec.rb +21 -0
  20. data/spec/controllers/spree/admin/promotions_controller_spec.rb +122 -0
  21. data/spec/controllers/spree/admin/refunds_controller_spec.rb +32 -0
  22. data/spec/controllers/spree/admin/reimbursements_controller_spec.rb +124 -0
  23. data/spec/controllers/spree/admin/reports_controller_spec.rb +134 -0
  24. data/spec/controllers/spree/admin/resource_controller_spec.rb +166 -0
  25. data/spec/controllers/spree/admin/return_authorizations_controller_spec.rb +240 -0
  26. data/spec/controllers/spree/admin/return_items_controller_spec.rb +27 -0
  27. data/spec/controllers/spree/admin/root_controller_spec.rb +41 -0
  28. data/spec/controllers/spree/admin/search_controller_spec.rb +104 -0
  29. data/spec/controllers/spree/admin/shipping_methods_controller_spec.rb +14 -0
  30. data/spec/controllers/spree/admin/stock_items_controller_spec.rb +50 -0
  31. data/spec/controllers/spree/admin/stock_locations_controller_spec.rb +41 -0
  32. data/spec/controllers/spree/admin/stock_transfers_controller_spec.rb +351 -0
  33. data/spec/controllers/spree/admin/store_credits_controller_spec.rb +309 -0
  34. data/spec/controllers/spree/admin/users_controller_spec.rb +257 -0
  35. data/spec/controllers/spree/admin/variants_controller_spec.rb +32 -0
  36. data/spec/features/admin/configuration/analytics_tracker_spec.rb +50 -0
  37. data/spec/features/admin/configuration/countries_spec.rb +22 -0
  38. data/spec/features/admin/configuration/general_settings_spec.rb +45 -0
  39. data/spec/features/admin/configuration/payment_methods_spec.rb +124 -0
  40. data/spec/features/admin/configuration/shipping_methods_spec.rb +64 -0
  41. data/spec/features/admin/configuration/states_spec.rb +64 -0
  42. data/spec/features/admin/configuration/stock_locations_spec.rb +50 -0
  43. data/spec/features/admin/configuration/tax_categories_spec.rb +56 -0
  44. data/spec/features/admin/configuration/tax_rates_spec.rb +30 -0
  45. data/spec/features/admin/configuration/taxonomies_spec.rb +52 -0
  46. data/spec/features/admin/configuration/zones_spec.rb +39 -0
  47. data/spec/features/admin/homepage_spec.rb +78 -0
  48. data/spec/features/admin/locale_spec.rb +30 -0
  49. data/spec/features/admin/orders/adjustments_promotions_spec.rb +53 -0
  50. data/spec/features/admin/orders/adjustments_spec.rb +126 -0
  51. data/spec/features/admin/orders/cancelling_and_resuming_spec.rb +48 -0
  52. data/spec/features/admin/orders/cancelling_inventory_spec.rb +48 -0
  53. data/spec/features/admin/orders/customer_details_spec.rb +163 -0
  54. data/spec/features/admin/orders/line_items_spec.rb +50 -0
  55. data/spec/features/admin/orders/listing_spec.rb +130 -0
  56. data/spec/features/admin/orders/log_entries_spec.rb +55 -0
  57. data/spec/features/admin/orders/new_order_spec.rb +185 -0
  58. data/spec/features/admin/orders/order_details_spec.rb +533 -0
  59. data/spec/features/admin/orders/payments_spec.rb +234 -0
  60. data/spec/features/admin/orders/risk_analysis_spec.rb +47 -0
  61. data/spec/features/admin/orders/shipments_spec.rb +65 -0
  62. data/spec/features/admin/payments/store_credits_spec.rb +21 -0
  63. data/spec/features/admin/products/edit/images_spec.rb +87 -0
  64. data/spec/features/admin/products/edit/products_spec.rb +66 -0
  65. data/spec/features/admin/products/edit/taxons_spec.rb +43 -0
  66. data/spec/features/admin/products/edit/variants_spec.rb +61 -0
  67. data/spec/features/admin/products/option_types_spec.rb +114 -0
  68. data/spec/features/admin/products/products_spec.rb +395 -0
  69. data/spec/features/admin/products/properties_spec.rb +139 -0
  70. data/spec/features/admin/products/prototypes_spec.rb +110 -0
  71. data/spec/features/admin/products/stock_management_spec.rb +82 -0
  72. data/spec/features/admin/products/variant_spec.rb +51 -0
  73. data/spec/features/admin/promotion_adjustments_spec.rb +220 -0
  74. data/spec/features/admin/promotions/option_value_rule_spec.rb +65 -0
  75. data/spec/features/admin/promotions/tiered_calculator_spec.rb +69 -0
  76. data/spec/features/admin/reports_spec.rb +61 -0
  77. data/spec/features/admin/stock_transfer_spec.rb +104 -0
  78. data/spec/features/admin/store_credits_spec.rb +82 -0
  79. data/spec/features/admin/taxons_spec.rb +31 -0
  80. data/spec/features/admin/users_spec.rb +275 -0
  81. data/spec/helpers/admin/base_helper_spec.rb +18 -0
  82. data/spec/helpers/admin/navigation_helper_spec.rb +73 -0
  83. data/spec/helpers/admin/reimbursements_helper_spec.rb +34 -0
  84. data/spec/helpers/admin/stock_movements_helper_spec.rb +29 -0
  85. data/spec/helpers/admin/store_credit_events_helper_spec.rb +95 -0
  86. data/spec/helpers/promotion_rules_helper_spec.rb +12 -0
  87. data/spec/spec_helper.rb +116 -0
  88. data/spec/support/appear_before_matcher.rb +8 -0
  89. data/spec/support/ror_ringer.jpeg +0 -0
  90. data/spec/test_views/spree/admin/widgets/edit.html.erb +1 -0
  91. data/spec/test_views/spree/admin/widgets/new.html.erb +1 -0
  92. metadata +96 -6
@@ -0,0 +1,460 @@
1
+ require 'spec_helper'
2
+ require 'cancan'
3
+ require 'spree/testing_support/bar_ability'
4
+
5
+ describe Spree::Admin::OrdersController, :type => :controller do
6
+
7
+ context "with authorization" do
8
+ stub_authorization!
9
+
10
+ before do
11
+ request.env["HTTP_REFERER"] = "http://localhost:3000"
12
+
13
+ # ensure no respond_overrides are in effect
14
+ if Spree::BaseController.spree_responders[:OrdersController].present?
15
+ Spree::BaseController.spree_responders[:OrdersController].clear
16
+ end
17
+ end
18
+
19
+ let(:order) do
20
+ mock_model(
21
+ Spree::Order,
22
+ completed?: true,
23
+ total: 100,
24
+ number: 'R123456789',
25
+ all_adjustments: adjustments,
26
+ ship_address: mock_model(Spree::Address),
27
+ )
28
+ end
29
+
30
+ let(:adjustments) { double('adjustments') }
31
+
32
+ before do
33
+ allow(Spree::Order).to receive_messages(find_by_number!: order)
34
+ allow(order).to receive_messages(contents: Spree::OrderContents.new(order))
35
+ end
36
+
37
+ context "#approve" do
38
+ it "approves an order" do
39
+ expect(order.contents).to receive(:approve).with(user: controller.try_spree_current_user)
40
+ spree_put :approve, id: order.number
41
+ expect(flash[:success]).to eq Spree.t(:order_approved)
42
+ end
43
+ end
44
+
45
+ context "#cancel" do
46
+ it "cancels an order" do
47
+ expect(order).to receive(:canceled_by).with(controller.try_spree_current_user)
48
+ spree_put :cancel, id: order.number
49
+ expect(flash[:success]).to eq Spree.t(:order_canceled)
50
+ end
51
+ end
52
+
53
+ context "#resume" do
54
+ it "resumes an order" do
55
+ expect(order).to receive(:resume!)
56
+ spree_put :resume, id: order.number
57
+ expect(flash[:success]).to eq Spree.t(:order_resumed)
58
+ end
59
+ end
60
+
61
+ context "pagination" do
62
+ it "can page through the orders" do
63
+ spree_get :index, :page => 2, :per_page => 10
64
+ expect(assigns[:orders].offset_value).to eq(10)
65
+ expect(assigns[:orders].limit_value).to eq(10)
66
+ end
67
+ end
68
+
69
+ # Test for #3346
70
+ context "#new" do
71
+ let(:user) { create(:user) }
72
+ before do
73
+ allow(controller).to receive_messages :spree_current_user => user
74
+ end
75
+
76
+ it "imports a new order and sets the current user as a creator" do
77
+ expect(Spree::Core::Importer::Order).to receive(:import)
78
+ .with(nil, hash_including(created_by_id: controller.try_spree_current_user.id))
79
+ .and_return(order)
80
+ spree_get :new
81
+ end
82
+
83
+ it "sets frontend_viewable to false" do
84
+ expect(Spree::Core::Importer::Order).to receive(:import)
85
+ .with(nil, hash_including(frontend_viewable: false ))
86
+ .and_return(order)
87
+ spree_get :new
88
+ end
89
+
90
+ it "should associate the order with a store" do
91
+ expect(Spree::Core::Importer::Order).to receive(:import)
92
+ .with(user, hash_including(store_id: controller.current_store.id))
93
+ .and_return(order)
94
+ spree_get :new, { user_id: user.id }
95
+ end
96
+
97
+ context "when a user_id is passed as a parameter" do
98
+ let(:user) { mock_model(Spree.user_class) }
99
+ before { allow(Spree.user_class).to receive_messages :find_by_id => user }
100
+
101
+ it "imports a new order and assigns the user to the order" do
102
+ expect(Spree::Core::Importer::Order).to receive(:import)
103
+ .with(user, hash_including(created_by_id: controller.try_spree_current_user.id))
104
+ .and_return(order)
105
+ spree_get :new, { user_id: user.id }
106
+ end
107
+ end
108
+
109
+ it "should redirect to cart" do
110
+ spree_get :new
111
+ expect(response).to redirect_to(spree.cart_admin_order_path(Spree::Order.last))
112
+ end
113
+ end
114
+
115
+ # Regression test for #3684
116
+ context "#edit" do
117
+ it "does not refresh rates if the order is completed" do
118
+ allow(order).to receive_messages :completed? => true
119
+ expect(order).not_to receive :refresh_shipment_rates
120
+ spree_get :edit, :id => order.number
121
+ end
122
+
123
+ it "does refresh the rates if the order is incomplete" do
124
+ allow(order).to receive_messages :completed? => false
125
+ expect(order).to receive :refresh_shipment_rates
126
+ spree_get :edit, :id => order.number
127
+ end
128
+
129
+ context "when order does not have a ship address" do
130
+ before do
131
+ allow(order).to receive_messages :ship_address => nil
132
+ end
133
+
134
+ context 'when order_bill_address_used is true' do
135
+ before { Spree::Config[:order_bill_address_used] = true }
136
+
137
+ it "should redirect to the customer details page" do
138
+ spree_get :edit, :id => order.number
139
+ expect(response).to redirect_to(spree.edit_admin_order_customer_path(order))
140
+ end
141
+ end
142
+
143
+ context 'when order_bill_address_used is false' do
144
+ before { Spree::Config[:order_bill_address_used] = false }
145
+
146
+ it "should redirect to the customer details page" do
147
+ spree_get :edit, :id => order.number
148
+ expect(response).to redirect_to(spree.edit_admin_order_customer_path(order))
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ describe '#advance' do
155
+ subject do
156
+ spree_put :advance, id: order.number
157
+ end
158
+
159
+ context 'when incomplete' do
160
+ before do
161
+ allow(order).to receive(:completed?).and_return(false, true)
162
+ allow(order).to receive(:next).and_return(true, false)
163
+ end
164
+
165
+ context 'when successful' do
166
+ before { allow(order).to receive(:confirm?).and_return(true) }
167
+
168
+ it 'messages and redirects' do
169
+ subject
170
+ expect(flash[:success]).to eq Spree.t('order_ready_for_confirm')
171
+ expect(response).to redirect_to(spree.confirm_admin_order_path(order))
172
+ end
173
+ end
174
+
175
+ context 'when unsuccessful' do
176
+ before do
177
+ allow(order).to receive(:confirm?).and_return(false)
178
+ allow(order).to receive(:errors).and_return(double(full_messages: ['failed']))
179
+ end
180
+
181
+ it 'messages and redirects' do
182
+ subject
183
+ expect(flash[:error]) == order.errors.full_messages
184
+ expect(response).to redirect_to(spree.confirm_admin_order_path(order))
185
+ end
186
+ end
187
+ end
188
+
189
+ context 'when already completed' do
190
+ before { allow(order).to receive_messages :completed? => true }
191
+
192
+ it 'messages and redirects' do
193
+ subject
194
+ expect(flash[:notice]).to eq Spree.t('order_already_completed')
195
+ expect(response).to redirect_to(spree.edit_admin_order_path(order))
196
+ end
197
+ end
198
+ end
199
+
200
+ context '#confirm' do
201
+ subject do
202
+ spree_get :confirm, id: order.number
203
+ end
204
+
205
+ context 'when in confirm' do
206
+ before { allow(order).to receive_messages completed?: false, confirm?: true }
207
+
208
+ it 'renders the confirm page' do
209
+ subject
210
+ expect(response.status).to eq 200
211
+ expect(response).to render_template(:confirm)
212
+ end
213
+ end
214
+
215
+ context 'when before confirm' do
216
+ before { allow(order).to receive_messages completed?: false, confirm?: false }
217
+
218
+ it 'renders the confirm_advance template (to allow refreshing of the order)' do
219
+ subject
220
+ expect(response.status).to eq 200
221
+ expect(response).to render_template(:confirm_advance)
222
+ end
223
+ end
224
+
225
+ context 'when already completed' do
226
+ before { allow(order).to receive_messages completed?: true }
227
+
228
+ it 'redirects to edit' do
229
+ subject
230
+ expect(response).to redirect_to(spree.edit_admin_order_path(order))
231
+ end
232
+ end
233
+ end
234
+
235
+ context "#complete" do
236
+ subject do
237
+ spree_put :complete, id: order.number
238
+ end
239
+
240
+ context 'when successful' do
241
+ before { allow(order).to receive(:complete!) }
242
+
243
+ it 'completes the order' do
244
+ expect(order).to receive(:complete!)
245
+ subject
246
+ end
247
+
248
+ it 'messages and redirects' do
249
+ subject
250
+ expect(flash[:success]).to eq Spree.t(:order_completed)
251
+ expect(response).to redirect_to(spree.edit_admin_order_path(order))
252
+ end
253
+ end
254
+
255
+ context 'with an StateMachines::InvalidTransition error' do
256
+ let(:order) { create(:order) }
257
+
258
+ it 'messages and redirects' do
259
+ subject
260
+ expect(response).to redirect_to(spree.confirm_admin_order_path(order))
261
+ expect(flash[:error].to_s).to include("Cannot transition state via :complete from :cart")
262
+ end
263
+ end
264
+
265
+ context 'insufficient stock to complete the order' do
266
+ before do
267
+ expect(order).to receive(:complete!).and_raise Spree::Order::InsufficientStock
268
+ end
269
+
270
+ it 'messages and redirects' do
271
+ subject
272
+ expect(response).to redirect_to(spree.cart_admin_order_path(order))
273
+ expect(flash[:error].to_s).to eq Spree.t(:insufficient_stock_for_order)
274
+ end
275
+ end
276
+ end
277
+
278
+ # Test for #3919
279
+ context "search" do
280
+ let(:user) { create(:user) }
281
+
282
+ before do
283
+ allow(controller).to receive_messages :spree_current_user => user
284
+ user.spree_roles << Spree::Role.find_or_create_by(name: 'admin')
285
+
286
+ create(:completed_order_with_totals)
287
+ expect(Spree::Order.count).to eq 1
288
+ end
289
+
290
+ it "does not display duplicated results" do
291
+ spree_get :index, q: {
292
+ line_items_variant_id_in: Spree::Order.first.variants.map(&:id)
293
+ }
294
+ expect(assigns[:orders].map { |o| o.number }.count).to eq 1
295
+ end
296
+ end
297
+
298
+ context "#not_finalized_adjustments" do
299
+ let(:order) { create(:order) }
300
+ let!(:finalized_adjustment) { create(:adjustment, finalized: true, adjustable: order, order: order) }
301
+
302
+ it "changes all the closed adjustments to open" do
303
+ spree_post :open_adjustments, id: order.number
304
+ expect(finalized_adjustment.reload.finalized).to eq(false)
305
+ end
306
+
307
+ it "sets the flash success message" do
308
+ spree_post :open_adjustments, id: order.number
309
+ expect(flash[:success]).to eql('All adjustments successfully opened!')
310
+ end
311
+
312
+ it "redirects back" do
313
+ spree_post :open_adjustments, id: order.number
314
+ expect(response).to redirect_to(:back)
315
+ end
316
+ end
317
+
318
+ context "#close_adjustments" do
319
+ let(:order) { create(:order) }
320
+ let!(:not_finalized_adjustment) { create(:adjustment, finalized: false, adjustable: order, order: order) }
321
+
322
+ it "changes all the open adjustments to closed" do
323
+ spree_post :close_adjustments, id: order.number
324
+ expect(not_finalized_adjustment.reload.finalized).to eq(true)
325
+ end
326
+
327
+ it "sets the flash success message" do
328
+ spree_post :close_adjustments, id: order.number
329
+ expect(flash[:success]).to eql('All adjustments successfully closed!')
330
+ end
331
+
332
+ it "redirects back" do
333
+ spree_post :close_adjustments, id: order.number
334
+ expect(response).to redirect_to(:back)
335
+ end
336
+ end
337
+ end
338
+
339
+ context '#authorize_admin' do
340
+ let(:user) { create(:user) }
341
+ let(:order) { create(:completed_order_with_totals, :number => 'R987654321') }
342
+
343
+ before do
344
+ allow(Spree::Order).to receive_messages :find_by_number! => order
345
+ allow(controller).to receive_messages :spree_current_user => user
346
+ end
347
+
348
+ it 'should grant access to users with an admin role' do
349
+ user.spree_roles << Spree::Role.find_or_create_by(name: 'admin')
350
+ spree_post :index
351
+ expect(response).to render_template :index
352
+ end
353
+
354
+ it 'should grant access to users with an bar role' do
355
+ user.spree_roles << Spree::Role.find_or_create_by(name: 'bar')
356
+ Spree::Ability.register_ability(BarAbility)
357
+ spree_post :index
358
+ expect(response).to render_template :index
359
+ Spree::Ability.remove_ability(BarAbility)
360
+ end
361
+
362
+ it 'should deny access to users with an bar role' do
363
+ allow(order).to receive(:update_attributes).and_return true
364
+ allow(order).to receive(:user).and_return Spree.user_class.new
365
+ allow(order).to receive(:token).and_return nil
366
+ user.spree_roles.clear
367
+ user.spree_roles << Spree::Role.find_or_create_by(name: 'bar')
368
+ Spree::Ability.register_ability(BarAbility)
369
+ spree_put :update, { :id => 'R123' }
370
+ expect(response).to redirect_to('/unauthorized')
371
+ Spree::Ability.remove_ability(BarAbility)
372
+ end
373
+
374
+ it 'should deny access to users without an admin role' do
375
+ allow(user).to receive_messages :has_spree_role? => false
376
+ spree_post :index
377
+ expect(response).to redirect_to('/unauthorized')
378
+ end
379
+
380
+ context 'with only permissions on Order' do
381
+ stub_authorization! do |ability|
382
+ can [:admin, :manage], Spree::Order, :number => 'R987654321'
383
+ end
384
+
385
+ it 'should restrict returned order(s) on index when using OrderSpecificAbility' do
386
+ number = order.number
387
+
388
+ 3.times { create(:completed_order_with_totals) }
389
+ expect(Spree::Order.complete.count).to eq 4
390
+
391
+ allow(user).to receive_messages :has_spree_role? => false
392
+ spree_get :index
393
+ expect(response).to render_template :index
394
+ expect(assigns['orders'].size).to eq 1
395
+ expect(assigns['orders'].first.number).to eq number
396
+ end
397
+ end
398
+ end
399
+
400
+ context "order number not given" do
401
+ stub_authorization!
402
+
403
+ it "raise active record not found" do
404
+ expect {
405
+ spree_get :edit, id: 0
406
+ }.to raise_error ActiveRecord::RecordNotFound
407
+ end
408
+ end
409
+
410
+ describe "#update" do
411
+ stub_authorization!
412
+
413
+ let(:order) { create(:order) }
414
+ let(:payload) do
415
+ {
416
+ id: order.number,
417
+ order: { email: "foo@bar.com" }
418
+ }
419
+ end
420
+
421
+ before do
422
+ allow(order.contents).to receive(:update_cart)
423
+ expect(Spree::Order).to receive(:find_by_number!) { order }
424
+ end
425
+ subject { spree_put :update, payload }
426
+
427
+ it "attempts to update the order" do
428
+ expect(order.contents).to receive(:update_cart).with(payload[:order])
429
+ subject
430
+ end
431
+
432
+ context "the order is already completed" do
433
+ before { allow(order).to receive(:completed?) { true } }
434
+
435
+ it "renders the edit route" do
436
+ subject
437
+ expect(response).to render_template(:edit)
438
+ end
439
+ end
440
+
441
+ context "the order is not completed" do
442
+ before { allow(order).to receive(:completed?) { false } }
443
+
444
+ it "redirects to the customer path" do
445
+ subject
446
+ expect(response).to redirect_to(spree.admin_order_customer_path(order))
447
+ end
448
+ end
449
+
450
+ context "the order has no line items" do
451
+ let(:order) { Spree::Order.new(:number => "1234") }
452
+
453
+ it "includes an error on the order" do
454
+ subject
455
+ expect(order.errors[:line_items]).to include Spree.t('errors.messages.blank')
456
+ end
457
+ end
458
+
459
+ end
460
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ class GatewayWithPassword < PaymentMethod
5
+ preference :password, :string, :default => "password"
6
+ end
7
+
8
+ describe Admin::PaymentMethodsController, :type => :controller do
9
+ stub_authorization!
10
+
11
+ let(:payment_method) { GatewayWithPassword.create!(:name => "Bogus", :preferred_password => "haxme") }
12
+
13
+ # regression test for #2094
14
+ it "does not clear password on update" do
15
+ expect(payment_method.preferred_password).to eq("haxme")
16
+ spree_put :update, :id => payment_method.id, :payment_method => { :type => payment_method.class.to_s, :preferred_password => "" }
17
+ expect(response).to redirect_to(spree.edit_admin_payment_method_path(payment_method))
18
+
19
+ payment_method.reload
20
+ expect(payment_method.preferred_password).to eq("haxme")
21
+ end
22
+
23
+ context "tries to save invalid payment" do
24
+ it "doesn't break, responds nicely" do
25
+ expect {
26
+ spree_post :create, :payment_method => { :name => "", :type => "Spree::Gateway::Bogus" }
27
+ }.not_to raise_error
28
+ end
29
+ end
30
+
31
+ it "can create a payment method of a valid type" do
32
+ expect {
33
+ spree_post :create, :payment_method => { :name => "Test Method", :type => "Spree::Gateway::Bogus" }
34
+ }.to change(Spree::PaymentMethod, :count).by(1)
35
+
36
+ expect(response).to be_redirect
37
+ expect(response).to redirect_to spree.edit_admin_payment_method_path(assigns(:payment_method))
38
+ end
39
+
40
+ it "can not create a payment method of an invalid type" do
41
+ expect {
42
+ spree_post :create, :payment_method => { :name => "Invalid Payment Method", :type => "Spree::InvalidType" }
43
+ }.to change(Spree::PaymentMethod, :count).by(0)
44
+
45
+ expect(response).to be_redirect
46
+ expect(response).to redirect_to spree.new_admin_payment_method_path
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ module Admin
5
+ describe PaymentsController, :type => :controller do
6
+ before do
7
+ allow(controller).to receive_messages :spree_current_user => user
8
+ end
9
+
10
+ let(:user) { create(:admin_user) }
11
+ let(:order) { create(:order) }
12
+
13
+ context "with a valid credit card" do
14
+ let(:order) { create(:order_with_line_items, :state => "payment") }
15
+ let(:payment_method) { create(:credit_card_payment_method, :display_on => "back_end") }
16
+ let(:attributes) do
17
+ {
18
+ :order_id => order.number,
19
+ :card => "new",
20
+ :payment => {
21
+ :amount => order.total,
22
+ :payment_method_id => payment_method.id.to_s,
23
+ :source_attributes => {
24
+ :name => "Test User",
25
+ :number => "4111 1111 1111 1111",
26
+ :expiry => "09 / #{Time.now.year + 1}",
27
+ :verification_value => "123"
28
+ }
29
+ }
30
+ }
31
+ end
32
+
33
+ before do
34
+ spree_post :create, attributes
35
+ end
36
+
37
+ it "should process payment correctly" do
38
+ expect(order.payments.count).to eq(1)
39
+ expect(order.payments.last.state).to eq 'checkout'
40
+ expect(response).to redirect_to(spree.admin_order_payments_path(order))
41
+ expect(order.reload.state).to eq('confirm')
42
+ end
43
+
44
+ context 'with credit card address fields' do
45
+ let(:address) { build(:address) }
46
+
47
+ let(:attributes) do
48
+ attrs = super()
49
+ attrs[:payment][:source_attributes][:address_attributes] = address_attributes
50
+ attrs
51
+ end
52
+
53
+ let(:address_attributes) do
54
+ {
55
+ 'firstname' => address.firstname,
56
+ 'lastname' => address.lastname,
57
+ 'address1' => address.address1,
58
+ 'city' => address.city,
59
+ 'country_id' => address.country_id,
60
+ 'state_id' => address.state_id,
61
+ 'zipcode' => address.zipcode,
62
+ 'phone' => address.phone,
63
+ }
64
+ end
65
+
66
+ it 'associates the address' do
67
+ expect(order.payments.count).to eq(1)
68
+ credit_card = order.payments.last.source
69
+ expect(credit_card.address.attributes).to include(address_attributes)
70
+ end
71
+ end
72
+ end
73
+
74
+ # Regression test for #3233
75
+ context "with a backend payment method" do
76
+ before do
77
+ @payment_method = create(:check_payment_method, :display_on => "back_end")
78
+ end
79
+
80
+ it "loads backend payment methods" do
81
+ spree_get :new, :order_id => order.number
82
+ expect(response.status).to eq(200)
83
+ expect(assigns[:payment_methods]).to include(@payment_method)
84
+ end
85
+ end
86
+
87
+ context "order has billing address" do
88
+ before do
89
+ order.bill_address = create(:address)
90
+ order.save!
91
+ end
92
+
93
+ context "order does not have payments" do
94
+ it "redirect to new payments page" do
95
+ spree_get :index, { amount: 100, order_id: order.number }
96
+ expect(response).to redirect_to(spree.new_admin_order_payment_path(order))
97
+ end
98
+ end
99
+
100
+ context "order has payments" do
101
+ before do
102
+ order.payments << create(:payment, amount: order.total, order: order, state: 'completed')
103
+ end
104
+
105
+ it "shows the payments page" do
106
+ spree_get :index, { amount: 100, order_id: order.number }
107
+ expect(response.code).to eq "200"
108
+ end
109
+ end
110
+
111
+ end
112
+
113
+ context "order does not have a billing address" do
114
+ before do
115
+ order.bill_address = nil
116
+ order.save
117
+ end
118
+
119
+ it "should redirect to the customer details page" do
120
+ spree_get :index, { amount: 100, order_id: order.number }
121
+ expect(response).to redirect_to(spree.edit_admin_order_customer_path(order))
122
+ end
123
+ end
124
+
125
+ describe 'fire' do
126
+ describe 'authorization' do
127
+ let(:payment) { create(:payment, state: 'checkout') }
128
+ let(:order) { payment.order }
129
+
130
+ context 'the user is authorized' do
131
+ class CaptureAllowedAbility
132
+ include CanCan::Ability
133
+
134
+ def initialize(user)
135
+ can :capture, Spree::Payment
136
+ end
137
+ end
138
+
139
+ before do
140
+ Spree::Ability.register_ability(CaptureAllowedAbility)
141
+ end
142
+
143
+ it 'allows the action' do
144
+ expect {
145
+ spree_post(:fire, id: payment.to_param, e: 'capture', order_id: order.to_param)
146
+ }.to change { payment.reload.state }.from('checkout').to('completed')
147
+ end
148
+ end
149
+
150
+ context 'the user is not authorized' do
151
+ class CaptureNotAllowedAbility
152
+ include CanCan::Ability
153
+
154
+ def initialize(user)
155
+ cannot :capture, Spree::Payment
156
+ end
157
+ end
158
+
159
+ before do
160
+ Spree::Ability.register_ability(CaptureNotAllowedAbility)
161
+ end
162
+
163
+ it 'does not allow the action' do
164
+ expect {
165
+ spree_post(:fire, id: payment.to_param, e: 'capture', order_id: order.to_param)
166
+ }.to_not change { payment.reload.state }
167
+ expect(flash[:error]).to eq('Authorization Failure')
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+ end
174
+ end
175
+ end