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.
- checksums.yaml +4 -4
- data/Gemfile +6 -0
- data/Rakefile +15 -0
- data/script/rails +9 -0
- data/solidus_backend.gemspec +30 -0
- data/spec/controllers/spree/admin/base_controller_spec.rb +24 -0
- data/spec/controllers/spree/admin/cancellations_controller_spec.rb +77 -0
- data/spec/controllers/spree/admin/customer_returns_controller_spec.rb +234 -0
- data/spec/controllers/spree/admin/general_settings_controller_spec.rb +41 -0
- data/spec/controllers/spree/admin/missing_products_controller_spec.rb +18 -0
- data/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb +80 -0
- data/spec/controllers/spree/admin/orders_controller_spec.rb +460 -0
- data/spec/controllers/spree/admin/payment_methods_controller_spec.rb +49 -0
- data/spec/controllers/spree/admin/payments_controller_spec.rb +175 -0
- data/spec/controllers/spree/admin/product_properties_controller_spec.rb +69 -0
- data/spec/controllers/spree/admin/products_controller_spec.rb +162 -0
- data/spec/controllers/spree/admin/promotion_actions_controller_spec.rb +21 -0
- data/spec/controllers/spree/admin/promotion_codes_controller_spec.rb +18 -0
- data/spec/controllers/spree/admin/promotion_rules_controller_spec.rb +21 -0
- data/spec/controllers/spree/admin/promotions_controller_spec.rb +122 -0
- data/spec/controllers/spree/admin/refunds_controller_spec.rb +32 -0
- data/spec/controllers/spree/admin/reimbursements_controller_spec.rb +124 -0
- data/spec/controllers/spree/admin/reports_controller_spec.rb +134 -0
- data/spec/controllers/spree/admin/resource_controller_spec.rb +166 -0
- data/spec/controllers/spree/admin/return_authorizations_controller_spec.rb +240 -0
- data/spec/controllers/spree/admin/return_items_controller_spec.rb +27 -0
- data/spec/controllers/spree/admin/root_controller_spec.rb +41 -0
- data/spec/controllers/spree/admin/search_controller_spec.rb +104 -0
- data/spec/controllers/spree/admin/shipping_methods_controller_spec.rb +14 -0
- data/spec/controllers/spree/admin/stock_items_controller_spec.rb +50 -0
- data/spec/controllers/spree/admin/stock_locations_controller_spec.rb +41 -0
- data/spec/controllers/spree/admin/stock_transfers_controller_spec.rb +351 -0
- data/spec/controllers/spree/admin/store_credits_controller_spec.rb +309 -0
- data/spec/controllers/spree/admin/users_controller_spec.rb +257 -0
- data/spec/controllers/spree/admin/variants_controller_spec.rb +32 -0
- data/spec/features/admin/configuration/analytics_tracker_spec.rb +50 -0
- data/spec/features/admin/configuration/countries_spec.rb +22 -0
- data/spec/features/admin/configuration/general_settings_spec.rb +45 -0
- data/spec/features/admin/configuration/payment_methods_spec.rb +124 -0
- data/spec/features/admin/configuration/shipping_methods_spec.rb +64 -0
- data/spec/features/admin/configuration/states_spec.rb +64 -0
- data/spec/features/admin/configuration/stock_locations_spec.rb +50 -0
- data/spec/features/admin/configuration/tax_categories_spec.rb +56 -0
- data/spec/features/admin/configuration/tax_rates_spec.rb +30 -0
- data/spec/features/admin/configuration/taxonomies_spec.rb +52 -0
- data/spec/features/admin/configuration/zones_spec.rb +39 -0
- data/spec/features/admin/homepage_spec.rb +78 -0
- data/spec/features/admin/locale_spec.rb +30 -0
- data/spec/features/admin/orders/adjustments_promotions_spec.rb +53 -0
- data/spec/features/admin/orders/adjustments_spec.rb +126 -0
- data/spec/features/admin/orders/cancelling_and_resuming_spec.rb +48 -0
- data/spec/features/admin/orders/cancelling_inventory_spec.rb +48 -0
- data/spec/features/admin/orders/customer_details_spec.rb +163 -0
- data/spec/features/admin/orders/line_items_spec.rb +50 -0
- data/spec/features/admin/orders/listing_spec.rb +130 -0
- data/spec/features/admin/orders/log_entries_spec.rb +55 -0
- data/spec/features/admin/orders/new_order_spec.rb +185 -0
- data/spec/features/admin/orders/order_details_spec.rb +533 -0
- data/spec/features/admin/orders/payments_spec.rb +234 -0
- data/spec/features/admin/orders/risk_analysis_spec.rb +47 -0
- data/spec/features/admin/orders/shipments_spec.rb +65 -0
- data/spec/features/admin/payments/store_credits_spec.rb +21 -0
- data/spec/features/admin/products/edit/images_spec.rb +87 -0
- data/spec/features/admin/products/edit/products_spec.rb +66 -0
- data/spec/features/admin/products/edit/taxons_spec.rb +43 -0
- data/spec/features/admin/products/edit/variants_spec.rb +61 -0
- data/spec/features/admin/products/option_types_spec.rb +114 -0
- data/spec/features/admin/products/products_spec.rb +395 -0
- data/spec/features/admin/products/properties_spec.rb +139 -0
- data/spec/features/admin/products/prototypes_spec.rb +110 -0
- data/spec/features/admin/products/stock_management_spec.rb +82 -0
- data/spec/features/admin/products/variant_spec.rb +51 -0
- data/spec/features/admin/promotion_adjustments_spec.rb +220 -0
- data/spec/features/admin/promotions/option_value_rule_spec.rb +65 -0
- data/spec/features/admin/promotions/tiered_calculator_spec.rb +69 -0
- data/spec/features/admin/reports_spec.rb +61 -0
- data/spec/features/admin/stock_transfer_spec.rb +104 -0
- data/spec/features/admin/store_credits_spec.rb +82 -0
- data/spec/features/admin/taxons_spec.rb +31 -0
- data/spec/features/admin/users_spec.rb +275 -0
- data/spec/helpers/admin/base_helper_spec.rb +18 -0
- data/spec/helpers/admin/navigation_helper_spec.rb +73 -0
- data/spec/helpers/admin/reimbursements_helper_spec.rb +34 -0
- data/spec/helpers/admin/stock_movements_helper_spec.rb +29 -0
- data/spec/helpers/admin/store_credit_events_helper_spec.rb +95 -0
- data/spec/helpers/promotion_rules_helper_spec.rb +12 -0
- data/spec/spec_helper.rb +116 -0
- data/spec/support/appear_before_matcher.rb +8 -0
- data/spec/support/ror_ringer.jpeg +0 -0
- data/spec/test_views/spree/admin/widgets/edit.html.erb +1 -0
- data/spec/test_views/spree/admin/widgets/new.html.erb +1 -0
- metadata +96 -6
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Admin::ReportsController, :type => :controller do
|
|
4
|
+
stub_authorization!
|
|
5
|
+
|
|
6
|
+
describe 'ReportsController.available_reports' do
|
|
7
|
+
it 'should contain sales_total' do
|
|
8
|
+
expect(Spree::Admin::ReportsController.available_reports.keys.include?(:sales_total)).to be true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it 'should have the proper sales total report description' do
|
|
12
|
+
expect(Spree::Admin::ReportsController.available_reports[:sales_total][:description]).to eql('Sales Total For All Orders')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe 'ReportsController.add_available_report!' do
|
|
18
|
+
context 'when adding the report name' do
|
|
19
|
+
it 'should contain the report' do
|
|
20
|
+
Spree::Admin::ReportsController.add_available_report!(:some_report)
|
|
21
|
+
expect(Spree::Admin::ReportsController.available_reports.keys.include?(:some_report)).to be true
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe 'GET sales_total' do
|
|
27
|
+
|
|
28
|
+
let!(:order_complete_start_of_month) { create(:completed_order_with_totals) }
|
|
29
|
+
let!(:order_complete_mid_month) { create(:completed_order_with_totals) }
|
|
30
|
+
let!(:order_non_complete) { create(:order, completed_at: nil) }
|
|
31
|
+
|
|
32
|
+
before do
|
|
33
|
+
# can't set completed_at during factory creation
|
|
34
|
+
order_complete_start_of_month.completed_at = Time.zone.now.beginning_of_month + 1.minute
|
|
35
|
+
order_complete_start_of_month.save!
|
|
36
|
+
|
|
37
|
+
order_complete_mid_month.completed_at = Time.zone.now.beginning_of_month + 15.days
|
|
38
|
+
order_complete_mid_month.save!
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
subject { spree_get :sales_total, params }
|
|
42
|
+
|
|
43
|
+
shared_examples 'sales total report' do
|
|
44
|
+
it 'should respond with success' do
|
|
45
|
+
expect(response).to be_success
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should set search to be a ransack search' do
|
|
49
|
+
subject
|
|
50
|
+
expect(assigns(:search)).to be_a Ransack::Search
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'should set orders correctly for date parameters' do
|
|
54
|
+
subject
|
|
55
|
+
expect(assigns(:orders)).to eq expected_returned_orders
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'does not include non-complete orders' do
|
|
59
|
+
subject
|
|
60
|
+
expect(assigns(:orders)).to_not include(order_non_complete)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should correctly set the totals hash' do
|
|
64
|
+
subject
|
|
65
|
+
expect(assigns(:totals)).to eq expected_totals
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'when no dates are specified' do
|
|
70
|
+
let(:params) { { } }
|
|
71
|
+
|
|
72
|
+
it_behaves_like 'sales total report' do
|
|
73
|
+
let(:expected_returned_orders) { [order_complete_mid_month, order_complete_start_of_month] }
|
|
74
|
+
let(:expected_totals) {
|
|
75
|
+
{
|
|
76
|
+
'USD' => {
|
|
77
|
+
item_total: Money.new(2000, 'USD'),
|
|
78
|
+
adjustment_total: Money.new(0, 'USD'),
|
|
79
|
+
sales_total: Money.new(22000, 'USD')
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context 'when params has a completed_at_gt' do
|
|
87
|
+
let(:params) { { q: { completed_at_gt: Time.zone.now.beginning_of_month + 1.day } } }
|
|
88
|
+
|
|
89
|
+
it_behaves_like 'sales total report' do
|
|
90
|
+
let(:expected_returned_orders) { [order_complete_mid_month] }
|
|
91
|
+
let(:expected_totals) {
|
|
92
|
+
{
|
|
93
|
+
'USD' => {
|
|
94
|
+
item_total: Money.new(1000, 'USD'),
|
|
95
|
+
adjustment_total: Money.new(0, 'USD'),
|
|
96
|
+
sales_total: Money.new(11000, 'USD')
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
context 'when params has a compeleted_at_lt' do
|
|
104
|
+
let(:params) { { q: { completed_at_lt: Time.zone.now.beginning_of_month } } }
|
|
105
|
+
|
|
106
|
+
it_behaves_like 'sales total report' do
|
|
107
|
+
let(:expected_returned_orders) { [order_complete_start_of_month] }
|
|
108
|
+
let(:expected_totals) {
|
|
109
|
+
{
|
|
110
|
+
'USD' => {
|
|
111
|
+
item_total: Money.new(1000, 'USD'),
|
|
112
|
+
adjustment_total: Money.new(0, 'USD'),
|
|
113
|
+
sales_total: Money.new(11000, 'USD')
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe 'GET index' do
|
|
122
|
+
it 'should be ok' do
|
|
123
|
+
spree_get :index
|
|
124
|
+
expect(response).to be_ok
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
after(:each) do
|
|
129
|
+
Spree::Admin::ReportsController.available_reports.delete_if do |key, value|
|
|
130
|
+
key != :sales_total
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Admin
|
|
5
|
+
class WidgetsController < Spree::Admin::ResourceController
|
|
6
|
+
prepend_view_path('spec/test_views')
|
|
7
|
+
|
|
8
|
+
def model_class
|
|
9
|
+
Widget
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe Spree::Admin::WidgetsController, :type => :controller do
|
|
16
|
+
stub_authorization!
|
|
17
|
+
|
|
18
|
+
after(:all) do
|
|
19
|
+
# Spree::Core::Engine.routes.reload_routes!
|
|
20
|
+
Rails.application.reload_routes!
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
with_model 'Widget', scope: :all do
|
|
24
|
+
table do |t|
|
|
25
|
+
t.string :name
|
|
26
|
+
t.integer :position
|
|
27
|
+
t.timestamps null: false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
model do
|
|
31
|
+
acts_as_list
|
|
32
|
+
validates :name, presence: true
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
before do
|
|
37
|
+
Spree::Core::Engine.routes.draw do
|
|
38
|
+
namespace :admin do
|
|
39
|
+
resources :widgets do
|
|
40
|
+
post :update_positions, on: :member
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe '#new' do
|
|
47
|
+
subject do
|
|
48
|
+
spree_get :new
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'succeeds' do
|
|
52
|
+
subject
|
|
53
|
+
expect(response).to be_success
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe '#edit' do
|
|
58
|
+
let(:widget) { Widget.create!(name: 'a widget') }
|
|
59
|
+
|
|
60
|
+
subject do
|
|
61
|
+
spree_get :edit, id: widget.to_param
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'succeeds' do
|
|
65
|
+
subject
|
|
66
|
+
expect(response).to be_success
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe '#create' do
|
|
71
|
+
let(:params) do
|
|
72
|
+
{widget: {name: 'a widget'}}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
subject { spree_post :create, params }
|
|
76
|
+
|
|
77
|
+
it 'creates the resource' do
|
|
78
|
+
expect { subject }.to change { Widget.count }.by(1)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context 'failure' do
|
|
82
|
+
let(:params) do
|
|
83
|
+
{widget: {name: ''}} # blank name generates an error
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'sets a flash error' do
|
|
87
|
+
subject
|
|
88
|
+
expect(flash[:error]).to eq assigns(:widget).errors.full_messages.join(', ')
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
context 'without any parameters' do
|
|
93
|
+
let(:params) { {} }
|
|
94
|
+
|
|
95
|
+
before do
|
|
96
|
+
allow_any_instance_of(Widget).to receive(:name).and_return('some name')
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it 'creates the resource' do
|
|
100
|
+
expect { subject }.to change { Widget.count }.by(1)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
describe '#update' do
|
|
106
|
+
let(:widget) { Widget.create!(name: 'a widget') }
|
|
107
|
+
|
|
108
|
+
let(:params) do
|
|
109
|
+
{
|
|
110
|
+
id: widget.to_param,
|
|
111
|
+
widget: {name: 'widget renamed'},
|
|
112
|
+
}
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
subject { spree_put :update, params }
|
|
116
|
+
|
|
117
|
+
it 'updates the resource' do
|
|
118
|
+
expect { subject }.to change { widget.reload.name }.from('a widget').to('widget renamed')
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
context 'failure' do
|
|
122
|
+
let(:params) do
|
|
123
|
+
{
|
|
124
|
+
id: widget.to_param,
|
|
125
|
+
widget: {name: ''}, # a blank name will trigger a validation error
|
|
126
|
+
}
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'sets a flash error' do
|
|
130
|
+
subject
|
|
131
|
+
expect(flash[:error]).to eq assigns(:widget).errors.full_messages.join(', ')
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe '#destroy' do
|
|
137
|
+
let!(:widget) { Widget.create!(name: 'a widget') }
|
|
138
|
+
let(:params) { {id: widget.id} }
|
|
139
|
+
|
|
140
|
+
subject {
|
|
141
|
+
spree_delete :destroy, params
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
it 'destroys the resource' do
|
|
145
|
+
expect { subject }.to change { Widget.count }.from(1).to(0)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
describe '#update_positions' do
|
|
150
|
+
let(:widget_1) { Widget.create!(name: 'widget 1', position: 1) }
|
|
151
|
+
let(:widget_2) { Widget.create!(name: 'widget 2', position: 2) }
|
|
152
|
+
|
|
153
|
+
subject do
|
|
154
|
+
spree_post :update_positions, id: widget_1.to_param,
|
|
155
|
+
positions: { widget_1.id => '2', widget_2.id => '1' }, format: 'js'
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it 'updates the position of widget 1' do
|
|
159
|
+
expect { subject }.to change { widget_1.reload.position }.from(1).to(2)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it 'updates the position of widget 2' do
|
|
163
|
+
expect { subject }.to change { widget_2.reload.position }.from(2).to(1)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Admin::ReturnAuthorizationsController, :type => :controller do
|
|
4
|
+
stub_authorization!
|
|
5
|
+
|
|
6
|
+
# Regression test for #1370 #3
|
|
7
|
+
let!(:order) { create(:shipped_order, line_items_count: 3) }
|
|
8
|
+
let!(:return_reason) { create(:return_reason) }
|
|
9
|
+
let(:inventory_unit_1) { order.inventory_units.order('id asc')[0] }
|
|
10
|
+
let(:inventory_unit_2) { order.inventory_units.order('id asc')[1] }
|
|
11
|
+
let(:inventory_unit_3) { order.inventory_units.order('id asc')[2] }
|
|
12
|
+
|
|
13
|
+
describe "#load_return_reasons" do
|
|
14
|
+
let!(:inactive_rma_reason) { create(:return_reason, active: false) }
|
|
15
|
+
|
|
16
|
+
context "a return item in the return authorization has an associated inactive reason" do
|
|
17
|
+
let!(:other_inactive_rma_reason) { create(:return_reason, active: false) }
|
|
18
|
+
let(:return_item) { create(:return_item, return_reason: inactive_rma_reason) }
|
|
19
|
+
let(:return_authorization) { return_item.return_authorization }
|
|
20
|
+
|
|
21
|
+
it "loads all the active rma reasons" do
|
|
22
|
+
spree_get :edit, id: return_authorization.to_param, order_id: return_authorization.order.to_param
|
|
23
|
+
expect(assigns(:reasons)).to include(return_reason)
|
|
24
|
+
expect(assigns(:reasons)).to include(inactive_rma_reason)
|
|
25
|
+
expect(assigns(:reasons)).not_to include(other_inactive_rma_reason)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "return authorization has an associated active reason" do
|
|
30
|
+
let(:return_authorization) { create(:return_authorization, reason: return_reason) }
|
|
31
|
+
|
|
32
|
+
it "loads all the active rma reasons" do
|
|
33
|
+
spree_get :edit, id: return_authorization.to_param, order_id: return_authorization.order.to_param
|
|
34
|
+
expect(assigns(:reasons)).to eq [return_reason]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "return authorization doesn't have an associated reason" do
|
|
39
|
+
it "loads all the active rma reasons" do
|
|
40
|
+
spree_get :new, order_id: order.to_param
|
|
41
|
+
expect(assigns(:reasons)).to eq [return_reason]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "#load_return_items" do
|
|
47
|
+
shared_context 'without existing return items' do
|
|
48
|
+
context 'without existing return items' do
|
|
49
|
+
it 'has 3 new @form_return_items' do
|
|
50
|
+
subject
|
|
51
|
+
expect(assigns(:form_return_items).size).to eq 3
|
|
52
|
+
expect(assigns(:form_return_items).select(&:new_record?).size).to eq 3
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
shared_context 'with existing return items' do
|
|
58
|
+
context 'with existing return items' do
|
|
59
|
+
let!(:return_item_1) { create(:return_item, inventory_unit: inventory_unit_1, return_authorization: return_authorization) }
|
|
60
|
+
|
|
61
|
+
it 'has 1 existing return item and 2 new return items' do
|
|
62
|
+
subject
|
|
63
|
+
expect(assigns(:form_return_items).size).to eq 3
|
|
64
|
+
expect(assigns(:form_return_items).select(&:persisted?)).to eq [return_item_1]
|
|
65
|
+
expect(assigns(:form_return_items).select(&:new_record?).size).to eq 2
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context '#new' do
|
|
71
|
+
subject { spree_get :new, order_id: order.to_param }
|
|
72
|
+
|
|
73
|
+
include_context 'without existing return items'
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context '#edit' do
|
|
77
|
+
subject do
|
|
78
|
+
spree_get :edit, {
|
|
79
|
+
id: return_authorization.to_param,
|
|
80
|
+
order_id: order.to_param,
|
|
81
|
+
}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
let(:return_authorization) { create(:return_authorization, order: order) }
|
|
85
|
+
|
|
86
|
+
include_context 'without existing return items'
|
|
87
|
+
include_context 'with existing return items'
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context '#create failed' do
|
|
91
|
+
subject do
|
|
92
|
+
spree_post :create, {
|
|
93
|
+
return_authorization: {stock_location_id: nil}, # return authorization requires valid stock location, so this will fail
|
|
94
|
+
order_id: order.to_param,
|
|
95
|
+
}
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
include_context 'without existing return items'
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
context '#update failed' do
|
|
102
|
+
subject do
|
|
103
|
+
spree_put :update, {
|
|
104
|
+
return_authorization: {stock_location_id: nil}, # return authorization requires valid stock location, so this will fail
|
|
105
|
+
id: return_authorization.to_param,
|
|
106
|
+
order_id: order.to_param,
|
|
107
|
+
}
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
let(:return_authorization) { create(:return_authorization, order: order) }
|
|
111
|
+
|
|
112
|
+
include_context 'without existing return items'
|
|
113
|
+
include_context 'with existing return items'
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
describe "#load_reimbursement_types" do
|
|
118
|
+
let(:order) { create(:order) }
|
|
119
|
+
let!(:inactive_reimbursement_type) { create(:reimbursement_type, active: false) }
|
|
120
|
+
let!(:first_active_reimbursement_type) { create(:reimbursement_type) }
|
|
121
|
+
let!(:second_active_reimbursement_type) { create(:reimbursement_type) }
|
|
122
|
+
|
|
123
|
+
before do
|
|
124
|
+
spree_get :new, order_id: order.to_param
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "loads all the active reimbursement types" do
|
|
128
|
+
expect(assigns(:reimbursement_types)).to include(first_active_reimbursement_type)
|
|
129
|
+
expect(assigns(:reimbursement_types)).to include(second_active_reimbursement_type)
|
|
130
|
+
expect(assigns(:reimbursement_types)).not_to include(inactive_reimbursement_type)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
describe "#load_stock_locations" do
|
|
135
|
+
let!(:active_stock_location) { create(:stock_location, active: true) }
|
|
136
|
+
let!(:inactive_stock_location) { create(:stock_location, active: false) }
|
|
137
|
+
|
|
138
|
+
before do
|
|
139
|
+
spree_get :new, order_id: order.to_param
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "loads all the active stock locations" do
|
|
143
|
+
expect(assigns(:stock_locations)).to include(active_stock_location)
|
|
144
|
+
expect(assigns(:stock_locations)).not_to include(inactive_stock_location)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context '#create' do
|
|
149
|
+
let(:stock_location) { create(:stock_location) }
|
|
150
|
+
|
|
151
|
+
subject { spree_post :create, params }
|
|
152
|
+
|
|
153
|
+
let(:params) do
|
|
154
|
+
{
|
|
155
|
+
order_id: order.to_param,
|
|
156
|
+
return_authorization: return_authorization_params,
|
|
157
|
+
}
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
let(:return_authorization_params) do
|
|
161
|
+
{
|
|
162
|
+
memo: "",
|
|
163
|
+
stock_location_id: stock_location.id,
|
|
164
|
+
return_reason_id: return_reason.id,
|
|
165
|
+
}
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "can create a return authorization" do
|
|
169
|
+
subject
|
|
170
|
+
expect(response).to redirect_to spree.admin_order_return_authorizations_path(order)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context '#update' do
|
|
175
|
+
let(:return_authorization) { create(:return_authorization, order: order) }
|
|
176
|
+
|
|
177
|
+
let(:params) do
|
|
178
|
+
{
|
|
179
|
+
id: return_authorization.to_param,
|
|
180
|
+
order_id: order.to_param,
|
|
181
|
+
return_authorization: return_authorization_params,
|
|
182
|
+
}
|
|
183
|
+
end
|
|
184
|
+
let(:return_authorization_params) do
|
|
185
|
+
{
|
|
186
|
+
memo: "",
|
|
187
|
+
return_items_attributes: return_items_params,
|
|
188
|
+
}
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
subject { spree_put :update, params }
|
|
192
|
+
|
|
193
|
+
context "adding an item" do
|
|
194
|
+
let(:return_items_params) do
|
|
195
|
+
{
|
|
196
|
+
'0' => {inventory_unit_id: inventory_unit_1.to_param}
|
|
197
|
+
}
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
context 'without existing items' do
|
|
201
|
+
it 'creates a new item' do
|
|
202
|
+
expect { subject }.to change { Spree::ReturnItem.count }.by(1)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
context 'with existing completed items' do
|
|
207
|
+
let!(:completed_return_item) do
|
|
208
|
+
create(:return_item, {
|
|
209
|
+
return_authorization: return_authorization,
|
|
210
|
+
inventory_unit: inventory_unit_1,
|
|
211
|
+
reception_status: 'received',
|
|
212
|
+
})
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it 'does not create new items' do
|
|
216
|
+
expect { subject }.to_not change { Spree::ReturnItem.count }
|
|
217
|
+
expect(assigns[:return_authorization].errors['return_items.inventory_unit']).to eq ["#{inventory_unit_1.id} has already been taken by return item #{completed_return_item.id}"]
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
context "removing an item" do
|
|
223
|
+
let!(:return_item) do
|
|
224
|
+
create(:return_item, return_authorization: return_authorization, inventory_unit: inventory_unit_1)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
let(:return_items_params) do
|
|
228
|
+
{
|
|
229
|
+
'0' => {id: return_item.to_param, _destroy: '1'}
|
|
230
|
+
}
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
context 'with existing items' do
|
|
234
|
+
it 'removes the item' do
|
|
235
|
+
expect { subject }.to change { Spree::ReturnItem.count }.by(-1)
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Admin::ReturnItemsController, :type => :controller do
|
|
4
|
+
stub_authorization!
|
|
5
|
+
|
|
6
|
+
describe '#update' do
|
|
7
|
+
let(:customer_return) { create(:customer_return) }
|
|
8
|
+
let(:return_item) { customer_return.return_items.first }
|
|
9
|
+
let(:old_acceptance_status) { 'pending' }
|
|
10
|
+
let(:new_acceptance_status) { 'rejected' }
|
|
11
|
+
|
|
12
|
+
subject do
|
|
13
|
+
spree_put :update, id: return_item.to_param, return_item: {acceptance_status: new_acceptance_status}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'updates the return item' do
|
|
17
|
+
expect {
|
|
18
|
+
subject
|
|
19
|
+
}.to change { return_item.reload.acceptance_status }.from(old_acceptance_status).to(new_acceptance_status)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'redirects to the customer return' do
|
|
23
|
+
subject
|
|
24
|
+
expect(response).to redirect_to spree.edit_admin_order_customer_return_path(customer_return.order, customer_return)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Admin::RootController do
|
|
4
|
+
describe "GET index" do
|
|
5
|
+
subject { get :index }
|
|
6
|
+
|
|
7
|
+
let(:user) { build(:user) }
|
|
8
|
+
let(:ability) { Spree::Ability.new(user) }
|
|
9
|
+
|
|
10
|
+
before do
|
|
11
|
+
allow_any_instance_of(Spree::Admin::RootController).to receive(:try_spree_current_user).and_return(user)
|
|
12
|
+
allow_any_instance_of(Spree::Admin::RootController).to receive(:current_ability).and_return(ability)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "when a user can admin and display spree orders" do
|
|
16
|
+
before do
|
|
17
|
+
ability.can :admin, Spree::Order
|
|
18
|
+
ability.can :display, Spree::Order
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it { is_expected.to redirect_to(spree.admin_orders_path) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "when a user cannot admin and display spree orders" do
|
|
25
|
+
context "when a user can admin and home dashboards" do
|
|
26
|
+
before do
|
|
27
|
+
ability.can :admin, :dashboards
|
|
28
|
+
ability.can :home, :dashboards
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it { is_expected.to redirect_to(spree.home_admin_dashboards_path) }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "when a user cannot admin and home dashboards" do
|
|
35
|
+
# The default exception handler redirects to /unauthorized.
|
|
36
|
+
# Extensions may change this.
|
|
37
|
+
it { is_expected.to redirect_to('/unauthorized') }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|