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,104 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Stock Transfers', :type => :feature, :js => true do
|
|
4
|
+
stub_authorization!
|
|
5
|
+
|
|
6
|
+
let(:admin_user) { create(:admin_user) }
|
|
7
|
+
let(:description) { 'Test stock transfer' }
|
|
8
|
+
|
|
9
|
+
before do
|
|
10
|
+
allow_any_instance_of(Spree::Admin::BaseController).to receive(:spree_current_user).and_return(admin_user)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe 'create stock transfer' do
|
|
14
|
+
it 'can create a stock transfer' do
|
|
15
|
+
source_location = create(:stock_location_with_items, :name => 'NY')
|
|
16
|
+
destination_location = create(:stock_location, :name => 'SF')
|
|
17
|
+
|
|
18
|
+
visit spree.new_admin_stock_transfer_path
|
|
19
|
+
select "SF", from: 'stock_transfer[source_location_id]'
|
|
20
|
+
fill_in 'stock_transfer_description', with: description
|
|
21
|
+
click_button 'Continue'
|
|
22
|
+
|
|
23
|
+
expect(page.find('#stock_transfer_description').value).to eq description
|
|
24
|
+
|
|
25
|
+
select "NY", from: 'stock_transfer[destination_location_id]'
|
|
26
|
+
within "form.edit_stock_transfer" do
|
|
27
|
+
page.find('button').trigger('click')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
expect(page).to have_content('Stock Transfer has been successfully updated')
|
|
31
|
+
expect(page).to have_css(:div, '#finalize-stock-transfer-warning')
|
|
32
|
+
expect(page).to have_content("NY")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe 'view a stock transfer' do
|
|
37
|
+
let(:stock_transfer) do
|
|
38
|
+
create(:stock_transfer_with_items,
|
|
39
|
+
source_location: source_location,
|
|
40
|
+
destination_location: nil,
|
|
41
|
+
description: "Test stock transfer")
|
|
42
|
+
end
|
|
43
|
+
let(:source_location) { create(:stock_location, name: 'SF') }
|
|
44
|
+
|
|
45
|
+
context "stock transfer does not have a destination" do
|
|
46
|
+
it 'displays the stock transfer details' do
|
|
47
|
+
visit spree.admin_stock_transfer_path(stock_transfer)
|
|
48
|
+
expect(page).to have_content("SF")
|
|
49
|
+
expect(page).to have_content("Test stock transfer")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe 'ship stock transfer' do
|
|
55
|
+
let(:stock_transfer) { create(:stock_transfer_with_items) }
|
|
56
|
+
|
|
57
|
+
before do
|
|
58
|
+
stock_transfer.transfer_items do |item|
|
|
59
|
+
item.update_attributes(expected_quantity: 1)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "tracking info" do
|
|
64
|
+
it 'adds tracking number' do
|
|
65
|
+
visit spree.tracking_info_admin_stock_transfer_path(stock_transfer)
|
|
66
|
+
|
|
67
|
+
fill_in 'stock_transfer_tracking_number', :with => "12345"
|
|
68
|
+
click_button 'Save'
|
|
69
|
+
|
|
70
|
+
expect(page).to have_content('Stock Transfer has been successfully updated')
|
|
71
|
+
expect(stock_transfer.reload.tracking_number).to eq '12345'
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe 'with enough stock' do
|
|
76
|
+
it 'ships stock transfer' do
|
|
77
|
+
visit spree.tracking_info_admin_stock_transfer_path(stock_transfer)
|
|
78
|
+
click_link 'ship'
|
|
79
|
+
|
|
80
|
+
first('#confirm-ship-link', visible: false).click
|
|
81
|
+
expect(current_path).to eq spree.admin_stock_transfers_path
|
|
82
|
+
expect(stock_transfer.reload.shipped_at).to_not be_nil
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe 'without enough stock' do
|
|
87
|
+
before do
|
|
88
|
+
stock_transfer.transfer_items.each do |item|
|
|
89
|
+
stock_transfer.source_location.stock_item(item.variant).set_count_on_hand(0)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'does not ship stock transfer' do
|
|
94
|
+
visit spree.tracking_info_admin_stock_transfer_path(stock_transfer)
|
|
95
|
+
|
|
96
|
+
click_link 'ship'
|
|
97
|
+
|
|
98
|
+
first('#confirm-ship-link', visible: false).click
|
|
99
|
+
expect(current_path).to eq spree.tracking_info_admin_stock_transfer_path(stock_transfer)
|
|
100
|
+
expect(stock_transfer.reload.shipped_at).to be_nil
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Store credits admin" do
|
|
4
|
+
stub_authorization!
|
|
5
|
+
let!(:admin_user) { create(:admin_user) }
|
|
6
|
+
let!(:store_credit) { create(:store_credit) }
|
|
7
|
+
let(:user) { store_credit.user }
|
|
8
|
+
|
|
9
|
+
before do
|
|
10
|
+
allow(Spree.user_class).to receive(:find_by).
|
|
11
|
+
with(hash_including(:id)).
|
|
12
|
+
and_return(store_credit.user)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "visiting the store credits page" do
|
|
16
|
+
before do
|
|
17
|
+
visit spree.admin_path
|
|
18
|
+
click_link "Users"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should be on the store credits page" do
|
|
22
|
+
click_link store_credit.user.email
|
|
23
|
+
click_link "Store Credit"
|
|
24
|
+
expect(page.current_path).to eq spree.admin_user_store_credits_path(store_credit.user)
|
|
25
|
+
|
|
26
|
+
store_credit_table = page.find(".twelve.columns > table")
|
|
27
|
+
expect(store_credit_table.all('tr').count).to eq 1
|
|
28
|
+
expect(store_credit_table).to have_content(Spree::Money.new(store_credit.amount).to_s)
|
|
29
|
+
expect(store_credit_table).to have_content(Spree::Money.new(store_credit.amount_used).to_s)
|
|
30
|
+
expect(store_credit_table).to have_content(store_credit.category_name)
|
|
31
|
+
expect(store_credit_table).to have_content(store_credit.created_by_email)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "creating store credit" do
|
|
36
|
+
before do
|
|
37
|
+
visit spree.admin_path
|
|
38
|
+
click_link "Users"
|
|
39
|
+
click_link store_credit.user.email
|
|
40
|
+
click_link "Store Credit"
|
|
41
|
+
allow_any_instance_of(Spree::Admin::StoreCreditsController).to receive_messages(try_spree_current_user: admin_user)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should create store credit and associate it with the user" do
|
|
45
|
+
click_link "Add store credit"
|
|
46
|
+
page.fill_in "store_credit_amount", with: "102.00"
|
|
47
|
+
select "Exchange", from: "store_credit_category_id"
|
|
48
|
+
click_button "Create"
|
|
49
|
+
|
|
50
|
+
expect(page.current_path).to eq spree.admin_user_store_credits_path(store_credit.user)
|
|
51
|
+
store_credit_table = page.find(".twelve.columns > table")
|
|
52
|
+
expect(store_credit_table.all('tr').count).to eq 2
|
|
53
|
+
expect(Spree::StoreCredit.count).to eq 2
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe "updating store credit" do
|
|
58
|
+
let(:updated_amount) { "99.0" }
|
|
59
|
+
let!(:update_reason) { create(:store_credit_update_reason) }
|
|
60
|
+
|
|
61
|
+
before do
|
|
62
|
+
visit spree.admin_path
|
|
63
|
+
click_link "Users"
|
|
64
|
+
click_link store_credit.user.email
|
|
65
|
+
click_link "Store Credit"
|
|
66
|
+
allow_any_instance_of(Spree::Admin::StoreCreditsController).to receive_messages(try_spree_current_user: admin_user)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "updates the store credit's amount" do
|
|
70
|
+
page.find(".twelve.columns > table td.actions a.fa-edit").click
|
|
71
|
+
expect(page).to have_content 'Store credit history'
|
|
72
|
+
click_link "Change amount"
|
|
73
|
+
expect(page).to have_content 'Editing store credit amount'
|
|
74
|
+
page.fill_in 'store_credit_amount', with: updated_amount
|
|
75
|
+
page.select update_reason.name, from: 'update_reason_id'
|
|
76
|
+
click_button "Update"
|
|
77
|
+
expect(page.find('#sc-detail-table')).to have_content "$99.00"
|
|
78
|
+
expect(store_credit.reload.amount.to_f).to eq updated_amount.to_f
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Taxonomies and taxons", :type => :feature do
|
|
4
|
+
stub_authorization!
|
|
5
|
+
|
|
6
|
+
it "admin should be able to edit taxon" do
|
|
7
|
+
|
|
8
|
+
visit spree.new_admin_taxonomy_path
|
|
9
|
+
|
|
10
|
+
fill_in "Name", :with => "Hello"
|
|
11
|
+
click_button "Create"
|
|
12
|
+
|
|
13
|
+
@taxonomy = Spree::Taxonomy.last
|
|
14
|
+
|
|
15
|
+
visit spree.edit_admin_taxonomy_taxon_path(@taxonomy, @taxonomy.root.id)
|
|
16
|
+
|
|
17
|
+
fill_in "taxon_name", :with => "Shirt"
|
|
18
|
+
fill_in "taxon_description", :with => "Discover our new rails shirts"
|
|
19
|
+
|
|
20
|
+
fill_in "permalink_part", :with => "shirt-rails"
|
|
21
|
+
click_button "Update"
|
|
22
|
+
expect(page).to have_content("Taxon \"Shirt\" has been successfully updated!")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "can see taxon tree", js: true do
|
|
26
|
+
taxonomy = create :taxonomy
|
|
27
|
+
|
|
28
|
+
visit spree.edit_admin_taxonomy_path(taxonomy)
|
|
29
|
+
expect(page).to have_content('Brand')
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Users', :type => :feature do
|
|
4
|
+
stub_authorization!
|
|
5
|
+
let!(:country) { create(:country) }
|
|
6
|
+
let!(:user_a) { create(:user_with_addreses, email: 'a@example.com') }
|
|
7
|
+
let!(:user_b) { create(:user_with_addreses, email: 'b@example.com') }
|
|
8
|
+
|
|
9
|
+
let(:order) { create(:completed_order_with_totals, user: user_a, number: "R123") }
|
|
10
|
+
|
|
11
|
+
let(:order_2) do
|
|
12
|
+
create(:completed_order_with_totals, user: user_a, number: "R456").tap do |o|
|
|
13
|
+
li = o.line_items.last
|
|
14
|
+
li.update_column(:price, li.price + 10)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let(:orders) { [order, order_2] }
|
|
19
|
+
|
|
20
|
+
shared_examples_for 'a user page' do
|
|
21
|
+
it 'has lifetime stats' do
|
|
22
|
+
orders
|
|
23
|
+
visit current_url # need to refresh after creating the orders for specs that did not require orders
|
|
24
|
+
within("#user-lifetime-stats") do
|
|
25
|
+
[:total_sales, :num_orders, :average_order_value, :member_since].each do |stat_name|
|
|
26
|
+
expect(page).to have_content Spree.t(stat_name)
|
|
27
|
+
end
|
|
28
|
+
expect(page).to have_content (order.total + order_2.total)
|
|
29
|
+
expect(page).to have_content orders.count
|
|
30
|
+
expect(page).to have_content (orders.sum(&:total) / orders.count)
|
|
31
|
+
expect(page).to have_content I18n.l(user_a.created_at.to_date)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'can go back to the users list' do
|
|
36
|
+
expect(page).to have_link Spree.t(:back_to_users_list), href: spree.admin_users_path
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'can navigate to the account page' do
|
|
40
|
+
expect(page).to have_link Spree.t(:"admin.user.account"), href: spree.edit_admin_user_path(user_a)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'can navigate to the order history' do
|
|
44
|
+
expect(page).to have_link Spree.t(:"admin.user.orders"), href: spree.orders_admin_user_path(user_a)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'can navigate to the items purchased' do
|
|
48
|
+
expect(page).to have_link Spree.t(:"admin.user.items"), href: spree.items_admin_user_path(user_a)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
shared_examples_for 'a sortable attribute' do
|
|
53
|
+
before { click_link sort_link }
|
|
54
|
+
|
|
55
|
+
it "can sort asc" do
|
|
56
|
+
within_table(table_id) do
|
|
57
|
+
expect(page).to have_text text_match_1
|
|
58
|
+
expect(page).to have_text text_match_2
|
|
59
|
+
expect(text_match_1).to appear_before text_match_2
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "can sort desc" do
|
|
64
|
+
within_table(table_id) do
|
|
65
|
+
click_link sort_link
|
|
66
|
+
|
|
67
|
+
expect(page).to have_text text_match_1
|
|
68
|
+
expect(page).to have_text text_match_2
|
|
69
|
+
expect(text_match_2).to appear_before text_match_1
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
before do
|
|
75
|
+
visit spree.admin_path
|
|
76
|
+
click_link 'Users'
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context 'users index' do
|
|
80
|
+
|
|
81
|
+
context "email" do
|
|
82
|
+
it_behaves_like "a sortable attribute" do
|
|
83
|
+
let(:text_match_1) { user_a.email }
|
|
84
|
+
let(:text_match_2) { user_b.email }
|
|
85
|
+
let(:table_id) { "listing_users" }
|
|
86
|
+
let(:sort_link) { "users_email_title" }
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'displays the correct results for a user search' do
|
|
91
|
+
fill_in 'q_email_cont', with: user_a.email
|
|
92
|
+
click_button 'Search'
|
|
93
|
+
within_table('listing_users') do
|
|
94
|
+
expect(page).to have_text user_a.email
|
|
95
|
+
expect(page).not_to have_text user_b.email
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context 'editing users' do
|
|
101
|
+
before { click_link user_a.email }
|
|
102
|
+
|
|
103
|
+
it_behaves_like 'a user page'
|
|
104
|
+
|
|
105
|
+
it 'can edit the user email' do
|
|
106
|
+
fill_in 'user_email', with: 'a@example.com99'
|
|
107
|
+
click_button 'Update'
|
|
108
|
+
|
|
109
|
+
expect(user_a.reload.email).to eq 'a@example.com99'
|
|
110
|
+
expect(page).to have_text 'Account updated'
|
|
111
|
+
expect(find_field('user_email').value).to eq 'a@example.com99'
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'can edit the user password' do
|
|
115
|
+
fill_in 'user_password', with: 'welcome'
|
|
116
|
+
fill_in 'user_password_confirmation', with: 'welcome'
|
|
117
|
+
click_button 'Update'
|
|
118
|
+
|
|
119
|
+
expect(page).to have_text 'Account updated'
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'can edit user roles' do
|
|
123
|
+
Spree::Role.create name: "admin"
|
|
124
|
+
click_link user_a.email
|
|
125
|
+
|
|
126
|
+
check 'user_spree_role_admin'
|
|
127
|
+
click_button 'Update'
|
|
128
|
+
expect(page).to have_text 'Account updated'
|
|
129
|
+
expect(find_field('user_spree_role_admin')['checked']).to be true
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'can edit user shipping address' do
|
|
133
|
+
click_link "Addresses"
|
|
134
|
+
|
|
135
|
+
within("#admin_user_edit_addresses") do
|
|
136
|
+
fill_in "user_ship_address_attributes_address1", with: "1313 Mockingbird Ln"
|
|
137
|
+
click_button 'Update'
|
|
138
|
+
expect(find_field('user_ship_address_attributes_address1').value).to eq "1313 Mockingbird Ln"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
expect(user_a.reload.ship_address.address1).to eq "1313 Mockingbird Ln"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'can edit user billing address' do
|
|
145
|
+
click_link "Addresses"
|
|
146
|
+
|
|
147
|
+
within("#admin_user_edit_addresses") do
|
|
148
|
+
fill_in "user_bill_address_attributes_address1", with: "1313 Mockingbird Ln"
|
|
149
|
+
click_button 'Update'
|
|
150
|
+
expect(find_field('user_bill_address_attributes_address1').value).to eq "1313 Mockingbird Ln"
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
expect(user_a.reload.bill_address.address1).to eq "1313 Mockingbird Ln"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context 'no api key exists' do
|
|
157
|
+
it 'can generate a new api key' do
|
|
158
|
+
within("#admin_user_edit_api_key") do
|
|
159
|
+
expect(user_a.spree_api_key).to be_blank
|
|
160
|
+
click_button Spree.t('generate_key', :scope => 'api')
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
expect(user_a.reload.spree_api_key).to be_present
|
|
164
|
+
|
|
165
|
+
expect(page).to have_content('Key: (hidden)')
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
context 'an api key exists' do
|
|
170
|
+
before do
|
|
171
|
+
user_a.generate_spree_api_key!
|
|
172
|
+
expect(user_a.reload.spree_api_key).to be_present
|
|
173
|
+
visit current_path
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
it 'can clear an api key' do
|
|
177
|
+
expect(page).to have_css('#current-api-key')
|
|
178
|
+
|
|
179
|
+
click_button Spree.t('clear_key', :scope => 'api')
|
|
180
|
+
|
|
181
|
+
expect(page).to have_no_css('#current-api-key')
|
|
182
|
+
|
|
183
|
+
expect(user_a.reload.spree_api_key).to be_blank
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it 'can regenerate an api key' do
|
|
187
|
+
old_key = user_a.spree_api_key
|
|
188
|
+
|
|
189
|
+
within("#admin_user_edit_api_key") do
|
|
190
|
+
click_button Spree.t('regenerate_key', :scope => 'api')
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
expect(user_a.reload.spree_api_key).to be_present
|
|
194
|
+
expect(user_a.reload.spree_api_key).not_to eq old_key
|
|
195
|
+
|
|
196
|
+
expect(page).to have_content('Key: (hidden)')
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context 'order history with sorting' do
|
|
202
|
+
|
|
203
|
+
before do
|
|
204
|
+
orders
|
|
205
|
+
click_link user_a.email
|
|
206
|
+
within("#sidebar") { click_link Spree.t(:"admin.user.orders") }
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it_behaves_like 'a user page'
|
|
210
|
+
|
|
211
|
+
context "completed_at" do
|
|
212
|
+
it_behaves_like "a sortable attribute" do
|
|
213
|
+
let(:text_match_1) { I18n.l(order.completed_at.to_date) }
|
|
214
|
+
let(:text_match_2) { I18n.l(order_2.completed_at.to_date) }
|
|
215
|
+
let(:table_id) { "listing_orders" }
|
|
216
|
+
let(:sort_link) { "orders_completed_at_title" }
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
[:number, :state, :total].each do |attr|
|
|
221
|
+
context attr do
|
|
222
|
+
it_behaves_like "a sortable attribute" do
|
|
223
|
+
let(:text_match_1) { order.send(attr).to_s }
|
|
224
|
+
let(:text_match_2) { order_2.send(attr).to_s }
|
|
225
|
+
let(:table_id) { "listing_orders" }
|
|
226
|
+
let(:sort_link) { "orders_#{attr}_title" }
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
context 'items purchased with sorting' do
|
|
233
|
+
|
|
234
|
+
before do
|
|
235
|
+
orders
|
|
236
|
+
click_link user_a.email
|
|
237
|
+
within("#sidebar") { click_link Spree.t(:"admin.user.items") }
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it_behaves_like 'a user page'
|
|
241
|
+
|
|
242
|
+
context "completed_at" do
|
|
243
|
+
it_behaves_like "a sortable attribute" do
|
|
244
|
+
let(:text_match_1) { I18n.l(order.completed_at.to_date) }
|
|
245
|
+
let(:text_match_2) { I18n.l(order_2.completed_at.to_date) }
|
|
246
|
+
let(:table_id) { "listing_items" }
|
|
247
|
+
let(:sort_link) { "orders_completed_at_title" }
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
[:number, :state].each do |attr|
|
|
252
|
+
context attr do
|
|
253
|
+
it_behaves_like "a sortable attribute" do
|
|
254
|
+
let(:text_match_1) { order.send(attr).to_s }
|
|
255
|
+
let(:text_match_2) { order_2.send(attr).to_s }
|
|
256
|
+
let(:table_id) { "listing_items" }
|
|
257
|
+
let(:sort_link) { "orders_#{attr}_title" }
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "has item attributes" do
|
|
263
|
+
items = order.line_items | order_2.line_items
|
|
264
|
+
expect(page).to have_table 'listing_items'
|
|
265
|
+
within_table('listing_items') do
|
|
266
|
+
items.each do |item|
|
|
267
|
+
expect(page).to have_selector(".item-name", text: item.product.name)
|
|
268
|
+
expect(page).to have_selector(".item-price", text: item.single_money.to_html)
|
|
269
|
+
expect(page).to have_selector(".item-quantity", text: item.quantity)
|
|
270
|
+
expect(page).to have_selector(".item-total", text: item.money.to_html)
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Admin::BaseHelper, :type => :helper do
|
|
4
|
+
include Spree::Admin::BaseHelper
|
|
5
|
+
|
|
6
|
+
context "#datepicker_field_value" do
|
|
7
|
+
it "should return nil when date is empty" do
|
|
8
|
+
date = nil
|
|
9
|
+
expect(datepicker_field_value(date)).to be_nil
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should return a formatted date when date is present" do
|
|
13
|
+
date = "2013-08-14".to_time
|
|
14
|
+
expect(datepicker_field_value(date)).to eq("2013/08/14")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# coding: UTF-8
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe Spree::Admin::NavigationHelper, :type => :helper do
|
|
5
|
+
|
|
6
|
+
describe "#tab" do
|
|
7
|
+
context "creating an admin tab" do
|
|
8
|
+
it "should capitalize the first letter of each word in the tab's label" do
|
|
9
|
+
admin_tab = helper.tab(:orders)
|
|
10
|
+
expect(admin_tab).to include("Orders")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should accept options with label and capitalize each word of it" do
|
|
15
|
+
admin_tab = helper.tab(:orders, :label => "delivered orders")
|
|
16
|
+
expect(admin_tab).to include("Delivered Orders")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should capitalize words with unicode characters" do
|
|
20
|
+
# overview
|
|
21
|
+
admin_tab = helper.tab(:orders, :label => "přehled")
|
|
22
|
+
expect(admin_tab).to include("Přehled")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "selection" do
|
|
26
|
+
context "when match_path option is not supplied" do
|
|
27
|
+
subject(:tab) { helper.tab(:orders) }
|
|
28
|
+
|
|
29
|
+
it "should be selected if the controller matches" do
|
|
30
|
+
allow(controller).to receive(:controller_name).and_return("orders")
|
|
31
|
+
expect(subject).to include('class="selected"')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should not be selected if the controller does not match" do
|
|
35
|
+
allow(controller).to receive(:controller_name).and_return("bonobos")
|
|
36
|
+
expect(subject).not_to include('class="selected"')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "when match_path option is supplied" do
|
|
42
|
+
before do
|
|
43
|
+
allow(helper).to receive(:admin_path).and_return("/somepath")
|
|
44
|
+
allow(helper).to receive(:request).and_return(double(ActionDispatch::Request, :fullpath => "/somepath/orders/edit/1"))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should be selected if the fullpath matches" do
|
|
48
|
+
allow(controller).to receive(:controller_name).and_return("bonobos")
|
|
49
|
+
tab = helper.tab(:orders, :label => "delivered orders", :match_path => '/orders')
|
|
50
|
+
expect(tab).to include('class="selected"')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should be selected if the fullpath matches a regular expression" do
|
|
54
|
+
allow(controller).to receive(:controller_name).and_return("bonobos")
|
|
55
|
+
tab = helper.tab(:orders, :label => "delivered orders", :match_path => /orders$|orders\//)
|
|
56
|
+
expect(tab).to include('class="selected"')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should not be selected if the fullpath does not match" do
|
|
60
|
+
allow(controller).to receive(:controller_name).and_return("bonobos")
|
|
61
|
+
tab = helper.tab(:orders, :label => "delivered orders", :match_path => '/shady')
|
|
62
|
+
expect(tab).not_to include('class="selected"')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should not be selected if the fullpath does not match a regular expression" do
|
|
66
|
+
allow(controller).to receive(:controller_name).and_return("bonobos")
|
|
67
|
+
tab = helper.tab(:orders, :label => "delivered orders", :match_path => /shady$|shady\//)
|
|
68
|
+
expect(tab).not_to include('class="selected"')
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Admin::ReimbursementsHelper, type: :helper do
|
|
4
|
+
describe '.reimbursement_status_color' do
|
|
5
|
+
subject { helper.reimbursement_status_color(reimbursement) }
|
|
6
|
+
|
|
7
|
+
let(:reimbursement) do
|
|
8
|
+
Spree::Reimbursement.new(reimbursement_status: status)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context 'when status is reimbursed' do
|
|
12
|
+
let(:status) { 'reimbursed' }
|
|
13
|
+
it { is_expected.to eq 'success'}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context 'when status is pending' do
|
|
17
|
+
let(:status) { 'pending' }
|
|
18
|
+
it { is_expected.to eq 'notice'}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'when status is pending' do
|
|
22
|
+
let(:status) { 'errored' }
|
|
23
|
+
it { is_expected.to eq 'error'}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'when status is not valid' do
|
|
27
|
+
let(:status) { 'noop' }
|
|
28
|
+
|
|
29
|
+
it 'should raise an error' do
|
|
30
|
+
expect{ subject }.to raise_error(RuntimeError)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Admin::StockMovementsHelper, :type => :helper do
|
|
4
|
+
|
|
5
|
+
describe "#pretty_originator" do
|
|
6
|
+
let!(:stock_location) { create(:stock_location_with_items) }
|
|
7
|
+
let!(:stock_item) { stock_location.stock_items.first }
|
|
8
|
+
let(:stock_movement) { create(:stock_movement, stock_item: stock_item, originator: originator) }
|
|
9
|
+
|
|
10
|
+
subject { helper.pretty_originator(stock_movement) }
|
|
11
|
+
|
|
12
|
+
context "originator has a number" do
|
|
13
|
+
let(:originator) { create(:order) }
|
|
14
|
+
|
|
15
|
+
it "returns the originator's number" do
|
|
16
|
+
expect(subject).to eq originator.number
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "originator doesn't have a number" do
|
|
21
|
+
let(:originator) { create(:user) }
|
|
22
|
+
|
|
23
|
+
it "returns an empty string" do
|
|
24
|
+
expect(subject).to eq ""
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|